[choices[i]]"
@@ -724,7 +715,7 @@ SUBSYSTEM_DEF(vote)
voted[usr.ckey] = SSpersistence.saved_votes[usr.ckey][mode]
if(islist(voted[usr.ckey]))
var/malformed = FALSE
- if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING)
+ if(vote_system == SCORE_VOTING || vote_system == HIGHEST_MEDIAN_VOTING)
for(var/thing in voted[usr.ckey])
if(!(thing in choices))
malformed = TRUE
@@ -738,7 +729,7 @@ SUBSYSTEM_DEF(vote)
to_chat(usr,"Your saved vote was malformed! Start over!")
voted -= usr.ckey
else
- if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING)
+ if(vote_system == SCORE_VOTING || vote_system == HIGHEST_MEDIAN_VOTING)
submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"])))
else
submit_vote(round(text2num(href_list["vote"])))
diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm
index e5e1434ab8..f35389f171 100644
--- a/code/datums/brain_damage/imaginary_friend.dm
+++ b/code/datums/brain_damage/imaginary_friend.dm
@@ -92,7 +92,7 @@
trauma = _trauma
owner = trauma.owner
- setup_friend()
+ INVOKE_ASYNC(src, .proc/setup_friend)
join = new
join.Grant(src)
diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm
index 7b3081cb33..2648ae1eab 100644
--- a/code/datums/cinematic.dm
+++ b/code/datums/cinematic.dm
@@ -30,7 +30,7 @@
/datum/cinematic
var/id = CINEMATIC_DEFAULT
var/list/watching = list() //List of clients watching this
- var/list/locked = list() //Who had mob_transforming set during the cinematic
+ var/list/locked = list() //Who had mob_transforming set during the cinematic
var/is_global = FALSE //Global cinematics will override mob-specific ones
var/obj/screen/cinematic/screen
var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc)
@@ -45,7 +45,7 @@
if(!CC)
continue
var/client/C = CC
- //C.mob.clear_fullscreen("cinematic")
+ C.mob.clear_fullscreen("cinematic")
C.screen -= screen
watching = null
QDEL_NULL(screen)
@@ -54,7 +54,7 @@
if(!MM)
continue
var/mob/M = MM
- M.mob_transforming = FALSE
+ M.mob_transforming = FALSE
locked = null
return ..()
@@ -93,7 +93,7 @@
toggle_ooc(TRUE)
/datum/cinematic/proc/show_to(mob/M, client/C)
- //SIGNAL_HANDLER //must not wait.
+ SIGNAL_HANDLER
if(!M.mob_transforming)
locked += M
@@ -101,7 +101,7 @@
if(!C)
return
watching += C
- //M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop)
+ M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop)
C.screen += screen
//Sound helper
@@ -122,7 +122,7 @@
sleep(50)
/datum/cinematic/proc/replacement_cinematic(datum/source, datum/cinematic/other)
- //SIGNAL_HANDLER
+ SIGNAL_HANDLER
if(!is_global && other.is_global) //Allow it to play if we're local and it's global
return NONE
@@ -210,6 +210,20 @@
special()
screen.icon_state = "summary_cult"
+// /datum/cinematic/cult_fail
+// id = CINEMATIC_CULT_FAIL
+
+// /datum/cinematic/cult_fail/content()
+// screen.icon_state = "station_intact"
+// sleep(20)
+// cinematic_sound(sound('sound/creatures/narsie_rises.ogg'))
+// sleep(60)
+// cinematic_sound(sound('sound/effects/explosion_distant.ogg'))
+// sleep(10)
+// cinematic_sound(sound('sound/magic/demon_dies.ogg'))
+// sleep(30)
+// special()
+
/datum/cinematic/nuke_annihilation
id = CINEMATIC_ANNIHILATION
diff --git a/code/datums/components/combat_mode.dm b/code/datums/components/combat_mode.dm
index b9952e9133..29d90fd509 100644
--- a/code/datums/components/combat_mode.dm
+++ b/code/datums/components/combat_mode.dm
@@ -125,7 +125,7 @@
///Changes the user direction to (try) keep match the pointer.
/datum/component/combat_mode/proc/on_move(atom/movable/source, dir, atom/oldloc, forced)
var/mob/living/L = source
- if(mode_flags & COMBAT_MODE_ACTIVE && L.client && lastmousedir && lastmousedir != dir)
+ if((mode_flags & COMBAT_MODE_ACTIVE) && L.client)
L.setDir(lastmousedir, ismousemovement = TRUE)
/// Added movement delay if moving backward.
diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm
index f767c607a5..8b326ac424 100644
--- a/code/datums/components/footstep.dm
+++ b/code/datums/components/footstep.dm
@@ -46,7 +46,7 @@
var/mob/living/LM = parent
if(!T.footstep || LM.buckled || !CHECK_MOBILITY(LM, MOBILITY_STAND) || LM.buckled || LM.throwing || (LM.movement_type & (VENTCRAWLING | FLYING)))
if (LM.lying && !LM.buckled && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying
- playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * volume)
+ playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff_distance = 1)
return
if(HAS_TRAIT(LM, TRAIT_SILENT_STEP))
@@ -75,7 +75,7 @@
if(!T)
return
if(isfile(footstep_sounds) || istext(footstep_sounds))
- playsound(T, footstep_sounds, volume)
+ playsound(T, footstep_sounds, volume, falloff_distance = 1)
return
var/turf_footstep
switch(footstep_type)
@@ -89,7 +89,7 @@
turf_footstep = T.footstep
if(!turf_footstep)
return
- playsound(T, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range)
+ playsound(T, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1)
/datum/component/footstep/proc/play_humanstep()
var/turf/open/T = prepare_step()
@@ -114,10 +114,10 @@
turf_footstep = T.footstep
L = GLOB.footstep
if(FOOTSTEP_MOB_SLIME)
- playsound(T, 'sound/effects/footstep/slime1.ogg', 50 * volume)
+ playsound(T, 'sound/effects/footstep/slime1.ogg', 50 * volume, falloff_distance = 1)
return
if(FOOTSTEP_MOB_CRAWL)
- playsound(T, 'sound/effects/footstep/crawl1.ogg', 50 * volume)
+ playsound(T, 'sound/effects/footstep/crawl1.ogg', 50 * volume, falloff_distance = 1)
return
special = TRUE
else
@@ -126,13 +126,13 @@
playsound(T, pick(GLOB.footstep[T.footstep][1]),
GLOB.footstep[T.footstep][2] * volume,
TRUE,
- GLOB.footstep[T.footstep][3] + e_range)
+ GLOB.footstep[T.footstep][3] + e_range, falloff_distance = 1)
return
if(!special && H.dna.species.special_step_sounds)
- playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE)
+ playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1)
else
playsound(T, pick(L[turf_footstep][1]),
L[turf_footstep][2] * volume,
TRUE,
- L[turf_footstep][3] + e_range)
+ L[turf_footstep][3] + e_range, falloff_distance = 1)
diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm
index c2b3ad1f30..61098c8b66 100644
--- a/code/datums/components/gps.dm
+++ b/code/datums/components/gps.dm
@@ -21,7 +21,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user.
var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
-/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE)
+/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE, starton = TRUE)
. = ..()
if(. == COMPONENT_INCOMPATIBLE || !isitem(parent))
return COMPONENT_INCOMPATIBLE
@@ -33,6 +33,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp_act)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/on_AltClick)
+ if(!starton)
+ tracking = FALSE
///Called on COMSIG_ITEM_ATTACK_SELF
/datum/component/gps/item/proc/interact(datum/source, mob/user)
diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm
index 49b19f767c..26f52f6ba5 100644
--- a/code/datums/components/orbiter.dm
+++ b/code/datums/components/orbiter.dm
@@ -146,9 +146,11 @@
if(!istype(A) || !get_turf(A) || A == src)
return
+ orbit_target = A
return A.AddComponent(/datum/component/orbiter, src, radius, clockwise, rotation_speed, rotation_segments, pre_rotation)
/atom/movable/proc/stop_orbit(datum/component/orbiter/orbits)
+ orbit_target = null
return // We're just a simple hook
/atom/proc/transfer_observers_to(atom/target)
diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm
index 03f3820a9b..e11eca2975 100644
--- a/code/datums/components/riding.dm
+++ b/code/datums/components/riding.dm
@@ -36,15 +36,15 @@
if(del_on_unbuckle_all && !AM.has_buckled_mobs())
qdel(src)
-/datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE)
- handle_vehicle_offsets()
+/datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force)
+ handle_vehicle_offsets(M.buckled?.dir)
-/datum/component/riding/proc/handle_vehicle_layer()
+/datum/component/riding/proc/handle_vehicle_layer(dir)
var/atom/movable/AM = parent
var/static/list/defaults = list(TEXT_NORTH = OBJ_LAYER, TEXT_SOUTH = ABOVE_MOB_LAYER, TEXT_EAST = ABOVE_MOB_LAYER, TEXT_WEST = ABOVE_MOB_LAYER)
- . = defaults["[AM.dir]"]
- if(directional_vehicle_layers["[AM.dir]"])
- . = directional_vehicle_layers["[AM.dir]"]
+ . = defaults["[dir]"]
+ if(directional_vehicle_layers["[dir]"])
+ . = directional_vehicle_layers["[dir]"]
if(isnull(.)) //you can set it to null to not change it.
. = AM.layer
AM.layer = .
@@ -52,12 +52,17 @@
/datum/component/riding/proc/set_vehicle_dir_layer(dir, layer)
directional_vehicle_layers["[dir]"] = layer
-/datum/component/riding/proc/vehicle_moved(datum/source)
+/datum/component/riding/proc/vehicle_moved(datum/source, oldLoc, dir)
+ SIGNAL_HANDLER
+
var/atom/movable/AM = parent
+ if (isnull(dir))
+ dir = AM.dir
+ AM.set_glide_size(DELAY_TO_GLIDE_SIZE(vehicle_move_delay), FALSE)
for(var/i in AM.buckled_mobs)
ride_check(i)
- handle_vehicle_offsets()
- handle_vehicle_layer()
+ handle_vehicle_offsets(dir)
+ handle_vehicle_layer(dir)
/datum/component/riding/proc/ride_check(mob/living/M)
var/atom/movable/AM = parent
@@ -74,9 +79,9 @@
/datum/component/riding/proc/additional_offset_checks()
return TRUE
-/datum/component/riding/proc/handle_vehicle_offsets()
+/datum/component/riding/proc/handle_vehicle_offsets(dir)
var/atom/movable/AM = parent
- var/AM_dir = "[AM.dir]"
+ var/AM_dir = "[dir]"
var/passindex = 0
if(AM.has_buckled_mobs())
for(var/m in AM.buckled_mobs)
@@ -177,8 +182,8 @@
else
last_move_diagonal = FALSE
- handle_vehicle_offsets()
- handle_vehicle_layer()
+ handle_vehicle_offsets(direction)
+ handle_vehicle_layer(direction)
else
to_chat(user, "You'll need the keys in one of your hands to [drive_verb] [AM].")
diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm
index 0552a791ea..a285b7d3f2 100644
--- a/code/datums/components/squeak.dm
+++ b/code/datums/components/squeak.dm
@@ -19,7 +19,14 @@
/// chance we'll be stopped from squeaking by cooldown when something crossing us squeaks
var/cross_squeak_delay_chance = 33 // about 3 things can squeak at a time
-/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override)
+ ///extra-range for this component's sound
+ var/sound_extra_range = -1
+ ///when sounds start falling off for the squeak
+ var/sound_falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE
+ ///sound exponent for squeak. Defaults to 10 as squeaking is loud and annoying enough.
+ var/sound_falloff_exponent = 10
+
+/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override, extrarange, falloff_exponent, fallof_distance)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak)
@@ -45,6 +52,12 @@
step_delay = step_delay_override
if(isnum(use_delay_override))
use_delay = use_delay_override
+ if(isnum(extrarange))
+ sound_extra_range = extrarange
+ if(isnum(falloff_exponent))
+ sound_falloff_exponent = falloff_exponent
+ if(isnum(fallof_distance))
+ sound_falloff_distance = fallof_distance
/datum/component/squeak/UnregisterFromParent()
if(!isatom(parent))
@@ -62,6 +75,7 @@
return ..()
/datum/component/squeak/proc/play_squeak()
+ SIGNAL_HANDLER
do_play_squeak()
/datum/component/squeak/proc/do_play_squeak(bypass_cooldown = FALSE)
@@ -69,14 +83,16 @@
return FALSE
if(prob(squeak_chance))
if(!override_squeak_sounds)
- playsound(parent, pickweight(default_squeak_sounds), volume, 1, -1)
+ playsound(parent, pickweight(default_squeak_sounds), volume, TRUE, sound_extra_range, sound_falloff_exponent, falloff_distance = sound_falloff_distance)
else
- playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1)
+ playsound(parent, pickweight(override_squeak_sounds), volume, TRUE, sound_extra_range, sound_falloff_exponent, falloff_distance = sound_falloff_distance)
last_squeak = world.time
return TRUE
return FALSE
/datum/component/squeak/proc/step_squeak()
+ SIGNAL_HANDLER
+
if(steps > step_delay)
do_play_squeak(TRUE)
steps = 0
@@ -84,20 +100,22 @@
steps++
/datum/component/squeak/proc/play_squeak_crossed(datum/source, atom/movable/AM)
+ SIGNAL_HANDLER
+
if(isitem(AM))
var/obj/item/I = AM
if(I.item_flags & ABSTRACT)
return
- else if(istype(AM, /obj/item/projectile))
- var/obj/item/projectile/P = AM
- if(P.original != parent)
- return
+ if(AM.movement_type & (FLYING|FLOATING) || !AM.has_gravity())
+ return
var/atom/current_parent = parent
if(isturf(current_parent.loc))
if(do_play_squeak())
SEND_SIGNAL(AM, COMSIG_CROSS_SQUEAKED)
/datum/component/squeak/proc/use_squeak()
+ SIGNAL_HANDLER
+
if(last_use + use_delay < world.time)
last_use = world.time
play_squeak()
@@ -118,6 +136,8 @@
RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change)
/datum/component/squeak/proc/holder_dir_change(datum/source, old_dir, new_dir)
+ SIGNAL_HANDLER
+
//If the dir changes it means we're going through a bend in the pipes, let's pretend we bumped the wall
if(old_dir != new_dir)
play_squeak()
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index f93d40bb04..2fa5a20d7a 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -449,6 +449,10 @@
// this must come before the screen objects only block, dunno why it wasn't before
if(over_object == M)
user_show_to_mob(M)
+ return
+ if(isrevenant(M))
+ RevenantThrow(over_object, M, source)
+ return
if(!M.incapacitated())
if(!istype(over_object, /obj/screen))
dump_content_at(over_object, M)
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index c69df4f5e3..10ff5bda3d 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -85,6 +85,10 @@
to_chat(user, "You're not ready to tackle!")
return
+ if(!user.mob_has_gravity() ||!user.loc.has_gravity() || isspaceturf(user.loc))
+ to_chat(user, "You can't find your footing without gravity!")
+ return
+
if(user.has_status_effect(STATUS_EFFECT_TASED)) // can't tackle if you just got tased
to_chat(user, "You can't tackle while tased!")
return
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
index d11532a883..42580425ce 100644
--- a/code/datums/datum.dm
+++ b/code/datums/datum.dm
@@ -77,21 +77,21 @@
/**
- * Default implementation of clean-up code.
- *
- * This should be overridden to remove all references pointing to the object being destroyed, if
- * you do override it, make sure to call the parent and return it's return value by default
- *
- * Return an appropriate [QDEL_HINT][QDEL_HINT_QUEUE] to modify handling of your deletion;
- * in most cases this is [QDEL_HINT_QUEUE].
- *
- * The base case is responsible for doing the following
- * * Erasing timers pointing to this datum
- * * Erasing compenents on this datum
- * * Notifying datums listening to signals from this datum that we are going away
- *
- * Returns [QDEL_HINT_QUEUE]
- */
+ * Default implementation of clean-up code.
+ *
+ * This should be overridden to remove all references pointing to the object being destroyed, if
+ * you do override it, make sure to call the parent and return it's return value by default
+ *
+ * Return an appropriate [QDEL_HINT][QDEL_HINT_QUEUE] to modify handling of your deletion;
+ * in most cases this is [QDEL_HINT_QUEUE].
+ *
+ * The base case is responsible for doing the following
+ * * Erasing timers pointing to this datum
+ * * Erasing compenents on this datum
+ * * Notifying datums listening to signals from this datum that we are going away
+ *
+ * Returns [QDEL_HINT_QUEUE]
+ */
/datum/proc/Destroy(force=FALSE, ...)
SHOULD_CALL_PARENT(TRUE)
tag = null
@@ -138,8 +138,6 @@
UnregisterSignal(target, signal_procs[target])
//END: ECS SHIT
- SSsounds.free_datum_channels(src) //?? (not on tg)
-
return QDEL_HINT_QUEUE
#ifdef DATUMVAR_DEBUGGING_MODE
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index a91549ab4c..0bb803ddb3 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -4,7 +4,7 @@
/datum/proc/can_vv_get(var_name)
return TRUE
-/datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited
+/datum/proc/vv_edit_var(var_name, var_value, massedit) //called whenever a var is edited
if(var_name == NAMEOF(src, vars))
return FALSE
vars[var_name] = var_value
diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm
index aabb9ed144..952ce4f18d 100644
--- a/code/datums/diseases/heart_failure.dm
+++ b/code/datums/diseases/heart_failure.dm
@@ -37,7 +37,7 @@
to_chat(H, "You feel [pick("full", "nauseated", "sweaty", "weak", "tired", "short on breath", "uneasy")].")
if(3 to 4)
if(!sound)
- H.playsound_local(H, 'sound/health/slowbeat.ogg',40,0, channel = CHANNEL_HEARTBEAT)
+ H.playsound_local(H, 'sound/health/slowbeat.ogg', 40, FALSE, channel = CHANNEL_HEARTBEAT)
sound = TRUE
if(prob(3))
to_chat(H, "You feel a sharp pain in your chest!")
@@ -53,7 +53,7 @@
H.emote("cough")
if(5)
H.stop_sound_channel(CHANNEL_HEARTBEAT)
- H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, 0)
+ H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, FALSE)
if(H.stat == CONSCIOUS)
H.visible_message("[H] clutches at [H.p_their()] chest as if [H.p_their()] heart is stopping!")
H.adjustStaminaLoss(60)
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 44775ed031..8dca59ea94 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -121,7 +121,7 @@
add_monkey(affected_mob.mind)
if(ishuman(affected_mob))
var/mob/living/carbon/monkey/M = affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
- M.ventcrawler = VENTCRAWLER_ALWAYS
+ M.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/datum/disease/transformation/jungle_fever/stage_act()
diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm
index 602c93fab3..4a498b2ed8 100644
--- a/code/datums/elements/bed_tucking.dm
+++ b/code/datums/elements/bed_tucking.dm
@@ -57,4 +57,4 @@
tucked.transform = turn(tucked.transform, -rotation_degree)
- UnregisterSignal(tucked, COMSIG_ITEM_PICKUP)
\ No newline at end of file
+ UnregisterSignal(tucked, COMSIG_ITEM_PICKUP)
diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm
index d770e0f30d..619f674969 100644
--- a/code/datums/elements/mob_holder.dm
+++ b/code/datums/elements/mob_holder.dm
@@ -141,7 +141,7 @@
/obj/item/clothing/head/mob_holder/dropped(mob/user)
. = ..()
- if(held_mob && isturf(loc))//don't release on soft-drops
+ if(held_mob && !ismob(loc))//don't release on soft-drops
release()
/obj/item/clothing/head/mob_holder/proc/release()
diff --git a/code/datums/elements/ventcrawling.dm b/code/datums/elements/ventcrawling.dm
new file mode 100644
index 0000000000..254345a97f
--- /dev/null
+++ b/code/datums/elements/ventcrawling.dm
@@ -0,0 +1,36 @@
+/datum/element/ventcrawling
+ element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ id_arg_index = 2
+ var/tier
+
+/datum/element/ventcrawling/Attach(datum/target, duration = 0, given_tier = VENTCRAWLER_NUDE)
+ . = ..()
+
+ var/mob/living/person = target
+ if(!istype(person))
+ return FALSE
+
+ src.tier = given_tier
+
+ RegisterSignal(target, COMSIG_HANDLE_VENTCRAWL, .proc/handle_ventcrawl)
+ RegisterSignal(target, COMSIG_CHECK_VENTCRAWL, .proc/check_ventcrawl)
+ to_chat(target, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.")
+
+ if(duration!=0)
+ addtimer(CALLBACK(src, .proc/Detach, target), duration)
+
+/datum/element/ventcrawling/Detach(datum/target)
+ UnregisterSignal(target, list(COMSIG_HANDLE_VENTCRAWL, COMSIG_CHECK_VENTCRAWL))
+ to_chat(target, "You can no longer ventcrawl.")
+
+ return ..()
+
+/datum/element/ventcrawling/proc/handle_ventcrawl(datum/target,atom/A)
+ var/mob/living/person = target
+ if(!istype(person))
+ return FALSE
+
+ person.handle_ventcrawl(A,tier)
+
+/datum/element/ventcrawling/proc/check_ventcrawl()
+ return tier
diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm
index ca65186063..9a29158b33 100644
--- a/code/datums/explosion.dm
+++ b/code/datums/explosion.dm
@@ -33,6 +33,14 @@ GLOBAL_LIST_EMPTY(explosions)
EX_PREPROCESS_EXIT_CHECK\
}
+#define CREAK_DELAY 5 SECONDS //Time taken for the creak to play after explosion, if applicable.
+#define FAR_UPPER 60 //Upper limit for the far_volume, distance, clamped.
+#define FAR_LOWER 40 //lower limit for the far_volume, distance, clamped.
+#define PROB_SOUND 75 //The probability modifier for a sound to be an echo, or a far sound. (0-100)
+#define SHAKE_CLAMP 2.5 //The limit for how much the camera can shake for out of view booms.
+#define FREQ_UPPER 40 //The upper limit for the randomly selected frequency.
+#define FREQ_LOWER 25 //The lower of the above.
+
/datum/explosion/New(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog, ignorecap, flame_range, silent, smoke)
set waitfor = FALSE
@@ -89,7 +97,7 @@ GLOBAL_LIST_EMPTY(explosions)
if(adminlog)
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [ADMIN_VERBOSEJMP(epicenter)]")
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [loc_name(epicenter)]")
-
+
deadchat_broadcast("An explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) has occured at ([get_area(epicenter)])", turf_target = get_turf(epicenter))
var/x0 = epicenter.x
@@ -115,13 +123,14 @@ GLOBAL_LIST_EMPTY(explosions)
var/sound/creaking_explosion_sound = sound(get_sfx("explosion_creaking"))
var/sound/hull_creaking_sound = sound(get_sfx("hull_creaking"))
var/sound/explosion_echo_sound = sound('sound/effects/explosion_distant.ogg')
- var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION)
+ var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION)
var/creaking_explosion = FALSE
if(prob(devastation_range*30+heavy_impact_range*5) && on_station) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might.
creaking_explosion = TRUE // prob over 100 always returns true
- for(var/mob/M in GLOB.player_list)
+ for(var/MN in GLOB.player_list)
+ var/mob/M = MN
// Double check for client
var/turf/M_turf = get_turf(M)
if(M_turf && M_turf.z == z0)
@@ -131,15 +140,15 @@ GLOBAL_LIST_EMPTY(explosions)
baseshakeamount = sqrt((orig_max_distance - dist)*0.1)
// If inside the blast radius + world.view - 2
if(dist <= round(max_range + world.view - 2, 1))
- M.playsound_local(epicenter, null, 100, 1, frequency, falloff = 5, S = explosion_sound)
+ M.playsound_local(epicenter, null, 100, 1, frequency, S = explosion_sound)
if(baseshakeamount > 0)
shake_camera(M, 25, clamp(baseshakeamount, 0, 10))
// You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
else if(dist <= far_dist)
- var/far_volume = clamp(far_dist/2, 40, 60) // Volume is based on explosion size and dist
+ var/far_volume = clamp(far_dist/2, FAR_LOWER, FAR_UPPER) // Volume is based on explosion size and dist
if(creaking_explosion)
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = creaking_explosion_sound, distance_multiplier = 0)
- else if(prob(75))
+ else if(prob(PROB_SOUND)) // Sound variety during meteor storm/tesloose/other bad event
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = far_explosion_sound, distance_multiplier = 0) // Far sound
else
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0) // Echo sound
@@ -147,18 +156,18 @@ GLOBAL_LIST_EMPTY(explosions)
if(baseshakeamount > 0 || devastation_range)
if(!baseshakeamount) // Devastating explosions rock the station and ground
baseshakeamount = devastation_range*3
- shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5))
-
- else if(M.can_hear() && !isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull
+ shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, SHAKE_CLAMP))
+ else if(!isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull
var/echo_volume = 40
if(devastation_range)
baseshakeamount = devastation_range
- shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5))
+ shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, SHAKE_CLAMP))
echo_volume = 60
M.playsound_local(epicenter, null, echo_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0)
if(creaking_explosion) // 5 seconds after the bang, the station begins to creak
- addtimer(CALLBACK(M, /mob/proc/playsound_local, epicenter, null, rand(25, 40), 1, frequency, null, null, FALSE, hull_creaking_sound, null, null, null, null, 0), 5 SECONDS)
+ addtimer(CALLBACK(M, /mob/proc/playsound_local, epicenter, null, rand(FREQ_LOWER, FREQ_UPPER), 1, frequency, null, null, FALSE, hull_creaking_sound, 0), CREAK_DELAY)
+
EX_PREPROCESS_CHECK_TICK
//postpone processing for a bit
@@ -230,8 +239,13 @@ GLOBAL_LIST_EMPTY(explosions)
atoms += A
for(var/i in atoms)
var/atom/A = i
- if(!QDELETED(A))
- A.ex_act(dist)
+ if(QDELETED(A))
+ continue
+ A.ex_act(dist, null, src)
+ if(QDELETED(A) || !ismovable(A))
+ continue
+ var/atom/movable/AM = A
+ LAZYADD(AM.acted_explosions, explosion_id)
if(flame_dist && prob(40) && !isspaceturf(T) && !T.density)
new /obj/effect/hotspot(T) //Mostly for ambience!
@@ -316,6 +330,14 @@ GLOBAL_LIST_EMPTY(explosions)
++stopped
qdel(src)
+#undef CREAK_DELAY
+#undef FAR_UPPER
+#undef FAR_LOWER
+#undef PROB_SOUND
+#undef SHAKE_CLAMP
+#undef FREQ_UPPER
+#undef FREQ_LOWER
+
#undef EX_PREPROCESS_EXIT_CHECK
#undef EX_PREPROCESS_CHECK_TICK
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 4bf02e8587..c54f6c971a 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -237,7 +237,7 @@
/obj/item/disk/holodisk/Initialize(mapload)
. = ..()
if(preset_record_text)
- build_record()
+ INVOKE_ASYNC(src, .proc/build_record)
/obj/item/disk/holodisk/Destroy()
QDEL_NULL(record)
@@ -425,42 +425,42 @@
"}
/obj/item/disk/holodisk/ruin/snowengieruin
- name = "Blackbox Print-out #EB412"
- desc = "A holodisk containing the last moments of EB412. There's a bloody fingerprint on it."
- preset_image_type = /datum/preset_holoimage/engineer
- preset_record_text = {"
- NAME Dave Tundrale
- SAY Maria, how's Build?
- DELAY 10
- NAME Maria Dell
- PRESET /datum/preset_holoimage/engineer/atmos
- SAY It's fine, don't worry. I've got Plastic on it. And frankly, i'm kinda busy with, the, uhhm, incinerator.
- DELAY 30
- NAME Dave Tundrale
- PRESET /datum/preset_holoimage/engineer
- SAY Aight, wonderful. The science mans been kinda shit though. No RCDs-
- DELAY 20
- NAME Maria Dell
- PRESET /datum/preset_holoimage/engineer/atmos
- SAY Enough about your RCDs. They're not even that important, just bui-
- DELAY 15
- SOUND explosion
- DELAY 10
- SAY Oh, shit!
- DELAY 10
- PRESET /datum/preset_holoimage/engineer/atmos/rig
- LANGUAGE /datum/language/narsie
- NAME Unknown
- SAY RISE, MY LORD!!
- DELAY 10
- LANGUAGE /datum/language/common
- NAME Plastic
- PRESET /datum/preset_holoimage/engineer/rig
- SAY Fuck, fuck, fuck!
- DELAY 20
- SAY It's loose! CALL THE FUCKING SHUTT-
- DELAY 10
- PRESET /datum/preset_holoimage/corgi
- NAME Blackbox Automated Message
- SAY Connection lost. Dumping audio logs to disk.
- DELAY 50"}
+ name = "Blackbox Print-out #EB412"
+ desc = "A holodisk containing the last moments of EB412. There's a bloody fingerprint on it."
+ preset_image_type = /datum/preset_holoimage/engineer
+ preset_record_text = {"
+ NAME Dave Tundrale
+ SAY Maria, how's Build?
+ DELAY 10
+ NAME Maria Dell
+ PRESET /datum/preset_holoimage/engineer/atmos
+ SAY It's fine, don't worry. I've got Plastic on it. And frankly, i'm kinda busy with, the, uhhm, incinerator.
+ DELAY 30
+ NAME Dave Tundrale
+ PRESET /datum/preset_holoimage/engineer
+ SAY Aight, wonderful. The science mans been kinda shit though. No RCDs-
+ DELAY 20
+ NAME Maria Dell
+ PRESET /datum/preset_holoimage/engineer/atmos
+ SAY Enough about your RCDs. They're not even that important, just bui-
+ DELAY 15
+ SOUND explosion
+ DELAY 10
+ SAY Oh, shit!
+ DELAY 10
+ PRESET /datum/preset_holoimage/engineer/atmos/rig
+ LANGUAGE /datum/language/narsie
+ NAME Unknown
+ SAY RISE, MY LORD!!
+ DELAY 10
+ LANGUAGE /datum/language/common
+ NAME Plastic
+ PRESET /datum/preset_holoimage/engineer/rig
+ SAY Fuck, fuck, fuck!
+ DELAY 20
+ SAY It's loose! CALL THE FUCKING SHUTT-
+ DELAY 10
+ PRESET /datum/preset_holoimage/corgi
+ NAME Blackbox Automated Message
+ SAY Connection lost. Dumping audio logs to disk.
+ DELAY 50"}
diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm
index 8bee4f3d1c..6af3b3c993 100644
--- a/code/datums/looping_sounds/_looping_sound.dm
+++ b/code/datums/looping_sounds/_looping_sound.dm
@@ -18,8 +18,12 @@
var/list/atom/output_atoms
var/mid_sounds
var/mid_length
+ ///Override for volume of start sound
+ var/start_volume
var/start_sound
var/start_length
+ ///Override for volume of end sound
+ var/end_volume
var/end_sound
var/chance
var/volume = 100
@@ -27,10 +31,9 @@
var/max_loops
var/direct
var/extra_range = 0
- var/falloff
-
+ var/falloff_exponent
var/timerid
- var/init_timerid
+ var/falloff_distance
/datum/looping_sound/New(list/_output_atoms=list(), start_immediately=FALSE, _direct=FALSE)
if(!mid_sounds)
@@ -51,16 +54,13 @@
/datum/looping_sound/proc/start(atom/add_thing)
if(add_thing)
output_atoms |= add_thing
- if(timerid || init_timerid)
+ if(timerid)
return
on_start()
/datum/looping_sound/proc/stop(atom/remove_thing)
if(remove_thing)
output_atoms -= remove_thing
- if(init_timerid)
- deltimer(init_timerid)
- init_timerid = null
if(!timerid)
return
on_stop()
@@ -76,18 +76,18 @@
if(!timerid)
timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_LOOP)
-/datum/looping_sound/proc/play(soundfile)
+/datum/looping_sound/proc/play(soundfile, volume_override)
var/list/atoms_cache = output_atoms
var/sound/S = sound(soundfile)
if(direct)
S.channel = SSsounds.random_available_channel()
- S.volume = volume
+ S.volume = volume_override || volume //Use volume as fallback if theres no override
for(var/i in 1 to atoms_cache.len)
var/atom/thing = atoms_cache[i]
if(direct)
SEND_SOUND(thing, S)
else
- playsound(thing, S, volume, vary, extra_range, falloff)
+ playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance)
/datum/looping_sound/proc/get_sound(starttime, _mid_sounds)
. = _mid_sounds || mid_sounds
@@ -97,10 +97,10 @@
/datum/looping_sound/proc/on_start()
var/start_wait = 0
if(start_sound)
- play(start_sound)
+ play(start_sound, start_volume)
start_wait = start_length
- init_timerid = addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME | TIMER_STOPPABLE)
+ addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME)
/datum/looping_sound/proc/on_stop()
if(end_sound)
- play(end_sound)
+ play(end_sound, end_volume)
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index 4f6996bfdd..f7a3b46118 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -4,7 +4,7 @@
mid_sounds = list('sound/machines/shower/shower_mid1.ogg'=1,'sound/machines/shower/shower_mid2.ogg'=1,'sound/machines/shower/shower_mid3.ogg'=1)
mid_length = 10
end_sound = 'sound/machines/shower/shower_end.ogg'
- volume = 10
+ volume = 20
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -12,6 +12,28 @@
mid_sounds = list('sound/machines/sm/supermatter1.ogg'=1,'sound/machines/sm/supermatter2.ogg'=1,'sound/machines/sm/supermatter3.ogg'=1)
mid_length = 10
volume = 1
+ extra_range = 25
+ falloff_exponent = 10
+ falloff_distance = 5
+ vary = TRUE
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/destabilized_crystal
+ mid_sounds = list('sound/machines/sm/loops/delamming.ogg' = 1)
+ mid_length = 60
+ volume = 55
+ extra_range = 15
+ vary = TRUE
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// /datum/looping_sound/hypertorus
+// mid_sounds = list('sound/machines/hypertorus/loops/hypertorus_nominal.ogg' = 1)
+// mid_length = 60
+// volume = 55
+// extra_range = 15
+// vary = TRUE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -32,7 +54,22 @@
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
mid_length = 2
end_sound = 'sound/machines/fryer/deep_fryer_emerge.ogg'
- volume = 5
+ volume = 15
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+/datum/looping_sound/grill
+ mid_sounds = list('sound/machines/grill/grillsizzle.ogg' = 1)
+ mid_length = 18
+ volume = 50
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/deep_fryer
+ mid_length = 2
+ mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
+ volume = 30
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -46,9 +83,39 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-/datum/looping_sound/grill
- mid_length = 2
- mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
- volume = 10
+// /datum/looping_sound/jackpot
+// mid_length = 11
+// mid_sounds = list('sound/machines/roulettejackpot.ogg')
+// volume = 85
+// vary = TRUE
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/*
+/datum/looping_sound/server
+ mid_sounds = list('sound/machines/tcomms/tcomms_mid1.ogg'=1,'sound/machines/tcomms/tcomms_mid2.ogg'=1,'sound/machines/tcomms/tcomms_mid3.ogg'=1,'sound/machines/tcomms/tcomms_mid4.ogg'=1,\
+ 'sound/machines/tcomms/tcomms_mid5.ogg'=1,'sound/machines/tcomms/tcomms_mid6.ogg'=1,'sound/machines/tcomms/tcomms_mid7.ogg'=1)
+ mid_length = 1.8 SECONDS
+ extra_range = -11
+ falloff_distance = 1
+ falloff_exponent = 5
+ volume = 50
+*/
+// /datum/looping_sound/computer
+// start_sound = 'sound/machines/computer/computer_start.ogg'
+// start_length = 7.2 SECONDS
+// start_volume = 10
+// mid_sounds = list('sound/machines/computer/computer_mid1.ogg'=1, 'sound/machines/computer/computer_mid2.ogg'=1)
+// mid_length = 1.8 SECONDS
+// end_sound = 'sound/machines/computer/computer_end.ogg'
+// end_volume = 10
+// volume = 2
+// falloff_exponent = 5 //Ultra quiet very fast
+// extra_range = -12
+// falloff_distance = 1 //Instant falloff after initial tile
+
+// /datum/looping_sound/gravgen
+// mid_sounds = list('sound/machines/gravgen/gravgen_mid1.ogg'=1,'sound/machines/gravgen/gravgen_mid2.ogg'=1,'sound/machines/gravgen/gravgen_mid3.ogg'=1,'sound/machines/gravgen/gravgen_mid4.ogg'=1,)
+// mid_length = 1.8 SECONDS
+// extra_range = 10
+// volume = 70
+// falloff_distance = 5
+// falloff_exponent = 20
diff --git a/code/datums/skills/_skill_modifier.dm b/code/datums/skills/_skill_modifier.dm
index c38cbf23c6..fd8de29f28 100644
--- a/code/datums/skills/_skill_modifier.dm
+++ b/code/datums/skills/_skill_modifier.dm
@@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill)
if(!mod_L)
mod_L = GLOB.potential_mods_per_skill[target_skills] = list()
else
- BINARY_INSERT(identifier, mod_L, datum/skill_modifier, src, priority, COMPARE_VALUE)
+ BINARY_INSERT(identifier, mod_L, /datum/skill_modifier, src, priority, COMPARE_VALUE)
mod_L[identifier] = src
GLOB.potential_skills_per_mod[target_skills_key] = list(target_skills)
else //Should be a list.
@@ -66,7 +66,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill)
if(!mod_L)
mod_L = GLOB.potential_mods_per_skill[path] = list()
else
- BINARY_INSERT(identifier, mod_L, datum/skill_modifier, src, priority, COMPARE_VALUE)
+ BINARY_INSERT(identifier, mod_L, /datum/skill_modifier, src, priority, COMPARE_VALUE)
mod_L[identifier] = src
/datum/skill_modifier/Destroy()
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 19b12410bc..fe59bbe14a 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -887,7 +887,7 @@
L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
-datum/status_effect/pacify
+/datum/status_effect/pacify
id = "pacify"
status_type = STATUS_EFFECT_REPLACE
tick_interval = 1
diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm
index c6466fdd96..22a851da1d 100644
--- a/code/datums/traits/_quirk.dm
+++ b/code/datums/traits/_quirk.dm
@@ -11,6 +11,8 @@
var/antag_removal_text // Text will be given to the quirk holder if they get an antag that has it blacklisted.
var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled
var/mob_trait //if applicable, apply and remove this mob trait
+ /// should we immediately call on_spawn or add a timer to trigger
+ var/on_spawn_immediate = TRUE
var/mob/living/quirk_holder
/datum/quirk/New(mob/living/quirk_mob, spawn_effects)
@@ -26,7 +28,10 @@
START_PROCESSING(SSquirks, src)
add()
if(spawn_effects)
- on_spawn()
+ if(on_spawn_immediate)
+ on_spawn()
+ else
+ addtimer(CALLBACK(src, .proc/on_spawn), 0)
addtimer(CALLBACK(src, .proc/post_add), 30)
/datum/quirk/Destroy()
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 3cbf4b3cd2..cce138e82c 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -184,6 +184,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
gain_text = null // Handled by trauma.
lose_text = null
medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities."
+ on_spawn_immediate = FALSE
/datum/quirk/paraplegic/add()
var/datum/brain_trauma/severe/paralysis/paraplegic/T = new()
diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm
index d7c34da34a..a1746001b9 100644
--- a/code/game/alternate_appearance.dm
+++ b/code/game/alternate_appearance.dm
@@ -168,7 +168,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
return TRUE
return FALSE
-datum/atom_hud/alternate_appearance/basic/onePerson
+/datum/atom_hud/alternate_appearance/basic/onePerson
var/mob/seer
/datum/atom_hud/alternate_appearance/basic/onePerson/mobShouldSee(mob/M)
diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm
index 2c2cc46344..b2673c960e 100644
--- a/code/game/area/Space_Station_13_areas.dm
+++ b/code/game/area/Space_Station_13_areas.dm
@@ -45,6 +45,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
ambientsounds = SPACE
blob_allowed = FALSE //Eating up space doesn't count for victory as a blob.
considered_hull_exterior = TRUE
+ sound_environment = SOUND_AREA_SPACE
/area/space/nearstation
icon_state = "space_near"
@@ -70,6 +71,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
blob_allowed = FALSE //Nope, no winning on the asteroid as a blob. Gotta eat the station.
valid_territory = FALSE
ambientsounds = MINING
+ sound_environment = SOUND_AREA_ASTEROID
/area/asteroid/nearstation
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
@@ -107,7 +109,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/maintenance
ambientsounds = MAINTENANCE
valid_territory = FALSE
-
+ sound_environment = SOUND_AREA_TUNNEL_ENCLOSED
//Departments
@@ -122,6 +124,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/maintenance/department/crew_quarters/bar
name = "Bar Maintenance"
icon_state = "maint_bar"
+ sound_environment = SOUND_AREA_WOODFLOOR
/area/maintenance/department/crew_quarters/dorms
name = "Dormitory Maintenance"
@@ -265,6 +268,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/hallway
nightshift_public_area = NIGHTSHIFT_AREA_PUBLIC
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/hallway/primary/aft
name = "Aft Primary Hallway"
@@ -333,30 +337,36 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Bridge"
icon_state = "bridge"
music = "signal"
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/bridge/meeting_room
name = "Heads of Staff Meeting Room"
icon_state = "meeting"
music = null
+ sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
/area/bridge/meeting_room/council
name = "Council Chamber"
icon_state = "meeting"
music = null
+ sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
/area/bridge/showroom/corporate
name = "Corporate Showroom"
icon_state = "showroom"
music = null
+ sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
/area/crew_quarters/heads/captain
name = "Captain's Office"
icon_state = "captain"
clockwork_warp_allowed = FALSE
+ sound_environment = SOUND_AREA_WOODFLOOR
/area/crew_quarters/heads/captain/private
name = "Captain's Quarters"
icon_state = "captain"
+ sound_environment = SOUND_AREA_WOODFLOOR
/area/crew_quarters/heads/chief
name = "Chief Engineer's Office"
@@ -401,10 +411,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/comms
name = "Communications Relay"
icon_state = "tcomsatcham"
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/server
name = "Messaging Server Room"
icon_state = "server"
+ sound_environment = SOUND_AREA_STANDARD_STATION
//Crew
@@ -413,6 +425,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "Sleep"
safe = TRUE
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/crew_quarters/dorms/male
name = "Male Dorm"
@@ -431,6 +444,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters/toilet
name = "Dormitory Toilets"
icon_state = "toilet"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/crew_quarters/toilet/auxiliary
name = "Auxiliary Restrooms"
@@ -465,6 +479,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Lounge"
icon_state = "yellow"
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
/area/crew_quarters/arcade
name = "Arcade"
@@ -502,15 +517,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters/kitchen/backroom
name = "Kitchen Coldroom"
icon_state = "kitchen"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/crew_quarters/bar
name = "Bar"
icon_state = "bar"
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
+ sound_environment = SOUND_AREA_WOODFLOOR
/area/crew_quarters/bar/atrium
name = "Atrium"
icon_state = "bar"
+ sound_environment = SOUND_AREA_WOODFLOOR
/area/crew_quarters/electronic_marketing_den
name = "Electronic Marketing Den"
@@ -526,6 +544,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters/theatre
name = "Theatre"
icon_state = "Theatre"
+ sound_environment = SOUND_AREA_WOODFLOOR
/area/crew_quarters/theatre/abandoned
name = "Abandoned Theatre"
@@ -546,10 +565,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "library"
flags_1 = NONE
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
+ sound_environment = SOUND_AREA_LARGE_SOFTFLOOR
/area/library/lounge
name = "Library Lounge"
icon_state = "library"
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
/area/library/abandoned
name = "Abandoned Library"
@@ -564,6 +585,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
clockwork_warp_allowed = FALSE
clockwork_warp_fail = "The consecration here prevents you from warping in."
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
/area/chapel/main
name = "Chapel"
@@ -579,6 +601,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/chapel/asteroid
name = "Chapel Asteroid"
icon_state = "explored"
+ sound_environment = SOUND_AREA_ASTEROID
/area/chapel/asteroid/monastery
name = "Monastery Asteroid"
@@ -590,12 +613,14 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/lawoffice
name = "Law Office"
icon_state = "law"
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
//Engineering
/area/engine
ambientsounds = ENGINEERING
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
/area/engine/engine_smes
name = "Engineering SMES"
@@ -613,14 +638,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/engine/atmospherics_engine
name = "Atmospherics Engine"
icon_state = "atmos_engine"
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
/area/engine/supermatter
name = "Supermatter Engine"
icon_state = "engine_sm"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/engine/break_room
name = "Engineering Foyer"
icon_state = "engine_foyer"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/engine/gravity_generator
name = "Gravity Generator Room"
@@ -635,6 +663,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/engine/storage
name = "Engineering Storage"
icon_state = "engi_storage"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/engine/storage_shared
name = "Shared Engineering Storage"
@@ -654,10 +683,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
blob_allowed = FALSE
flags_1 = NONE
ambientsounds = ENGINEERING
+ sound_environment = SOUND_AREA_SPACE
/area/solar/fore
name = "Fore Solar Array"
icon_state = "yellow"
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/solar/aft
name = "Aft Solar Array"
@@ -763,6 +794,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "gateway"
music = "signal"
ambientsounds = ENGINEERING
+ sound_environment = SOUND_AREA_STANDARD_STATION
//MedBay
@@ -770,6 +802,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Medical"
icon_state = "medbay3"
ambientsounds = MEDICAL
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/medical/clinic
name = "Clinic"
@@ -780,6 +813,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Abandoned Medbay"
icon_state = "medbay3"
music = 'sound/ambience/signal.ogg'
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/medical/medbay/central
name = "Medbay Central"
@@ -821,6 +855,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/medical/patients_rooms
name = "Patients' Rooms"
icon_state = "patients"
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
/area/medical/patients_rooms/room_a
name = "Patient Room A"
@@ -839,6 +874,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Morgue"
icon_state = "morgue"
ambientsounds = SPOOKY
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/medical/chemistry
name = "Chemistry"
@@ -879,6 +915,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Security"
icon_state = "security"
ambientsounds = HIGHSEC
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/security/main
name = "Security Office"
@@ -891,6 +928,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/security/courtroom
name = "Courtroom"
icon_state = "courtroom"
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
/area/security/prison
name = "Prison Wing"
@@ -903,10 +941,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/security/processing/cremation
name = "Security Crematorium"
icon_state = "sec_prison"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/security/warden
name = "Brig Control"
icon_state = "Warden"
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
/area/security/armory
name = "Armory"
@@ -920,6 +960,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/security/detectives_office/private_investigators_office
name = "Private Investigator's Office"
icon_state = "detective"
+ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
/area/security/range
name = "Firing Range"
@@ -997,18 +1038,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/quartermaster
name = "Quartermasters"
icon_state = "quart"
-
-///////////WORK IN PROGRESS//////////
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/quartermaster/sorting
name = "Delivery Office"
icon_state = "cargo_delivery"
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/quartermaster/warehouse
name = "Warehouse"
icon_state = "cargo_warehouse"
-
-////////////WORK IN PROGRESS//////////
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
/area/quartermaster/office
name = "Cargo Office"
@@ -1017,6 +1057,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/quartermaster/storage
name = "Cargo Bay"
icon_state = "cargo_bay"
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
/area/quartermaster/qm
name = "Quartermaster's Office"
@@ -1046,6 +1087,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Custodial Closet"
icon_state = "janitor"
flags_1 = NONE
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/janitor/aux
name = "Auxiliary Custodial Closet"
@@ -1055,6 +1097,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/hydroponics
name = "Hydroponics"
icon_state = "hydro"
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/hydroponics/lobby
name = "Hydroponics Lobby"
@@ -1067,6 +1110,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/hydroponics/garden/abandoned
name = "Abandoned Garden"
icon_state = "abandoned_garden"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/hydroponics/garden/monastery
name = "Monastery Garden"
@@ -1077,6 +1121,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/science
name = "Science Division"
icon_state = "toxlab"
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/science/observatory
name = "Research Observatory"
@@ -1167,12 +1212,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/science/research/abandoned
name = "Abandoned Research Lab"
icon_state = "medresearch"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/science/nanite
name = "Nanite Lab"
icon_state = "toxmisc"
//Storage
+/area/storage
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/storage/tools
name = "Auxiliary Tool Storage"
@@ -1242,6 +1290,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Construction Area"
icon_state = "yellow"
ambientsounds = ENGINEERING
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/construction/minisat_exterior
name = "Minisat Exterior"
@@ -1250,6 +1299,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/construction/mining/aux_base
name = "Auxiliary Base Construction"
icon_state = "yellow"
+ sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
/area/construction/mining/aux_base/closet
name = "Auxiliary Closet Construction"
@@ -1305,6 +1355,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
//AI
+/area/ai_monitored
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/ai_monitored/security/armory
name = "Armory"
@@ -1329,10 +1381,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/ai_monitored/turret_protected/ai_upload
name = "AI Upload Chamber"
icon_state = "ai_upload"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/ai_monitored/turret_protected/ai_upload_foyer
name = "AI Upload Access"
icon_state = "ai_foyer"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
/area/ai_monitored/turret_protected/ai
name = "AI Chamber"
@@ -1341,6 +1395,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/ai_monitored/turret_protected/aisat
name = "AI Satellite"
icon_state = "ai"
+ sound_environment = SOUND_ENVIRONMENT_ROOM
/area/ai_monitored/turret_protected/aisat/atmos
name = "AI Satellite Atmos"
@@ -1365,6 +1420,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/ai_monitored/turret_protected/aisat_interior
name = "AI Satellite Antechamber"
icon_state = "ai"
+ sound_environment = SOUND_AREA_LARGE_ENCLOSED
/area/ai_monitored/turret_protected/AIsatextFP
name = "AI Sat Ext"
@@ -1418,6 +1474,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/tcommsat/computer
name = "Telecomms Control Room"
icon_state = "tcomsatcomp"
+ sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
/area/tcommsat/server
name = "Telecomms Server Room"
diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm
index 558a4b1026..48e77e1623 100644
--- a/code/game/area/ai_monitored.dm
+++ b/code/game/area/ai_monitored.dm
@@ -3,6 +3,7 @@
clockwork_warp_allowed = FALSE
var/list/obj/machinery/camera/motioncameras = list()
var/list/datum/weakref/motionTargets = list()
+ sound_environment = SOUND_ENVIRONMENT_ROOM
/area/ai_monitored/Initialize(mapload)
. = ..()
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index ff177898cb..4790d20f64 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -1,16 +1,72 @@
-// Areas.dm
-
-
+/**
+ * # area
+ *
+ * A grouping of tiles into a logical space, mostly used by map editors
+ */
/area
- level = null
name = "Space"
icon = 'icons/turf/areas.dmi'
icon_state = "unknown"
layer = AREA_LAYER
- plane = BLACKNESS_PLANE //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE.
+ //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE.
+ plane = BLACKNESS_PLANE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
invisibility = INVISIBILITY_LIGHTING
+ var/fire = null
+ ///Whether there is an atmos alarm in this area
+ var/atmosalm = FALSE
+ var/poweralm = FALSE
+ var/lightswitch = TRUE
+
+ /// All beauty in this area combined, only includes indoor area.
+ var/totalbeauty = 0
+ /// Beauty average per open turf in the area
+ var/beauty = 0
+ /// If a room is too big it doesn't have beauty.
+ var/beauty_threshold = 150
+
+ /// For space, the asteroid, lavaland, etc. Used with blueprints or with weather to determine if we are adding a new area (vs editing a station room)
+ var/outdoors = FALSE
+
+ /// Size of the area in open turfs, only calculated for indoors areas.
+ var/areasize = 0
+
+ /// Bonus mood for being in this area
+ var/mood_bonus = 0
+ /// Mood message for being here, only shows up if mood_bonus != 0
+ var/mood_message = "This area is pretty nice!\n"
+
+ ///Will objects this area be needing power?
+ var/requires_power = TRUE
+ /// This gets overridden to 1 for space in area/Initialize().
+ var/always_unpowered = FALSE
+
+ var/power_equip = TRUE
+ var/power_light = TRUE
+ var/power_environ = TRUE
+
+ var/has_gravity = FALSE
+
+ var/parallax_movedir = 0
+
+ var/list/ambientsounds = GENERIC
+ flags_1 = CAN_BE_DIRTY_1
+
+ var/list/firedoors
+ var/list/cameras
+ var/list/firealarms
+ var/firedoors_last_closed_on = 0
+
+
+ ///This datum, if set, allows terrain generation behavior to be ran on Initialize()
+ // var/datum/map_generator/map_generator
+
+ ///Used to decide what kind of reverb the area makes sound have
+ var/sound_environment = SOUND_ENVIRONMENT_NONE
+
+ /// CIT SPECIFIC VARS
+
/// Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints.
var/map_name
@@ -41,29 +97,8 @@
/// Considered space for hull shielding
var/considered_hull_exterior = FALSE
- var/fire = null
var/atmos = TRUE
- var/atmosalm = FALSE
- var/poweralm = TRUE
- var/lightswitch = TRUE
- var/totalbeauty = 0 //All beauty in this area combined, only includes indoor area.
- var/beauty = 0 // Beauty average per open turf in the area
- var/beauty_threshold = 150 //If a room is too big it doesn't have beauty.
-
- var/requires_power = TRUE
- /// This gets overridden to 1 for space in area/Initialize().
- var/always_unpowered = FALSE
-
- /// For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
- var/outdoors = FALSE
-
- /// Size of the area in open turfs, only calculated for indoors areas.
- var/areasize = 0
-
- var/power_equip = TRUE
- var/power_light = TRUE
- var/power_environ = TRUE
var/music = null
var/used_equip = 0
var/used_light = 0
@@ -72,7 +107,6 @@
var/static_light = 0
var/static_environ
- var/has_gravity = 0
/// Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
var/noteleport = FALSE
/// Hides area from player Teleport function.
@@ -84,15 +118,6 @@
var/no_air = null
- var/parallax_movedir = 0
-
- var/list/ambientsounds = GENERIC
- flags_1 = CAN_BE_DIRTY_1
-
- var/list/firedoors
- var/list/cameras
- var/list/firealarms
- var/firedoors_last_closed_on = 0
var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default?
var/list/canSmoothWithAreas //typecache to limit the areas that atoms in this area can smooth with
@@ -111,10 +136,24 @@
var/nightshift_public_area = NIGHTSHIFT_AREA_NONE //considered a public area for nightshift
-/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
-/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
+
+/**
+ * A list of teleport locations
+ *
+ * Adding a wizard area teleport list because motherfucking lag -- Urist
+ * I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game
+ */
GLOBAL_LIST_EMPTY(teleportlocs)
+/**
+ * Generate a list of turfs you can teleport to from the areas list
+ *
+ * Includes areas if they're not a shuttle or not not teleport or have no contents
+ *
+ * The chosen turf is the first item in the areas contents that is a station level
+ *
+ * The returned list of turfs is sorted by name
+ */
/proc/process_teleport_locs()
for(var/V in GLOB.sortedAreas)
var/area/AR = V
@@ -128,11 +167,19 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if (picked && is_station_level(picked.z))
GLOB.teleportlocs[AR.name] = AR
- sortTim(GLOB.teleportlocs, /proc/cmp_text_dsc)
-
-// ===
+ sortTim(GLOB.teleportlocs, /proc/cmp_text_asc)
+/**
+ * Called when an area loads
+ *
+ * Adds the item to the GLOB.areas_by_type list based on area type
+ */
/area/New()
+ // This interacts with the map loader, so it needs to be set immediately
+ // rather than waiting for atoms to initialize.
+ if (unique)
+ GLOB.areas_by_type[type] = src
+
if(!minimap_color) // goes in New() because otherwise it doesn't fucking work
// generate one using the icon_state
if(icon_state && icon_state != "unknown")
@@ -141,14 +188,18 @@ GLOBAL_LIST_EMPTY(teleportlocs)
minimap_color = I.GetPixel(1,1)
else // no icon state? use random.
minimap_color = rgb(rand(50,70),rand(50,70),rand(50,70)) // This interacts with the map loader, so it needs to be set immediately
- // rather than waiting for atoms to initialize.
- if (unique)
- GLOB.areas_by_type[type] = src
return ..()
+/**
+ * Initalize this area
+ *
+ * intializes the dynamic area lighting and also registers the area with the z level via
+ * reg_in_areas_in_z
+ *
+ * returns INITIALIZE_HINT_LATELOAD
+ */
/area/Initialize()
icon_state = ""
- layer = AREA_LAYER
map_name = name // Save the initial (the name set in the map) name of the area.
canSmoothWithAreas = typecacheof(canSmoothWithAreas)
@@ -202,29 +253,55 @@ GLOBAL_LIST_EMPTY(teleportlocs)
return INITIALIZE_HINT_LATELOAD
+/**
+ * Sets machine power levels in the area
+ */
/area/LateInitialize()
if(!base_area) //we don't want to run it twice.
power_change() // all machines set to current power level, also updates icon
update_beauty()
-/area/proc/reg_in_areas_in_z()
- if(contents.len)
- var/list/areas_in_z = SSmapping.areas_in_z
- var/z
- update_areasize()
- for(var/i in 1 to contents.len)
- var/atom/thing = contents[i]
- if(!thing)
- continue
- z = thing.z
- break
- if(!z)
- WARNING("No z found for [src]")
- return
- if(!areas_in_z["[z]"])
- areas_in_z["[z]"] = list()
- areas_in_z["[z]"] += src
+/// Soon ™
+/area/proc/RunGeneration()
+ // if(map_generator)
+ // map_generator = new map_generator()
+ // var/list/turfs = list()
+ // for(var/turf/T in contents)
+ // turfs += T
+ // map_generator.generate_terrain(turfs)
+/area/proc/test_gen()
+ // if(map_generator)
+ // var/list/turfs = list()
+ // for(var/turf/T in contents)
+ // turfs += T
+ // map_generator.generate_terrain(turfs)
+
+/**
+ * Register this area as belonging to a z level
+ *
+ * Ensures the item is added to the SSmapping.areas_in_z list for this z
+ */
+/area/proc/reg_in_areas_in_z()
+ if(!length(contents))
+ return
+ var/list/areas_in_z = SSmapping.areas_in_z
+ update_areasize()
+ if(!z)
+ WARNING("No z found for [src]")
+ return
+ if(!areas_in_z["[z]"])
+ areas_in_z["[z]"] = list()
+ areas_in_z["[z]"] += src
+
+/**
+ * Destroy an area and clean it up
+ *
+ * Removes the area from GLOB.areas_by_type and also stops it processing on SSobj
+ *
+ * This is despite the fact that no code appears to put it on SSobj, but
+ * who am I to argue with old coders
+ */
/area/Destroy()
if(GLOB.areas_by_type[type] == src)
GLOB.areas_by_type[type] = null
@@ -244,6 +321,11 @@ GLOBAL_LIST_EMPTY(teleportlocs)
STOP_PROCESSING(SSobj, src)
return ..()
+/**
+ * Generate a power alert for this area
+ *
+ * Sends to all ai players, alert consoles, drones and alarm monitor programs in the world
+ */
/area/proc/poweralert(state, obj/source)
if (state != poweralm)
poweralm = state
@@ -525,6 +607,13 @@ GLOBAL_LIST_EMPTY(teleportlocs)
used_environ += amount
+/**
+ * Call back when an atom enters an area
+ *
+ * Sends signals COMSIG_AREA_ENTERED and COMSIG_ENTER_AREA (to the atom)
+ *
+ * If the area has ambience, then it plays some ambience music to the ambience channel
+ */
/area/Entered(atom/movable/M, atom/OldLoc)
set waitfor = FALSE
SEND_SIGNAL(src, COMSIG_AREA_ENTERED, M)
@@ -567,6 +656,12 @@ GLOBAL_LIST_EMPTY(teleportlocs)
return FALSE //Too big
beauty = totalbeauty / areasize
+
+/**
+ * Called when an atom exits an area
+ *
+ * Sends signals COMSIG_AREA_EXITED and COMSIG_EXIT_AREA (to the atom)
+ */
/area/Exited(atom/movable/M)
SEND_SIGNAL(src, COMSIG_AREA_EXITED, M)
SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area
diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm
index 27a73ae5f1..63beaec412 100644
--- a/code/game/area/areas/away_content.dm
+++ b/code/game/area/areas/away_content.dm
@@ -9,6 +9,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30"
icon_state = "away"
has_gravity = STANDARD_GRAVITY
ambientsounds = AWAY_MISSION
+ sound_environment = SOUND_ENVIRONMENT_ROOM
/area/awaymission/beach
name = "Beach"
diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm
index 9eec00460a..c0819d29b9 100644
--- a/code/game/area/areas/holodeck.dm
+++ b/code/game/area/areas/holodeck.dm
@@ -4,6 +4,7 @@
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
flags_1 = 0
hidden = TRUE
+ sound_environment = SOUND_ENVIRONMENT_PADDED_CELL
var/obj/machinery/computer/holodeck/linked
var/restricted = 0 // if true, program goes on emag list
diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm
index 70e0910dde..520c7ba59f 100644
--- a/code/game/area/areas/mining.dm
+++ b/code/game/area/areas/mining.dm
@@ -19,6 +19,7 @@
flags_1 = NONE
ambientsounds = MINING
flora_allowed = FALSE
+ sound_environment = SOUND_AREA_STANDARD_STATION
/area/mine/unexplored
name = "Mine"
@@ -86,6 +87,7 @@
has_gravity = STANDARD_GRAVITY
flags_1 = NONE
flora_allowed = TRUE
+ sound_environment = SOUND_AREA_LAVALAND
/area/lavaland/surface
name = "Lavaland"
@@ -139,6 +141,7 @@
flags_1 = NONE
flora_allowed = TRUE
blob_allowed = FALSE
+ sound_environment = SOUND_AREA_ICEMOON
/area/icemoon/surface
name = "Icemoon"
diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm
index b97c3f0ef4..17ba4f7721 100644
--- a/code/game/area/areas/ruins/_ruins.dm
+++ b/code/game/area/areas/ruins/_ruins.dm
@@ -7,6 +7,7 @@
hidden = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
ambientsounds = RUINS
+ sound_environment = SOUND_ENVIRONMENT_STONEROOM
/area/ruin/unpowered
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index e7f8c63d4a..9a890ead75 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -12,6 +12,7 @@
icon_state = "shuttle"
// Loading the same shuttle map at a different time will produce distinct area instances.
unique = FALSE
+ sound_environment = SOUND_ENVIRONMENT_ROOM
/area/shuttle/Initialize()
if(!canSmoothWithAreas)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 7fbfe48f4e..1b64cca787 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1,12 +1,22 @@
+/**
+ * The base type for nearly all physical objects in SS13
+
+ * Lots and lots of functionality lives here, although in general we are striving to move
+ * as much as possible to the components/elements system
+ */
/atom
layer = TURF_LAYER
plane = GAME_PLANE
- var/level = 2
- var/article // If non-null, overrides a/an/some in all cases
+ appearance_flags = TILE_BOUND
+ var/level = 2
+ ///If non-null, overrides a/an/some in all cases
+ var/article
+
+ ///First atom flags var
var/flags_1 = NONE
+ ///Intearaction flags
var/interaction_flags_atom = NONE
- var/datum/reagents/reagents = null
var/flags_ricochet = NONE
@@ -15,35 +25,52 @@
///When a projectile ricochets off this atom, it deals the normal damage * this modifier to this atom
var/ricochet_damage_mod = 0.33
- //This atom's HUD (med/sec, etc) images. Associative list.
+ ///Reagents holder
+ var/datum/reagents/reagents = null
+
+ ///This atom's HUD (med/sec, etc) images. Associative list.
var/list/image/hud_list = null
- //HUD images that this atom can provide.
+ ///HUD images that this atom can provide.
var/list/hud_possible
- //Value used to increment ex_act() if reactionary_explosions is on
+ ///Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0
- var/list/atom_colours //used to store the different colors on an atom
- //its inherent color, the colored paint applied on it, special color effect etc...
+ /**
+ * used to store the different colors on an atom
+ *
+ * its inherent color, the colored paint applied on it, special color effect etc...
+ */
+ var/list/atom_colours
- var/list/remove_overlays // a very temporary list of overlays to remove
- var/list/add_overlays // a very temporary list of overlays to add
- var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays
- ///overlays managed by update_overlays() to prevent removing overlays that weren't added by the same proc
+ /// a very temporary list of overlays to remove
+ var/list/remove_overlays
+ /// a very temporary list of overlays to add
+ var/list/add_overlays
+
+ ///vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays
+ var/list/managed_vis_overlays
+ ///overlays managed by [update_overlays][/atom/proc/update_overlays] to prevent removing overlays that weren't added by the same proc
var/list/managed_overlays
+ ///Proximity monitor associated with this atom
var/datum/proximity_monitor/proximity_monitor
+ ///Last fingerprints to touch this atom
var/fingerprintslast
var/list/filter_data //For handling persistent filters
+ ///Price of an item in a vending machine, overriding the base vending machine price. Define in terms of paycheck defines as opposed to raw numbers.
var/custom_price
+ ///Price of an item in a vending machine, overriding the premium vending machine price. Define in terms of paycheck defines as opposed to raw numbers.
var/custom_premium_price
+ //List of datums orbiting this atom
var/datum/component/orbiter/orbiters
var/rad_flags = NONE // Will move to flags_1 when i can be arsed to
+ /// Radiation insulation types
var/rad_insulation = RAD_NO_INSULATION
///The custom materials this atom is made of, used by a lot of things like furniture, walls, and floors (if I finish the functionality, that is.)
@@ -72,6 +99,19 @@
///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
var/list/targeted_by
+ ///Reference to atom being orbited
+ var/atom/orbit_target
+
+/**
+ * Called when an atom is created in byond (built in engine proc)
+ *
+ * Not a lot happens here in SS13 code, as we offload most of the work to the
+ * [Intialization][/atom/proc/Initialize] proc, mostly we run the preloader
+ * if the preloader is being used and then call [InitAtom][/datum/controller/subsystem/atoms/proc/InitAtom] of which the ultimate
+ * result is that the Intialize proc is called.
+ *
+ * We also generate a tag here if the DF_USE_TAG flag is set on the atom
+ */
/atom/New(loc, ...)
//atom creation method that preloads variables at creation
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
@@ -87,24 +127,50 @@
//we were deleted
return
-//Called after New if the map is being loaded. mapload = TRUE
-//Called from base of New if the map is not being loaded. mapload = FALSE
-//This base must be called or derivatives must set initialized to TRUE
-//must not sleep
-//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE
-//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm
-
-//Note: the following functions don't call the base for optimization and must copypasta:
-// /turf/Initialize
-// /turf/open/space/Initialize
-
+/**
+ * The primary method that objects are setup in SS13 with
+ *
+ * we don't use New as we have better control over when this is called and we can choose
+ * to delay calls or hook other logic in and so forth
+ *
+ * During roundstart map parsing, atoms are queued for intialization in the base atom/New(),
+ * After the map has loaded, then Initalize is called on all atoms one by one. NB: this
+ * is also true for loading map templates as well, so they don't Initalize until all objects
+ * in the map file are parsed and present in the world
+ *
+ * If you're creating an object at any point after SSInit has run then this proc will be
+ * immediately be called from New.
+ *
+ * mapload: This parameter is true if the atom being loaded is either being intialized during
+ * the Atom subsystem intialization, or if the atom is being loaded from the map template.
+ * If the item is being created at runtime any time after the Atom subsystem is intialized then
+ * it's false.
+ *
+ * You must always call the parent of this proc, otherwise failures will occur as the item
+ * will not be seen as initalized (this can lead to all sorts of strange behaviour, like
+ * the item being completely unclickable)
+ *
+ * You must not sleep in this proc, or any subprocs
+ *
+ * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map
+ * there are no other arguments
+ *
+ * Must return an [initialization hint][INITIALIZE_HINT_NORMAL] or a runtime will occur.
+ *
+ * Note: the following functions don't call the base for optimization and must copypasta handling:
+ * * [/turf/proc/Initialize]
+ * * [/turf/open/space/proc/Initialize]
+ */
/atom/proc/Initialize(mapload, ...)
+ // SHOULD_NOT_SLEEP(TRUE)
+ SHOULD_CALL_PARENT(TRUE)
if(flags_1 & INITIALIZED_1)
stack_trace("Warning: [src]([type]) initialized multiple times!")
flags_1 |= INITIALIZED_1
if(loc)
SEND_SIGNAL(loc, COMSIG_ATOM_CREATED, src) /// Sends a signal that the new atom `src`, has been created at `loc`
+
//atom color stuff
if(color)
add_atom_colour(color, FIXED_COLOUR_PRIORITY)
@@ -126,14 +192,34 @@
return INITIALIZE_HINT_NORMAL
-//called if Initialize returns INITIALIZE_HINT_LATELOAD
+/**
+ * Late Intialization, for code that should run after all atoms have run Intialization
+ *
+ * To have your LateIntialize proc be called, your atoms [Initalization][/atom/proc/Initialize]
+ * proc must return the hint
+ * [INITIALIZE_HINT_LATELOAD] otherwise you will never be called.
+ *
+ * useful for doing things like finding other machines on GLOB.machines because you can guarantee
+ * that all atoms will actually exist in the "WORLD" at this time and that all their Intialization
+ * code has been run
+ */
/atom/proc/LateInitialize()
- return
+ set waitfor = FALSE
-// Put your AddComponent() calls here
+/// Put your [AddComponent] calls here
/atom/proc/ComponentInitialize()
return
+/**
+ * Top level of the destroy chain for most atoms
+ *
+ * Cleans up the following:
+ * * Removes alternate apperances from huds that see them
+ * * qdels the reagent holder from atoms if it exists
+ * * clears the orbiters list
+ * * clears overlays and priority overlays
+ * * clears the light object
+ */
/atom/Destroy()
if(alternate_appearances)
for(var/K in alternate_appearances)
@@ -143,6 +229,8 @@
if(reagents)
qdel(reagents)
+ orbiters = null // The component is attached to us normaly and will be deleted elsewhere
+
LAZYCLEARLIST(overlays)
for(var/i in targeted_by)
@@ -179,6 +267,16 @@
/atom/proc/CanPass(atom/movable/mover, turf/target)
return !density
+/**
+ * Is this atom currently located on centcom
+ *
+ * Specifically, is it on the z level and within the centcom areas
+ *
+ * You can also be in a shuttleshuttle during endgame transit
+ *
+ * Used in gamemode to identify mobs who have escaped and for some other areas of the code
+ * who don't want atoms where they shouldn't be
+ */
/atom/proc/onCentCom()
var/turf/T = get_turf(src)
if(!T)
@@ -209,6 +307,13 @@
if(T in shuttle_area)
return TRUE
+/**
+ * Is the atom in any of the centcom syndicate areas
+ *
+ * Either in the syndie base on centcom, or any of their shuttles
+ *
+ * Also used in gamemode code for win conditions
+ */
/atom/proc/onSyndieBase()
var/turf/T = get_turf(src)
if(!T)
@@ -222,6 +327,23 @@
return FALSE
+/**
+ * Is the atom in an away mission
+ *
+ * Must be in the away mission z-level to return TRUE
+ *
+ * Also used in gamemode code for win conditions
+ */
+/atom/proc/onAwayMission()
+ var/turf/T = get_turf(src)
+ if(!T)
+ return FALSE
+
+ if(is_away_level(T.z))
+ return TRUE
+
+ return FALSE
+
/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
if(does_attack_animation)
@@ -415,7 +537,7 @@
/// Updates the overlays of the atom
/atom/proc/update_overlays()
- SHOULD_CALL_PARENT(1)
+ SHOULD_CALL_PARENT(TRUE)
. = list()
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .)
@@ -429,7 +551,7 @@
/atom/proc/contents_explosion(severity, target)
return //For handling the effects of explosions on contents that would not normally be effected
-/atom/proc/ex_act(severity, target)
+/atom/proc/ex_act(severity, target, datum/explosion/E)
set waitfor = FALSE
contents_explosion(severity, target)
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 4715c3bed3..a582fa03e4 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1,5 +1,7 @@
/atom/movable
layer = OBJ_LAYER
+ glide_size = 8
+ SET_APPEARANCE_FLAGS(TILE_BOUND | PIXEL_SCALE)
var/last_move = null
var/last_move_time = 0
var/anchored = FALSE
@@ -28,10 +30,15 @@
var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before.
var/list/client_mobs_in_contents // This contains all the client mobs within this container
var/list/acted_explosions //for explosion dodging
- glide_size = 8
- appearance_flags = TILE_BOUND|PIXEL_SCALE
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
- var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc.
+
+ /**
+ * In case you have multiple types, you automatically use the most useful one.
+ * IE: Skating on ice, flippers on water, flying over chasm/space, etc.
+ * I reccomend you use the movetype_handler system and not modify this directly, especially for living mobs.
+ */
+ var/movement_type = GROUND
+
var/atom/movable/pulling
var/grab_state = 0
var/throwforce = 0
@@ -59,6 +66,42 @@
em_block = new(src, render_target)
vis_contents += em_block
+
+/atom/movable/Destroy(force)
+ QDEL_NULL(proximity_monitor)
+ QDEL_NULL(language_holder)
+ QDEL_NULL(em_block)
+
+ unbuckle_all_mobs(force = TRUE)
+
+ if(loc)
+ //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary)
+ if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc))
+ CanAtmosPass = ATMOS_PASS_YES
+ air_update_turf(TRUE)
+ loc.handle_atom_del(src)
+
+ // if(opacity)
+ // RemoveElement(/datum/element/light_blocking)
+
+ invisibility = INVISIBILITY_ABSTRACT
+
+ if(pulledby)
+ pulledby.stop_pulling()
+
+ if(orbiting)
+ orbiting.end_orbit(src)
+ orbiting = null
+
+ . = ..()
+
+ for(var/movable_content in contents)
+ qdel(movable_content)
+
+ LAZYCLEARLIST(client_mobs_in_contents)
+
+ moveToNullspace()
+
/atom/movable/proc/update_emissive_block()
if(blocks_emissive != EMISSIVE_BLOCK_GENERIC)
return
@@ -113,40 +156,52 @@
return FALSE
return T.zPassOut(src, direction, destination) && destination.zPassIn(src, direction, T)
-/atom/movable/vv_edit_var(var_name, var_value)
- var/static/list/banned_edits = list("step_x", "step_y", "step_size")
- var/static/list/careful_edits = list("bound_x", "bound_y", "bound_width", "bound_height")
- if(var_name in banned_edits)
+/atom/movable/vv_edit_var(var_name, var_value, massedit)
+ var/static/list/banned_edits = list("step_x" = TRUE, "step_y" = TRUE, "step_size" = TRUE, "bounds" = TRUE)
+ var/static/list/careful_edits = list("bound_x" = TRUE, "bound_y" = TRUE, "bound_width" = TRUE, "bound_height" = TRUE)
+ if(banned_edits[var_name])
return FALSE //PLEASE no.
- if((var_name in careful_edits) && (var_value % world.icon_size) != 0)
+ if((careful_edits[var_name]) && (var_value % world.icon_size) != 0)
return FALSE
+
switch(var_name)
if(NAMEOF(src, x))
var/turf/T = locate(var_value, y, z)
if(T)
- forceMove(T)
+ admin_teleport(T, !massedit)
return TRUE
return FALSE
if(NAMEOF(src, y))
var/turf/T = locate(x, var_value, z)
if(T)
- forceMove(T)
+ admin_teleport(T, !massedit)
return TRUE
return FALSE
if(NAMEOF(src, z))
var/turf/T = locate(x, y, var_value)
if(T)
- forceMove(T)
+ admin_teleport(T, !massedit)
return TRUE
return FALSE
if(NAMEOF(src, loc))
- if(istype(var_value, /atom))
- forceMove(var_value)
- return TRUE
- else if(isnull(var_value))
- moveToNullspace()
+ if(isatom(var_value) || isnull(var_value))
+ admin_teleport(var_value, !massedit)
return TRUE
return FALSE
+ if(NAMEOF(src, anchored))
+ set_anchored(var_value)
+ . = TRUE
+ if(NAMEOF(src, pulledby))
+ set_pulledby(var_value)
+ . = TRUE
+ if(NAMEOF(src, glide_size))
+ set_glide_size(var_value)
+ . = TRUE
+
+ if(!isnull(.))
+ datum_flags |= DF_VAR_EDITED
+ return
+
return ..()
/atom/movable/proc/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
@@ -168,48 +223,73 @@
AMob.grabbedby(src)
return TRUE
stop_pulling()
+
+ // SEND_SIGNAL(src, COMSIG_ATOM_START_PULL, AM, state, force)
+
if(AM.pulledby)
log_combat(AM, AM.pulledby, "pulled from", src)
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
pulling = AM
- AM.pulledby = src
+ AM.set_pulledby(src)
setGrabState(state)
if(ismob(AM))
var/mob/M = AM
log_combat(src, M, "grabbed", addition="passive grab")
if(!supress_message)
- visible_message("[src] has grabbed [M] passively!")
+ M.visible_message("[src] grabs [M] passively.", \
+ "[src] grabs you passively.")
return TRUE
/atom/movable/proc/stop_pulling()
if(!pulling)
return
- pulling.pulledby = null
+ pulling.set_pulledby(null)
var/mob/living/ex_pulled = pulling
+ setGrabState(GRAB_PASSIVE)
pulling = null
- setGrabState(0)
if(isliving(ex_pulled))
var/mob/living/L = ex_pulled
L.update_mobility()// mob gets up if it was lyng down in a chokehold
+///Reports the event of the change in value of the pulledby variable.
+/atom/movable/proc/set_pulledby(new_pulledby)
+ if(new_pulledby == pulledby)
+ return FALSE //null signals there was a change, be sure to return FALSE if none happened here.
+ . = pulledby
+ pulledby = new_pulledby
+
/atom/movable/proc/Move_Pulled(atom/A)
if(!pulling)
- return
+ return FALSE
if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src))
stop_pulling()
- return
+ return FALSE
if(isliving(pulling))
var/mob/living/L = pulling
if(L.buckled && L.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it
stop_pulling()
- return
+ return FALSE
if(A == loc && pulling.density)
- return
- if(!Process_Spacemove(get_dir(pulling.loc, A)))
- return
- step(pulling, get_dir(pulling.loc, A))
+ return FALSE
+ var/move_dir = get_dir(pulling.loc, A)
+ if(!Process_Spacemove(move_dir))
+ return FALSE
+ pulling.Move(get_step(pulling.loc, move_dir), move_dir, glide_size)
return TRUE
+/**
+ * Recursively set glide size for atom's pulled things
+ */
+/atom/movable/proc/recursive_pulled_glidesize_update()
+ var/list/ran = list()
+ var/atom/movable/updating = pulling
+ while(updating)
+ if(ran[updating])
+ return
+ updating.set_glide_size(glide_size, FALSE)
+ ran[updating] = TRUE
+ updating = updating.pulling
+
/atom/movable/proc/check_pulling()
if(pulling)
var/atom/movable/pullee = pulling
@@ -229,54 +309,57 @@
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move.
pulledby.stop_pulling()
-/atom/movable/Destroy(force)
- QDEL_NULL(proximity_monitor)
- QDEL_NULL(language_holder)
- QDEL_NULL(em_block)
+/atom/movable/proc/set_glide_size(target = 8, recursive = TRUE)
+#ifdef SMOOTH_MOVEMENT
+ // SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target)
+ glide_size = target
- unbuckle_all_mobs(force=1)
+ for(var/m in buckled_mobs)
+ var/mob/buckled_mob = m
+ buckled_mob.set_glide_size(target)
- . = ..()
+ if(recursive)
+ recursive_pulled_glidesize_update()
+#else
+ return
+#endif
- if(loc)
- //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary)
- if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc))
- CanAtmosPass = ATMOS_PASS_YES
- air_update_turf(TRUE)
- loc.handle_atom_del(src)
- for(var/atom/movable/AM in contents)
- qdel(AM)
- moveToNullspace()
- invisibility = INVISIBILITY_ABSTRACT
- if(pulledby)
- pulledby.stop_pulling()
-
- if(orbiting)
- orbiting.end_orbit(src)
- orbiting = null
+///Sets the anchored var and returns if it was sucessfully changed or not.
+/atom/movable/proc/set_anchored(anchorvalue)
+ SHOULD_CALL_PARENT(TRUE)
+ if(anchored == anchorvalue)
+ return
+ . = anchored
+ anchored = anchorvalue
+ // SEND_SIGNAL(src, COMSIG_MOVABLE_SET_ANCHORED, anchorvalue)
/atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- set waitfor = 0
+ set waitfor = FALSE
var/hitpush = TRUE
var/impact_signal = SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
if(impact_signal & COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH)
hitpush = FALSE // hacky, tie this to something else or a proper workaround later
- if(impact_signal & ~COMPONENT_MOVABLE_IMPACT_NEVERMIND) // in case a signal interceptor broke or deleted the thing before we could process our hit
- return hit_atom.hitby(src, throwingdatum = throwingdatum, hitpush = hitpush)
+ if(!(impact_signal && (impact_signal & COMPONENT_MOVABLE_IMPACT_NEVERMIND))) // in case a signal interceptor broke or deleted the thing before we could process our hit
+ return hit_atom.hitby(src, throwingdatum=throwingdatum, hitpush=hitpush)
/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum)
if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO))))
step(src, AM.dir)
..()
-/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, messy_throw = TRUE)
+/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE)
if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY))
return
- return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, messy_throw)
+ return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, gentle)
-/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, messy_throw = TRUE) //If this returns FALSE then callback will not be called.
+///If this returns FALSE then callback will not be called.
+/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE, quickstart = TRUE)
. = FALSE
+
+ if(QDELETED(src))
+ CRASH("Qdeleted thing being thrown around.")
+
if (!target || speed <= 0)
return
@@ -288,7 +371,7 @@
//They are moving! Wouldn't it be cool if we calculated their momentum and added it to the throw?
if (thrower && thrower.last_move && thrower.client && thrower.client.move_delay >= world.time + world.tick_lag*2)
- var/user_momentum = thrower.movement_delay()
+ var/user_momentum = thrower.movement_delay() //cached_multiplicative_slowdown
if (!user_momentum) //no movement_delay, this means they move once per byond tick, lets calculate from that instead.
user_momentum = world.tick_lag
@@ -312,19 +395,13 @@
. = TRUE // No failure conditions past this point.
- var/datum/thrownthing/TT = new()
- TT.thrownthing = src
- TT.target = target
- TT.target_turf = get_turf(target)
- TT.init_dir = get_dir(src, target)
- TT.maxrange = range
- TT.speed = speed
- TT.thrower = thrower
- TT.diagonals_first = diagonals_first
- TT.force = force
- TT.callback = callback
- if(!QDELETED(thrower))
- TT.target_zone = thrower.zone_selected
+ var/target_zone
+ if(QDELETED(thrower))
+ thrower = null //Let's not pass a qdeleting reference if any.
+ else
+ target_zone = thrower.zone_selected
+
+ var/datum/thrownthing/TT = new(src, target, get_turf(target), get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone)
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
@@ -359,7 +436,8 @@
SSthrowing.processing[src] = TT
if (SSthrowing.state == SS_PAUSED && length(SSthrowing.currentrun))
SSthrowing.currentrun[src] = TT
- TT.tick()
+ if (quickstart)
+ TT.tick()
/atom/movable/proc/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
return FALSE
@@ -382,13 +460,13 @@
return TRUE
return ..()
-// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called.
-/atom/movable/proc/on_exit_storage(datum/component/storage/concrete/S)
- return
+/// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called.
+/atom/movable/proc/on_exit_storage(datum/component/storage/concrete/S) // rename S to master_storage
+ // SEND_SIGNAL(src, COMSIG_STORAGE_EXITED, master_storage)
-// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item.
+/// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item.
/atom/movable/proc/on_enter_storage(datum/component/storage/concrete/S)
- return
+ // SEND_SIGNAL(src, COMSIG_STORAGE_ENTERED, master_storage)
/atom/movable/proc/get_spacemove_backup()
var/atom/movable/dense_object_backup
@@ -422,24 +500,26 @@
return //don't do an animation if attacking self
var/pixel_x_diff = 0
var/pixel_y_diff = 0
+ var/turn_dir = 1
var/direction = get_dir(src, A)
if(direction & NORTH)
pixel_y_diff = 8
+ turn_dir = prob(50) ? -1 : 1
else if(direction & SOUTH)
pixel_y_diff = -8
+ turn_dir = prob(50) ? -1 : 1
if(direction & EAST)
pixel_x_diff = 8
else if(direction & WEST)
pixel_x_diff = -8
+ turn_dir = -1
- var/matrix/OM = matrix(transform)
- var/matrix/M = matrix(transform)
- M.Turn(pixel_x_diff ? pixel_x_diff*2 : pick(-16, 16))
-
- animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform = M, time = 2)
- animate(src, pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, transform = OM, time = 2)
+ var/matrix/initial_transform = matrix(transform)
+ var/matrix/rotated_transform = transform.Turn(15 * turn_dir)
+ animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform=rotated_transform, time = 1, easing=BACK_EASING|EASE_IN)
+ animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, transform=initial_transform, time = 2, easing=SINE_EASING)
/atom/movable/proc/do_item_attack_animation(atom/A, visual_effect_icon, obj/item/used_item)
var/image/I
@@ -450,21 +530,21 @@
I.plane = GAME_PLANE
// Scale the icon.
- I.transform *= 0.75
+ I.transform *= 0.4
// The icon should not rotate.
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
// Set the direction of the icon animation.
var/direction = get_dir(src, A)
if(direction & NORTH)
- I.pixel_y = -16
+ I.pixel_y = -12
else if(direction & SOUTH)
- I.pixel_y = 16
+ I.pixel_y = 12
if(direction & EAST)
- I.pixel_x = -16
+ I.pixel_x = -14
else if(direction & WEST)
- I.pixel_x = 16
+ I.pixel_x = 14
if(!direction) // Attacked self?!
I.pixel_z = 16
@@ -472,10 +552,12 @@
if(!I)
return
- flick_overlay(I, GLOB.clients, 5) // 5 ticks/half a second
+ flick_overlay(I, GLOB.clients, 10)
// And animate the attack!
- animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
+ animate(I, alpha = 175, transform = matrix() * 0.75, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
+ animate(time = 1)
+ animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT)
/atom/movable/vv_get_dropdown()
. = ..()
@@ -492,19 +574,17 @@
return TRUE
//TODO: Better floating
-/atom/movable/proc/float(on)
- if(throwing)
+/atom/movable/proc/float(on, throw_override)
+ if(throwing || !throw_override)
return
- if(on && (!(movement_type & FLOATING) || floating_need_update))
- animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
- sleep(10)
- animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
- if(!(movement_type & FLOATING))
- setMovetype(movement_type | FLOATING)
- else if (!on && movement_type & FLOATING)
+ if(on && !(movement_type & FLOATING))
+ animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
+ animate(pixel_y = -2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
+ setMovetype(movement_type | FLOATING)
+ else if (!on && (movement_type & FLOATING))
animate(src, pixel_y = initial(pixel_y), time = 10)
setMovetype(movement_type & ~FLOATING)
- floating_need_update = FALSE
+ floating_need_update = FALSE // assume it's done
/* Language procs
* Unless you are doing something very specific, these are the ones you want to use.
@@ -611,10 +691,32 @@
return FALSE
return TRUE
-/// Updates the grab state of the movable
-/// This exists to act as a hook for behaviour
+/**
+ * Updates the grab state of the movable
+ *
+ * This exists to act as a hook for behaviour
+ */
/atom/movable/proc/setGrabState(newstate)
+ if(newstate == grab_state)
+ return
+ // SEND_SIGNAL(src, COMSIG_MOVABLE_SET_GRAB_STATE, newstate)
+ . = grab_state
grab_state = newstate
+ // switch(grab_state) // Current state.
+ // if(GRAB_PASSIVE)
+ // REMOVE_TRAIT(pulling, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT)
+ // REMOVE_TRAIT(pulling, TRAIT_HANDS_BLOCKED, CHOKEHOLD_TRAIT)
+ // if(. >= GRAB_NECK) // Previous state was a a neck-grab or higher.
+ // REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT)
+ // if(GRAB_AGGRESSIVE)
+ // if(. >= GRAB_NECK) // Grab got downgraded.
+ // REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT)
+ // else // Grab got upgraded from a passive one.
+ // ADD_TRAIT(pulling, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT)
+ // ADD_TRAIT(pulling, TRAIT_HANDS_BLOCKED, CHOKEHOLD_TRAIT)
+ // if(GRAB_NECK, GRAB_KILL)
+ // if(. <= GRAB_AGGRESSIVE)
+ // ADD_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT)
/obj/item/proc/do_pickup_animation(atom/target)
set waitfor = FALSE
@@ -626,31 +728,24 @@
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
var/turf/T = get_turf(src)
var/direction
- var/to_x = 0
- var/to_y = 0
+ var/to_x = initial(target.pixel_x)
+ var/to_y = initial(target.pixel_y)
if(!QDELETED(T) && !QDELETED(target))
direction = get_dir(T, target)
if(direction & NORTH)
- to_y = 32
+ to_y += 32
else if(direction & SOUTH)
- to_y = -32
+ to_y -= 32
if(direction & EAST)
- to_x = 32
+ to_x += 32
else if(direction & WEST)
- to_x = -32
+ to_x -= 32
if(!direction)
- to_y = 16
+ to_y += 16
flick_overlay(I, GLOB.clients, 6)
var/matrix/M = new
M.Turn(pick(-30, 30))
animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING)
sleep(1)
animate(I, alpha = 0, transform = matrix(), time = 1)
-
-/atom/movable/proc/set_anchored(anchorvalue) //literally only for plumbing ran
- SHOULD_CALL_PARENT(TRUE)
- if(anchored == anchorvalue)
- return
- . = anchored
- anchored = anchorvalue
diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm
index db9424d983..4f07ff6f95 100644
--- a/code/game/atoms_movement.dm
+++ b/code/game/atoms_movement.dm
@@ -5,8 +5,7 @@
// Here's where we rewrite how byond handles movement except slightly different
// To be removed on step_ conversion
// All this work to prevent a second bump
-/atom/movable/Move(atom/newloc, direct=0)
- set waitfor = FALSE //n o
+/atom/movable/Move(atom/newloc, direct=0, glide_size_override = 0)
. = FALSE
if(!newloc || newloc == loc)
return
@@ -52,8 +51,7 @@
//
////////////////////////////////////////
-/atom/movable/Move(atom/newloc, direct)
- set waitfor = FALSE //n o
+/atom/movable/Move(atom/newloc, direct, glide_size_override = 0)
var/atom/movable/pullee = pulling
var/turf/T = loc
if(!moving_from_pull)
@@ -61,6 +59,9 @@
if(!loc || !newloc)
return FALSE
var/atom/oldloc = loc
+ //Early override for some cases like diagonal movement
+ if(glide_size_override)
+ set_glide_size(glide_size_override, FALSE)
if(loc != newloc)
if (!(direct & (direct - 1))) //Cardinal move
@@ -120,32 +121,38 @@
return
if(!loc || (loc == oldloc && oldloc != newloc))
- last_move = NONE
+ last_move = 0
return
+ setDir(direct)
if(.)
- last_move = direct
- setDir(direct)
-
- if(has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s)
- return FALSE
-
- if(pulling && pulling == pullee && pulling != moving_from_pull) //we were pulling a thing and didn't lose it during our move.
- if(pulling.anchored)
- stop_pulling()
- else
- var/pull_dir = get_dir(src, pulling)
- //puller and pullee more than one tile away or in diagonal position
- if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir)))
- pulling.moving_from_pull = src
- pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position
- pulling.moving_from_pull = null
Moved(oldloc, direct)
+ if(. && pulling && pulling == pullee && pulling != moving_from_pull) //we were pulling a thing and didn't lose it during our move.
+ if(pulling.anchored)
+ stop_pulling()
+ else
+ var/pull_dir = get_dir(src, pulling)
+ //puller and pullee more than one tile away or in diagonal position
+ if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir)))
+ pulling.moving_from_pull = src
+ pulling.Move(T, get_dir(pulling, T), glide_size) //the pullee tries to reach our previous position
+ pulling.moving_from_pull = null
+ check_pulling()
-/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
+
+ //glide_size strangely enough can change mid movement animation and update correctly while the animation is playing
+ //This means that if you don't override it late like this, it will just be set back by the movement update that's called when you move turfs.
+ if(glide_size_override)
+ set_glide_size(glide_size_override, FALSE)
+
+ last_move = direct
+ if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, glide_size_override)) //movement failed due to buckled mob(s)
+ return FALSE
+
+/atom/movable/proc/handle_buckled_mob_movement(newloc, direct, glide_size_override)
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
- if(!buckled_mob.Move(newloc, direct))
+ if(!buckled_mob.Move(newloc, direct, glide_size_override))
forceMove(buckled_mob.loc)
last_move = buckled_mob.last_move
inertia_dir = last_move
@@ -155,6 +162,7 @@
//Called after a successful Move(). By this point, we've already moved
/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE)
+ SHOULD_CALL_PARENT(TRUE)
SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced)
if (!inertia_moving)
inertia_next_move = world.time + inertia_move_delay
@@ -174,6 +182,8 @@
//oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called!
/atom/movable/Crossed(atom/movable/AM, oldloc)
+ // SHOULD_CALL_PARENT(TRUE)
+ . = ..()
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM)
/atom/movable/Uncross(atom/movable/AM, atom/newloc)
@@ -204,7 +214,11 @@
var/atom/movable/AM = item
AM.onTransitZ(old_z,new_z)
+///Proc to modify the movement_type and hook behavior associated with it changing.
/atom/movable/proc/setMovetype(newval)
+ if(movement_type == newval)
+ return
+ . = movement_type
movement_type = newval
///////////// FORCED MOVEMENT /////////////
@@ -268,37 +282,44 @@
old_area.Exited(src, null)
loc = null
-//Called whenever an object moves and by mobs when they attempt to move themselves through space
-//And when an object or action applies a force on src, see newtonian_move() below
-//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting
-//Mobs should return 1 if they should be able to move of their own volition, see client/Move() in mob_movement.dm
-//movement_dir == 0 when stopping or any dir when trying to move
+/**
+ * Called whenever an object moves and by mobs when they attempt to move themselves through space
+ * And when an object or action applies a force on src, see [newtonian_move][/atom/movable/proc/newtonian_move]
+ *
+ * Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting
+ *
+ * Mobs should return 1 if they should be able to move of their own volition, see [/client/proc/Move]
+ *
+ * Arguments:
+ * * movement_dir - 0 when stopping or any dir when trying to move
+ */
/atom/movable/proc/Process_Spacemove(movement_dir = 0)
if(has_gravity(src))
- return 1
+ return TRUE
- if(pulledby)
- return 1
+ if(pulledby && (pulledby.pulledby != src || moving_from_pull))
+ return TRUE
if(throwing)
- return 1
+ return TRUE
if(!isturf(loc))
- return 1
+ return TRUE
if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier
- return 1
+ return TRUE
- return 0
+ return FALSE
-/atom/movable/proc/newtonian_move(direction) //Only moves the object if it's under no gravity
- if(!loc || Process_Spacemove(0))
+/// Only moves the object if it's under no gravity
+/atom/movable/proc/newtonian_move(direction)
+ if(!isturf(loc) || Process_Spacemove(0))
inertia_dir = 0
- return 0
+ return FALSE
inertia_dir = direction
if(!direction)
- return 1
+ return TRUE
inertia_last_loc = loc
SSspacedrift.processing[src] = src
- return 1
+ return TRUE
diff --git a/code/game/gamemodes/gangs/gang_items.dm b/code/game/gamemodes/gangs/gang_items.dm
index 7d6ecd00f6..d1cf006600 100644
--- a/code/game/gamemodes/gangs/gang_items.dm
+++ b/code/game/gamemodes/gangs/gang_items.dm
@@ -133,7 +133,7 @@
icon_state = "knuckles"
w_class = 3
-datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang member anyways?
+/datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang member anyways?
name = "Cool Sunglasses"
id = "glasses"
cost = 5
@@ -313,13 +313,13 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m
permeability_coefficient = 0.01
clothing_flags = NOSLIP
-datum/gang_item/equipment/shield
+/datum/gang_item/equipment/shield
name = "Riot Shield"
id = "riot_shield"
cost = 25
item_path = /obj/item/shield/riot
-datum/gang_item/equipment/gangsheild
+/datum/gang_item/equipment/gangsheild
name = "Tower Shield"
id = "metal"
cost = 45 //High block of melee and even higher for bullets
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index d8617e0b48..0ee07951a9 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -455,7 +455,7 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo.
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
var/target_missing_id
-/datum/objective/escape/escape_with_identity/find_target()
+/datum/objective/escape/escape_with_identity/find_target(dupe_search_range, blacklist)
target = ..()
update_explanation_text()
@@ -553,7 +553,7 @@ GLOBAL_LIST_EMPTY(possible_items)
for(var/I in subtypesof(/datum/objective_item/steal))
new I
-/datum/objective/steal/find_target()
+/datum/objective/steal/find_target(dupe_search_range, blacklist)
var/list/datum/mind/owners = get_owners()
var/approved_targets = list()
check_items:
@@ -631,7 +631,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
for(var/I in subtypesof(/datum/objective_item/special) + subtypesof(/datum/objective_item/stack))
new I
-/datum/objective/steal/special/find_target()
+/datum/objective/steal/special/find_target(dupe_search_range, blacklist)
return set_target(pick(GLOB.possible_items_special))
/datum/objective/steal/exchange
@@ -844,7 +844,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
name = "destroy AI"
martyr_compatible = 1
-/datum/objective/destroy/find_target()
+/datum/objective/destroy/find_target(dupe_search_range, blacklist)
var/list/possible_targets = active_ais(1)
var/mob/living/silicon/ai/target_ai = pick(possible_targets)
target = target_ai.mind
@@ -1124,7 +1124,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
/datum/objective/hoard/heirloom
name = "steal heirloom"
-/datum/objective/hoard/heirloom/find_target()
+/datum/objective/hoard/heirloom/find_target(dupe_search_range, blacklist)
set_target(pick(GLOB.family_heirlooms))
GLOBAL_LIST_EMPTY(traitor_contraband)
@@ -1141,7 +1141,7 @@ GLOBAL_LIST_EMPTY(cult_contraband)
if(!GLOB.cult_contraband.len)
GLOB.cult_contraband = list(/obj/item/clockwork/slab,/obj/item/clockwork/component/belligerent_eye,/obj/item/clockwork/component/belligerent_eye/lens_gem,/obj/item/shuttle_curse,/obj/item/cult_shift)
-/datum/objective/hoard/collector/find_target()
+/datum/objective/hoard/collector/find_target(dupe_search_range, blacklist)
var/obj/item/I
var/I_type
if(prob(50))
@@ -1172,7 +1172,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages)
for(var/I in subtypesof(/datum/sabotage_objective))
new I
-/datum/objective/sabotage/find_target()
+/datum/objective/sabotage/find_target(dupe_search_range, blacklist)
var/list/datum/mind/owners = get_owners()
var/approved_targets = list()
check_sabotages:
diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm
index e515f56196..af5093d6ca 100644
--- a/code/game/machinery/camera/motion.dm
+++ b/code/game/machinery/camera/motion.dm
@@ -109,4 +109,4 @@
else if (world.time > detectTime)
detectTime = 0
for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines)
- TV.notify(FALSE)
\ No newline at end of file
+ TV.notify(FALSE)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index effd70e9ab..25445f0d1c 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -10,7 +10,7 @@
circuit = /obj/item/circuitboard/machine/cell_charger
pass_flags = PASSTABLE
var/obj/item/stock_parts/cell/charging = null
- var/charge_rate = 500
+ var/recharge_coeff = 1
/obj/machinery/cell_charger/update_overlays()
. += ..()
@@ -28,9 +28,10 @@
. = ..()
. += "There's [charging ? "a" : "no"] cell in the charger."
if(charging)
- . += "Current charge: [round(charging.percent(), 1)]%."
+ var/obj/item/stock_parts/cell/C = charging.get_cell()
+ . += "Current charge: [C.percent()]%."
if(in_range(user, src) || isobserver(user))
- . += "The status display reads: Charge rate at [charge_rate]J per cycle."
+ . += "The status display reads: Charge rate at [recharge_coeff*10]J per cycle."
/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/cell) && !panel_open)
@@ -122,17 +123,18 @@
charging.emp_act(severity)
/obj/machinery/cell_charger/RefreshParts()
- charge_rate = 500
for(var/obj/item/stock_parts/capacitor/C in component_parts)
- charge_rate *= C.rating
+ recharge_coeff = C.rating
/obj/machinery/cell_charger/process()
if(!charging || !anchored || (stat & (BROKEN|NOPOWER)))
return
- if(charging.percent() >= 100)
- return
- use_power(charge_rate)
- charging.give(charge_rate) //this is 2558, efficient batteries exist
+ if(charging)
+ var/obj/item/stock_parts/cell/C = charging.get_cell()
+ if(C)
+ if(C.charge < C.maxcharge)
+ C.give(C.chargerate * recharge_coeff)
+ use_power(250 * recharge_coeff)
update_icon()
diff --git a/code/game/machinery/colormate.dm b/code/game/machinery/colormate.dm
index b4306d49a4..1f1c16248c 100644
--- a/code/game/machinery/colormate.dm
+++ b/code/game/machinery/colormate.dm
@@ -6,10 +6,12 @@
density = TRUE
anchored = TRUE
circuit = /obj/item/circuitboard/machine/colormate
- var/obj/item/inserted
+ var/atom/movable/inserted
var/activecolor = "#FFFFFF"
var/list/color_matrix_last
var/matrix_mode = FALSE
+ /// Allow holder'd mobs
+ var/allow_mobs = TRUE
/// Minimum lightness for normal mode
var/minimum_normal_lightness = 50
/// Minimum lightness for matrix mode, tested using 4 test colors of full red, green, blue, white.
@@ -57,11 +59,22 @@
return
if(user.a_intent == INTENT_HARM)
return ..()
+ if(allow_mobs && istype(I, /obj/item/clothing/head/mob_holder))
+ var/obj/item/clothing/head/mob_holder/H = I
+ var/mob/victim = H.held_mob
+ if(!user.transferItemToLoc(I, src))
+ to_chat(user, "[I] is stuck to your hand!")
+ return
+ if(!QDELETED(H))
+ H.release()
+ insert_mob(victim, user)
if(is_type_in_list(I, allowed_types) && is_operational())
if(!user.transferItemToLoc(I, src))
to_chat(user, "[I] is stuck to your hand!")
return
+ if(QDELETED(I))
+ return
user.visible_message("[user] inserts [I] into [src]'s receptable.")
inserted = I
@@ -69,9 +82,22 @@
else
return ..()
+/obj/machinery/gear_painter/proc/insert_mob(mob/victim, mob/user)
+ if(inserted)
+ return
+ if(user)
+ visible_message("[user] stuffs [victim] into [src]!")
+ inserted = victim
+ inserted.forceMove(src)
+
/obj/machinery/gear_painter/AllowDrop()
return FALSE
+/obj/machinery/gear_painter/handle_atom_del(atom/movable/AM)
+ if(AM == inserted)
+ inserted = null
+ return ..()
+
/obj/machinery/gear_painter/AltClick(mob/user)
. = ..()
if(!user.CanReach(src))
diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm
index 5a0f0e9acf..96f224f4cf 100644
--- a/code/game/machinery/computer/arcade/battle.dm
+++ b/code/game/machinery/computer/arcade/battle.dm
@@ -60,7 +60,7 @@
blocked = TRUE
var/attackamt = rand(2,6)
temp = "You attack for [attackamt] damage!"
- playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
updateUsrDialog()
if(turtle > 0)
turtle--
@@ -74,7 +74,7 @@
var/pointamt = rand(1,3)
var/healamt = rand(6,8)
temp = "You use [pointamt] magic to heal for [healamt] damage!"
- playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
updateUsrDialog()
turtle++
@@ -89,7 +89,7 @@
blocked = TRUE
var/chargeamt = rand(4,7)
temp = "You regain [chargeamt] points"
- playsound(loc, 'sound/arcade/mana.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3)
player_mp += chargeamt
if(turtle > 0)
turtle--
@@ -124,7 +124,7 @@
if(!gameover)
gameover = TRUE
temp = "[enemy_name] has fallen! Rejoice!"
- playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3)
if(obj_flags & EMAGGED)
new /obj/effect/spawner/newbomb/timer/syndicate(loc)
@@ -141,13 +141,13 @@
else if ((obj_flags & EMAGGED) && (turtle >= 4))
var/boomamt = rand(5,10)
temp = "[enemy_name] throws a bomb, exploding you for [boomamt] damage!"
- playsound(loc, 'sound/arcade/boom.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/boom.ogg', 50, TRUE, extrarange = -3)
player_hp -= boomamt
else if ((enemy_mp <= 5) && (prob(70)))
var/stealamt = rand(2,3)
temp = "[enemy_name] steals [stealamt] of your power!"
- playsound(loc, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3)
player_mp -= stealamt
updateUsrDialog()
@@ -155,27 +155,27 @@
gameover = TRUE
sleep(turn_speed)
temp = "You have been drained! GAME OVER"
- playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3)
if(obj_flags & EMAGGED)
usr.gib()
SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "mana", (obj_flags & EMAGGED ? "emagged":"normal")))
else if ((enemy_hp <= 10) && (enemy_mp > 4))
temp = "[enemy_name] heals for 4 health!"
- playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
enemy_hp += 4
enemy_mp -= 4
else
var/attackamt = rand(3,6)
temp = "[enemy_name] attacks for [attackamt] damage!"
- playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
player_hp -= attackamt
if ((player_mp <= 0) || (player_hp <= 0))
gameover = TRUE
temp = "You have been crushed! GAME OVER"
- playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3)
if(obj_flags & EMAGGED)
usr.gib()
SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (obj_flags & EMAGGED ? "emagged":"normal")))
diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm
index a9c9b5dfd9..3f7ef778b0 100644
--- a/code/game/machinery/computer/arcade/minesweeper.dm
+++ b/code/game/machinery/computer/arcade/minesweeper.dm
@@ -78,7 +78,7 @@
columns = 0
mine_placed = 0
if(href_list["Easy"])
- playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
+ playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
flag_text = "OFF"
game_status = MINESWEEPER_GAME_PLAYING
reset_board = TRUE
@@ -87,7 +87,7 @@
columns = 10
mine_limit = 10
if(href_list["Intermediate"])
- playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
+ playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
flag_text = "OFF"
game_status = MINESWEEPER_GAME_PLAYING
reset_board = TRUE
@@ -96,7 +96,7 @@
columns = 17
mine_limit = 40
if(href_list["Hard"])
- playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
+ playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
flag_text = "OFF"
game_status = MINESWEEPER_GAME_PLAYING
reset_board = TRUE
@@ -110,9 +110,9 @@
game_status = MINESWEEPER_GAME_PLAYING
reset_board = TRUE
difficulty = "Custom"
- playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
+ playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
if(href_list["Flag"])
- playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
if(!flagging)
flagging = TRUE
flag_text = "ON"
@@ -122,10 +122,10 @@
if(game_status == MINESWEEPER_GAME_MAIN_MENU)
if(CHECK_BITFIELD(obj_flags, EMAGGED))
- playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, 0, extrarange = -3, falloff = 10)
+ playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, FALSE, extrarange = -3)
web += "Explode in the game, explode in real life! What difficulty do you want to play?
"
if(islist(gear.restricted_roles))
if(gear.restricted_roles.len)
@@ -929,14 +933,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += gear.restricted_roles.Join(";")
dat += ""
if(!istype(gear, /datum/gear/unlockable))
- dat += "
[gear.description]
"
+ // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description"
+ dat += "
"
else
//we add the user's progress to the description assuming they have progress
var/datum/gear/unlockable/unlockable = gear
var/progress_made = unlockable_loadout_data[unlockable.progress_key]
if(!progress_made)
progress_made = 0
- dat += "
"
dat += ""
if(4) // Content preferences
@@ -2700,7 +2705,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
loadout_data["SAVE_[loadout_slot]"] += list(new_loadout_data) //double packed because it does the union of the CONTENTS of the lists
else
loadout_data["SAVE_[loadout_slot]"] = list(new_loadout_data) //double packed because you somehow had no save slot in your loadout?
- if(href_list["loadout_color"])
+
+ if(href_list["loadout_color"] || href_list["loadout_color_polychromic"] || href_list["loadout_rename"] || href_list["loadout_redescribe"])
+ //if the gear doesn't exist, or they don't have it, ignore the request
var/name = html_decode(href_list["loadout_gear_name"])
var/datum/gear/G = GLOB.loadout_items[gear_category][gear_subcategory][name]
if(!G)
@@ -2708,29 +2715,44 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/user_gear = has_loadout_gear(loadout_slot, "[G.type]")
if(!user_gear)
return
- if(!length(user_gear[LOADOUT_COLOR]))
- user_gear[LOADOUT_COLOR] = list("#FFFFFF")
- var/current_color = user_gear[LOADOUT_COLOR][1]
- var/new_color = input(user, "Polychromic options", "Choose Color", current_color) as color|null
- user_gear[LOADOUT_COLOR][1] = sanitize_hexcolor(new_color, 6, TRUE, current_color)
- if(href_list["loadout_color_polychromic"])
- var/name = html_decode(href_list["loadout_gear_name"])
- var/datum/gear/G = GLOB.loadout_items[gear_category][gear_subcategory][name]
- if(!G)
- return
- var/user_gear = has_loadout_gear(loadout_slot, "[G.type]")
- if(!user_gear)
- return
- var/list/color_options = list()
- for(var/i=1, i<=length(G.loadout_initial_colors), i++)
- color_options += "Color [i]"
- var/color_to_change = input(user, "Polychromic options", "Recolor [name]") as null|anything in color_options
- if(color_to_change)
- var/color_index = text2num(copytext(color_to_change, 7))
- var/current_color = user_gear[LOADOUT_COLOR][color_index]
- var/new_color = input(user, "Polychromic options", "Choose [color_to_change] Color", current_color) as color|null
- if(new_color)
- user_gear[LOADOUT_COLOR][color_index] = sanitize_hexcolor(new_color, 6, TRUE, current_color)
+
+ //possible requests: recolor, recolor (polychromic), rename, redescribe
+ //always make sure the gear allows said request before proceeding
+
+ //non-poly coloring can only be done by non-poly items
+ if(href_list["loadout_color"] && !(G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC))
+ if(!length(user_gear[LOADOUT_COLOR]))
+ user_gear[LOADOUT_COLOR] = list("#FFFFFF")
+ var/current_color = user_gear[LOADOUT_COLOR][1]
+ var/new_color = input(user, "Polychromic options", "Choose Color", current_color) as color|null
+ user_gear[LOADOUT_COLOR][1] = sanitize_hexcolor(new_color, 6, TRUE, current_color)
+
+ //poly coloring can only be done by poly items
+ if(href_list["loadout_color_polychromic"] && (G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC))
+ var/list/color_options = list()
+ for(var/i=1, i<=length(G.loadout_initial_colors), i++)
+ color_options += "Color [i]"
+ var/color_to_change = input(user, "Polychromic options", "Recolor [name]") as null|anything in color_options
+ if(color_to_change)
+ var/color_index = text2num(copytext(color_to_change, 7))
+ var/current_color = user_gear[LOADOUT_COLOR][color_index]
+ var/new_color = input(user, "Polychromic options", "Choose [color_to_change] Color", current_color) as color|null
+ if(new_color)
+ user_gear[LOADOUT_COLOR][color_index] = sanitize_hexcolor(new_color, 6, TRUE, current_color)
+
+ //both renaming and redescribing strip the input to stop html injection
+
+ //renaming is only allowed if it has the flag for it
+ if(href_list["loadout_rename"] && (G.loadout_flags & LOADOUT_CAN_NAME))
+ var/new_name = stripped_input(user, "Enter new name for item. Maximum [MAX_NAME_LEN] characters.", "Loadout Item Naming", null, MAX_NAME_LEN)
+ if(new_name)
+ user_gear[LOADOUT_CUSTOM_NAME] = new_name
+
+ //redescribing is only allowed if it has the flag for it
+ if(href_list["loadout_redescribe"] && (G.loadout_flags & LOADOUT_CAN_DESCRIPTION)) //redescribe isnt a real word but i can't think of the right term to use
+ var/new_description = stripped_input(user, "Enter new description for item. Maximum 500 characters.", "Loadout Item Redescribing", null, 500)
+ if(new_description)
+ user_gear[LOADOUT_CUSTOM_DESCRIPTION] = new_description
ShowChoices(user)
return 1
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index af55c6b9d7..c069649848 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -36,7 +36,7 @@
/obj/item/clothing/gloves/fingerless/pugilist/equipped(mob/user, slot)
. = ..()
- if(current_equipped_slot == SLOT_GLOVES)
+ if(slot == SLOT_GLOVES)
use_buffs(user, TRUE)
wornonce = TRUE
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 15a5345ad1..525db577e0 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -17,7 +17,7 @@
/obj/item/clothing/mask/gas/examine(mob/user)
. = ..()
if(flavor_adjust)
- . += "Alt-click to toggle identity concealment. it's currently [flags_inv & HIDEFACE ? "on" : "off"]."
+ . += "Alt-click to toggle identity concealment. It's currently [flags_inv & HIDEFACE ? "on" : "off"]."
/obj/item/clothing/mask/gas/AltClick(mob/user)
. = ..()
@@ -143,14 +143,17 @@
"Blanc" = image(icon = src.icon, icon_state = "mime"),
"Excité" = image(icon = src.icon, icon_state = "sexymime"),
"Triste" = image(icon = src.icon, icon_state = "sadmime"),
- "Effrayé" = image(icon = src.icon, icon_state = "scaredmime")
+ "Effrayé" = image(icon = src.icon, icon_state = "scaredmime"),
+ "Timid Woman" = image(icon = src.icon, icon_state = "timidwoman"),
+ "Timid Man" = image(icon = src.icon, icon_state = "timidman")
)
/obj/item/clothing/mask/gas/mime/ui_action_click(mob/user)
if(!istype(user) || user.incapacitated())
return
- var/static/list/options = list("Blanc" = "mime", "Triste" = "sadmime", "Effrayé" = "scaredmime", "Excité" ="sexymime")
+ var/static/list/options = list("Blanc" = "mime", "Triste" = "sadmime", "Effrayé" = "scaredmime", "Excité" ="sexymime",
+ "Timid Woman" = "timidwoman", "Timid Man" = "timidman")
var/choice = show_radial_menu(user,src, mimemask_designs, custom_check = FALSE, radius = 36, require_near = TRUE)
@@ -170,6 +173,20 @@
item_state = "sexymime"
actions_types = list()
+/obj/item/clothing/mask/gas/timidcostume
+ name = "timid woman mask"
+ desc = "Most people who wear these are not really that timid."
+ clothing_flags = ALLOWINTERNALS
+ icon_state = "timidwoman"
+ item_state = "timidwoman"
+ flags_cover = MASKCOVERSEYES
+ resistance_flags = FLAMMABLE
+
+/obj/item/clothing/mask/gas/timidcostume/man
+ name = "timid man mask"
+ icon_state = "timidman"
+ item_state = "timidman"
+
/obj/item/clothing/mask/gas/monkeymask
name = "monkey mask"
desc = "A mask used when acting as a monkey."
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 5dd35788f1..fc4185f207 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -33,6 +33,16 @@
actions_types = list(/datum/action/item_action/adjust)
mutantrace_variation = STYLE_MUZZLE
+/obj/item/clothing/mask/surgical/aesthetic
+ name = "aesthetic sterile mask"
+ desc = "A sterile mask designed to help prevent the spread of diseases. This one doesn't seem like it does a whole lot, somehow."
+ flags_inv = HIDEFACE
+ flags_cover = null
+ visor_flags_inv = null
+ visor_flags_cover = null
+ permeability_coefficient = 1
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+
/obj/item/clothing/mask/surgical/attack_self(mob/user)
adjustmask(user)
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 51a526d089..b0af7aa0d5 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -237,6 +237,12 @@
icon_state = "choker"
poly_colors = list("#222222")
+/obj/item/clothing/neck/necklace/cowbell
+ name = "cowbell collar"
+ desc = "Who would wear this? Take this off, you aren't a cow, you're just an awful degenerate."
+ icon = 'icons/obj/clothing/neck.dmi'
+ icon_state = "cowbell"
+
/obj/item/key/collar
name = "Collar Key"
desc = "A key for a tiny lock on a collar or bag."
@@ -289,7 +295,7 @@
//VERY SUPER BADASS NECKERCHIEFS//
//////////////////////////////////
-obj/item/clothing/neck/neckerchief
+/obj/item/clothing/neck/neckerchief
icon = 'icons/obj/clothing/masks.dmi' //In order to reuse the bandana sprite
w_class = WEIGHT_CLASS_TINY
var/sourceBandanaType
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index b0d760ebd9..d99d52666b 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -413,6 +413,22 @@
var/wallcharges = 4
var/newlocobject = null
+/obj/item/clothing/shoes/timidcostume
+ name = "timid woman boots"
+ desc = "Ready to rock your hips back and forth? These boots have a polychromic finish."
+ icon_state = "timidwoman"
+ item_state = "timidwoman"
+
+/obj/item/clothing/shoes/timidcostume/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#0094FF"), 1)
+
+/obj/item/clothing/shoes/timidcostume/man
+ name = "timid man shoes"
+ desc = "Ready to go kart racing? These shoes have a polychromic finish."
+ icon_state = "timidman"
+ item_state = "timidman"
+
/obj/item/clothing/shoes/wallwalkers/equipped(mob/user,slot)
. = ..()
if(slot == SLOT_SHOES)
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index c7d5a4ea56..a27d82a544 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -55,7 +55,7 @@
/obj/item/clothing/suit/toggle/labcoat/virologist
name = "virologist labcoat"
- desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder."
+ desc = "A suit that protects against minor chemical spills. Has a green stripe on the shoulder."
icon_state = "labcoat_vir"
/obj/item/clothing/suit/toggle/labcoat/science
@@ -63,6 +63,11 @@
desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder."
icon_state = "labcoat_tox"
+/obj/item/clothing/suit/toggle/labcoat/roboticist
+ name = "roboticist labcoat"
+ desc = "More like an eccentric coat than a labcoat. Helps pass off bloodstains as part of the aesthetic. Comes with red shoulder pads."
+ icon_state = "labcoat_robo"
+
// Departmental Jackets
/obj/item/clothing/suit/toggle/labcoat/depjacket
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 6dfcd72c10..a47d55bfcb 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -1088,6 +1088,36 @@
icon_state = "winterhood_poly"
item_state = "winterhood_poly"
+/obj/item/clothing/suit/hooded/wintercoat/timidcostume
+ name = "timid woman hoodie"
+ desc = "A snug, tight yet warm outfit with belts wrapped around it. Looks to be made of polychromic materials."
+ icon_state = "timidwoman"
+ item_state = "timidwoman"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/timidcostume
+
+/obj/item/clothing/suit/hooded/wintercoat/timidcostume/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#EB0C07", "#5E2400", "#CEA100"), 3)
+
+/obj/item/clothing/head/hooded/winterhood/timidcostume
+ name = "timid woman hood"
+ desc = "A hood attached to the hoodie."
+ icon_state = "timidwoman"
+ item_state = "timidwoman"
+
+/obj/item/clothing/suit/hooded/wintercoat/timidcostume/man
+ name = "timid man hoodie"
+ desc = "A snug, tight yet warm outfit a belt wrapped around it. Looks to be made of polychromic materials."
+ icon_state = "timidman"
+ item_state = "timidman"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/timidcostume/man
+
+/obj/item/clothing/head/hooded/winterhood/timidcostume/man
+ name = "timid man hood"
+ icon_state = "timidman"
+ item_state = "timidman"
+
+
/obj/item/clothing/suit/striped_sweater
name = "striped sweater"
desc = "Reminds you of someone, but you just can't put your finger on it..."
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index f496468371..aa22834670 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -58,6 +58,12 @@
RemoveHood()
/obj/item/clothing/suit/hooded/proc/ToggleHood()
+ if(!hood)
+ to_chat(loc, "[src] seems to be missing its hood..")
+ return
+ if(atom_colours)
+ hood.atom_colours = atom_colours.Copy()
+ hood.update_atom_colour()
if(!suittoggled)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
@@ -191,7 +197,11 @@
if(!helmettype)
return
if(!helmet)
+ to_chat(H, "[src] seems to be missing its helmet..")
return
+ if(atom_colours)
+ helmet.atom_colours = atom_colours.Copy()
+ helmet.update_atom_colour()
if(!suittoggled)
if(ishuman(src.loc))
if(H.wear_suit != src)
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index ee7e4c48e1..7f28b88ad6 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -79,13 +79,175 @@
if(initial(above_suit))
. += "\The [src] can be worn above or below your suit. Alt-click to toggle."
+//////////////
+//Waistcoats//
+//////////////
+
/obj/item/clothing/accessory/waistcoat
- name = "waistcoat"
+ name = "black waistcoat"
desc = "For some classy, murderous fun."
icon_state = "waistcoat"
item_state = "waistcoat"
minimize_when_attached = FALSE
+/obj/item/clothing/accessory/waistcoat/red
+ name = "red waistcoat"
+ icon_state = "waistcoat_red"
+ item_state = "waistcoat_red"
+
+/obj/item/clothing/accessory/waistcoat/grey
+ name = "grey waistcoat"
+ icon_state = "waistcoat_grey"
+ item_state = "waistcoat_grey"
+
+/obj/item/clothing/accessory/waistcoat/brown
+ name = "red waistcoat"
+ icon_state = "waistcoat_brown"
+ item_state = "waistcoat_brown"
+
+/obj/item/clothing/accessory/waistcoat/sweatervest
+ name = "black sweatervest"
+ icon_state = "sweatervest"
+ item_state = "sweatervest"
+
+/obj/item/clothing/accessory/waistcoat/sweatervest/blue
+ name = "blue sweatervest"
+ icon_state = "sweatervest_blue"
+ item_state = "sweatervest_blue"
+
+/obj/item/clothing/accessory/waistcoat/sweatervest/red
+ name = "red sweatervest"
+ icon_state = "sweatervest_red"
+ item_state = "sweatervest_red"
+
+////////////
+//Sweaters//
+////////////
+
+/obj/item/clothing/accessory/sweater
+ name = "grey sweater"
+ desc = "Nicely comfy and warm!"
+ icon_state = "sweater"
+ item_state = "sweater"
+ minimize_when_attached = FALSE
+
+/obj/item/clothing/accessory/sweater/pink
+ name = "pink sweater"
+ icon_state = "sweater_pink"
+ item_state = "sweater_pink"
+
+/obj/item/clothing/accessory/sweater/heart
+ name = "heart sweater"
+ icon_state = "sweater_heart"
+ item_state = "sweater_heart"
+
+/obj/item/clothing/accessory/sweater/blue
+ name = "blue sweater"
+ icon_state = "sweater_blue"
+ item_state = "sweater_blue"
+
+/obj/item/clothing/accessory/sweater/nt
+ name = "nanotrasen sweater"
+ icon_state = "sweater_nt"
+ item_state = "sweater_nt"
+
+/obj/item/clothing/accessory/sweater/mint
+ name = "mint sweater"
+ icon_state = "sweater_mint"
+ item_state = "sweater_mint"
+
+/obj/item/clothing/accessory/sweater/shoulderless
+ name = "shoulderless sweater"
+ icon_state = "sweater_shoulderless"
+ item_state = "sweater_shoulderless"
+
+/obj/item/clothing/accessory/sweater/uglyxmas
+ name = "ugly xmas sweater"
+ icon_state = "sweater_uglyxmas"
+ item_state = "sweater_uglyxmas"
+
+/obj/item/clothing/accessory/sweater/flower
+ name = "flower sweater"
+ icon_state = "sweater_flower"
+ item_state = "sweater_flower"
+
+////////////////
+//Suit Jackets//
+////////////////
+
+/obj/item/clothing/accessory/suitjacket
+ name = "tan suit jacket"
+ desc = "For those times when you have to attend a fancy business meeting without wearing your pants."
+ icon_state = "jacket_tan"
+ item_state = "jacket_tan"
+ minimize_when_attached = FALSE
+
+/obj/item/clothing/accessory/suitjacket/charcoal
+ name = "charcoal suit jacket"
+ icon_state = "jacket_charcoal"
+ item_state = "jacket_charcoal"
+
+/obj/item/clothing/accessory/suitjacket/navy
+ name = "navy suit jacket"
+ icon_state = "jacket_navy"
+ item_state = "jacket_navy"
+
+/obj/item/clothing/accessory/suitjacket/burgundy
+ name = "burgundy suit jacket"
+ icon_state = "jacket_burgundy"
+ item_state = "jacket_burgundy"
+
+/obj/item/clothing/accessory/suitjacket/checkered
+ name = "checkered suit jacket"
+ icon_state = "jacket_checkered"
+ item_state = "jacket_checkered"
+
+///////////////////////
+//Tactical Turtlnecks//
+///////////////////////
+
+/obj/item/clothing/accessory/turtleneck
+ name = "black turtleneck"
+ desc = "Extra cool. Extra fool."
+ icon_state = "turtleneck"
+ item_state = "turtleneck"
+ minimize_when_attached = FALSE
+
+/obj/item/clothing/accessory/turtleneck/red
+ name = "red turtleneck"
+ icon_state = "turtleneck_red"
+ item_state = "turtleneck_red"
+
+/obj/item/clothing/accessory/turtleneck/comfy
+ name = "comfy turtleneck"
+ icon_state = "turtleneck_comfy"
+ item_state = "turtleneck_comfy"
+
+/obj/item/clothing/accessory/turtleneck/tactifool
+ name = "black sweaterneck"
+ desc = "Extra fool. Extra cool."
+ icon_state = "tactifool"
+ item_state = "tactifool"
+
+/obj/item/clothing/accessory/turtleneck/tactifool/green
+ name = "green sweaterneck"
+ icon_state = "tactifool_green"
+ item_state = "tactifool_green"
+
+/obj/item/clothing/accessory/turtleneck/tactifool/blue
+ name = "blue sweaterneck"
+ icon_state = "tactifool_blue"
+ item_state = "tactifool_blue"
+
+/obj/item/clothing/accessory/turtleneck/tactifool/syndicate
+ name = "tactifool sweaterneck"
+ icon_state = "tactifool_syndicate"
+ item_state = "tactifool_syndicate"
+
+/////////////////
+//Miscellaneous//
+/////////////////
+
/obj/item/clothing/accessory/maidapron
name = "maid apron"
desc = "The best part of a maid costume."
diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm
index 40ce543d31..10f8c60386 100644
--- a/code/modules/events/_event.dm
+++ b/code/modules/events/_event.dm
@@ -92,7 +92,7 @@
log_admin_private("[key_name(usr)] cancelled event [name].")
SSblackbox.record_feedback("tally", "event_admin_cancelled", 1, typepath)
-/datum/round_event_control/proc/runEvent()
+/datum/round_event_control/proc/runEvent(random = FALSE)
var/datum/round_event/E = new typepath()
E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1)
E.control = src
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index 06318df4f5..90ebe7f6a1 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -144,22 +144,23 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
if(L && (L.density || prob(10)))
L.ex_act(EXPLODE_HEAVY)
-obj/effect/immovablerod/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
- if(ishuman(user))
- var/mob/living/carbon/human/U = user
- if(U.job in list("Research Director"))
- playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
- for(var/mob/M in urange(8, src))
- if(!M.stat)
- shake_camera(M, 2, 3)
- if(wizard)
- U.visible_message("[src] transforms into [wizard] as [U] suplexes them!", "As you grab [src], it suddenly turns into [wizard] as you suplex them!")
- to_chat(wizard, "You're suddenly jolted out of rod-form as [U] somehow manages to grab you, slamming you into the ground!")
- wizard.Stun(60)
- wizard.apply_damage(25, BRUTE)
- qdel(src)
- else
- U.visible_message("[U] suplexes [src] into the ground!", "You suplex [src] into the ground!")
- new /obj/structure/festivus/anchored(drop_location())
- new /obj/effect/anomaly/flux(drop_location())
- qdel(src)
+/obj/effect/immovablerod/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/U = user
+ if(U.job in list("Research Director"))
+ playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE)
+ for(var/mob/M in urange(8, src))
+ if(!M.stat)
+ shake_camera(M, 2, 3)
+ if(wizard)
+ U.visible_message("[src] transforms into [wizard] as [U] suplexes them!", "As you grab [src], it suddenly turns into [wizard] as you suplex them!")
+ to_chat(wizard, "You're suddenly jolted out of rod-form as [U] somehow manages to grab you, slamming you into the ground!")
+ wizard.Stun(60)
+ wizard.apply_damage(25, BRUTE)
+ qdel(src)
+ else
+ U.visible_message("[U] suplexes [src] into the ground!", "You suplex [src] into the ground!")
+ new /obj/structure/festivus/anchored(drop_location())
+ new /obj/effect/anomaly/flux(drop_location())
+ qdel(src)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 7cf11848e8..edc062f78f 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -340,6 +340,7 @@
playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE)
/obj/structure/spacevine/Crossed(atom/movable/AM)
+ . = ..()
if(!isliving(AM))
return
for(var/datum/spacevine_mutation/SM in mutations)
diff --git a/code/modules/events/travelling_trader.dm b/code/modules/events/travelling_trader.dm
index eeb1acdba5..2f7b9dbea5 100644
--- a/code/modules/events/travelling_trader.dm
+++ b/code/modules/events/travelling_trader.dm
@@ -25,14 +25,14 @@
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(1, spawn_location)
smoke.start()
- trader.visible_message("[src] suddenly appears in a puff of smoke!")
+ trader.visible_message("[trader] suddenly appears in a puff of smoke!")
/datum/round_event/travelling_trader/announce(fake)
priority_announce("A mysterious figure has been detected on sensors at [get_area(spawn_location)]", "Mysterious Figure")
/datum/round_event/travelling_trader/end()
- if(trader)
- trader.visible_message("The [src] has given up on waiting!")
+ if(trader) // the /datum/round_event/travelling_trader has given up on waiting!
+ trader.visible_message("The [trader] has given up on waiting!")
qdel(trader)
//the actual trader mob
@@ -99,7 +99,7 @@
new reward(get_turf(src))
/mob/living/carbon/human/dummy/travelling_trader/Initialize()
- ..()
+ . = ..() // return a hint you fuck
add_atom_colour("#570d6b", FIXED_COLOUR_PRIORITY) //make them purple (otherworldly!)
set_light(1, -0.7, "#AAD84B")
ADD_TRAIT(src,TRAIT_PIERCEIMMUNE, "trader_pierce_immune") //don't let people take their blood
@@ -188,18 +188,18 @@
/mob/living/simple_animal/hostile/netherworld/blankbody = 1,
/mob/living/simple_animal/hostile/retaliate/goose = 1)
-mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize()
+/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize()
+ . = ..()
acceptance_speech = pick(list("This lifeform shall make for a great stew, thank you.", "This lifeform shall be of a true use to our cause, thank you.", "The lifeform is adequate. Goodbye.", "This lifeform shall make a great addition to my collection."))
- ..()
-/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/check_item(var/obj/item/supplied_item) //item is likely to be in contents of whats supplied
+/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/check_item(obj/item/supplied_item) //item is likely to be in contents of whats supplied
for(var/atom/something in supplied_item.contents)
if(istype(something, requested_item))
qdel(something) //typically things holding mobs release the mob when the container is deleted, so delete the mob first here
return TRUE
return FALSE
-/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/give_reward(var/mob/giver) //the reward is actually given in a jar, because releasing it onto the station might be a bad idea
+/mob/living/carbon/human/dummy/travelling_trader/animal_hunter/give_reward(mob/giver) //the reward is actually given in a jar, because releasing it onto the station might be a bad idea
var/obj/item/pet_carrier/bluespace/jar = new(get_turf(src))
var/chosen_animal = pickweight(possible_rewards)
var/mob/living/new_animal = new chosen_animal(jar)
@@ -223,6 +223,7 @@ mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize()
/obj/structure/reagent_dispensers/keg/quintuple_sec = 3)
/mob/living/carbon/human/dummy/travelling_trader/bartender/Initialize() //pick a subtype of ethanol that isn't found in the default set of the booze dispensers reagents
+ . = ..() // RETURN A HINT.
requested_item = pick(subtypesof(/datum/reagent/consumable/ethanol) - list(/datum/reagent/consumable/ethanol/beer,
/datum/reagent/consumable/ethanol/kahlua,
/datum/reagent/consumable/ethanol/whiskey,
@@ -242,7 +243,6 @@ mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize()
/datum/reagent/consumable/ethanol/triple_sec,
/datum/reagent/consumable/ethanol/sake,
/datum/reagent/consumable/ethanol/applejack))
- ..()
/mob/living/carbon/human/dummy/travelling_trader/bartender/check_item(var/obj/item/supplied_item) //you need to check its reagents
if(istype(supplied_item, /obj/item/reagent_containers))
diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm
index 8710282021..cb8d3e8dcf 100644
--- a/code/modules/fields/fields.dm
+++ b/code/modules/fields/fields.dm
@@ -16,7 +16,7 @@
if(!F.check_variables() && !override_checks)
QDEL_NULL(F)
if(start_field && (F || override_checks))
- F.Initialize()
+ F.begin_field()
return F
/datum/proximity_monitor/advanced
@@ -78,11 +78,11 @@
/datum/proximity_monitor/advanced/proc/process_edge_turf(turf/T)
-/datum/proximity_monitor/advanced/New()
+/datum/proximity_monitor/advanced/New(atom/_host, range, _ignore_if_not_on_turf = TRUE)
if(requires_processing)
START_PROCESSING(SSfields, src)
-/datum/proximity_monitor/advanced/proc/Initialize()
+/datum/proximity_monitor/advanced/proc/begin_field()
setup_field()
post_setup_field()
@@ -154,7 +154,7 @@
var/atom/_host = host
var/atom/new_host_loc = _host.loc
if(last_host_loc != new_host_loc)
- recalculate_field()
+ INVOKE_ASYNC(src, .proc/recalculate_field)
/datum/proximity_monitor/advanced/proc/post_setup_field()
@@ -302,7 +302,7 @@
/obj/item/multitool/field_debug/attack_self(mob/user)
operating = !operating
- to_chat(user, "You turn [src] [operating? "on":"off"].")
+ to_chat(user, "You turn [src] [operating? "on":"off"].")
UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
listeningTo = null
if(!istype(current) && operating)
@@ -312,13 +312,15 @@
else if(!operating)
QDEL_NULL(current)
-/obj/item/multitool/field_debug/dropped(mob/user)
+/obj/item/multitool/field_debug/dropped()
. = ..()
if(listeningTo)
UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
listeningTo = null
/obj/item/multitool/field_debug/proc/on_mob_move()
+ SIGNAL_HANDLER
+
check_turf(get_turf(src))
/obj/item/multitool/field_debug/process()
diff --git a/code/modules/fields/timestop.dm b/code/modules/fields/timestop.dm
index 56abef8cd6..a96a44a789 100644
--- a/code/modules/fields/timestop.dm
+++ b/code/modules/fields/timestop.dm
@@ -33,7 +33,7 @@
if(G.summoner && locate(/obj/effect/proc_holder/spell/aoe_turf/timestop) in G.summoner.mind.spell_list) //It would only make sense that a person's stand would also be immune.
immune[G] = TRUE
if(start)
- timestop()
+ INVOKE_ASYNC(src, .proc/timestop)
/obj/effect/timestop/Destroy()
qdel(chronofield)
@@ -42,7 +42,7 @@
/obj/effect/timestop/proc/timestop()
target = get_turf(src)
- playsound(src, 'sound/magic/timeparadox2.ogg', 75, 1, -1)
+ playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, -1)
chronofield = make_field(/datum/proximity_monitor/advanced/timestop, list("current_range" = freezerange, "host" = src, "immune" = immune, "check_anti_magic" = check_anti_magic, "check_holy" = check_holy))
QDEL_IN(src, duration)
@@ -112,6 +112,8 @@
unfreeze_turf(T)
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_atom(atom/movable/A)
+ SIGNAL_HANDLER
+
if(A.throwing)
unfreeze_throwing(A)
if(isliving(A))
@@ -128,12 +130,14 @@
frozen_things -= A
global_frozen_atoms -= A
+
/datum/proximity_monitor/advanced/timestop/proc/freeze_mecha(obj/mecha/M)
M.completely_disabled = TRUE
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mecha(obj/mecha/M)
M.completely_disabled = FALSE
+
/datum/proximity_monitor/advanced/timestop/proc/freeze_throwing(atom/movable/AM)
var/datum/thrownthing/T = AM.throwing
T.paused = TRUE
@@ -160,7 +164,7 @@
/datum/proximity_monitor/advanced/timestop/process()
for(var/i in frozen_mobs)
var/mob/living/m = i
- m.Stun(20, 1, 1)
+ m.Stun(20, ignore_canstun = TRUE)
/datum/proximity_monitor/advanced/timestop/setup_field_turf(turf/T)
for(var/i in T.contents)
@@ -168,6 +172,7 @@
freeze_turf(T)
return ..()
+
/datum/proximity_monitor/advanced/timestop/proc/freeze_projectile(obj/item/projectile/P)
P.paused = TRUE
@@ -176,18 +181,18 @@
/datum/proximity_monitor/advanced/timestop/proc/freeze_mob(mob/living/L)
frozen_mobs += L
- L.Stun(20, 1, 1)
+ L.Stun(20, ignore_canstun = TRUE)
ADD_TRAIT(L, TRAIT_MUTE, TIMESTOP_TRAIT)
walk(L, 0) //stops them mid pathing even if they're stunimmune
if(isanimal(L))
var/mob/living/simple_animal/S = L
S.toggle_ai(AI_OFF)
- if(ishostile(L))
- var/mob/living/simple_animal/hostile/H = L
- H.LoseTarget()
+ if(ishostile(L))
+ var/mob/living/simple_animal/hostile/H = L
+ H.LoseTarget()
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mob(mob/living/L)
- L.AdjustStun(-20, 1, 1)
+ L.AdjustStun(-20, ignore_canstun = TRUE)
REMOVE_TRAIT(L, TRAIT_MUTE, TIMESTOP_TRAIT)
frozen_mobs -= L
if(isanimal(L))
diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm
index d37036d83c..1af924294a 100644
--- a/code/modules/fields/turf_objects.dm
+++ b/code/modules/fields/turf_objects.dm
@@ -24,11 +24,12 @@
desc = "Get off my turf!"
/obj/effect/abstract/proximity_checker/advanced/field_turf/CanPass(atom/movable/AM, turf/target)
+ . = ..()
if(parent)
return parent.field_turf_canpass(AM, src, target)
- return TRUE
/obj/effect/abstract/proximity_checker/advanced/field_turf/Crossed(atom/movable/AM)
+ . = ..()
if(parent)
return parent.field_turf_crossed(AM, src)
return TRUE
@@ -48,11 +49,12 @@
desc = "Edgy description here."
/obj/effect/abstract/proximity_checker/advanced/field_edge/CanPass(atom/movable/AM, turf/target)
+ . = ..()
if(parent)
return parent.field_edge_canpass(AM, src, target)
- return TRUE
/obj/effect/abstract/proximity_checker/advanced/field_edge/Crossed(atom/movable/AM)
+ . = ..()
if(parent)
return parent.field_edge_crossed(AM, src)
return TRUE
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 56c96c3559..cc18207a29 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -139,10 +139,11 @@ GLOBAL_LIST_INIT(hallucination_list, list(
Show()
/obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir)
+ . = ..()
Show()
/obj/effect/hallucination/simple/Destroy()
- if(target && target.client)
+ if(target?.client)
target.client.images.Remove(current_image)
active = FALSE
return ..()
@@ -1093,6 +1094,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
target.client.images += image
/obj/effect/hallucination/danger/lava/Crossed(atom/movable/AM)
+ . = ..()
if(AM == target)
target.adjustStaminaLoss(20)
new /datum/hallucination/fire(target)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 3f51da22b3..807251111a 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -17,10 +17,7 @@
var/isGlass = TRUE //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
/obj/item/reagent_containers/food/drinks/on_reagent_change(changetype)
- if (gulp_size < 5)
- gulp_size = 5
- else
- gulp_size = max(round(reagents.total_volume / 5), 5)
+ gulp_size = max(round(reagents.total_volume / 5), 5)
/obj/item/reagent_containers/food/drinks/attack(mob/living/M, mob/user, def_zone)
if(!reagents || !reagents.total_volume)
@@ -596,7 +593,7 @@
name = "Buzz Fuzz"
desc = "The sister drink of Shambler's Juice! Uses real honey, making it a sweet tooth's dream drink. The slogan reads ''A Hive of Flavour'', there's also a label about how it is adddicting."
icon_state = "honeysoda_can"
- list_reagents = list(/datum/reagent/consumable/buzz_fuzz = 25, /datum/reagent/consumable/honey = 5)
+ list_reagents = list(/datum/reagent/consumable/buzz_fuzz = 30)
foodtype = SUGAR | JUNKFOOD
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 8e5069925f..9602c1d24e 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -52,10 +52,7 @@
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change(changetype)
cut_overlays()
- if (gulp_size < 15)
- gulp_size = 15
- else
- gulp_size = max(round(reagents.total_volume / 15), 15)
+ gulp_size = max(round(reagents.total_volume / 15), 15)
if (reagents.reagent_list.len > 0)
var/datum/reagent/largest_reagent = reagents.get_master_reagent()
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index be07826a7f..67ac2ee59b 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -308,7 +308,7 @@
tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
foodtype = GRAIN | DAIRY | SUGAR
-obj/item/reagent_containers/food/snacks/store/cake/pound_cake
+/obj/item/reagent_containers/food/snacks/store/cake/pound_cake
name = "pound cake"
desc = "A condensed cake made for filling people up quickly."
icon_state = "pound_cake"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 6bdf3cff8e..5954788d5c 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -151,10 +151,13 @@
to_chat(user, "You need more space cleaner!")
return TRUE
- if(istype(O, /obj/item/soap))
- var/obj/item/soap/P = O
+ if(istype(O, /obj/item/soap) || istype(O, /obj/item/reagent_containers/rag))
+ var/cleanspeed = 50
+ if(istype(O, /obj/item/soap))
+ var/obj/item/soap/used_soap = O
+ cleanspeed = used_soap.cleanspeed
user.visible_message("[user] starts to clean \the [src].", "You start to clean \the [src]...")
- if(do_after(user, P.cleanspeed, target = src))
+ if(do_after(user, cleanspeed, target = src))
user.visible_message("[user] has cleaned \the [src].", "You clean \the [src].")
dirty = 0
update_icon()
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm
index c376ab4025..3d3b1ac0fd 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm
@@ -21,7 +21,7 @@
)
result = /obj/item/reagent_containers/food/snacks/donut/chaos
-datum/crafting_recipe/food/donut/meat
+/datum/crafting_recipe/food/donut/meat
time = 15
name = "Meat donut"
reqs = list(
diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm
index 90016954fc..4212a2e296 100644
--- a/code/modules/holiday/halloween/jacqueen.dm
+++ b/code/modules/holiday/halloween/jacqueen.dm
@@ -50,16 +50,18 @@
var/cached_z
/// I'm busy, don't move.
var/busy = FALSE
+
var/static/blacklisted_items = typecacheof(list(
- /obj/effect,
- /obj/belly,
- /obj/mafia_game_board,
- /obj/docking_port,
- /obj/shapeshift_holder,
- /obj/screen))
+ /obj/effect,
+ /obj/belly,
+ /obj/mafia_game_board,
+ /obj/docking_port,
+ /obj/shapeshift_holder,
+ /obj/screen
+ ))
/mob/living/simple_animal/jacq/Initialize()
- ..()
+ . = ..() //fuck you jacq, return a hint you shit
cached_z = z
poof()
@@ -158,23 +160,18 @@
return FALSE
/mob/living/simple_animal/jacq/proc/gender_check(mob/living/carbon/C)
- var/gender = "lamb"
- if(C)
- if(C.gender == MALE)
- gender = "laddie"
- if(C.gender == FEMALE)
- gender = "lassie"
- return gender
+ . = "lamb"
+ switch(C)
+ if(MALE)
+ . = "laddie"
+ if(FEMALE)
+ . = "lassie"
//Ye wee bugger, gerrout of it. Ye've nae tae enjoy reading the code fer mae secrets like.
/mob/living/simple_animal/jacq/proc/chit_chat(mob/living/carbon/C)
//Very important
var/gender = gender_check(C)
- if(C)
- if(C.gender == MALE)
- gender = "laddie"
- if(C.gender == FEMALE)
- gender = "lassie"
+ // it physicaly cannot fail*. Why is there a fucking dupe
if(!progression["[C.real_name]"] || !(progression["[C.real_name]"] & JACQ_HELLO))
visible_message("[src] smiles ominously at [C], \"Well halo there [gender]! Ah'm Jacqueline, tae great Pumpqueen, great tae meet ye.\"")
diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm
index beff751479..daaf71c626 100644
--- a/code/modules/hydroponics/grown/cotton.dm
+++ b/code/modules/hydroponics/grown/cotton.dm
@@ -34,16 +34,14 @@
/obj/item/grown/cotton/attack_self(mob/user)
user.show_message("You pull some [cotton_name] out of the [name]!", MSG_VISUAL)
- var/seed_modifier = 0
- if(seed)
- seed_modifier = round(seed.potency / 25)
- var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier)
- var/old_cotton_amount = cotton.amount
- for(var/obj/item/stack/ST in user.loc)
- if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount)
- ST.attackby(cotton, user)
- if(cotton.amount > old_cotton_amount)
- to_chat(user, "You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].")
+ var/cottonAmt = 1 + round(seed.potency / 25) // cotton inhand we're holding
+ for(var/obj/item/grown/cotton/ctn in user.loc) // cotton on the floor
+ if(ctn.type != type)
+ continue
+ cottonAmt += 1 + round(ctn.seed.potency / 25)
+ qdel(ctn)
+ new cotton_type(user.drop_location(), cottonAmt)
+ // above code stolen from grass
qdel(src)
//reinforced mutated variant
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 8467d00124..24f65756c8 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -92,6 +92,11 @@
return BULLET_ACT_HIT
else if(istype(Proj , /obj/item/projectile/energy/florayield))
return myseed.bullet_act(Proj)
+ else if(istype(Proj , /obj/item/projectile/energy/florarevolution))
+ if(myseed)
+ if(myseed.mutatelist.len > 0)
+ myseed.instability = (myseed.instability/2)
+ mutatespecie()
else
return ..()
@@ -384,7 +389,6 @@
/obj/machinery/hydroponics/proc/hardmutate()
mutate(4, 10, 2, 4, 50, 4, 10, 3)
-
/obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant!
if(!myseed || dead)
return
@@ -600,7 +604,34 @@
desc = initial(desc)
weedlevel = 0 //Has a side effect of cleaning up those nasty weeds
update_icon()
-
+ else if(istype(O, /obj/item/gun/energy/floragun))
+ var/obj/item/gun/energy/floragun/flowergun = O
+ if(flowergun.cell.charge < flowergun.cell.maxcharge)
+ to_chat(user, "[flowergun] must be fully charged to lock in a mutation!")
+ return
+ if(!myseed)
+ to_chat(user, "[src] is empty!")
+ return
+ if(myseed.endurance <= 20)
+ to_chat(user, "[myseed.plantname] isn't hardy enough to sequence its mutation!")
+ return
+ if(!myseed.mutatelist)
+ to_chat(user, "[myseed.plantname] has nothing else to mutate into!")
+ return
+ else
+ var/list/fresh_mut_list = list()
+ for(var/muties in myseed.mutatelist)
+ var/obj/item/seeds/another_mut = new muties
+ fresh_mut_list[another_mut.plantname] = muties
+ var/locked_mutation = (input(user, "Select a mutation to lock.", "Plant Mutation Locks") as null|anything in sortList(fresh_mut_list))
+ if(!user.canUseTopic(src, BE_CLOSE) || !locked_mutation)
+ return
+ myseed.mutatelist = list(fresh_mut_list[locked_mutation])
+ myseed.endurance = (myseed.endurance/2)
+ flowergun.cell.use(flowergun.cell.charge)
+ flowergun.update_icon()
+ to_chat(user, "[myseed.plantname]'s mutation was set to [locked_mutation], depleting [flowergun]'s cell!")
+ return
else
return ..()
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 2dc80cd8fc..d8082e667d 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -24,7 +24,7 @@
var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested.
var/potency = 10 // The 'power' of a plant. Generally effects the amount of reagent in a plant, also used in other ways.
var/growthstages = 6 // Amount of growth sprites the plant has.
- var/instability = 5 //Chance that a plant will mutate in each stage of it's life.
+ var/instability = 5 //Chance that a plant will mutate in each stage of it's life.
var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom.
var/list/mutatelist = list() // The type of plants that this plant can mutate into.
var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info.
@@ -105,7 +105,7 @@
S.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes.
return S
-obj/item/seeds/proc/is_gene_forbidden(typepath)
+/obj/item/seeds/proc/is_gene_forbidden(typepath)
return (typepath in forbiddengenes)
diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm
index eee9be3cc7..c4d86e2013 100644
--- a/code/modules/instruments/songs/play_legacy.dm
+++ b/code/modules/instruments/songs/play_legacy.dm
@@ -82,5 +82,5 @@
var/sound/music_played = sound(soundfile)
for(var/i in hearing_mobs)
var/mob/M = i
- M.playsound_local(source, null, volume * using_instrument.volume_multiplier, falloff = 5, S = music_played)
+ M.playsound_local(source, null, volume * using_instrument.volume_multiplier, S = music_played)
// Could do environment and echo later but not for now
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 7c9f811c34..6cb578dfb1 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -578,6 +578,7 @@
return FALSE
/obj/item/electronic_assembly/Moved(oldLoc, dir)
+ . = ..()
for(var/I in assembly_components)
var/obj/item/integrated_circuit/IC = I
IC.ext_moved(oldLoc, dir)
diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm
index f90b584d76..92d2aa270f 100644
--- a/code/modules/integrated_electronics/core/integrated_circuit.dm
+++ b/code/modules/integrated_electronics/core/integrated_circuit.dm
@@ -378,7 +378,7 @@ a creative player the means to solve many problems. Circuits are held inside an
// Checks if the target object is reachable. Useful for various manipulators and manipulator-like objects.
-/obj/item/integrated_circuit/proc/check_target(atom/target, exclude_contents = FALSE, exclude_components = FALSE, exclude_self = FALSE)
+/obj/item/integrated_circuit/proc/check_target(atom/target, exclude_contents = FALSE, exclude_components = FALSE, exclude_self = FALSE, exclude_outside = FALSE)
if(!target)
return FALSE
@@ -394,7 +394,7 @@ a creative player the means to solve many problems. Circuits are held inside an
if(target == assembly.battery)
return FALSE
- if(target.Adjacent(acting_object) && isturf(target.loc))
+ if(!exclude_outside && target.Adjacent(acting_object) && isturf(target.loc))
return TRUE
if(!exclude_contents && (target in acting_object.GetAllContents()))
diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm
index 26ac3080de..d449775bd1 100644
--- a/code/modules/integrated_electronics/subtypes/atmospherics.dm
+++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm
@@ -292,7 +292,7 @@
activate_pin(2)
// Required for making the connector port script work
-obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
+/obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
return air_contents
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index eac16d2950..e32f8daa2d 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -186,6 +186,8 @@
AM.forceMove(src)
/obj/item/integrated_circuit/manipulation/grabber/proc/drop(obj/item/AM, turf/T = drop_location())
+ if(!check_target(AM, FALSE, TRUE, TRUE, TRUE))
+ return
var/atom/A = get_object()
A.investigate_log("dropped ([AM]) from [src].", INVESTIGATE_CIRCUIT)
AM.forceMove(T)
diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm
index 96a732d08f..25fa7058fb 100644
--- a/code/modules/integrated_electronics/subtypes/weaponized.dm
+++ b/code/modules/integrated_electronics/subtypes/weaponized.dm
@@ -137,6 +137,10 @@
//Shooting Code:
A.preparePixelProjectile(target, src)
A.fire()
+ if(ismob(loc.loc))
+ installed_gun.shoot_live_shot(loc.loc)
+ else
+ installed_gun.shoot_live_shot() //Shitcode, but we don't have much of a choice
log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
return A
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 64ab4791d3..855e2ccbd7 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -187,7 +187,7 @@
/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels.
if(H && GLOB.announcement_systems.len)
//timer because these should come after the captain announcement
- SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1))
+ SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/_addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1))
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
/datum/job/proc/player_old_enough(client/C)
diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm
index aa52b353df..b44d536cd2 100644
--- a/code/modules/jobs/job_types/roboticist.dm
+++ b/code/modules/jobs/job_types/roboticist.dm
@@ -32,7 +32,7 @@
l_pocket = /obj/item/pda/roboticist
ears = /obj/item/radio/headset/headset_sci
uniform = /obj/item/clothing/under/rank/rnd/roboticist
- suit = /obj/item/clothing/suit/toggle/labcoat
+ suit = /obj/item/clothing/suit/toggle/labcoat/roboticist
backpack = /obj/item/storage/backpack/science
satchel = /obj/item/storage/backpack/satchel/tox
diff --git a/code/modules/keybindings/keybind/carbon.dm b/code/modules/keybindings/keybind/carbon.dm
index 46cb5cd0ac..50ec29ff5e 100644
--- a/code/modules/keybindings/keybind/carbon.dm
+++ b/code/modules/keybindings/keybind/carbon.dm
@@ -60,3 +60,14 @@
/datum/keybinding/carbon/select_harm_intent/down(client/user)
user.mob?.a_intent_change(INTENT_HARM)
return TRUE
+
+/datum/keybinding/carbon/give
+ hotkey_keys = list("CtrlG")
+ name = "Give_Item"
+ full_name = "Give item"
+ description = "Give the item you're currently holding"
+
+/datum/keybinding/carbon/give/down(client/user)
+ var/mob/living/carbon/C = user.mob
+ C.give()
+ return TRUE
diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm
index 11bcc0ffcf..a3e0653678 100644
--- a/code/modules/mapping/reader.dm
+++ b/code/modules/mapping/reader.dm
@@ -135,7 +135,7 @@
var/curr_z = text2num(dmmRegex.group[5])
if(curr_z < z_lower || curr_z > z_upper)
continue
-
+
var/curr_x = text2num(dmmRegex.group[3])
var/curr_y = text2num(dmmRegex.group[4])
@@ -171,7 +171,7 @@
if(width > right_width)
for(var/i in 1 to lines)
gridLines[i] = copytext(gridLines[i], 1, key_len * right_width)
-
+
// during the actual load we're starting at the top and working our way down
gridSet.ycrd += lines - 1
@@ -300,14 +300,14 @@
//we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs
T.AfterChange(CHANGETURF_IGNORE_AIR)
+ if(did_expand)
+ world.refresh_atmos_grid()
+
#ifdef TESTING
if(turfsSkipped)
testing("Skipped loading [turfsSkipped] default turfs")
#endif
- if(did_expand)
- world.refresh_atmos_grid()
-
return TRUE
/datum/parsed_map/proc/build_cache(no_changeturf, bad_paths=null)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 9c39601b4e..6af1c2118c 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -522,7 +522,7 @@
max_charges = 1
item_flags = NEEDS_PERMIT | NOBLUDGEON
w_class = WEIGHT_CLASS_BULKY
- force = 18
+ force = 15
/obj/item/ammo_casing/magic/hook
name = "hook"
@@ -536,11 +536,11 @@
icon_state = "hook"
icon = 'icons/obj/lavaland/artefacts.dmi'
pass_flags = PASSTABLE
- damage = 25
- armour_penetration = 100
+ damage = 15
+ armour_penetration = 10
+ knockdown = 5
damage_type = BRUTE
hitsound = 'sound/effects/splat.ogg'
- knockdown = 30
var/chain
/obj/item/projectile/hook/fire(setAngle)
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index 0268d32a6b..d6c4dfae34 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -250,6 +250,8 @@
if(points)
if(I)
I.mining_points += points
+ if(usr.client)
+ usr.client.increment_progress("miner", points)
points = 0
else
to_chat(usr, "No ID detected.")
diff --git a/code/modules/mining/point_bank.dm b/code/modules/mining/point_bank.dm
index f18b62635f..f467b94de5 100644
--- a/code/modules/mining/point_bank.dm
+++ b/code/modules/mining/point_bank.dm
@@ -20,25 +20,6 @@
data["totalPoints"] = points
return data
-/obj/machinery/mineral/ore_redemption/ui_act(action, params)
- if(..())
- return
- switch(action)
- if("Claim")
- var/mob/M = usr
- var/obj/item/card/id/I = M.get_idcard(TRUE)
- if(points)
- if(I)
- I.mining_points += points
- if(usr.client)
- usr.client.increment_progress("miner", points)
- points = 0
- else
- to_chat(usr, "No ID detected.")
- else
- to_chat(usr, "No points to claim.")
- return TRUE
-
/obj/machinery/point_bank/power_change()
..()
update_icon()
diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm
index 87f9d716bd..223366c7ab 100644
--- a/code/modules/mob/dead/dead.dm
+++ b/code/modules/mob/dead/dead.dm
@@ -8,6 +8,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
throwforce = 0
/mob/dead/Initialize()
+ SHOULD_CALL_PARENT(FALSE)
if(flags_1 & INITIALIZED_1)
stack_trace("Warning: [src]([type]) initialized multiple times!")
flags_1 |= INITIALIZED_1
@@ -68,14 +69,15 @@ INITIALIZE_IMMEDIATE(/mob/dead)
set desc= "Jump to the other server"
if(mob_transforming)
return
- var/list/csa = CONFIG_GET(keyed_list/cross_server)
+ var/list/our_id = CONFIG_GET(string/cross_comms_name)
+ var/list/csa = CONFIG_GET(keyed_list/cross_server) - our_id
var/pick
switch(csa.len)
if(0)
remove_verb(src, /mob/dead/proc/server_hop)
to_chat(src, "Server Hop has been disabled.")
if(1)
- pick = csa[0]
+ pick = csa[1]
else
pick = input(src, "Pick a server to jump to", "Server Hop") as null|anything in csa
@@ -100,7 +102,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
- C << link("[addr]?server_hop=[key]")
+ C << link("[addr]")
/mob/dead/proc/update_z(new_z) // 1+ to register, null to unregister
if (registered_z != new_z)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
index 4e5f010964..bc6c4899dd 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
@@ -341,4 +341,4 @@
/datum/sprite_accessory/insect_fluff/witchwing
name = "Witch Wing"
- icon_state = "witchwing"
\ No newline at end of file
+ icon_state = "witchwing"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/caps.dm b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm
index 822fcf960d..d974672490 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/caps.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm
@@ -1,4 +1,4 @@
-datum/sprite_accessory/caps
+/datum/sprite_accessory/caps
icon = 'icons/mob/mutant_bodyparts.dmi'
color_src = HAIR
relevant_layers = list(BODY_ADJ_LAYER)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
index 55ab18c20c..0c22a85886 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -13,6 +13,10 @@
name = "Bald"
icon_state = "bald"
+/datum/sprite_accessory/hair/adhara
+ name = "Adhara"
+ icon_state = "hair_adhara"
+
/datum/sprite_accessory/hair/afro
name = "Afro"
icon_state = "hair_afro"
@@ -29,6 +33,14 @@
name = "Ahoge"
icon_state = "hair_antenna"
+/datum/sprite_accessory/hair/amazon
+ name = "Amazon"
+ icon_state = "hair_amazon"
+
+/datum/sprite_accessory/hair/anita
+ name = "Anita"
+ icon_state = "hair_anita"
+
/datum/sprite_accessory/hair/balding
name = "Balding Hair"
icon_state = "hair_e"
@@ -61,6 +73,18 @@
name = "Beehive 2"
icon_state = "hair_beehive2"
+/datum/sprite_accessory/hair/belenko
+ name = "Beleneko"
+ icon_state = "hair_belenko"
+
+/datum/sprite_accessory/hair/belenkotied
+ name = "Belenko (Tied)"
+ icon_state = "hair_belenkotied"
+
+/datum/sprite_accessory/hair/belle
+ name = "Belle"
+ icon_state = "hair_belle"
+
/datum/sprite_accessory/hair/bob
name = "Bob Hair"
icon_state = "hair_bob"
@@ -309,6 +333,10 @@
name = "Flow Hair"
icon_state = "hair_f"
+/datum/sprite_accessory/hair/fluffy
+ name = "Fluffy"
+ icon_state = "hair_fluffy"
+
/datum/sprite_accessory/hair/fringetail
name = "Fringe Tail"
icon_state = "hair_fringetail"
@@ -365,6 +393,10 @@
name = "Hitop"
icon_state = "hair_hitop"
+/datum/sprite_accessory/hair/inkling
+ name = "Inkling"
+ icon_state = "hair_inkling"
+
/datum/sprite_accessory/hair/jade
name = "Jade"
icon_state = "hair_jade"
@@ -373,6 +405,10 @@
name = "Jensen"
icon_state = "hair_jensen"
+/datum/sprite_accessory/hair/jessica
+ name = "Jessica"
+ icon_state = "hair_jessica"
+
/datum/sprite_accessory/hair/joestar
name = "Joestar"
icon_state = "hair_joestar"
@@ -389,6 +425,10 @@
name = "Kusanagi"
icon_state = "hair_kusanagi"
+/datum/sprite_accessory/hair/kleeia
+ name = "Kleeia"
+ icon_state = "hair_kleeia"
+
/datum/sprite_accessory/hair/long
name = "Long Hair 1"
icon_state = "hair_long"
@@ -445,6 +485,10 @@
name = "Mohawk"
icon_state = "hair_d"
+/datum/sprite_accessory/hair/newyou
+ name = "New You"
+ icon_state = "hair_newyou"
+
/datum/sprite_accessory/hair/reversemohawk
name = "Mohawk (Reverse)"
icon_state = "hair_reversemohawk"
@@ -575,6 +619,10 @@
name = "Ponytail (Side) 4"
icon_state = "hair_sidetail4"
+/datum/sprite_accessory/hair/sharptail
+ name = "Ponytail (Sharp)"
+ icon_state = "hair_sharptail"
+
/datum/sprite_accessory/hair/spikytail
name = "Ponytail (Spiky)"
icon_state = "hair_spikyponytail"
@@ -679,6 +727,26 @@
name = "Skinhead"
icon_state = "hair_skinhead"
+/datum/sprite_accessory/hair/simple
+ name = "Simple"
+ icon_state = "hair_simple"
+
+/datum/sprite_accessory/hair/skrellvshort
+ name = "Skrell Replicant (Very Short)"
+ icon_state = "hair_skrellvshort"
+
+/datum/sprite_accessory/hair/skrellshort
+ name = "Skrell Replicant (Short)"
+ icon_state = "hair_skrellshort"
+
+/datum/sprite_accessory/hair/skrell
+ name = "Skrell Replicant (Average)"
+ icon_state = "hair_skrell"
+
+/datum/sprite_accessory/hair/skrelllong
+ name = "Skrell Replicant (Long)"
+ icon_state = "hair_skrelllong"
+
/datum/sprite_accessory/hair/sleaze
name = "Sleaze"
icon_state = "hair_sleaze"
@@ -699,6 +767,10 @@
name = "Spiky 3"
icon_state = "hair_spiky2"
+/datum/sprite_accessory/hair/supernova
+ name = "Supernova"
+ icon_state = "hair_supernova"
+
/datum/sprite_accessory/hair/swept
name = "Swept Back Hair"
icon_state = "hair_swept"
@@ -743,6 +815,10 @@
name = "Trimmed (Flat)"
icon_state = "hair_trimflat"
+/datum/sprite_accessory/hair/twincurls
+ name = "Twincurls"
+ icon_state = "hair_twincurls"
+
/datum/sprite_accessory/hair/twintails
name = "Twintails"
icon_state = "hair_twintail"
@@ -787,6 +863,10 @@
name = "Very Short Over Eye (Alt)"
icon_state = "hair_veryshortovereyealternate"
+/datum/sprite_accessory/hair/vivi
+ name = "Vivi"
+ icon_state = "hair_vivi"
+
/datum/sprite_accessory/hair/volaju
name = "Volaju"
icon_state = "hair_volaju"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
index cd55a17e3c..78517b003e 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
@@ -11,6 +11,11 @@
// please make sure they're sorted alphabetically and categorized
+/datum/sprite_accessory/underwear/socks/garter
+ name = "Garter"
+ icon_state = "garter"
+ has_color = TRUE
+
/datum/sprite_accessory/underwear/socks/socks_knee
name = "Knee-high"
icon_state = "socks_knee"
@@ -83,6 +88,10 @@
name = "Pantyhose"
icon_state = "pantyhose"
+/datum/sprite_accessory/underwear/socks/pantyhose_ripped
+ name = "Pantyhose - Ripped"
+ icon_state = "pantyhose_ripped"
+
/datum/sprite_accessory/underwear/socks/socks_short
name = "Short"
icon_state = "socks_short"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 6135d42569..a964be3f8a 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -757,7 +757,7 @@
icon_state = "husky"
matrixed_sections = MATRIX_RED_GREEN
-datum/sprite_accessory/tails/mam_tails/insect
+/datum/sprite_accessory/tails/mam_tails/insect
name = "Insect"
icon_state = "insect"
matrixed_sections = MATRIX_RED
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
index 1be02c207e..364485fe8a 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
@@ -343,6 +343,20 @@
icon_state = "fishnet_body"
gender = FEMALE
+/datum/sprite_accessory/underwear/top/shibari
+ name = "Shibari Ropes"
+ icon_state = "shibari"
+ gender = FEMALE
+ has_color = TRUE
+ covers_chest = FALSE
+
+/datum/sprite_accessory/underwear/top/shibari_sleeved
+ name = "Shibari Ropes - sleeves"
+ icon_state = "shibari_sleeves"
+ gender = FEMALE
+ has_color = TRUE
+ covers_chest = FALSE
+
/datum/sprite_accessory/underwear/top/swimsuit
name = "Swimsuit Top"
icon_state = "bra_swimming"
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index dc53f9487f..783f55d12d 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -556,7 +556,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/list/dest = list() //List of possible destinations (mobs)
var/target = null //Chosen target.
- dest += getpois(mobs_only=1) //Fill list, prompt user with list
+ dest += getpois(mobs_only = TRUE) //Fill list, prompt user with list
target = input("Please, select a player!", "Jump to Mob", null, null) as null|anything in dest
if (!target)//Make sure we actually have a target
@@ -893,7 +893,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if (!eye_name)
return
- var/mob/mob_eye = creatures[eye_name]
+ do_observe(creatures[eye_name])
+
+/mob/dead/observer/proc/do_observe(mob/mob_eye)
//Istype so we filter out points of interest that are not mobs
if(client && mob_eye && istype(mob_eye))
client.eye = mob_eye
diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm
index 3aa5f8e302..26494dcb34 100644
--- a/code/modules/mob/dead/observer/orbit.dm
+++ b/code/modules/mob/dead/observer/orbit.dm
@@ -1,5 +1,6 @@
/datum/orbit_menu
var/mob/dead/observer/owner
+ var/auto_observe = FALSE
/datum/orbit_menu/New(mob/dead/observer/new_owner)
if(!istype(new_owner))
@@ -10,6 +11,7 @@
return GLOB.observer_state
/datum/orbit_menu/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
if (!ui)
ui = new(user, src, "Orbit")
ui.open()
@@ -18,15 +20,35 @@
if (..())
return
- if (action == "orbit")
- var/ref = params["ref"]
- var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list)
- if (poi != null)
+ switch(action)
+ if ("orbit")
+ var/ref = params["ref"]
+ var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list)
+ if (poi == null)
+ . = TRUE
+ return
owner.ManualFollow(poi)
+ owner.reset_perspective(null)
+ if (auto_observe)
+ owner.do_observe(poi)
+ . = TRUE
+ if ("refresh")
+ update_static_data(owner, ui)
+ . = TRUE
+ if ("toggle_observe")
+ auto_observe = !auto_observe
+ if (auto_observe && owner.orbit_target)
+ owner.do_observe(owner.orbit_target)
+ else
+ owner.reset_perspective(null)
/datum/orbit_menu/ui_data(mob/user)
var/list/data = list()
+ data["auto_observe"] = auto_observe
+ return data
+/datum/orbit_menu/ui_static_data(mob/user)
+ var/list/data = list()
var/list/alive = list()
var/list/antagonists = list()
var/list/dead = list()
@@ -34,7 +56,7 @@
var/list/misc = list()
var/list/npcs = list()
- var/list/pois = getpois(skip_mindless = 1)
+ var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE)
for (var/name in pois)
var/list/serialized = list()
serialized["name"] = name
@@ -80,7 +102,7 @@
data["npcs"] = npcs
return data
-
+
/datum/orbit_menu/ui_assets()
. = ..() || list()
. += get_asset_datum(/datum/asset/simple/orbit)
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index 09336d2fea..476bddded3 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -1,6 +1,6 @@
//This is the proc for gibbing a mob. Cannot gib ghosts.
//added different sort of gibs and animations. N
-/mob/proc/gib()
+/mob/proc/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
return
//This is the proc for turning a mob into ash. Mostly a copy of gib code (above).
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index e7ad67d240..f5970d9da2 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -4,7 +4,6 @@
gender = FEMALE //All xenos are girls!!
dna = null
faction = list(ROLE_ALIEN)
- ventcrawler = VENTCRAWLER_ALWAYS
sight = SEE_MOBS
see_in_dark = 4
verb_say = "hisses"
@@ -12,6 +11,10 @@
bubble_icon = "alien"
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
+ /// Whether they can ventcrawl; this is set individually for 'humanoid' and 'royal' types
+ /// 'royal' types (Praetorian, Queen) cannot ventcrawl
+ var/can_ventcrawl
+
/// How much brute damage without armor piercing they do against mobs in melee
var/meleeSlashHumanPower = 20
/// How much power they have for DefaultCombatKnockdown when attacking humans
@@ -19,7 +22,6 @@
/// How much brute damage they do to simple animals
var/meleeSlashSAPower = 35
- var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie
var/has_fine_manipulation = 0
var/move_delay_add = 0 // movement delay to add
@@ -40,6 +42,9 @@
create_internal_organs()
+ if(can_ventcrawl)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
. = ..()
/mob/living/carbon/alien/create_internal_organs()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index d0addbab21..0d2a1c0c59 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -20,6 +20,8 @@
bodyparts = list(/obj/item/bodypart/chest/alien, /obj/item/bodypart/head/alien, /obj/item/bodypart/l_arm/alien,
/obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien)
+ can_ventcrawl = TRUE
+
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/Initialize()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 91a61efea6..bcc83f14f9 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -2,7 +2,6 @@
//Common stuffs for Praetorian and Queen
icon = 'icons/mob/alienqueen.dmi'
status_flags = 0
- ventcrawler = VENTCRAWLER_NONE //pull over that ass too fat
unique_name = 0
pixel_x = -16
bubble_icon = "alienroyal"
@@ -10,6 +9,7 @@
layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3)
+ can_ventcrawl = FALSE
meleeKnockdownPower = 125
meleeSlashHumanPower = 30
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 5392e7b2d5..ca2946fd8a 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -91,8 +91,8 @@
Attach(M)
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
+ . = ..()
HasProximity(target)
- return
/obj/item/clothing/mask/facehugger/on_found(mob/finder)
if(stat == CONSCIOUS)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 45a0d82d2c..979baeb065 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -1229,3 +1229,25 @@
*/
/mob/living/carbon/proc/get_biological_state()
return BIO_FLESH_BONE
+
+/mob/living/carbon/altattackby(obj/item/W, mob/living/carbon/user, params)
+ if(user.incapacitated() || !user.Adjacent(src))
+ return FALSE
+ if(W && user.a_intent == INTENT_HELP && W.can_give())
+ user.give()
+ return TRUE
+
+/mob/living/carbon/verb/give_verb()
+ set src in oview(1)
+ set category = "IC"
+ set name = "Give"
+
+ if(usr.incapacitated() || !usr.Adjacent(src))
+ return
+
+ if(!usr.get_active_held_item()) // Let me know if this has any problems -Yota
+ return
+ var/obj/item/I = usr.get_active_held_item()
+ var/mob/living/carbon/C = usr
+ if(I.can_give())
+ C.give()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 7a16d5c352..b2c14c30fe 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -304,10 +304,16 @@
emote("wag")
else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
- M.visible_message( \
- "[M] shakes [src]'s hand.", \
- "You shake [src]'s hand.", target = src,
- target_message = "[M] shakes your hand.")
+ if((pulling == M) && (grab_state == GRAB_PASSIVE))
+ M.visible_message( \
+ "[M] squeezes [src]'s hand.", \
+ "You squeeze [src]'s hand.", target = src,
+ target_message = "[M] squeezes your hand.")
+ else
+ M.visible_message( \
+ "[M] shakes [src]'s hand.", \
+ "You shake [src]'s hand.", target = src,
+ target_message = "[M] shakes your hand.")
else
M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index ee2f945b65..528848fb14 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -17,7 +17,7 @@
if(SSticker.mode)
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
-/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts)
+/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
var/atom/Tsec = drop_location()
for(var/mob/M in src)
if(M in stomach_contents)
@@ -27,7 +27,7 @@
"You burst out of [src]!")
..()
-/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts)
+/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
var/atom/Tsec = drop_location()
if(!no_bodyparts)
if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop.
@@ -41,6 +41,8 @@
qdel(O) //so the brain isn't transfered to the head when the head drops.
continue
if(!(O.organ_flags & ORGAN_NO_DISMEMBERMENT) && check_zone(O.zone) == BODY_ZONE_CHEST)
+ if(was_explosion)
+ LAZYADD(O.acted_explosions, was_explosion.explosion_id)
O.Remove()
O.forceMove(Tsec)
O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
@@ -50,13 +52,16 @@
if(I.organ_flags & ORGAN_NO_DISMEMBERMENT || (no_brain && istype(I, /obj/item/organ/brain)) || (no_organs && !istype(I, /obj/item/organ/brain)))
qdel(I)
continue
+ if(was_explosion)
+ LAZYADD(I.acted_explosions, was_explosion.explosion_id)
I.Remove()
I.forceMove(Tsec)
I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
-
-/mob/living/carbon/spread_bodyparts()
+/mob/living/carbon/spread_bodyparts(no_brain, no_organs, datum/explosion/was_explosion)
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
+ if(was_explosion)
+ LAZYADD(BP.acted_explosions, was_explosion.explosion_id)
BP.drop_limb()
BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 03816555b3..f653c96cbc 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -3,7 +3,7 @@
real_name = "Unknown"
icon = 'icons/mob/human.dmi'
icon_state = "caucasian_m"
- appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE
+ SET_APPEARANCE_FLAGS(KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE)
/mob/living/carbon/human/Initialize()
add_verb(src, /mob/living/proc/mob_sleep)
@@ -938,43 +938,43 @@
admin_ticket_log(src, msg)
/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)
- if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS)
+ var/GS_needed = istype(target, /mob/living/silicon/pai)? GRAB_PASSIVE : GRAB_AGGRESSIVE
+ if(pulling == target && grab_state >= GS_needed && stat == CONSCIOUS)
//If they dragged themselves and we're currently aggressively grabbing them try to piggyback
if(user == target && can_piggyback(target))
piggyback(target)
return
//If you dragged them to you and you're aggressively grabbing try to fireman carry them
- else if(user != target)
+ else if(user == src)
if(user.a_intent == INTENT_GRAB)
fireman_carry(target)
return
. = ..()
//src is the user that will be carrying, target is the mob to be carried
-/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target)
- return (istype(target) && target.stat == CONSCIOUS)
+/mob/living/carbon/human/proc/can_piggyback(mob/living/target)
+ return (iscarbon(target) || ispAI(target)) && target.stat == CONSCIOUS
/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target)
- return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND))
+ return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND)) || ispAI(target)
/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target)
var/carrydelay = 50 //if you have latex you are faster at grabbing
var/skills_space = "" //cobby told me to do this
if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY))
carrydelay = 30
- skills_space = "expertly"
+ skills_space = "expertly "
else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY))
carrydelay = 40
- skills_space = "quickly"
+ skills_space = "quickly "
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
- visible_message("[src] starts [skills_space] lifting [target] onto their back..",
+ visible_message("[src] starts [skills_space]lifting [target] onto their back..",
//Joe Medic starts quickly/expertly lifting Grey Tider onto their back..
- "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]")
+ "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space]start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]")
//(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...)
if(do_after(src, carrydelay, TRUE, target))
//Second check to make sure they're still valid to be carried
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
- target.set_resting(FALSE, TRUE)
buckle_mob(target, TRUE, TRUE, 90, 1, 0, TRUE)
return
visible_message("[src] fails to fireman carry [target]!")
@@ -992,13 +992,13 @@
if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
target.visible_message("[target] can't hang onto [src]!")
return
- buckle_mob(target, TRUE, TRUE, FALSE, 1, 2, FALSE)
+ buckle_mob(target, TRUE, TRUE, 0, 1, 2, FALSE)
else
visible_message("[target] fails to climb onto [src]!")
else
to_chat(target, "You can't piggyback ride [src] right now!")
-/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0, fireman = FALSE)
+/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = 0, hands_needed = 0, target_hands_needed = 0, fireman = FALSE)
if(!force)//humans are only meant to be ridden through piggybacking and special cases
return
if(!is_type_in_typecache(target, can_ride_typecache))
@@ -1010,6 +1010,9 @@
riding_datum.ride_check_rider_restrained = TRUE
if(buckled_mobs && ((target in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled)
return
+ if(istype(target, /mob/living/silicon/pai))
+ hands_needed = 1
+ target_hands_needed = 0
var/equipped_hands_self
var/equipped_hands_target
if(hands_needed)
@@ -1028,7 +1031,7 @@
return
stop_pulling()
- riding_datum.handle_vehicle_layer()
+ riding_datum.handle_vehicle_layer(dir)
riding_datum.fireman_carrying = fireman
. = ..(target, force, check_loc)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index a82151cc1d..eedc59d9d5 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -71,7 +71,7 @@
var/list/datum/bioware = list()
var/creamed = FALSE //to use with creampie overlays
- var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot))
+ var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot, /mob/living/silicon/pai))
var/lastpuke = 0
var/account_id
var/last_fire_update
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 440400f889..1619d0f6de 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -9,11 +9,6 @@
return
return considering
-/mob/living/carbon/human/movement_delay()
- . = ..()
- if (m_intent == MOVE_INTENT_WALK && HAS_TRAIT(src, TRAIT_SPEEDY_STEP))
- . -= 1.5
-
/mob/living/carbon/human/slip(knockdown_amount, obj/O, lube)
if(HAS_TRAIT(src, TRAIT_NOSLIPALL))
return 0
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 94d7e84c6b..8d473639b4 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1796,12 +1796,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
"[M] attempted to touch you!", target = M, \
target_message = "You attempted to touch [H]!")
return TRUE
+ if(M == H)
+ althelp(M, H, attacker_style)
+ return TRUE
switch(M.a_intent)
- if(INTENT_HELP)
- if(M == H)
- althelp(M, H, attacker_style)
- return TRUE
- return FALSE
if(INTENT_DISARM)
altdisarm(M, H, attacker_style)
return TRUE
@@ -1987,6 +1985,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.show_message("The radiation beam dissipates harmlessly through your body.")
if(/obj/item/projectile/energy/florayield)
H.show_message("The radiation beam dissipates harmlessly through your body.")
+ if(/obj/item/projectile/energy/florarevolution)
+ H.show_message("The radiation beam dissipates harmlessly through your body.")
/datum/species/proc/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
// called before a projectile hit
diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
index 7c35ade4f2..e0a9bcaa36 100644
--- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
@@ -30,10 +30,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
/datum/species/dwarf/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
- var/dwarf_hair = pick("Beard (Dwarf)", "Beard (Very Long)", "Beard (Long)") //beard roullette
var/mob/living/carbon/human/H = C
- H.facial_hair_style = dwarf_hair
- H.update_hair()
H.AddElement(/datum/element/dwarfism, COMSIG_SPECIES_LOSS, src)
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) //We register handle_speech is being used.
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index ff0287d7b9..75aff774ce 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -801,11 +801,11 @@
/datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
- C.ventcrawler = VENTCRAWLER_NUDE
+ C.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C)
. = ..()
- C.ventcrawler = initial(C.ventcrawler)
+ C.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/datum/species/golem/bronze
name = "Bronze Golem"
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index c25c5efb6c..697c3db35e 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -64,6 +64,11 @@
H.show_message("The radiation beam singes you!")
if(/obj/item/projectile/energy/florayield)
H.adjust_nutrition(30, NUTRITION_LEVEL_FULL)
+ if(/obj/item/projectile/energy/florarevolution)
+ H.show_message("The radiation beam leaves you feeling disoriented!")
+ H.Dizzy(15)
+ H.emote("flip")
+ H.emote("spin")
/datum/species/pod/pseudo_weak
name = "Anthromorphic Plant"
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 558fdc6594..5e07150ce6 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -169,7 +169,7 @@
if(istype(H, /mob/living/simple_animal))
var/mob/living/simple_animal/SA = H
if((human_caster.blood_volume <= (BLOOD_VOLUME_BAD*human_caster.blood_ratio)) || (ventcrawl_nude_only && length(human_caster.get_equipped_items(include_pockets = TRUE))))
- SA.ventcrawler = FALSE
+ SA.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
if(transfer_name)
H.name = human_caster.name
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 96dab9e95d..e5ba022277 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -159,3 +159,57 @@
/mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I)
var/index = get_held_index_of_item(I)
return index && hand_bodyparts[index]
+
+/**
+ * Proc called when giving an item to another player
+ *
+ * This handles creating an alert and adding an overlay to it
+ */
+/mob/living/carbon/proc/give(target)
+ var/obj/item/receiving = get_active_held_item()
+ if(!receiving)
+ to_chat(src, "You're not holding anything to give!")
+ return
+ visible_message("[src] is offering [receiving]", \
+ "You offer [receiving]", null, 2)
+ var/mob/living/carbon/targets = list()
+ if(!target)
+ for(var/mob/living/carbon/C in orange(1, src))
+ if(!CanReach(C))
+ return
+ targets += C
+ else
+ targets += target
+ if(!targets)
+ return
+ for(var/mob/living/carbon/C in targets)
+ var/obj/screen/alert/give/G = C.throw_alert("[src]", /obj/screen/alert/give)
+ if(!G)
+ return
+ G.setup(C, src, receiving)
+
+/**
+ * Proc called when the player clicks the give alert
+ *
+ * Handles checking if the player taking the item has open slots and is in range of the giver
+ * Also deals with the actual transferring of the item to the players hands
+ * Arguments:
+ * * giver - The person giving the original item
+ * * I - The item being given by the giver
+ */
+/mob/living/carbon/proc/take(mob/living/carbon/giver, obj/item/I)
+ clear_alert("[giver]")
+ if(get_dist(src, giver) > 1)
+ to_chat(src, "[giver] is out of range! ")
+ return
+ if(!I || giver.get_active_held_item() != I)
+ to_chat(src, "[giver] is no longer holding the item they were offering! ")
+ return
+ if(!get_empty_held_indexes())
+ to_chat(src, "You have no empty hands!")
+ return
+ if(!giver.temporarilyRemoveItemFromInventory(I))
+ visible_message("[src] tries to hand over [I] but it's stuck to them....", \
+ " You make a fool of yourself trying to give away an item stuck to your hands")
+ return
+ put_in_hands(I)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index e0fab331a6..9885efd7c7 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -594,10 +594,18 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
drunkenness = max(drunkenness - (drunkenness * 0.04), 0)
if(drunkenness >= 6)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "drunk", /datum/mood_event/drunk)
+ if(prob(25))
+ slurring += 2
jitteriness = max(jitteriness - 3, 0)
+ // throw_alert("drunk", /atom/movable/screen/alert/drunk)
if(HAS_TRAIT(src, TRAIT_DRUNK_HEALING))
adjustBruteLoss(-0.12, FALSE)
adjustFireLoss(-0.06, FALSE)
+ sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC
+ else
+ SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "drunk")
+ clear_alert("drunk")
+ sound_environment_override = SOUND_ENVIRONMENT_NONE
if(mind && (mind.assigned_role == "Scientist" || mind.assigned_role == "Research Director"))
if(SSresearch.science_tech)
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 1f3e0a1b81..d49059f839 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -6,7 +6,6 @@
icon_state = ""
gender = NEUTER
pass_flags = PASSTABLE
- ventcrawler = VENTCRAWLER_NUDE
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey
@@ -29,6 +28,8 @@
create_bodyparts()
create_internal_organs()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_NUDE)
+
. = ..()
if (cubespawned)
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index a47bb7fb4a..d602c25331 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -8,10 +8,12 @@
overlay_fullscreen("high", /obj/screen/fullscreen/high)
throw_alert("high", /obj/screen/alert/high)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "high", /datum/mood_event/high)
+ sound_environment_override = SOUND_ENVIRONMENT_DRUGGED
else
clear_fullscreen("high")
clear_alert("high")
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "high")
+ sound_environment_override = SOUND_ENVIRONMENT_NONE
/mob/living/carbon/set_drugginess(amount)
druggy = max(amount, 0)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 688b0cf63e..be9cd0aabb 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -1,4 +1,4 @@
-/mob/living/gib(no_brain, no_organs, no_bodyparts)
+/mob/living/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
var/prev_lying = lying
if(stat != DEAD)
death(1)
@@ -6,22 +6,22 @@
if(!prev_lying)
gib_animation()
- spill_organs(no_brain, no_organs, no_bodyparts)
+ spill_organs(no_brain, no_organs, no_bodyparts, was_explosion)
if(!no_bodyparts)
- spread_bodyparts(no_brain, no_organs)
+ spread_bodyparts(no_brain, no_organs, was_explosion)
for(var/X in implants)
var/obj/item/implant/I = X
qdel(I)
- spawn_gibs(no_bodyparts)
+ spawn_gibs(no_bodyparts, null, was_explosion)
qdel(src)
/mob/living/proc/gib_animation()
return
-/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override)
+/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override, datum/explosion/was_explosion)
var/location = loc_override ? loc_override.drop_location() : drop_location()
if(mob_biotypes & MOB_ROBOTIC)
new /obj/effect/gibspawner/robot(location, src, get_static_viruses())
@@ -31,7 +31,7 @@
/mob/living/proc/spill_organs()
return
-/mob/living/proc/spread_bodyparts()
+/mob/living/proc/spread_bodyparts(no_brain, no_organs, datum/explosion/was_explosion)
return
/mob/living/dust(just_ash, drop_items, force)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 742d4d8624..386f1174e1 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -81,7 +81,6 @@
var/bloodcrawl = 0 //0 No blood crawling, BLOODCRAWL for bloodcrawling, BLOODCRAWL_EAT for crawling+mob devour
var/holder = null //The holder for blood crawling
- var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always
var/limb_destroyer = 0 //1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack.
var/mob_size = MOB_SIZE_HUMAN
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index 9e093d391e..bafa38ec5e 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -101,6 +101,7 @@
if(lying && !buckled && prob(getBruteLoss()*200/maxHealth))
makeTrail(newloc, T, old_direction)
+
if(causes_dirt_buildup_on_floor && (movement_type & GROUND))
dirt_buildup()
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index 931f87eb7c..2b1c2de17a 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -17,10 +17,6 @@
if (isturf(T))
update_z(T.z)
- //Vents
- if(ventcrawler)
- to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.")
-
if(ranged_ability)
ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!")
if((vore_flags & VORE_INIT) && !(vore_flags & VOREPREF_INIT)) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index fbf2d27c31..e0e1d91ba9 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -911,10 +911,10 @@
if(!istype(apc) || QDELETED(apc) || apc.stat & BROKEN)
to_chat(src, "Hack aborted. The designated APC no longer exists on the power network.")
- playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1)
+ playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, TRUE, ignore_walls = FALSE)
else if(apc.aidisabled)
to_chat(src, "Hack aborted. \The [apc] is no longer responding to our systems.")
- playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 1)
+ playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, TRUE, ignore_walls = FALSE)
else
malf_picker.processing_time += 10
@@ -923,7 +923,7 @@
apc.locked = TRUE
apc.coverlocked = TRUE
- playsound(get_turf(src), 'sound/machines/ding.ogg', 50, 1)
+ playsound(get_turf(src), 'sound/machines/ding.ogg', 50, TRUE, ignore_walls = FALSE)
to_chat(src, "Hack complete. \The [apc] is now under your exclusive control.")
apc.update_icon()
@@ -1039,3 +1039,6 @@
if(current && eyeobj)
return eyeobj.emote(act, m_type, message, intentional, forced = TRUE)
return ..()
+
+/mob/living/silicon/ai/zMove(dir, feedback = FALSE)
+ . = eyeobj.zMove(dir, feedback)
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 17de811cdd..dcaa28b39c 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -94,6 +94,25 @@
if(ai.master_multicam)
ai.master_multicam.refresh_view()
+//it uses setLoc not forceMove, talks to the sillycone and not the camera mob
+/mob/camera/aiEye/zMove(dir, feedback = FALSE)
+ if(dir != UP && dir != DOWN)
+ return FALSE
+ var/turf/target = get_step_multiz(src, dir)
+ if(!target)
+ if(feedback)
+ to_chat(ai, "There's nowhere to go in that direction!")
+ return FALSE
+ if(!canZMove(dir, target))
+ if(feedback)
+ to_chat(ai, "You couldn't move there!")
+ return FALSE
+ setLoc(target, TRUE)
+ return TRUE
+
+/mob/camera/aiEye/canZMove(direction, turf/target) //cameras do not respect these FLOORS you speak so much of
+ return TRUE
+
/mob/camera/aiEye/Move()
return 0
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 786c121ad6..5740f98e90 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -143,6 +143,10 @@
custom_holoform.Grant(src)
emitter_next_use = world.time + 10 SECONDS
+/mob/living/silicon/pai/deployed/Initialize()
+ . = ..()
+ fold_out(TRUE)
+
/mob/living/silicon/pai/ComponentInitialize()
. = ..()
if(possible_chassis[chassis])
@@ -426,6 +430,10 @@
//Misc
.["Cyborg - Misc (dog - blade)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/widerobot.dmi', "blade"), HOLOFORM_FILTER_PAI, FALSE)
+ // Gorillas
+ .["Gorilla (standing)"] = process_holoform_icon_filter(icon('icons/mob/gorilla.dmi', "standing"), HOLOFORM_FILTER_PAI, FALSE)
+ .["Gorilla (crawling)"] = process_holoform_icon_filter(icon('icons/mob/gorilla.dmi', "crawling"), HOLOFORM_FILTER_PAI, FALSE)
+
/mob/living/silicon/pai/proc/default_chassis_pixel_offsets_x()
. = list()
//Engi
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 7c4125fbc6..4c83841809 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -923,7 +923,8 @@
/obj/item/cyborg_clamp,
/obj/item/stack/marker_beacon,
/obj/item/destTagger,
- /obj/item/stack/packageWrap)
+ /obj/item/stack/packageWrap,
+ /obj/item/card/id/miningborg)
emag_modules = list(/obj/item/borg/stun)
ratvar_modules = list(
/obj/item/clockwork/slab/cyborg/miner,
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 0ba4023864..ff6941ec70 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -335,6 +335,11 @@
/mob/living/simple_animal/bot/floorbot/proc/repair(turf/target_turf)
+ if(check_bot_working(target_turf))
+ add_to_ignore(target_turf)
+ target = null
+ playsound(src, 'sound/effects/whistlereset.ogg', 50, TRUE)
+ return
if(isspaceturf(target_turf))
//Must be a hull breach or in line mode to continue.
if(!is_hull_breach(target_turf) && !targetdirection)
@@ -418,3 +423,14 @@
repair(A)
else
..()
+
+/**
+ * Checks a given turf to see if another floorbot is there, working as well.
+ */
+/mob/living/simple_animal/bot/floorbot/proc/check_bot_working(turf/active_turf)
+ if(isturf(active_turf))
+ for(var/mob/living/simple_animal/bot/floorbot/robot in active_turf)
+ if(robot.mode == BOT_REPAIRING)
+ return TRUE
+ return FALSE
+
diff --git a/code/modules/mob/living/simple_animal/friendly/bumbles.dm b/code/modules/mob/living/simple_animal/friendly/bumbles.dm
index 0debb7b98c..6ed6d03b68 100644
--- a/code/modules/mob/living/simple_animal/friendly/bumbles.dm
+++ b/code/modules/mob/living/simple_animal/friendly/bumbles.dm
@@ -20,7 +20,6 @@
density = FALSE
movement_type = FLYING
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
- ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
mob_biotypes = MOB_ORGANIC|MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
@@ -35,6 +34,7 @@
/mob/living/simple_animal/pet/bumbles/Initialize()
. = ..()
add_verb(src, /mob/living/proc/lay_down)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/pet/bumbles/ComponentInitialize()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
index bf4f45e283..1e6afd6044 100644
--- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm
+++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
@@ -20,7 +20,6 @@
density = FALSE
movement_type = FLYING
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
- ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
mob_biotypes = MOB_ORGANIC|MOB_BUG
gold_core_spawnable = FRIENDLY_SPAWN
@@ -33,6 +32,7 @@
. = ..()
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/butterfly/bee_friendly()
return TRUE //treaty signed at the Beeneeva convention
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 71ae3b4c03..4594d27ecd 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -14,7 +14,6 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- ventcrawler = VENTCRAWLER_ALWAYS
pass_flags = PASSTABLE
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
@@ -40,6 +39,7 @@
/mob/living/simple_animal/pet/cat/Initialize()
. = ..()
add_verb(src, /mob/living/proc/lay_down)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/pet/cat/ComponentInitialize()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
index 384fa8146f..f65b2bab9b 100644
--- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
@@ -22,7 +22,6 @@
response_harm_simple = "splat"
speak_emote = list("chitters")
density = FALSE
- ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
gold_core_spawnable = FRIENDLY_SPAWN
verb_say = "chitters"
@@ -32,28 +31,34 @@
var/squish_chance = 50
del_on_death = 1
+/mob/living/simple_animal/cockroach/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/cockroach/death(gibbed)
if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
return
..()
-/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM)
- if(ismob(AM))
- if(isliving(AM))
- var/mob/living/A = AM
- if(A.mob_size > MOB_SIZE_SMALL && !(A.movement_type & FLYING))
- if(prob(squish_chance))
- A.visible_message("[A] squashed [src].", "You squashed [src].")
- adjustBruteLoss(1) //kills a normal cockroach
- else
- visible_message("[src] avoids getting crushed.")
- else
- if(isstructure(AM))
+/mob/living/simple_animal/cockroach/Crossed(atom/movable/AM)
+ . = ..()
+ if(isliving(AM))
+ var/mob/living/A = AM
+ if(A.mob_size > MOB_SIZE_SMALL && !(A.movement_type & FLYING))
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ A.visible_message("[A] carefully steps over [src].", "You carefully step over [src] to avoid hurting it.")
+ return
if(prob(squish_chance))
- AM.visible_message("[src] was crushed under [AM].")
- adjustBruteLoss(1)
+ A.visible_message("[A] squashed [src].", "You squashed [src].")
+ adjustBruteLoss(1) //kills a normal cockroach
else
visible_message("[src] avoids getting crushed.")
+ else if(isstructure(AM))
+ if(prob(squish_chance))
+ AM.visible_message("[src] is crushed under [AM].")
+ adjustBruteLoss(1)
+ else
+ visible_message("[src] avoids getting crushed.")
/mob/living/simple_animal/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach.
return
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 7f3693f622..addbd493a5 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -21,12 +21,15 @@
stop_automated_movement = 1
friendly_verb_continuous = "pinches"
friendly_verb_simple = "pinch"
- ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
var/obj/item/inventory_head
var/obj/item/inventory_mask
gold_core_spawnable = FRIENDLY_SPAWN
+/mob/living/simple_animal/crab/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/crab/BiologicalLife(seconds, times_fired)
if(!(. = ..()))
return
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 0584995583..49581b91a7 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -263,7 +263,7 @@
/mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/user)
if(istype(item_to_add, /obj/item/grenade/plastic)) // last thing he ever wears, I guess
- item_to_add.afterattack(src,user,1)
+ INVOKE_ASYNC(item_to_add, /obj/item.proc/afterattack, src, user, 1)
return
if(inventory_head)
@@ -271,13 +271,15 @@
to_chat(user, "You can't put more than one hat on [src]!")
return
if(!item_to_add)
- user.visible_message("[user] pets [src].","You rest your hand on [src]'s head for a moment.")
+ user.visible_message("[user] pets [src].", "You rest your hand on [src]'s head for a moment.")
+ if(flags_1 & HOLOGRAM_1)
+ return
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/pet_animal, src)
return
if(user && !user.temporarilyRemoveItemFromInventory(item_to_add))
to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")
- return 0
+ return
var/valid = FALSE
if(ispath(item_to_add.dog_fashion, /datum/dog_fashion/head))
@@ -287,11 +289,11 @@
if(valid)
if(health <= 0)
- to_chat(user, "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on [p_them()].")
+ to_chat(user, "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on [p_them()].")
else if(user)
- user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.",
- "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks.",
- "You hear a friendly-sounding bark.")
+ user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.",
+ "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks.",
+ "You hear a friendly-sounding bark.")
item_to_add.forceMove(src)
src.inventory_head = item_to_add
update_corgi_fluff()
@@ -361,7 +363,7 @@
icon_state = "old_corgi"
icon_living = "old_corgi"
icon_dead = "old_corgi_dead"
- desc = "At a ripe old age of [record_age] Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP
+ desc = "At a ripe old age of [record_age], Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP
turns_per_move = 20
RemoveElement(/datum/element/mob_holder, held_icon)
AddElement(/datum/element/mob_holder, "old_corgi")
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index a8c0e7d207..e11facb4ba 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -28,7 +28,6 @@
unsuitable_atmos_damage = 0
wander = 0
speed = 0
- ventcrawler = VENTCRAWLER_ALWAYS
healable = 0
density = FALSE
pass_flags = PASSTABLE | PASSMOB
@@ -101,6 +100,8 @@
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.add_to_hud(src)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/drone/ComponentInitialize()
. = ..()
if(can_be_held)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index 55339a02fd..22dbdd3db7 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -114,7 +114,6 @@
harm_intent_damage = 5
density = TRUE
speed = 1
- ventcrawler = VENTCRAWLER_NONE
faction = list("neutral", "ratvar")
speak_emote = list("clanks", "clinks", "clunks", "clangs")
verb_ask = "requests"
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index 54184310a8..11d7884999 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -110,7 +110,7 @@
to_chat(src, "Your onboard antivirus has initiated lockdown. Motor servos are impaired, ventilation access is denied, and your display reports that you are hacked to all nearby.")
hacked = TRUE
mind.special_role = "hacked drone"
- ventcrawler = VENTCRAWLER_NONE //Again, balance
+ RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) // balance
speed = 1 //gotta go slow
message_admins("[src] ([src.key]) became a hacked drone hellbent on [clockwork ? "serving Ratvar" : "destroying the station"]!")
else
@@ -125,7 +125,7 @@
to_chat(src, "Having been restored, your onboard antivirus reports the all-clear and you are able to perform all actions again.")
hacked = FALSE
mind.special_role = null
- ventcrawler = initial(ventcrawler)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
speed = initial(speed)
if(is_servant_of_ratvar(src))
remove_servant_of_ratvar(src, TRUE)
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 51e7ee6c03..81925d922f 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -241,7 +241,6 @@
attack_verb_simple = "kick"
health = 3
maxHealth = 3
- ventcrawler = VENTCRAWLER_ALWAYS
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
@@ -253,6 +252,7 @@
. = ..()
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/chick/BiologicalLife(seconds, times_fired)
if(!(. = ..()))
@@ -296,7 +296,6 @@
attack_verb_simple = "kick"
health = 15
maxHealth = 15
- ventcrawler = VENTCRAWLER_ALWAYS
var/eggsleft = 0
var/eggsFertile = TRUE
var/body_color
@@ -322,6 +321,8 @@
pixel_y = rand(0, 10)
++chicken_count
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/chicken/Destroy()
--chicken_count
return ..()
@@ -392,7 +393,6 @@
attack_verb_simple = "kick"
health = 25
maxHealth = 25
- ventcrawler = VENTCRAWLER_ALWAYS
var/eggsleft = 0
var/eggsFertile = TRUE
pass_flags = PASSTABLE | PASSMOB
@@ -412,6 +412,8 @@
. = ..()
++kiwi_count
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/kiwi/BiologicalLife(seconds, times_fired)
if(!(. = ..()))
return
@@ -473,7 +475,6 @@
attack_verb_simple = "kick"
health = 10
maxHealth = 10
- ventcrawler = VENTCRAWLER_ALWAYS
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
@@ -486,6 +487,8 @@
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/babyKiwi/BiologicalLife(seconds, times_fired)
if(!(. = ..()))
return
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index b9ff99b677..fd0095bf87 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -18,7 +18,6 @@
response_disarm_simple = "shoo"
response_harm_continuous = "stomps on"
response_harm_simple = "stomp on"
- ventcrawler = VENTCRAWLER_ALWAYS
density = FALSE
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
@@ -31,6 +30,7 @@
/mob/living/simple_animal/hostile/lizard/ComponentInitialize()
. = ..()
AddElement(/datum/element/mob_holder, worn_state = "lizard", inv_slots = ITEM_SLOT_HEAD) //you can hold lizards now.
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target?
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 51c903ee16..8348af43fa 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -22,7 +22,6 @@
response_harm_continuous = "splats"
response_harm_simple = "splat"
density = FALSE
- ventcrawler = VENTCRAWLER_ALWAYS
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
mob_biotypes = MOB_ORGANIC|MOB_BEAST
@@ -40,6 +39,7 @@
icon_state = "mouse_[body_color]"
icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead"
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm
index 71fdbd1465..5e7ed572e2 100644
--- a/code/modules/mob/living/simple_animal/friendly/possum.dm
+++ b/code/modules/mob/living/simple_animal/friendly/possum.dm
@@ -22,12 +22,15 @@
response_harm_continuous = "stamps on"
response_harm_simple = "stamp"
density = FALSE
- ventcrawler = VENTCRAWLER_ALWAYS
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_TINY
mob_biotypes = MOB_ORGANIC|MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
+/mob/living/simple_animal/opossum/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/opossum/poppy
name = "Poppy the Safety Possum"
desc = "Safety first!"
diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm
index 4d20b927a6..61c735c7c1 100644
--- a/code/modules/mob/living/simple_animal/friendly/snake.dm
+++ b/code/modules/mob/living/simple_animal/friendly/snake.dm
@@ -30,7 +30,6 @@
response_harm_continuous = "steps on"
response_harm_simple = "step on"
faction = list("hostile")
- ventcrawler = VENTCRAWLER_ALWAYS
density = FALSE
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
@@ -39,6 +38,9 @@
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
+/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target)
. = oview(vision_range, targets_from) //get list of things in vision range
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
index e7c4e2f352..e2bcdd5684 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -110,6 +110,7 @@
/obj/effect/snare/Crossed(AM as mob|obj)
+ . = ..()
if(isliving(AM) && spawner && spawner.summoner && AM != spawner && !spawner.hasmatchingsummoner(AM))
to_chat(spawner.summoner, "[AM] has crossed surveillance snare, [name].")
var/list/guardians = spawner.summoner.hasparasites()
diff --git a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm
index 259c0bc721..a88593ed74 100644
--- a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm
@@ -22,7 +22,6 @@
speak_emote = list("chitters")
mouse_opacity = 2
density = TRUE
- ventcrawler = VENTCRAWLER_ALWAYS
verb_say = "chitters"
verb_ask = "chitters inquisitively"
verb_exclaim = "chitters loudly"
@@ -37,6 +36,8 @@
if(A)
notify_ghosts("A banana spider has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/banana_spider/attack_ghost(mob/user)
if(key) //please stop using src. without a good reason.
return
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 1be90a07f8..c7772f780d 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -109,7 +109,7 @@
to_chat(user, "You strap the armor plating to [A] and sharpen [A.p_their()] claws with the nail filer. This was a great idea.")
qdel(src)
-mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it.
+/mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it.
name = "Terrygold"
icon_state = "butterbear"
icon_living = "butterbear"
@@ -155,7 +155,7 @@ mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Seve
to_chat(src, "Your name is now \"new_name\"!")
name = new_name
-mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path.
+/mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path.
if(isliving(target))
var/mob/living/L = target
if((L.mobility_flags & MOBILITY_STAND))
diff --git a/code/modules/mob/living/simple_animal/hostile/bread.dm b/code/modules/mob/living/simple_animal/hostile/bread.dm
index 317827028d..70c8b0c540 100644
--- a/code/modules/mob/living/simple_animal/hostile/bread.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bread.dm
@@ -26,7 +26,6 @@
speak_emote = list("growls")
mouse_opacity = 2
density = TRUE
- ventcrawler = VENTCRAWLER_ALWAYS
verb_say = "growls"
verb_ask = "growls inquisitively"
verb_exclaim = "growls loudly"
@@ -38,6 +37,7 @@
var/area/A = get_area(src)
if(A)
notify_ghosts("A tumor bread has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/hostile/bread/attack_ghost(mob/user)
if(key) //please stop using src. without a good reason.
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index bde5a19518..2349685a4e 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -44,7 +44,6 @@
var/busy = SPIDER_IDLE
pass_flags = PASSTABLE
move_to_delay = 6
- ventcrawler = VENTCRAWLER_ALWAYS
attack_verb_continuous = "bites"
attack_verb_simple = "bite"
attack_sound = 'sound/weapons/bite.ogg'
@@ -63,6 +62,8 @@
lay_web = new
lay_web.Grant(src)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/hostile/poison/giant_spider/Destroy()
QDEL_NULL(lay_web)
return ..()
@@ -389,7 +390,6 @@
name = "Wrap"
panel = "Spider"
active = FALSE
- datum/action/spell_action/action = null
desc = "Wrap something or someone in a cocoon. If it's a living being, you'll also consume them, allowing you to lay eggs."
ranged_mousepointer = 'icons/effects/wrap_target.dmi'
action_icon = 'icons/mob/actions/actions_animal.dmi'
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 850beeb099..5e34d17bb2 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -20,11 +20,14 @@
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
speak_emote = list("squeaks")
- ventcrawler = VENTCRAWLER_ALWAYS
var/datum/mind/origin
var/egg_lain = 0
gold_core_spawnable = NO_SPAWN //are you sure about this?? // CITADEL CHANGE, Yes.
+/mob/living/simple_animal/hostile/headcrab/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)
egg.Insert(victim)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 37eb9b7f67..95f8f2acc1 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -511,7 +511,7 @@
DestroyObjectsInDirection(direction)
-mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them
+/mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them
if(environment_smash)
EscapeConfinement()
for(var/dir in GLOB.cardinals)
diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
index b86d5d87fc..d3d3dadd1e 100644
--- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm
+++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
@@ -22,10 +22,13 @@
attack_verb_continuous = "slams"
attack_verb_simple = "slam"
attack_sound = 'sound/weapons/punch1.ogg'
- ventcrawler = VENTCRAWLER_ALWAYS
faction = list("plants")
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 150
maxbodytemp = 500
gold_core_spawnable = HOSTILE_SPAWN
+
+/mob/living/simple_animal/hostile/killertomato/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index fa3a59a6b9..a584d34995 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -620,7 +620,6 @@ Difficulty: Very Hard
density = FALSE
movement_type = FLYING
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
- ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
gold_core_spawnable = HOSTILE_SPAWN
verb_say = "warps"
@@ -648,6 +647,7 @@ Difficulty: Very Hard
remove_verb(src, /mob/verb/me_verb)
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/hostile/lightgeist/AttackingTarget()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index 61be1f6287..cee7e2979d 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -94,16 +94,17 @@
consume_bait()
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/proc/consume_bait()
- var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in oview(src, 9)
- var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in oview(src, 9)
- if(!diamonds && !bait)
- return
+ var/list/L = list()
+ for(var/obj/O in view(src, 9))
+ L += O
+ var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in L
if(diamonds)
var/distanced = 0
distanced = get_dist(loc,diamonds.loc)
if(distanced <= 1 && diamonds)
qdel(diamonds)
src.visible_message("[src] consumes [diamonds], and it disappears! ...At least, you think.")
+ var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in L
if(bait)
var/distanceb = 0
distanceb = get_dist(loc,bait.loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index 4e8f4f6160..ef51dc572f 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -219,6 +219,9 @@
/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/Initialize(mapload, new_spawner)
. = ..()
+ INVOKE_ASYNC(src, .proc/createpatch)
+
+/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/proc/createpatch()
var/tentacle_locs = spiral_range_turfs(1, get_turf(src))
for(var/T in tentacle_locs)
new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index 0ccc4525c7..e35220a920 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -27,7 +27,6 @@
friendly_verb_continuous = "pinches"
friendly_verb_simple = "pinch"
a_intent = INTENT_HELP
- ventcrawler = VENTCRAWLER_ALWAYS
gold_core_spawnable = FRIENDLY_SPAWN
stat_attack = UNCONSCIOUS
gender = NEUTER
@@ -50,6 +49,7 @@
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
udder = new()
. = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/hostile/asteroid/gutlunch/CanAttack(atom/the_target) // Gutlunch-specific version of CanAttack to handle stupid stat_exclusive = true crap so we don't have to do it for literally every single simple_animal/hostile except the two that spawn in lavaland
if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 11ce4f9214..ae0f5ea3ca 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -398,7 +398,6 @@
uniform = /obj/item/clothing/under/color/grey
belt = /obj/item/tank/internals/emergency_oxygen
mask = /obj/item/clothing/mask/gas
- ears = /obj/item/radio/headset
gloves = /obj/item/clothing/gloves/color/fyellow
id = /obj/item/card/id/silver/reaper //looks cool and has a fancy name but only a 1% chance
if(prob(99))
@@ -412,7 +411,7 @@
back = /obj/item/spear
else if(prob(80)) //Now they dont always have a backpack
back = /obj/item/storage/backpack
- backpack_contents = list(/obj/item/stack/cable_coil = 1, /obj/item/assembly/flash = 1, /obj/item/storage/fancy/donut_box = 1, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 1, /obj/item/lighter = 1)
+ backpack_contents = list(/obj/item/stack/cable_coil = 1, /obj/item/storage/fancy/donut_box = 1, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 1, /obj/item/lighter = 1)
if(prob(90))
r_pocket = /obj/item/kitchen/knife
if(prob(60))
@@ -423,7 +422,6 @@
suit = /obj/item/clothing/suit/hooded/bee_costume
shoes = /obj/item/clothing/shoes/sneakers/yellow
gloves = /obj/item/clothing/gloves/color/yellow
- ears = /obj/item/radio/headset
belt = /obj/item/storage/belt/fannypack/yellow
id_job = "Assisant"
id = /obj/item/card/id
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 9101430ccc..f41746ea69 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -28,7 +28,6 @@
stat_attack = DEAD
mouse_opacity = MOUSE_OPACITY_ICON
speed = 1
- ventcrawler = VENTCRAWLER_ALWAYS
robust_searching = 1
unique_name = 1
speak_emote = list("squeaks")
@@ -41,6 +40,10 @@
var/static/mutable_appearance/cap_living //Where we store our cap icons so we dont generate them constantly to update our icon
var/static/mutable_appearance/cap_dead
+/mob/living/simple_animal/hostile/mushroom/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/hostile/mushroom/examine(mob/user)
. = ..()
if(health >= maxHealth)
diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm
index 77b2d4268a..77731f0ea4 100644
--- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm
@@ -23,7 +23,6 @@
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/punch1.ogg'
- ventcrawler = VENTCRAWLER_ALWAYS
unique_name = TRUE
faction = list("rat")
var/datum/action/cooldown/coffer
@@ -42,6 +41,8 @@
key = C.key
notify_ghosts("All rise for the rat king, ascendant to the throne in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/hostile/regalrat/handle_automated_action()
if(prob(20))
riot.Trigger()
@@ -175,7 +176,6 @@
health = 15
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1)
density = FALSE
- ventcrawler = VENTCRAWLER_ALWAYS
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
mob_biotypes = MOB_ORGANIC|MOB_BEAST
@@ -185,6 +185,7 @@
. = ..()
SSmobs.cheeserats += src
AddComponent(/datum/component/swarming)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/hostile/rat/Destroy()
SSmobs.cheeserats -= src
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
index 9045ccef51..cb1ee6c6f6 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
@@ -30,7 +30,6 @@
attack_sound = 'sound/weapons/bite.ogg'
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
- ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
movement_type = FLYING
speak_emote = list("squeaks")
@@ -38,11 +37,14 @@
var/min_oxy = 0
var/max_tox = 0
-
//Space bats need no air to fly in.
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
+/mob/living/simple_animal/hostile/retaliate/bat/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/hostile/retaliate/bat/secbat
name = "Security Bat"
icon_state = "secbat"
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index dec2159dc0..96418686d3 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -137,7 +137,6 @@
emote_see = list("honks", "sweats", "jiggles", "contemplates its existence")
speak_chance = 5
dextrous = TRUE
- ventcrawler = VENTCRAWLER_ALWAYS
maxHealth = 140
health = 140
speed = -5
@@ -147,6 +146,10 @@
obj_damage = 5
loot = list(/obj/item/clothing/suit/hooded/bloated_human, /obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap)
+/mob/living/simple_animal/hostile/retaliate/clown/fleshclown/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/hostile/retaliate/clown/longface
name = "Longface"
desc = "Often found walking into the bar."
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm
index 8424a0a576..2433b45cc0 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm
@@ -22,7 +22,6 @@
response_harm_continuous = "splats"
response_harm_simple = "splat"
density = FALSE
- ventcrawler = VENTCRAWLER_ALWAYS
faction = list("hostile")
attack_sound = 'sound/effects/reee.ogg'
butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 1)
@@ -40,9 +39,11 @@
icon_living = "rare_frog"
icon_dead = "rare_frog_dead"
butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 5)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/hostile/retaliate/frog/Crossed(AM as mob|obj)
+ . = ..()
if(!stat && isliving(AM))
var/mob/living/L = AM
if(L.mob_size > MOB_SIZE_TINY)
- playsound(src, stepped_sound, 50, 1)
+ playsound(src, stepped_sound, 50, TRUE)
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index fdb088934c..cc5b0b8a75 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -190,5 +190,5 @@
* Arguments:
* * datum/beam/vine - The vine to be removed from the list.
*/
-mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force)
+/mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force)
vines -= vine
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 6e02944885..d146bb855f 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -83,6 +83,8 @@
//Headset for Poly to yell at engineers :)
var/obj/item/radio/headset/ears = null
+ /// spawns with headset
+ var/spawns_with_headset = FALSE
//The thing the parrot is currently interested in. This gets used for items the parrot wants to pick up, mobs it wants to steal from,
//mobs it wants to attack or mobs that have attacked it
@@ -105,13 +107,14 @@
/mob/living/simple_animal/parrot/Initialize()
. = ..()
- if(!ears)
- var/headset = pick(/obj/item/radio/headset/headset_sec, \
- /obj/item/radio/headset/headset_eng, \
- /obj/item/radio/headset/headset_med, \
- /obj/item/radio/headset/headset_sci, \
- /obj/item/radio/headset/headset_cargo)
- ears = new headset(src)
+ if(spawns_with_headset)
+ if(!ears)
+ var/headset = pick(/obj/item/radio/headset/headset_sec, \
+ /obj/item/radio/headset/headset_eng, \
+ /obj/item/radio/headset/headset_med, \
+ /obj/item/radio/headset/headset_sci, \
+ /obj/item/radio/headset/headset_cargo)
+ ears = new headset(src)
parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var
@@ -881,6 +884,7 @@
speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE")
gold_core_spawnable = NO_SPAWN
speak_chance = 3
+ spawns_with_headset = TRUE
var/memory_saved = FALSE
var/rounds_survived = 0
var/longest_survival = 0
@@ -1189,4 +1193,4 @@
icon_state = "mtoo-flap"
icon_living = "mtoo-flap"
icon_dead = "mtoo-dead"
- icon_sit = "mtoo_sit"
\ No newline at end of file
+ icon_sit = "mtoo_sit"
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index ab59441572..06649ac7d6 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -4,7 +4,6 @@
icon_state = "grey baby slime"
pass_flags = PASSTABLE
mob_size = MOB_SIZE_SMALL
- ventcrawler = VENTCRAWLER_ALWAYS
gender = NEUTER
var/is_adult = 0
var/docile = 0
@@ -108,6 +107,8 @@
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_SLIME, 7.5)
set_nutrition(rand(650, 800))
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/slime/Destroy()
for (var/A in actions)
var/datum/action/AC = A
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 4c00fd0033..9ade9f097f 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -5,7 +5,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
//VENTCRAWLING
-/mob/living/proc/handle_ventcrawl(atom/A)
+/mob/living/proc/handle_ventcrawl(atom/A, ventcrawler)
if(!ventcrawler || !Adjacent(A))
return
. = TRUE //return value to stop the client from being shown the turf contents stat tab on alt-click.
@@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
if(!client)
return
- if(iscarbon(src) && ventcrawler == VENTCRAWLER_NUDE)
+ if(iscarbon(src) && ventcrawler==VENTCRAWLER_NUDE)
if(length(get_equipped_items(include_pockets = TRUE)) || get_num_held_items())
to_chat(src, "You can't crawl around in the ventilation ducts with items!")
return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index dc81b3cfbf..ba2399b831 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -177,3 +177,6 @@
var/list/ability_actions
/// ability = list(data). see __DEFINES/mobs/innate_abilities.dm
var/list/ability_properties
+
+ ///Override for sound_environments. If this is set the user will always hear a specific type of reverb (Instead of the area defined reverb)
+ var/sound_environment_override = SOUND_ENVIRONMENT_NONE
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index e977c397c9..c467605f37 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -73,6 +73,7 @@
return FALSE
//We are now going to move
var/add_delay = mob.movement_delay()
+ mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay * ( (NSCOMPONENT(direction) && EWCOMPONENT(direction)) ? 2 : 1 ) ), FALSE) // set it now in case of pulled objects
if(old_move_delay + (add_delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time)
move_delay = old_move_delay
else
@@ -95,6 +96,7 @@
if((direction & (direction - 1)) && mob.loc == n) //moved diagonally successfully
add_delay *= 2
+ mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay), FALSE)
move_delay += add_delay
if(.) // If mob is null here, we deserve the runtime
if(mob.throwing)
@@ -104,6 +106,8 @@
if(AM && AM.density && !SEND_SIGNAL(L, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE) && !ismob(AM))
L.setDir(turn(L.dir, 180))
+ last_move = world.time
+
SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVE, src, direction, n, oldloc, add_delay)
/// Process_Grab(): checks for grab, attempts to break if so. Return TRUE to prevent movement.
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index c5c53dc876..94bf45c1b0 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -3,14 +3,14 @@
//////////////////////////////////////////////////////
/mob/proc/get_top_level_mob()
- if(istype(src.loc,/mob)&&src.loc!=src)
- var/mob/M=src.loc
+ if(ismob(src.loc) && src.loc != src)
+ var/mob/M = src.loc
return M.get_top_level_mob()
return src
-proc/get_top_level_mob(var/mob/S)
- if(istype(S.loc,/mob)&&S.loc!=S)
- var/mob/M=S.loc
+/proc/get_top_level_mob(mob/S)
+ if(ismob(S.loc) && S.loc != S)
+ var/mob/M = S.loc
return M.get_top_level_mob()
return S
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 3a7e270567..e49bd5162b 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -175,6 +175,7 @@
icon = null
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
+
new /obj/effect/temp_visual/monkeyify/humanify(loc)
transformation_timer = addtimer(CALLBACK(src, .proc/finish_humanize, tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
@@ -202,6 +203,8 @@
var/mob/living/carbon/human/O = new( loc )
for(var/obj/item/C in O.loc)
+ if(C.anchored)
+ continue
O.equip_to_appropriate_slot(C)
dna.transfer_identity(O)
diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm
index 4c7b51a7fd..002cf20801 100644
--- a/code/modules/modular_computers/file_system/programs/arcade.dm
+++ b/code/modules/modular_computers/file_system/programs/arcade.dm
@@ -27,7 +27,7 @@
// user?.mind?.adjust_experience(/datum/skill/gaming, 1)
if(boss_hp <= 0)
heads_up = "You have crushed [boss_name]! Rejoice!"
- playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3, falloff = 10)
+ playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3)
game_active = FALSE
program_icon_state = "arcade_off"
if(istype(computer))
@@ -37,7 +37,7 @@
sleep(10)
else if(player_hp <= 0 || player_mp <= 0)
heads_up = "You have been defeated... how will the station survive?"
- playsound(computer.loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3, falloff = 10)
+ playsound(computer.loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3)
game_active = FALSE
program_icon_state = "arcade_off"
if(istype(computer))
@@ -57,17 +57,17 @@
return
if (boss_mp <= 5)
heads_up = "[boss_mpamt] magic power has been stolen from you!"
- playsound(computer.loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3, falloff = 10)
+ playsound(computer.loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3)
player_mp -= boss_mpamt
boss_mp += boss_mpamt
else if(boss_mp > 5 && boss_hp <12)
heads_up = "[boss_name] heals for [bossheal] health!"
- playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 10)
+ playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
boss_hp += bossheal
boss_mp -= boss_mpamt
else
heads_up = "[boss_name] attacks you for [boss_attackamt] damage!"
- playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 10)
+ playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
player_hp -= boss_attackamt
pause_state = FALSE
@@ -106,7 +106,7 @@
attackamt = rand(2,6)// + rand(0, gamerSkill)
pause_state = TRUE
heads_up = "You attack for [attackamt] damage."
- playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 10)
+ playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
boss_hp -= attackamt
sleep(10)
game_check()
@@ -123,7 +123,7 @@
healcost = rand(1, maxPointCost)
pause_state = TRUE
heads_up = "You heal for [healamt] damage."
- playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 10)
+ playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
player_hp += healamt
player_mp -= healcost
sleep(10)
@@ -136,7 +136,7 @@
rechargeamt = rand(4,7)// + rand(0, gamerSkill)
pause_state = TRUE
heads_up = "You regain [rechargeamt] magic power."
- playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3, falloff = 10)
+ playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3)
player_mp += rechargeamt
sleep(10)
game_check()
diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm
index 6d45914add..3455547d20 100644
--- a/code/modules/modular_computers/file_system/programs/card.dm
+++ b/code/modules/modular_computers/file_system/programs/card.dm
@@ -175,7 +175,7 @@
if("PRG_edit")
if(!computer || !authenticated || !target_id_card)
return
- var/new_name = params["name"]
+ var/new_name = reject_bad_name(params["name"])
if(!new_name)
return
target_id_card.registered_name = new_name
@@ -190,7 +190,7 @@
return
if(target == "Custom")
- var/custom_name = params["custom_name"]
+ var/custom_name = reject_bad_name(params["custom_name"])
if(custom_name)
target_id_card.assignment = custom_name
target_id_card.update_label()
diff --git a/code/modules/movespeed/_movespeed_modifier.dm b/code/modules/movespeed/_movespeed_modifier.dm
index 9c8036bd55..46d10afe7f 100644
--- a/code/modules/movespeed/_movespeed_modifier.dm
+++ b/code/modules/movespeed/_movespeed_modifier.dm
@@ -96,7 +96,7 @@ GLOBAL_LIST_EMPTY(movespeed_modification_cache)
return TRUE
remove_movespeed_modifier(existing, FALSE)
if(length(movespeed_modification))
- BINARY_INSERT(type_or_datum.id, movespeed_modification, datum/movespeed_modifier, type_or_datum, priority, COMPARE_VALUE)
+ BINARY_INSERT(type_or_datum.id, movespeed_modification, /datum/movespeed_modifier, type_or_datum, priority, COMPARE_VALUE)
LAZYSET(movespeed_modification, type_or_datum.id, type_or_datum)
if(update)
update_movespeed()
@@ -217,13 +217,25 @@ GLOBAL_LIST_EMPTY(movespeed_modification_cache)
else
continue
. = M.apply_multiplicative(., src)
- var/old = cached_multiplicative_slowdown // CITAEDL EDIT - To make things a bit less jarring, when in situations where
// your delay decreases, "give" the delay back to the client
cached_multiplicative_slowdown = .
- var/diff = old - cached_multiplicative_slowdown
- if((diff > 0) && client)
+ if(!client)
+ return
+ var/diff = (client.last_move - client.move_delay) - cached_multiplicative_slowdown
+ if(diff > 0)
if(client.move_delay > world.time + 1.5)
client.move_delay -= diff
+ var/timeleft = world.time - client.move_delay
+ var/elapsed = world.time - client.last_move
+ var/glide_size_current = glide_size
+ if((timeleft <= 0) || (elapsed > 20))
+ set_glide_size(16, TRUE)
+ return
+ var/pixels_moved = glide_size_current * elapsed * (1 / world.tick_lag)
+ // calculate glidesize needed to move to the next tile within timeleft deciseconds
+ var/ticks_allowed = timeleft / world.tick_lag
+ var/pixels_per_tick = pixels_moved / ticks_allowed
+ set_glide_size(pixels_per_tick * GLOB.glide_size_multiplier, TRUE)
/// Get the move speed modifiers list of the mob
/mob/proc/get_movespeed_modifiers()
diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
index d453124b71..cdfb275418 100644
--- a/code/modules/movespeed/modifiers/mobs.dm
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -62,6 +62,11 @@
var/mod = CONFIG_GET(number/movedelay/walk_delay)
multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown)
+/datum/movespeed_modifier/config_wak_run/walk/apply_multiplicative(existing, mob/target)
+ . = ..()
+ if(HAS_TRAIT(target, TRAIT_SPEEDY_STEP))
+ . -= 1.25
+
/datum/movespeed_modifier/config_walk_run/run/sync()
var/mod = CONFIG_GET(number/movedelay/run_delay)
multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown)
diff --git a/code/modules/movespeed/modifiers/reagents.dm b/code/modules/movespeed/modifiers/reagents.dm
index b6c2458670..1a03e8a602 100644
--- a/code/modules/movespeed/modifiers/reagents.dm
+++ b/code/modules/movespeed/modifiers/reagents.dm
@@ -12,3 +12,7 @@
/datum/movespeed_modifier/reagent/nitryl
multiplicative_slowdown = -1
+
+/datum/movespeed_modifier/reagent/meth
+ multiplicative_slowdown = -0.5
+ absolute_max_tiles_per_second = 11
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 20ec678e45..a00145f9dc 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -193,6 +193,13 @@
user.visible_message(ignition_message)
add_fingerprint(user)
fire_act(I.get_temperature())
+//I would have it become a paper plane before the throw, but that would risk runtimes
+/obj/item/paper/DoRevenantThrowEffects(atom/target)
+ sleep(10)
+ if(HAS_TRAIT(src, TRAIT_SPOOKY_THROW))
+ return
+ new /obj/item/paperplane(get_turf(src))
+ qdel(src)
/obj/item/paper/attackby(obj/item/P, mob/living/user, params)
if(burn_paper_product_attackby_check(P, user))
diff --git a/code/modules/pool/pool_main.dm b/code/modules/pool/pool_main.dm
index 98189cc8a4..088c991ca0 100644
--- a/code/modules/pool/pool_main.dm
+++ b/code/modules/pool/pool_main.dm
@@ -150,7 +150,8 @@
H.DefaultCombatKnockdown(40)
playsound(src, 'sound/effects/woodhit.ogg', 60, TRUE, 1)
else if(filled)
- victim.adjustStaminaLoss(1)
+ if(iscarbon(victim))
+ victim.adjustStaminaLoss(1)
playsound(src, "water_wade", 20, TRUE)
return ..()
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index dfb51df9cf..2ca9b7513c 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -56,12 +56,14 @@
else
..()
-/obj/machinery/field/containment/Crossed(mob/mover)
- if(isliving(mover))
- shock(mover)
+/obj/machinery/field/containment/Crossed(atom/movable/AM)
+ . = ..()
+ if(isliving(AM))
+ shock(AM)
+
+ if(ismachinery(AM) || isstructure(AM) || ismecha(AM))
+ bump_field(AM)
- if(ismachinery(mover) || isstructure(mover) || ismecha(mover))
- bump_field(mover)
/obj/machinery/field/containment/proc/set_master(master1,master2)
if(!master1 || !master2)
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index 9e098446d1..7ecde364ae 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -44,6 +44,7 @@
movement_range = 0
/obj/effect/accelerated_particle/Crossed(atom/A)
+ . = ..()
if(isliving(A))
toxmob(A)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index f385b640aa..1e82a601ea 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -348,11 +348,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
/obj/machinery/power/supermatter_crystal/proc/alarm()
switch(get_status())
if(SUPERMATTER_DELAMINATING)
- playsound(src, 'sound/misc/bloblarm.ogg', 100)
+ playsound(src, 'sound/misc/bloblarm.ogg', 100, FALSE, 40, 30, falloff_distance = 10)
if(SUPERMATTER_EMERGENCY)
- playsound(src, 'sound/machines/engine_alert1.ogg', 100)
+ playsound(src, 'sound/machines/engine_alert1.ogg', 100, FALSE, 30, 30, falloff_distance = 10)
if(SUPERMATTER_DANGER)
- playsound(src, 'sound/machines/engine_alert2.ogg', 100)
+ playsound(src, 'sound/machines/engine_alert2.ogg', 100, FALSE, 30, 30, falloff_distance = 10)
if(SUPERMATTER_WARNING)
playsound(src, 'sound/machines/terminal_alert.ogg', 75)
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 68c1c1036d..2a41b41d1d 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -8,7 +8,7 @@
projectile_type = /obj/item/projectile/bullet/shotgun_slug
custom_materials = list(/datum/material/iron=4000)
-obj/item/ammo_casing/shotgun/executioner
+/obj/item/ammo_casing/shotgun/executioner
name = "executioner slug"
desc = "A 12 gauge lead slug purpose built to annihilate flesh on impact."
icon_state = "stunshell"
diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm
index fc4207d084..2bf7c06ec6 100644
--- a/code/modules/projectiles/ammunition/energy/special.dm
+++ b/code/modules/projectiles/ammunition/energy/special.dm
@@ -24,6 +24,11 @@
projectile_type = /obj/item/projectile/energy/floramut
select_name = "mutation"
+/obj/item/ammo_casing/energy/flora/revolution
+ projectile_type = /obj/item/projectile/energy/florarevolution
+ select_name = "revolution"
+ e_cost = 250
+
/obj/item/ammo_casing/energy/temp
projectile_type = /obj/item/projectile/temp
select_name = "freeze"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 1c3a0d230f..e3a2da68da 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -18,6 +18,8 @@
item_flags = NEEDS_PERMIT
attack_verb = list("struck", "hit", "bashed")
attack_speed = CLICK_CD_RANGE
+ var/ranged_attack_speed = CLICK_CD_RANGE
+ var/melee_attack_speed = CLICK_CD_MELEE
var/fire_sound = "gunshot"
var/suppressed = null //whether or not a message is displayed when fired
@@ -158,7 +160,7 @@
user.UseStaminaBuffer(safe_cost)
if(suppressed)
- playsound(user, fire_sound, 10, 1)
+ playsound(user, fire_sound, 10, TRUE, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
else
playsound(user, fire_sound, 50, 1)
if(message)
@@ -173,12 +175,25 @@
for(var/obj/O in contents)
O.emp_act(severity)
+/obj/item/gun/attack(mob/living/M, mob/user)
+ . = ..()
+ if(!(. & DISCARD_LAST_ACTION))
+ user.DelayNextAction(melee_attack_speed)
+
+/obj/item/gun/attack_obj(obj/O, mob/user)
+ . = ..()
+ if(!(. & DISCARD_LAST_ACTION))
+ user.DelayNextAction(melee_attack_speed)
+
/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params)
. = ..()
- if(!CheckAttackCooldown(user, target))
+ if(!CheckAttackCooldown(user, target, TRUE))
return
process_afterattack(target, user, flag, params)
+/obj/item/gun/CheckAttackCooldown(mob/user, atom/target, shooting = FALSE)
+ return user.CheckActionCooldown(shooting? ranged_attack_speed : attack_speed, clickdelay_from_next_action, clickdelay_mod_bypass, clickdelay_ignores_next_action)
+
/obj/item/gun/proc/process_afterattack(atom/target, mob/living/user, flag, params)
if(!target)
return
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index a08e570dd7..f965100846 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -45,7 +45,7 @@
desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
icon_state = "flora"
item_state = "gun"
- ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut)
+ ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut, /obj/item/ammo_casing/energy/flora/revolution)
modifystate = 1
ammo_x_offset = 1
selfcharge = EGUN_SELFCHARGE
@@ -173,18 +173,60 @@
force = 15
ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
+//Sci guns
+
+/obj/item/gun/energy/gravity_gun
+ name = "one-point gravitational manipulator"
+ desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity. Requires an anomaly core to function."
+ ammo_type = list(/obj/item/ammo_casing/energy/gravity/repulse, /obj/item/ammo_casing/energy/gravity/attract, /obj/item/ammo_casing/energy/gravity/chaos)
+ item_state = "gravity_gun"
+ icon_state = "gravity_gun"
+ var/power = 4
+ var/firing_core = FALSE
+
+/obj/item/gun/energy/gravity_gun/attackby(obj/item/C, mob/user)
+ if(istype(C, /obj/item/assembly/signaler/anomaly))
+ to_chat(user, "You insert [C] into the gravitational manipulator and the weapon gently hums to life.")
+ firing_core = TRUE
+ playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
+ qdel(C)
+ return
+ return ..()
+
+/obj/item/gun/energy/gravity_gun/can_shoot()
+ if(!firing_core)
+ return FALSE
+ return ..()
+
/obj/item/gun/energy/wormhole_projector
name = "bluespace wormhole projector"
- desc = "A projector that emits high density quantum-coupled bluespace beams."
+ desc = "A projector that emits high density quantum-coupled bluespace beams. Requires an anomaly core to function."
ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
item_state = null
icon_state = "wormhole_projector"
- pin = null
inaccuracy_modifier = 0.25
automatic_charge_overlays = FALSE
var/obj/effect/portal/p_blue
var/obj/effect/portal/p_orange
var/atmos_link = FALSE
+ var/firing_core = FALSE
+
+/obj/item/gun/energy/wormhole_projector/attackby(obj/item/C, mob/user)
+ if(istype(C, /obj/item/assembly/signaler/anomaly))
+ to_chat(user, "You insert [C] into the wormhole projector and the weapon gently hums to life.")
+ firing_core = TRUE
+ playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
+ qdel(C)
+ return
+
+/obj/item/gun/energy/wormhole_projector/can_shoot()
+ if(!firing_core)
+ return FALSE
+ return ..()
+
+/obj/item/gun/energy/wormhole_projector/shoot_with_empty_chamber(mob/living/user)
+ . = ..()
+ to_chat(user, "The display says, 'NO CORE INSTALLED'.")
/obj/item/gun/energy/wormhole_projector/update_icon_state()
icon_state = "[initial(icon_state)][current_firemode_index]"
@@ -243,6 +285,9 @@
p_blue = P
crosslink()
+/obj/item/gun/energy/wormhole_projector/core_inserted
+ firing_core = TRUE
+
/* 3d printer 'pseudo guns' for borgs */
/obj/item/gun/energy/printer
@@ -298,18 +343,6 @@
/obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib
return
-/obj/item/gun/energy/gravity_gun
- name = "one-point bluespace-gravitational manipulator"
- desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity."
- ammo_type = list(/obj/item/ammo_casing/energy/gravity/repulse, /obj/item/ammo_casing/energy/gravity/attract, /obj/item/ammo_casing/energy/gravity/chaos)
- item_state = "gravity_gun"
- icon_state = "gravity_gun"
- pin = null
- var/power = 4
-
-/obj/item/gun/energy/gravity_gun/security
- pin = /obj/item/firing_pin
-
//Emitter Gun
/obj/item/gun/energy/emitter
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index fb9e6ff6c6..481d3c2c68 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -471,11 +471,10 @@
if(paused || !isturf(loc))
return
- var/ds = (SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait
- var/required_pixels = (pixels_per_second * ds * 0.1) + pixels_tick_leftover
+ var/required_pixels = (pixels_per_second * wait) + pixels_tick_leftover
if(required_pixels >= pixel_increment_amount)
pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount)
- pixel_move(FLOOR(required_pixels / pixel_increment_amount, 1), FALSE, ds, SSprojectiles.global_projectile_speed_multiplier)
+ pixel_move(FLOOR(required_pixels / pixel_increment_amount, 1), FALSE, wait, SSprojectiles.global_projectile_speed_multiplier)
else
pixels_tick_leftover = required_pixels
@@ -603,7 +602,7 @@
* Trajectory multiplier directly modifies the factor of pixel_increment_amount to go per time.
* It's complicated, so probably just don't mess with this unless you know what you're doing.
*/
-/obj/item/projectile/proc/pixel_move(times, hitscanning = FALSE, deciseconds_equivalent = world.tick_lag, trajectory_multiplier = 1, allow_animation = TRUE)
+/obj/item/projectile/proc/pixel_move(times, hitscanning = FALSE, seconds_equivalent = world.tick_lag * 0.1, trajectory_multiplier = 1, allow_animation = TRUE)
if(!loc || !trajectory)
return
if(!nondirectional_sprite && !hitscanning)
@@ -620,7 +619,7 @@
if(homing_target)
// No datum/points, too expensive.
var/angle = closer_angle_difference(Angle, get_projectile_angle(src, homing_target))
- var/max_turn = homing_turn_speed * deciseconds_equivalent * 0.1
+ var/max_turn = homing_turn_speed * seconds_equivalent
setAngle(Angle + clamp(angle, -max_turn, max_turn))
// HOMING END
trajectory.increment(trajectory_multiplier)
diff --git a/code/modules/projectiles/projectile/plasma.dm b/code/modules/projectiles/projectile/plasma.dm
index 838dac34a0..474a3d95c7 100644
--- a/code/modules/projectiles/projectile/plasma.dm
+++ b/code/modules/projectiles/projectile/plasma.dm
@@ -1,4 +1,4 @@
-obj/item/projectile/energy/plasmabolt
+/obj/item/projectile/energy/plasmabolt
name = "plasma bolt"
icon_state = "plasma"
flag = "energy"
diff --git a/code/modules/projectiles/projectile/reusable/foam_dart.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm
index 7d21f663c2..b00c35cd18 100644
--- a/code/modules/projectiles/projectile/reusable/foam_dart.dm
+++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm
@@ -20,8 +20,9 @@
newcasing.modified = modified
var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB
newdart.modified = modified
- newdart.damage = damage
- newdart.nodamage = nodamage
+ if(modified)
+ newdart.damage = 5
+ newdart.nodamage = FALSE
newdart.damage_type = damage_type
if(pen)
newdart.pen = pen
diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm
index c3fe1f0fcb..b855322f09 100644
--- a/code/modules/projectiles/projectile/special/floral.dm
+++ b/code/modules/projectiles/projectile/special/floral.dm
@@ -2,7 +2,7 @@
name = "alpha somatoray"
icon_state = "energy"
damage = 0
- damage_type = TOX
+ damage_type = TRUE
nodamage = 1
flag = "energy"
@@ -21,5 +21,13 @@
icon_state = "energy2"
damage = 0
damage_type = TOX
- nodamage = 1
+ nodamage = TRUE
+ flag = "energy"
+
+/obj/item/projectile/energy/florarevolution
+ name = "gamma somatorary"
+ icon_state = "energy3"
+ damage = 0
+ damage_type = TOX
+ nodamage = TRUE
flag = "energy"
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index a0de9f7a7f..aae21464b1 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -2288,6 +2288,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
//Race-Base-Drinks//
////////////////////
/datum/reagent/consumable/ethanol/species_drink
+ name = "Species Drink"
var/species_required
var/disgust = 26
boozepwr = 50
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 37fc075c6f..0e1cd77793 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -504,6 +504,14 @@
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
value = REAGENT_VALUE_COMMON
+/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/carbon/M)
+ M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
+ return ..()
+
+/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/carbon/M)
+ M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
+ return ..()
+
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
M.set_drugginess(30)
@@ -625,8 +633,9 @@
myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.5))
/datum/reagent/consumable/buzz_fuzz/on_mob_life(mob/living/carbon/M)
- M.reagents.add_reagent(/datum/reagent/consumable/sugar,1)
- if(prob(5))
+ if(prob(33))
+ M.reagents.add_reagent(/datum/reagent/consumable/sugar,1)
+ if(prob(1))
M.reagents.add_reagent(/datum/reagent/consumable/honey,1)
..()
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 0b44c33926..675502c5fb 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -174,11 +174,13 @@
ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type)
L.update_movespeed()
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L)
REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type)
L.update_movespeed()
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
..()
/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 7ab50884e0..e55286ed3f 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -272,10 +272,10 @@
overdose_threshold = 50
/datum/reagent/medicine/silver_sulfadiazine/reaction_obj(obj/O, reac_volume)
- if(istype(O, /obj/item/stack/medical/gauze))
+ if(istype(O, /obj/item/stack/medical/gauze/adv))
var/obj/item/stack/medical/gauze/G = O
- reac_volume = min((reac_volume / 10), G.amount)
- new/obj/item/stack/medical/mesh(get_turf(G), reac_volume)
+ reac_volume = min((reac_volume / 5), G.amount)
+ new /obj/item/stack/medical/mesh/five(get_turf(G), reac_volume)
G.use(reac_volume)
/datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
@@ -358,10 +358,10 @@
..()
/datum/reagent/medicine/styptic_powder/reaction_obj(obj/O, reac_volume)
- if(istype(O, /obj/item/stack/medical/gauze))
+ if(istype(O, /obj/item/stack/medical/gauze/adv))
var/obj/item/stack/medical/gauze/G = O
- reac_volume = min((reac_volume / 10), G.amount)
- new/obj/item/stack/medical/suture(get_turf(G), reac_volume)
+ reac_volume = min((reac_volume / 5), G.amount)
+ new /obj/item/stack/medical/suture/five(get_turf(G), reac_volume)
G.use(reac_volume)
/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 193b96e841..90f570e4d1 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1125,7 +1125,7 @@
/datum/reagent/space_cleaner/sterilizine/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/item/stack/medical/gauze))
var/obj/item/stack/medical/gauze/G = O
- reac_volume = min((reac_volume / 10), G.amount)
+ reac_volume = min((reac_volume / 5), G.amount)
new /obj/item/stack/medical/gauze/adv(get_turf(G), reac_volume)
G.use(reac_volume)
@@ -2528,7 +2528,7 @@
M.adjustStaminaLoss(-0.25*REM) // the more wounds, the more stamina regen
..()
-datum/reagent/eldritch
+/datum/reagent/eldritch
name = "Eldritch Essence"
description = "Strange liquid that defies the laws of physics"
taste_description = "Ag'hsj'saje'sh"
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 0d0a234afc..c9fbf6928a 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -783,6 +783,8 @@
value = REAGENT_VALUE_VERY_RARE
/datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/M)
+ return ..() // until fixed - the rotations never stop
+/*
if(M.hud_used)
if(current_cycle >= 20 && current_cycle%20 == 0)
var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"],
@@ -800,6 +802,7 @@
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING)
..()
+*/
/datum/reagent/toxin/skewium
name = "Skewium"
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 98a117ea69..acfda85963 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -104,31 +104,44 @@
return ..()
/obj/item/reagent_containers/blood/attack(mob/living/carbon/C, mob/user, def_zone)
- if(user.a_intent == INTENT_HELP && reagents.total_volume > 0 && iscarbon(C) && user.a_intent == INTENT_HELP)
- if(C.is_mouth_covered())
- to_chat(user, "You cant drink from the [src] while your mouth is covered.")
- return
- if(user != C)
- user.visible_message("[user] forces [C] to drink from the [src].", \
- "You force [C] to drink from the [src]")
- if(!do_mob(user, C, 50))
- return
- else
- if(!do_mob(user, C, 10))
- return
+ if(!iscarbon(C) || user.a_intent != INTENT_HELP || reagents.total_volume <= 0)
+ ..()
- to_chat(user, "You take a sip from the [src].")
- user.visible_message("[user] puts the [src] up to their mouth.")
- if(reagents.total_volume <= 0) // Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero)
+ if(C.is_mouth_covered())
+ if(user != C)
+ to_chat(user, "You can't force [C] to drink from [src] while their mouth is covered.")
return
- var/gulp_size = 3
- var/fraction = min(gulp_size / reagents.total_volume, 1)
- reagents.reaction(C, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry.
- reagents.trans_to(C, gulp_size)
- reagents.remove_reagent(src, 2) //Inneficency, so hey, IVs are usefull.
- playsound(C.loc,'sound/items/drink.ogg', rand(10, 50), TRUE)
+ to_chat(user, "You can't drink from [src] while your mouth is covered.")
return
- ..()
+
+ if(!user.CheckActionCooldown())
+ return
+ if(user != C)
+ user.visible_message("[user] forces [C] to drink from [src].", \
+ "You force [C] to drink from [src]")
+ user.DelayNextAction(50)
+ if(do_mob(user, C, 50))
+ do_drink(C, user)
+
+ else
+ user.DelayNextAction(10)
+ if(do_mob(user, C, 10))
+ user.visible_message("[user] puts [src] up to their mouth.", \
+ "You take a sip from [src].")
+ do_drink(C, user)
+
+
+/obj/item/reagent_containers/blood/proc/do_drink(mob/living/carbon/C, mob/user)
+ if(reagents.total_volume <= 0) // Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero)
+ to_chat(user, "...and notice [src] is empty.")
+ return
+ var/gulp_size = 3
+ var/fraction = min(gulp_size / reagents.total_volume, 1)
+ reagents.reaction(C, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry.
+ reagents.remove_any(5) //Inneficency, so hey, IVs are usefull.
+ reagents.trans_to(C, gulp_size)
+ playsound(C.loc,'sound/items/drink.ogg', rand(10, 50), TRUE)
+
/obj/item/reagent_containers/blood/bluespace
name = "bluespace blood pack"
diff --git a/code/modules/reagents/reagent_containers/chem_pack.dm b/code/modules/reagents/reagent_containers/chem_pack.dm
index 78ae1a3070..77d6067d3b 100644
--- a/code/modules/reagents/reagent_containers/chem_pack.dm
+++ b/code/modules/reagents/reagent_containers/chem_pack.dm
@@ -44,8 +44,7 @@
else
. += "Alt-click to seal it."
-
-obj/item/reagent_containers/chem_pack/attack_self(mob/user)
+/obj/item/reagent_containers/chem_pack/attack_self(mob/user)
if(sealed)
return
..()
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index b106005a15..ef3a053027 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -141,7 +141,7 @@
update_icon()
/obj/machinery/disposal/proc/can_stuff_mob_in(mob/living/target, mob/living/user, pushing = FALSE)
- if(!pushing && !iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves.
+ if(!pushing && !iscarbon(user) && !(SEND_SIGNAL(user, COMSIG_CHECK_VENTCRAWL))) //only carbon and ventcrawlers can climb into disposal by themselves.
if(iscyborg(user))
var/mob/living/silicon/robot/borg = user
if (!borg.module || !borg.module.canDispose)
diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm
index 348e687e03..c6d015df34 100644
--- a/code/modules/recycling/disposal/construction.dm
+++ b/code/modules/recycling/disposal/construction.dm
@@ -14,12 +14,12 @@
var/obj/pipe_type = /obj/structure/disposalpipe/segment
var/pipename
-/obj/structure/disposalconstruct/Initialize(loc, _pipe_type, _dir = SOUTH, flip = FALSE, obj/make_from)
+/obj/structure/disposalconstruct/Initialize(mapload, _pipe_type, _dir = SOUTH, flip = FALSE, obj/make_from)
. = ..()
if(make_from)
pipe_type = make_from.type
setDir(make_from.dir)
- anchored = TRUE
+ set_anchored(TRUE)
else
if(_pipe_type)
@@ -34,6 +34,8 @@
update_icon()
+ // AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE)
+
/obj/structure/disposalconstruct/Move()
var/old_dir = dir
..()
diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm
index 2e36a9deaa..f739057699 100644
--- a/code/modules/recycling/disposal/holder.dm
+++ b/code/modules/recycling/disposal/holder.dm
@@ -73,14 +73,16 @@
/obj/structure/disposalholder/proc/move()
set waitfor = FALSE
var/obj/structure/disposalpipe/last
+ var/ticks = 1
while(active)
var/obj/structure/disposalpipe/curr = loc
last = curr
+ set_glide_size(DELAY_TO_GLIDE_SIZE(ticks * world.tick_lag))
curr = curr.transfer(src)
if(!curr && active)
last.expel(src, loc, dir)
- stoplag()
+ ticks = stoplag()
if(!(count--))
active = FALSE
diff --git a/code/modules/research/designs/machine_desings/machine_designs_engi.dm b/code/modules/research/designs/machine_desings/machine_designs_engi.dm
index 8908241b83..ca522d2ce1 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_engi.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_engi.dm
@@ -111,4 +111,4 @@
id = "spaceship_navigation_beacon"
build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon
category = list ("Teleportation Machinery")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
\ No newline at end of file
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 8c934d39a9..11dd29a416 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -324,8 +324,7 @@
desc = "A tool that discharges controlled radiation which induces mutation in plant cells. Harmless to other organic life."
id = "flora_gun"
build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2000, /datum/material/glass = 500)
- reagents_list = list(/datum/reagent/radium = 20)
+ materials = list(/datum/material/iron = 2000, /datum/material/glass = 500, /datum/material/uranium = 2000)
build_path = /obj/item/gun/energy/floragun
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_SCIENCE
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index 9b19516f26..f3e14993ed 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -236,7 +236,7 @@
duration = -1
alert_type = null
-datum/status_effect/rebreathing/tick()
+/datum/status_effect/rebreathing/tick()
owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing.
///////////////////////////////////////////////////////
@@ -469,6 +469,10 @@ datum/status_effect/rebreathing/tick()
qdel(src)
return ..()
+/datum/status_effect/stabilized/Destroy()
+ linked_extract = null
+ return ..()
+
/datum/status_effect/stabilized/null //This shouldn't ever happen, but just in case.
id = "stabilizednull"
@@ -524,7 +528,7 @@ datum/status_effect/rebreathing/tick()
ADD_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus")
return ..()
-datum/status_effect/stabilized/blue/on_remove()
+/datum/status_effect/stabilized/blue/on_remove()
REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus")
return ..()
@@ -884,7 +888,8 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/oil/tick()
if(owner.stat == DEAD)
explosion(get_turf(owner),1,2,4,flame_range = 5)
- owner.remove_status_effect(/datum/status_effect/stabilized/oil)
+ qdel(linked_extract)
+ return
return ..()
/datum/status_effect/stabilized/black
diff --git a/code/modules/ruins/lavalandruin_code/alien_nest.dm b/code/modules/ruins/lavalandruin_code/alien_nest.dm
index d98a6bf5c1..c204102b1b 100644
--- a/code/modules/ruins/lavalandruin_code/alien_nest.dm
+++ b/code/modules/ruins/lavalandruin_code/alien_nest.dm
@@ -5,6 +5,24 @@
name = "alien drone"
mob_name = "alien drone"
+/obj/effect/mob_spawn/alien/corpse/humanoid/hunter
+ mob_type = /mob/living/carbon/alien/humanoid/hunter
+ death = TRUE
+ name = "alien hunter"
+ mob_name = "alien hunter"
+
+/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel
+ mob_type = /mob/living/carbon/alien/humanoid/sentinel
+ death = TRUE
+ name = "alien sentinel"
+ mob_name = "alien sentinel"
+
+/obj/effect/mob_spawn/alien/corpse/humanoid/praetorian
+ mob_type = /mob/living/carbon/alien/humanoid/royal/praetorian
+ death = TRUE
+ name = "alien praetorian"
+ mob_name = "alien praetorian"
+
/obj/effect/mob_spawn/alien/corpse/humanoid/queen
mob_type = /mob/living/carbon/alien/humanoid/royal/queen
death = TRUE
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index fd2f4377e7..5f9b810070 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -274,6 +274,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
return
/obj/structure/stone_tile/Crossed(atom/movable/AM)
+ . = ..()
if(falling || fallen)
return
var/turf/T = get_turf(src)
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
index 4859fcfca0..33c4a70634 100644
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -21,6 +21,9 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
/obj/item/hilbertshotel/Initialize()
. = ..()
//Load templates
+ INVOKE_ASYNC(src, .proc/prepare_rooms)
+
+/obj/item/hilbertshotel/proc/prepare_rooms()
hotelRoomTemp = new()
hotelRoomTempEmpty = new()
hotelRoomTempLore = new()
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 03ff509086..c8ecbf1906 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -807,7 +807,7 @@
for(var/mob/M in SSmobs.clients_by_zlevel[z])
var/dist_far = get_dist(M, distant_source)
if(dist_far <= long_range && dist_far > range)
- M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff = 20)
+ M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100)
else if(dist_far <= range)
var/source
if(engine_list.len == 0)
@@ -819,7 +819,7 @@
if(dist_near < closest_dist)
source = O
closest_dist = dist_near
- M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff = range / 2)
+ M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100)
// Losing all initial engines should get you 2
// Adding another set of engines at 0.5 time
diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm
index f1861e0477..7488bdd205 100644
--- a/code/modules/shuttle/spaceship_navigation_beacon.dm
+++ b/code/modules/shuttle/spaceship_navigation_beacon.dm
@@ -21,7 +21,7 @@
. = ..()
SSshuttle.beacons |= src
-obj/machinery/spaceship_navigation_beacon/emp_act()
+/obj/machinery/spaceship_navigation_beacon/emp_act()
locked = TRUE
/obj/machinery/spaceship_navigation_beacon/Destroy()
@@ -60,4 +60,4 @@ obj/machinery/spaceship_navigation_beacon/emp_act()
if(default_deconstruction_crowbar(W))
return
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm
index 5db6b09452..20eaee8a08 100644
--- a/code/modules/smithing/finished_items.dm
+++ b/code/modules/smithing/finished_items.dm
@@ -231,7 +231,7 @@
/obj/item/melee/smith/twohand/katana
name = "katana"
- icon_state = "katana"
+ icon_state = "katana-s"
overlay_state = "katanahilt"
force = 7
wielded_mult = 2
diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm
index 5797cbf8b7..5a8776b16b 100644
--- a/code/modules/spells/spell_types/spacetime_distortion.dm
+++ b/code/modules/spells/spell_types/spacetime_distortion.dm
@@ -1,6 +1,6 @@
/obj/effect/proc_holder/spell/spacetime_dist
name = "Spacetime Distortion"
- desc = "Entangle the strings of spacetime to deny easy movement around you. The strings vibrate..."
+ desc = "Entangle the strings of space-time in an area around you, randomizing the layout and making proper movement impossible. The strings vibrate..."
charge_max = 300
var/duration = 150
range = 7
@@ -10,8 +10,9 @@
sound = 'sound/effects/magic.ogg'
cooldown_min = 300
level_max = 0
+ // action_icon_state = "spacetime"
-/obj/effect/proc_holder/spell/spacetime_dist/can_cast(mob/user = usr, skipcharge = FALSE, silent = FALSE)
+/obj/effect/proc_holder/spell/spacetime_dist/can_cast(mob/user = usr)
if(ready)
return ..()
return FALSE
@@ -97,10 +98,11 @@
busy = TRUE
flick("purplesparkles", src)
AM.forceMove(get_turf(src))
- playsound(get_turf(src),sound,70,0)
+ playsound(get_turf(src),sound,70,FALSE)
busy = FALSE
/obj/effect/cross_action/spacetime_dist/Crossed(atom/movable/AM)
+ . = ..()
if(!busy)
walk_link(AM)
@@ -110,7 +112,8 @@
else
walk_link(user)
-/obj/effect/cross_action/spacetime_dist/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+//ATTACK HAND IGNORING PARENT RETURN VALUE
+/obj/effect/cross_action/spacetime_dist/on_attack_hand(mob/user)
walk_link(user)
/obj/effect/cross_action/spacetime_dist/attack_paw(mob/user)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 2ca7d07e73..962bc8c1ce 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -297,6 +297,7 @@
owner.update_stamina()
consider_processing()
update_disabled()
+ update_threshhold_state()
return update_bodypart_damage_state()
/// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds
@@ -475,6 +476,7 @@
owner.updatehealth()
consider_processing()
update_disabled()
+ update_threshhold_state()
return update_bodypart_damage_state()
//Returns total damage.
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index a088eb2e4f..09f0a901a3 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -404,6 +404,7 @@
on_mob.set_light(1, 1, current_color_string)
/obj/effect/abstract/eye_lighting
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/obj/item/organ/eyes/robotic/glow/parent
/obj/effect/abstract/eye_lighting/Initialize()
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 6b3d47b587..aaa4e34f36 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -97,7 +97,7 @@
owner.set_heartattack(TRUE)
failed = TRUE
-obj/item/organ/heart/slime
+/obj/item/organ/heart/slime
name = "slime heart"
desc = "It seems we've gotten to the slimy core of the matter."
icon_state = "heart-s-on"
@@ -221,7 +221,7 @@ obj/item/organ/heart/slime
var/rid = /datum/reagent/medicine/epinephrine
var/ramount = 10
-obj/item/organ/heart/cybernetic/upgraded/on_life()
+/obj/item/organ/heart/cybernetic/upgraded/on_life()
. = ..()
if(!.)
return
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index b6b74efe32..47b504c86e 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -1319,7 +1319,7 @@
if(E.phase > 1)
if(user.ckey == E.enthrallID && user.real_name == E.master.real_name)
E.master = user
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5)
+ to_chat(H, "[(E.lewd?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]")
to_chat(user, "[H] looks at you with sparkling eyes, recognising you!")
//I dunno how to do state objectives without them revealing they're an antag
diff --git a/code/modules/unit_tests/README.md b/code/modules/unit_tests/README.md
new file mode 100644
index 0000000000..420c805fbf
--- /dev/null
+++ b/code/modules/unit_tests/README.md
@@ -0,0 +1,70 @@
+# Unit Tests
+
+## What is unit testing?
+
+Unit tests are automated code to verify that parts of the game work exactly as they should. For example, [a test to make sure that the amputation surgery actually amputates the limb](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/surgeries.dm#L1-L13). These are ran every time a PR is made, and thus are very helpful for preventing bugs from cropping up in your code that would've otherwise gone unnoticed. For example, would you have thought to check [that beach boys would still work the same after editing pizza](https://github.com/tgstation/tgstation/pull/53641#issuecomment-691384934)? If you value your time, probably not.
+
+On their most basic level, when `UNIT_TESTS` is defined, all subtypes of `/datum/unit_test` will have their `Run` proc executed. From here, if `Fail` is called at any point, then the tests will report as failed.
+
+## How do I write one?
+1. Find a relevant file.
+
+All unit test related code is in `code/modules/unit_tests`. If you are adding a new test for a surgery, for example, then you'd open `surgeries.dm`. If a relevant file does not exist, simply create one in this folder, then `#include` it in `_unit_tests.dm`.
+
+2. Create the unit test.
+
+To make a new unit test, you simply need to define a `/datum/unit_test`.
+
+For example, let's suppose that we are creating a test to make sure a proc `square` correctly raises inputs to the power of two. We'd start with first:
+
+```
+/datum/unit_test/square/Run()
+```
+
+This defines our new unit test, `/datum/unit_test/square`. Inside this function, we're then going to run through whatever we want to check. Tests provide a few assertion functions to make this easy. For now, we're going to use `TEST_ASSERT_EQUAL`.
+
+```
+/datum/unit_test/square/Run()
+ TEST_ASSERT_EQUAL(square(3), 9, "square(3) did not return 9")
+ TEST_ASSERT_EQUAL(square(4), 16, "square(4) did not return 16")
+```
+
+As you can hopefully tell, we're simply checking if the output of `square` matches the output we are expecting. If the test fails, it'll report the error message given as well as whatever the actual output was.
+
+3. Run the unit test
+
+Open `code/_compile_options.dm` and uncomment the following line.
+
+```
+//#define UNIT_TESTS //If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between
+```
+
+Then, run tgstation.dmb in Dream Daemon. Don't bother trying to connect, you won't need to. You'll be able to see the outputs of all the tests. You'll get to see which tests failed and for what reason. If they all pass, you're set!
+
+## How to think about tests
+
+Unit tests exist to prevent bugs that would happen in a real game. Thus, they should attempt to emulate the game world wherever possible. For example, the [quick swap sanity test](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/quick_swap_sanity.dm) emulates a *real* scenario of the bug it fixed occurring by creating a character and giving it real items. The unrecommended alternative would be to create special test-only items. This isn't a hard rule, the [reagent method exposure tests](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/reagent_mod_expose.dm) create a test-only reagent for example, but do keep it in mind.
+
+Unit tests should also be just that--testing *units* of code. For example, instead of having one massive test for reagents, there are instead several smaller tests for testing exposure, metabolization, etc.
+
+## The unit testing API
+
+You can find more information about all of these from their respective doc comments, but for a brief overview:
+
+`/datum/unit_test` - The base for all tests to be ran. Subtypes must override `Run()`. `New()` and `Destroy()` can be used for setup and teardown. To fail, use `Fail(reason)`.
+
+`/datum/unit_test/proc/allocate(type, ...)` - Allocates an instance of the provided type with the given arguments. Is automatically destroyed when the test is over. Commonly seen in the form of `var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)`.
+
+`TEST_ASSERT(assertion, reason)` - Stops the unit test and fails if the assertion is not met. For example: `TEST_ASSERT(powered(), "Machine is not powered")`.
+
+`TEST_ASSERT_EQUAL(a, b, message)` - Same as `TEST_ASSERT`, but checks if `a == b`. If not, gives a helpful message showing what both `a` and `b` were. For example: `TEST_ASSERT_EQUAL(2 + 2, 4, "The universe is falling apart before our eyes!")`.
+
+`TEST_ASSERT_NOTEQUAL(a, b, message)` - Same as `TEST_ASSERT_EQUAL`, but reversed.
+
+`TEST_FOCUS(test_path)` - *Only* run the test provided within the parameters. Useful for reducing noise. For example, if we only want to run our example square test, we can add `TEST_FOCUS(/datum/unit_test/square)`. Should *never* be pushed in a pull request--you will be laughed at.
+
+## Final Notes
+
+- Writing tests before you attempt to fix the bug can actually speed up development a lot! It means you don't have to go in game and folllow the same exact steps manually every time. This process is known as "TDD" (test driven development). Write the test first, make sure it fails, *then* start work on the fix/feature, and you'll know you're done when your tests pass. If you do try this, do make sure to confirm in a non-testing environment just to double check.
+- Make sure that your tests don't accidentally call RNG functions like `prob`. Since RNG is seeded during tests, you may not realize you have until someone else makes a PR and the tests fail!
+- Do your best not to change the behavior of non-testing code during tests. While it may sometimes be necessary in the case of situations such as the above, it is still a slippery slope that can lead to the code you're testing being too different from the production environment to be useful.
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 37fa35946c..2745d971ff 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -1,42 +1,80 @@
//include unit test files in this module in this ifdef
//Keep this sorted alphabetically
-#ifdef UNIT_TESTS
+#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM)
+
/// Asserts that a condition is true
/// If the condition is not true, fails the test
#define TEST_ASSERT(assertion, reason) if (!(assertion)) { return Fail("Assertion failed: [reason || "No reason"]") }
/// Asserts that the two parameters passed are equal, fails otherwise
/// Optionally allows an additional message in the case of a failure
-#define TEST_ASSERT_EQUAL(a, b, message) if ((a) != (b)) { return Fail("Expected [isnull(a) ? "null" : a] to be equal to [isnull(b) ? "null" : b].[message ? " [message]" : ""]") }
+#define TEST_ASSERT_EQUAL(a, b, message) do { \
+ var/lhs = ##a; \
+ var/rhs = ##b; \
+ if (lhs != rhs) { \
+ return Fail("Expected [isnull(lhs) ? "null" : lhs] to be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]"); \
+ } \
+} while (FALSE)
+
+/// Asserts that the two parameters passed are not equal, fails otherwise
+/// Optionally allows an additional message in the case of a failure
+#define TEST_ASSERT_NOTEQUAL(a, b, message) do { \
+ var/lhs = ##a; \
+ var/rhs = ##b; \
+ if (lhs == rhs) { \
+ return Fail("Expected [isnull(lhs) ? "null" : lhs] to not be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]"); \
+ } \
+} while (FALSE)
+
+/// *Only* run the test provided within the parentheses
+/// This is useful for debugging when you want to reduce noise, but should never be pushed
+/// Intended to be used in the manner of `TEST_FOCUS(/datum/unit_test/math)`
+#define TEST_FOCUS(test_path) ##test_path { focus = TRUE; }
#include "anchored_mobs.dm"
#include "bespoke_id.dm"
-// #include "binary_insert.dm"
-// #include "card_mismatch.dm" shame we don't have this!
+#include "binary_insert.dm"
+// #include "card_mismatch.dm"
#include "chain_pull_through_space.dm"
-#include "character_saving.dm"
+// #include "combat.dm"
#include "component_tests.dm"
// #include "confusion.dm"
-// #include "keybinding_init.dm"
+// #include "emoting.dm"
+// #include "heretic_knowledge.dm"
+// #include "holidays.dm"
+#include "initialize_sanity.dm"
+#include "keybinding_init.dm"
#include "machine_disassembly.dm"
#include "medical_wounds.dm"
+#include "merge_type.dm"
// #include "metabolizing.dm"
// #include "outfit_sanity.dm"
+// #include "pills.dm"
// #include "plantgrowth_tests.dm"
-// #include "quick_swap_sanity.dm" - we don't have quick swap yet
+// #include "projectiles.dm"
#include "reagent_id_typos.dm"
+// #include "reagent_mod_expose.dm"
+// #include "reagent_mod_procs.dm"
#include "reagent_recipe_collisions.dm"
#include "resist.dm"
-// #include "say.dm" //no saymods, someone update saycode please.
+// #include "say.dm"
+// #include "serving_tray.dm"
// #include "siunit.dm"
#include "spawn_humans.dm"
// #include "species_whitelists.dm"
+// #include "stomach.dm"
#include "subsystem_init.dm"
-// #include "surgeries.dm" // fails at random due to a race condition, commented out for now
+#include "surgeries.dm"
+#include "teleporters.dm"
#include "timer_sanity.dm"
#include "unit_test.dm"
+/// CIT TESTS
+#include "character_saving.dm"
+
#undef TEST_ASSERT
#undef TEST_ASSERT_EQUAL
+#undef TEST_ASSERT_NOTEQUAL
+#undef TEST_FOCUS
#endif
diff --git a/code/modules/unit_tests/card_mismatch.dm b/code/modules/unit_tests/card_mismatch.dm
new file mode 100644
index 0000000000..506e88f19c
--- /dev/null
+++ b/code/modules/unit_tests/card_mismatch.dm
@@ -0,0 +1,7 @@
+/datum/unit_test/card_mismatch
+
+/datum/unit_test/card_mismatch/Run()
+ var/message = checkCardpacks(SStrading_card_game.card_packs)
+ message += checkCardDatums()
+ if(message)
+ Fail(message)
diff --git a/code/modules/unit_tests/combat.dm b/code/modules/unit_tests/combat.dm
new file mode 100644
index 0000000000..30bad72175
--- /dev/null
+++ b/code/modules/unit_tests/combat.dm
@@ -0,0 +1,98 @@
+/datum/unit_test/harm_punch/Run()
+ var/mob/living/carbon/human/puncher = allocate(/mob/living/carbon/human)
+ var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human)
+
+ // Avoid all randomness in tests
+ ADD_TRAIT(puncher, TRAIT_PERFECT_ATTACKER, INNATE_TRAIT)
+
+ puncher.a_intent_change(INTENT_HARM)
+ victim.attack_hand(puncher)
+
+ TEST_ASSERT(victim.getBruteLoss() > 0, "Victim took no brute damage after being punched")
+
+/datum/unit_test/harm_melee/Run()
+ var/mob/living/carbon/human/tider = allocate(/mob/living/carbon/human)
+ var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human)
+ var/obj/item/storage/toolbox/toolbox = allocate(/obj/item/storage/toolbox)
+
+ tider.put_in_active_hand(toolbox, forced = TRUE)
+ tider.a_intent_change(INTENT_HARM)
+ victim.attackby(toolbox, tider)
+
+ TEST_ASSERT(victim.getBruteLoss() > 0, "Victim took no brute damage after being hit by a toolbox")
+
+/datum/unit_test/harm_different_damage/Run()
+ var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human)
+ var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human)
+ var/obj/item/weldingtool/welding_tool = allocate(/obj/item/weldingtool)
+
+ attacker.put_in_active_hand(welding_tool, forced = TRUE)
+ attacker.a_intent_change(INTENT_HARM)
+ welding_tool.attack_self(attacker) // Turn it on
+ victim.attackby(welding_tool, attacker)
+
+ TEST_ASSERT_EQUAL(victim.getBruteLoss(), 0, "Victim took brute damage from a lit welding tool")
+ TEST_ASSERT(victim.getFireLoss() > 0, "Victim took no burn damage after being hit by a lit welding tool")
+
+/datum/unit_test/attack_chain
+ var/attack_hit
+ var/post_attack_hit
+ var/pre_attack_hit
+
+/datum/unit_test/attack_chain/proc/attack_hit()
+ attack_hit = TRUE
+
+/datum/unit_test/attack_chain/proc/post_attack_hit()
+ post_attack_hit = TRUE
+
+/datum/unit_test/attack_chain/proc/pre_attack_hit()
+ pre_attack_hit = TRUE
+
+/datum/unit_test/attack_chain/Run()
+ var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human)
+ var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human)
+ var/obj/item/storage/toolbox/toolbox = allocate(/obj/item/storage/toolbox)
+
+ RegisterSignal(toolbox, COMSIG_ITEM_PRE_ATTACK, .proc/pre_attack_hit)
+ RegisterSignal(toolbox, COMSIG_ITEM_ATTACK, .proc/attack_hit)
+ RegisterSignal(toolbox, COMSIG_ITEM_AFTERATTACK, .proc/post_attack_hit)
+
+ attacker.put_in_active_hand(toolbox, forced = TRUE)
+ attacker.a_intent_change(INTENT_HARM)
+ toolbox.melee_attack_chain(attacker, victim)
+
+ TEST_ASSERT(pre_attack_hit, "Pre-attack signal was not fired")
+ TEST_ASSERT(attack_hit, "Attack signal was not fired")
+ TEST_ASSERT(post_attack_hit, "Post-attack signal was not fired")
+
+/datum/unit_test/disarm/Run()
+ var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human)
+ var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human)
+ var/obj/item/storage/toolbox/toolbox = allocate(/obj/item/storage/toolbox)
+
+ victim.put_in_active_hand(toolbox, forced = TRUE)
+ attacker.a_intent_change(INTENT_DISARM)
+
+ var/obj/structure/barricade/dense_object = allocate(/obj/structure/barricade)
+
+ // Attacker --> Victim --> Empty space --> Wall
+ attacker.forceMove(run_loc_bottom_left)
+ victim.forceMove(locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z))
+ dense_object.forceMove(locate(run_loc_bottom_left.x + 3, run_loc_bottom_left.y, run_loc_bottom_left.z))
+
+ // First disarm, world should now look like:
+ // Attacker --> Empty space --> Victim --> Wall
+ victim.attack_hand(attacker)
+
+ TEST_ASSERT_EQUAL(victim.loc.x, run_loc_bottom_left.x + 2, "Victim wasn't moved back after being pushed")
+ TEST_ASSERT(!victim.has_status_effect(STATUS_EFFECT_KNOCKDOWN), "Victim was knocked down despite not being against a wall")
+ TEST_ASSERT_EQUAL(victim.get_active_held_item(), toolbox, "Victim dropped toolbox despite not being against a wall")
+
+ attacker.forceMove(get_step(attacker, EAST))
+
+ // Second disarm, victim was against wall and should be down
+ victim.attack_hand(attacker)
+
+ TEST_ASSERT_EQUAL(victim.loc.x, run_loc_bottom_left.x + 2, "Victim was moved after being pushed against a wall")
+ TEST_ASSERT(victim.has_status_effect(STATUS_EFFECT_KNOCKDOWN), "Victim was not knocked down after being pushed against a wall")
+ TEST_ASSERT_EQUAL(victim.get_active_held_item(), null, "Victim didn't drop toolbox after being pushed against a wall")
diff --git a/code/modules/unit_tests/confusion.dm b/code/modules/unit_tests/confusion.dm
new file mode 100644
index 0000000000..8282493c96
--- /dev/null
+++ b/code/modules/unit_tests/confusion.dm
@@ -0,0 +1,16 @@
+// Checks that the confusion symptom correctly gives, and removes, confusion
+/datum/unit_test/confusion_symptom/Run()
+ var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human)
+ var/datum/disease/advance/confusion/disease = allocate(/datum/disease/advance/confusion)
+ var/datum/symptom/confusion/confusion = disease.symptoms[1]
+ disease.processing = TRUE
+ disease.update_stage(5)
+ disease.infect(H, make_copy = FALSE)
+ confusion.Activate(disease)
+ TEST_ASSERT(H.get_confusion() > 0, "Human is not confused after getting symptom.")
+ disease.cure()
+ TEST_ASSERT_EQUAL(H.get_confusion(), 0, "Human is still confused after curing confusion.")
+
+/datum/disease/advance/confusion/New()
+ symptoms += new /datum/symptom/confusion
+ Refresh()
diff --git a/code/modules/unit_tests/emoting.dm b/code/modules/unit_tests/emoting.dm
new file mode 100644
index 0000000000..5795ab3437
--- /dev/null
+++ b/code/modules/unit_tests/emoting.dm
@@ -0,0 +1,25 @@
+/datum/unit_test/emoting
+ var/emotes_used = 0
+
+/datum/unit_test/emoting/Run()
+ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
+ RegisterSignal(human, COMSIG_MOB_EMOTE, .proc/on_emote_used)
+
+ human.say("*shrug")
+ TEST_ASSERT_EQUAL(emotes_used, 1, "Human did not shrug")
+
+ human.say("*beep")
+ TEST_ASSERT_EQUAL(emotes_used, 1, "Human beeped, when that should be restricted to silicons")
+
+ human.setOxyLoss(140)
+
+ TEST_ASSERT(human.stat != CONSCIOUS, "Human is somehow conscious after receiving suffocation damage")
+
+ human.say("*shrug")
+ TEST_ASSERT_EQUAL(emotes_used, 1, "Human shrugged while unconscious")
+
+ human.say("*deathgasp")
+ TEST_ASSERT_EQUAL(emotes_used, 2, "Human could not deathgasp while unconscious")
+
+/datum/unit_test/emoting/proc/on_emote_used()
+ emotes_used += 1
diff --git a/code/modules/unit_tests/heretic_knowledge.dm b/code/modules/unit_tests/heretic_knowledge.dm
new file mode 100644
index 0000000000..a433bce1ec
--- /dev/null
+++ b/code/modules/unit_tests/heretic_knowledge.dm
@@ -0,0 +1,21 @@
+/// This test checks all heretic knowledge nodes - excluding the ones which are unreachable on purpose - and ensures players can reach them in game.
+/// If it finds a node that is unreachable, it throws an error.
+/datum/unit_test/heretic_knowledge/Run()
+ ///List of all knowledge excluding the unreachable base types.
+ var/list/blacklist = list(/datum/eldritch_knowledge/spell,/datum/eldritch_knowledge/curse,/datum/eldritch_knowledge/final,/datum/eldritch_knowledge/summon)
+ var/list/all_possible_knowledge = subtypesof(/datum/eldritch_knowledge) - blacklist
+
+ var/list/list_to_check = GLOB.heretic_start_knowledge.Copy()
+ var/i = 0
+ while(i < length(list_to_check))
+ var/datum/eldritch_knowledge/eldritch_knowledge = allocate(list_to_check[++i])
+ for(var/next_knowledge in eldritch_knowledge.next_knowledge)
+ if(next_knowledge in list_to_check)
+ continue
+ list_to_check += next_knowledge
+
+ if(length(all_possible_knowledge) != length(all_possible_knowledge & list_to_check))
+ var/list/unreachables = all_possible_knowledge - list_to_check
+ for(var/X in unreachables)
+ var/datum/eldritch_knowledge/eldritch_knowledge = X
+ Fail("[initial(eldritch_knowledge.name)] is unreachable by players! Add it to the blacklist in /code/modules/unit_tests/heretic_knowledge.dm if it is purposeful!")
diff --git a/code/modules/unit_tests/holidays.dm b/code/modules/unit_tests/holidays.dm
new file mode 100644
index 0000000000..4df5443e2e
--- /dev/null
+++ b/code/modules/unit_tests/holidays.dm
@@ -0,0 +1,33 @@
+// test Jewish holiday
+/datum/unit_test/hanukkah_2123/Run()
+ var/datum/holiday/hebrew/hanukkah/hanukkah = new
+ TEST_ASSERT(hanukkah.shouldCelebrate(14, DECEMBER, 2123, 2, TUESDAY), "December 14, 2123 was not Hanukkah.")
+
+// test Islamic holiday
+/datum/unit_test/ramadan_2165/Run()
+ var/datum/holiday/islamic/ramadan/ramadan = new
+ TEST_ASSERT(ramadan.shouldCelebrate(6, NOVEMBER, 2165, 1, WEDNESDAY), "November 6, 2165 was not Ramadan.")
+
+// nth day of week
+/datum/unit_test/thanksgiving_2020/Run()
+ var/datum/holiday/nth_week/thanksgiving/thanksgiving = new
+ TEST_ASSERT(thanksgiving.shouldCelebrate(26, NOVEMBER, 2020, 4, THURSDAY), "November 26, 2020 was not Thanksgiving.")
+
+// another nth day of week
+/datum/unit_test/indigenous_3683/Run()
+ var/datum/holiday/nth_week/indigenous/indigenous = new
+ TEST_ASSERT(indigenous.shouldCelebrate(11, OCTOBER, 3683, 2, MONDAY), "October 11, 3683 was not Indigenous Peoples' Day.")
+
+// plain old simple holiday
+/datum/unit_test/hello_2020/Run()
+ var/datum/holiday/hello/hello = new
+ TEST_ASSERT(hello.shouldCelebrate(21, NOVEMBER, 2020, 3, SATURDAY), "November 21, 2020 was not Hello day.")
+
+// holiday which goes across months
+/datum/unit_test/new_year_1983/Run()
+ var/datum/holiday/new_year/new_year = new
+ TEST_ASSERT(new_year.shouldCelebrate(2, JANUARY, 1983, 1, SUNDAY), "January 2, 1983 was not New Year.")
+
+/datum/unit_test/moth_week_2020/Run()
+ var/datum/holiday/moth/moth = new
+ TEST_ASSERT(moth.shouldCelebrate(19, JULY, 2020, 3, SATURDAY), "July 19, 2020 was not Moth Week.")
diff --git a/code/modules/unit_tests/initialize_sanity.dm b/code/modules/unit_tests/initialize_sanity.dm
new file mode 100644
index 0000000000..d183f530c8
--- /dev/null
+++ b/code/modules/unit_tests/initialize_sanity.dm
@@ -0,0 +1,11 @@
+/datum/unit_test/initialize_sanity/Run()
+ if(length(SSatoms.BadInitializeCalls))
+ Fail("Bad Initialize() calls detected. Please read logs.")
+ var/list/init_failures_to_text = list(
+ "[BAD_INIT_QDEL_BEFORE]" = "Qdeleted Before Initialized",
+ "[BAD_INIT_DIDNT_INIT]" = "Did Not Initialize",
+ "[BAD_INIT_SLEPT]" = "Initialize() Slept",
+ "[BAD_INIT_NO_HINT]" = "No Initialize() Hint Returned",
+ )
+ for(var/failure in SSatoms.BadInitializeCalls)
+ log_world("[failure]: [init_failures_to_text["[SSatoms.BadInitializeCalls[failure]]"]]") // You like stacked brackets?
diff --git a/code/modules/unit_tests/keybinding_init.dm b/code/modules/unit_tests/keybinding_init.dm
new file mode 100644
index 0000000000..2bd2fdee1e
--- /dev/null
+++ b/code/modules/unit_tests/keybinding_init.dm
@@ -0,0 +1,6 @@
+/datum/unit_test/keybinding_init/Run()
+ for(var/i in subtypesof(/datum/keybinding))
+ var/datum/keybinding/KB = i
+ if(initial(KB.keybind_signal) || !initial(KB.name))
+ continue
+ Fail("[KB.name] does not have a keybind signal defined.")
diff --git a/code/modules/unit_tests/machine_disassembly.dm b/code/modules/unit_tests/machine_disassembly.dm
index bcc769bcf2..59edb4ae9d 100644
--- a/code/modules/unit_tests/machine_disassembly.dm
+++ b/code/modules/unit_tests/machine_disassembly.dm
@@ -3,11 +3,10 @@
var/obj/machinery/freezer = allocate(/obj/machinery/atmospherics/components/unary/thermomachine/freezer)
var/turf/freezer_location = freezer.loc
- freezer_location.ChangeTurf(/turf/open/floor/plasteel)
freezer.deconstruct()
// Check that the components are created
TEST_ASSERT(locate(/obj/item/stock_parts/micro_laser) in freezer_location, "Couldn't find micro-laser when disassembling freezer")
// Check that the circuit board itself is created
- TEST_ASSERT(locate(/obj/item/circuitboard/machine/thermomachine/freezer) in freezer_location, "Couldn't find the circuit board when disassembling freezer")
+ TEST_ASSERT(locate(/obj/item/circuitboard/machine/thermomachine) in freezer_location, "Couldn't find the circuit board when disassembling freezer")
diff --git a/code/modules/unit_tests/merge_type.dm b/code/modules/unit_tests/merge_type.dm
new file mode 100644
index 0000000000..ba3cfcf492
--- /dev/null
+++ b/code/modules/unit_tests/merge_type.dm
@@ -0,0 +1,15 @@
+/datum/unit_test/merge_type/Run()
+ var/list/blacklist = list(/obj/item/stack/sheet,
+ /obj/item/stack/sheet/mineral,
+ /obj/item/stack/ore,
+ /obj/item/stack/spacecash,
+ // /obj/item/stack/license_plates,
+ /obj/item/stack/tile/mineral,
+ /obj/item/stack/tile)
+
+ var/list/paths = subtypesof(/obj/item/stack) - blacklist
+
+ for(var/stackpath in paths)
+ var/obj/item/stack/stack = stackpath
+ if(!initial(stack.merge_type))
+ Fail("([stack]) lacks set merge_type variable!")
diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm
index 895762c0ec..b7f8fc4f6a 100644
--- a/code/modules/unit_tests/metabolizing.dm
+++ b/code/modules/unit_tests/metabolizing.dm
@@ -17,3 +17,22 @@
/datum/unit_test/metabolization/Destroy()
SSmobs.ignite()
return ..()
+
+/datum/unit_test/on_mob_end_metabolize/Run()
+ var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human)
+ var/obj/item/reagent_containers/pill/pill = allocate(/obj/item/reagent_containers/pill)
+ var/datum/reagent/drug/methamphetamine/meth = /datum/reagent/drug/methamphetamine
+
+ // Give them enough meth to be consumed in 2 metabolizations
+ pill.reagents.add_reagent(meth, initial(meth.metabolization_rate) * 1.9)
+ pill.attack(user, user)
+
+ user.Life()
+
+ TEST_ASSERT(user.reagents.has_reagent(meth), "User does not have meth in their system after consuming it")
+ TEST_ASSERT(user.has_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine), "User consumed meth, but did not gain movespeed modifier")
+
+ user.Life()
+
+ TEST_ASSERT(!user.reagents.has_reagent(meth), "User still has meth in their system when it should've finished metabolizing")
+ TEST_ASSERT(!user.has_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine), "User still has movespeed modifier despite not containing any more meth")
diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm
index 235820f9e9..57ce22434e 100644
--- a/code/modules/unit_tests/outfit_sanity.dm
+++ b/code/modules/unit_tests/outfit_sanity.dm
@@ -30,8 +30,8 @@
CHECK_OUTFIT_SLOT(glasses, ITEM_SLOT_EYES)
CHECK_OUTFIT_SLOT(id, ITEM_SLOT_ID)
CHECK_OUTFIT_SLOT(suit_store, ITEM_SLOT_SUITSTORE)
- CHECK_OUTFIT_SLOT(l_pocket, ITEM_SLOT_POCKET)
- CHECK_OUTFIT_SLOT(r_pocket, ITEM_SLOT_POCKET)
+ CHECK_OUTFIT_SLOT(l_pocket, ITEM_SLOT_LPOCKET)
+ CHECK_OUTFIT_SLOT(r_pocket, ITEM_SLOT_RPOCKET)
if (outfit.backpack_contents || outfit.box)
var/list/backpack_contents = outfit.backpack_contents?.Copy()
diff --git a/code/modules/unit_tests/pills.dm b/code/modules/unit_tests/pills.dm
new file mode 100644
index 0000000000..ed8f64ce95
--- /dev/null
+++ b/code/modules/unit_tests/pills.dm
@@ -0,0 +1,10 @@
+/datum/unit_test/pills/Run()
+ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
+ var/obj/item/reagent_containers/pill/iron/pill = allocate(/obj/item/reagent_containers/pill/iron)
+
+ TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/iron), FALSE, "Human somehow has iron before taking pill")
+
+ pill.attack(human, human)
+ human.Life()
+
+ TEST_ASSERT(human.has_reagent(/datum/reagent/iron), "Human doesn't have iron after taking pill")
diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm
new file mode 100644
index 0000000000..53ceef01d6
--- /dev/null
+++ b/code/modules/unit_tests/projectiles.dm
@@ -0,0 +1,5 @@
+/datum/unit_test/projectile_movetypes/Run()
+ for(var/path in typesof(/obj/item/projectile))
+ var/obj/projectile/projectile = path
+ if(initial(projectile.movement_type) & PHASING)
+ Fail("[path] has default movement type PHASING. Piercing projectiles should be done using the projectile piercing system, not movement_types!")
diff --git a/code/modules/unit_tests/reagent_mod_expose.dm b/code/modules/unit_tests/reagent_mod_expose.dm
new file mode 100644
index 0000000000..3fe02e044d
--- /dev/null
+++ b/code/modules/unit_tests/reagent_mod_expose.dm
@@ -0,0 +1,59 @@
+// testing the mob expose procs are working
+
+/datum/reagent/method_patch_test
+ name = "method patch test"
+
+/datum/reagent/method_patch_test/expose_mob(mob/living/target, methods = PATCH, reac_volume, show_message = TRUE)
+ . = ..()
+ if(methods & PATCH)
+ target.health = 90
+ if(methods & INJECT)
+ target.health = 80
+
+/datum/unit_test/reagent_mob_expose/Run()
+ // Life() is handled just by tests
+ SSmobs.pause()
+
+ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
+ var/obj/item/reagent_containers/dropper/dropper = allocate(/obj/item/reagent_containers/dropper)
+ var/obj/item/reagent_containers/food/drinks/drink = allocate(/obj/item/reagent_containers/food/drinks/bottle)
+ var/obj/item/reagent_containers/pill/patch/patch = allocate(/obj/item/reagent_containers/pill/patch)
+ var/obj/item/reagent_containers/syringe/syringe = allocate(/obj/item/reagent_containers/syringe)
+
+ // INGEST
+ TEST_ASSERT_EQUAL(human.fire_stacks, 0, "Human has fire stacks before taking phlogiston")
+ drink.reagents.add_reagent(/datum/reagent/phlogiston, 10)
+ drink.attack(human, human)
+ TEST_ASSERT_EQUAL(human.fire_stacks, 1, "Human does not have fire stacks after taking phlogiston")
+ human.Life()
+ TEST_ASSERT(human.fire_stacks > 1, "Human fire stacks did not increase after life tick")
+
+ // TOUCH
+ dropper.reagents.add_reagent(/datum/reagent/water, 1)
+ dropper.afterattack(human, human, TRUE)
+ TEST_ASSERT_EQUAL(human.fire_stacks, 0, "Human still has fire stacks after touching water")
+
+ // VAPOR
+ TEST_ASSERT_EQUAL(human.drowsyness, 0, "Human is drowsy at the start of testing")
+ drink.reagents.clear_reagents()
+ drink.reagents.add_reagent(/datum/reagent/nitrous_oxide, 10)
+ drink.reagents.trans_to(human, 10, methods = VAPOR)
+ TEST_ASSERT_NOTEQUAL(human.drowsyness, 0, "Human is not drowsy after exposure to vapors")
+
+ // PATCH
+ human.health = 100
+ TEST_ASSERT_EQUAL(human.health, 100, "Human health did not set properly")
+ patch.reagents.add_reagent(/datum/reagent/method_patch_test, 1)
+ patch.self_delay = 0
+ patch.attack(human, human)
+ TEST_ASSERT_EQUAL(human.health, 90, "Human health did not update after patch was applied")
+
+ // INJECT
+ syringe.reagents.add_reagent(/datum/reagent/method_patch_test, 1)
+ syringe.mode = SYRINGE_INJECT
+ syringe.afterattack(human, human, TRUE)
+ TEST_ASSERT_EQUAL(human.health, 80, "Human health did not update after injection from syringe")
+
+/datum/unit_test/reagent_mob_expose/Destroy()
+ SSmobs.ignite()
+ return ..()
diff --git a/code/modules/unit_tests/reagent_mod_procs.dm b/code/modules/unit_tests/reagent_mod_procs.dm
new file mode 100644
index 0000000000..a2087f8624
--- /dev/null
+++ b/code/modules/unit_tests/reagent_mod_procs.dm
@@ -0,0 +1,12 @@
+/datum/unit_test/reagent_mob_procs/Run()
+ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
+ var/obj/item/food/hotdog/debug/fooditem = allocate(/obj/item/food/hotdog/debug)
+
+ TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human somehow has ketchup before eating")
+ TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/medicine/epinephrine), FALSE, "Human somehow has epinephrine before injecting")
+
+ fooditem.attack(human, human)
+ human.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5)
+
+ TEST_ASSERT(human.has_reagent(/datum/reagent/consumable/ketchup), "Human doesn't have ketchup after eating")
+ TEST_ASSERT(human.has_reagent(/datum/reagent/medicine/epinephrine), "Human doesn't have epinephrine after injecting")
diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm
index 3fe6675ab4..a7df5ad624 100644
--- a/code/modules/unit_tests/say.dm
+++ b/code/modules/unit_tests/say.dm
@@ -10,7 +10,6 @@
test(";%Never gonna give you up", "Never gonna give you up", list(MODE_HEADSET = TRUE, MODE_SING = TRUE))
test(".s Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SECURITY, RADIO_EXTENSION = RADIO_CHANNEL_SECURITY))
test("...What", "...What", list())
- //note to lettern: add the ++, ||, __, and the verb*text checks
/datum/unit_test/get_message_mods/proc/test(message, expected_message, list/expected_mods)
var/list/mods = list()
diff --git a/code/modules/unit_tests/serving_tray.dm b/code/modules/unit_tests/serving_tray.dm
new file mode 100644
index 0000000000..00e911ae50
--- /dev/null
+++ b/code/modules/unit_tests/serving_tray.dm
@@ -0,0 +1,47 @@
+/**
+ * Check that standard food items fit on the serving tray
+ */
+/datum/unit_test/servingtray/Run()
+ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
+ var/obj/structure/table/the_table = allocate(/obj/structure/table)
+ var/obj/item/storage/bag/tray/test_tray = allocate(/obj/item/storage/bag/tray)
+ var/obj/item/reagent_containers/food/banana = allocate(/obj/item/food/rationpack)
+ var/obj/item/food/the_bread = allocate(/obj/item/food/breadslice)
+ var/obj/item/reagent_containers/food/sugarcookie = allocate(/obj/item/food/cookie/sugar)
+ var/obj/item/clothing/under/jumpsuit = allocate(/obj/item/clothing/under/color/black)
+
+ TEST_ASSERT_EQUAL((the_bread in test_tray.contents), FALSE, "The bread is on the serving tray at test start")
+
+ // set the tray to single item mode the dirty way
+ var/datum/component/storage/tray_storage = test_tray.GetComponent(/datum/component/storage)
+ tray_storage.collection_mode = COLLECT_ONE
+
+ test_tray.pre_attack(the_bread, human)
+
+ TEST_ASSERT_EQUAL((the_bread in test_tray.contents), TRUE, "The bread did not get picked up by the serving tray")
+
+ test_tray.pre_attack(banana, human)
+
+ TEST_ASSERT_EQUAL((banana in test_tray.contents), TRUE, "The banana did not get picked up by the serving tray")
+
+ the_table.attackby(test_tray, human)
+
+ TEST_ASSERT_EQUAL(test_tray.contents.len, 0, "The serving tray did not drop all items on hitting the table")
+
+ test_tray.pre_attack(sugarcookie, human)
+
+ TEST_ASSERT_EQUAL((sugarcookie in test_tray.contents), TRUE, "The sugarcookie did not get picked up by the serving tray")
+
+ human.equip_to_slot(jumpsuit, ITEM_SLOT_ICLOTHING)
+ TEST_ASSERT(human.get_item_by_slot(ITEM_SLOT_ICLOTHING), "Human does not have jumpsuit on")
+
+ human.equip_to_slot(test_tray, ITEM_SLOT_LPOCKET)
+ TEST_ASSERT(human.get_item_by_slot(ITEM_SLOT_LPOCKET), "Serving tray failed to fit in the Left Pocket")
+
+ human.equip_to_slot(test_tray, ITEM_SLOT_RPOCKET)
+ TEST_ASSERT(human.get_item_by_slot(ITEM_SLOT_RPOCKET), "Serving tray failed to fit in the Right Pocket")
+
+ test_tray.attack(human, human)
+
+ TEST_ASSERT_EQUAL(test_tray.contents.len, 0, "The serving tray did not drop all items on hitting a human")
+
diff --git a/code/modules/unit_tests/siunit.dm b/code/modules/unit_tests/siunit.dm
new file mode 100644
index 0000000000..3a7a25a98d
--- /dev/null
+++ b/code/modules/unit_tests/siunit.dm
@@ -0,0 +1,15 @@
+/datum/unit_test/siunit/Run()
+ TEST_ASSERT_EQUAL(siunit(0.5345, "A", 0), "535 mA", "")
+ TEST_ASSERT_EQUAL(siunit(0.5344, "A", 0), "534 mA", "")
+ TEST_ASSERT_EQUAL(siunit(-0.5344, "A", 0), "-534 mA", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(1.234, 1), "1.2 kPa", "") // test for pascal require *10e-3, as the game thinks in kPa, the proc siunit in Pa
+ TEST_ASSERT_EQUAL(siunit_pressure(1.234, 2), "1.23 kPa", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(1.234, 3), "1.234 kPa", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(1, 4), "1 kPa", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(0), "0 Pa", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(1e3), "1 MPa", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(999e3), "999 MPa", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(999.9e3), "999.9 MPa" , "")
+ TEST_ASSERT_EQUAL(siunit_pressure(999.9e3, 0), "1 GPa", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(1e6), "1 GPa", "")
+ TEST_ASSERT_EQUAL(siunit_pressure(3e17), "300000 PPa", "")
diff --git a/code/modules/unit_tests/spawn_humans.dm b/code/modules/unit_tests/spawn_humans.dm
index 7189e87277..0500deae0a 100644
--- a/code/modules/unit_tests/spawn_humans.dm
+++ b/code/modules/unit_tests/spawn_humans.dm
@@ -1,7 +1,7 @@
/datum/unit_test/spawn_humans/Run()
- var/locs = block(run_loc_bottom_left, run_loc_top_right)
+ var/locs = block(run_loc_bottom_left, run_loc_top_right)
- for(var/I in 1 to 5)
- new /mob/living/carbon/human(pick(locs))
+ for(var/I in 1 to 5)
+ new /mob/living/carbon/human(pick(locs))
- sleep(50)
+ sleep(50)
diff --git a/code/modules/unit_tests/species_whitelists.dm b/code/modules/unit_tests/species_whitelists.dm
new file mode 100644
index 0000000000..145f3a259f
--- /dev/null
+++ b/code/modules/unit_tests/species_whitelists.dm
@@ -0,0 +1,5 @@
+/datum/unit_test/species_whitelist_check/Run()
+ for(var/typepath in subtypesof(/datum/species))
+ var/datum/species/S = typepath
+ if(initial(S.changesource_flags) == NONE)
+ Fail("A species type was detected with no changesource flags: [S]")
diff --git a/code/modules/unit_tests/stomach.dm b/code/modules/unit_tests/stomach.dm
new file mode 100644
index 0000000000..06fdc71dd4
--- /dev/null
+++ b/code/modules/unit_tests/stomach.dm
@@ -0,0 +1,40 @@
+/datum/unit_test/stomach/Run()
+
+ // Pause natural mob life so it can be handled entirely by the test
+ SSmobs.pause()
+
+ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
+ var/obj/item/food/hotdog/debug/fooditem = allocate(/obj/item/food/hotdog/debug)
+ var/obj/item/organ/stomach/belly = human.getorganslot(ORGAN_SLOT_STOMACH)
+ var/obj/item/reagent_containers/pill/pill = allocate(/obj/item/reagent_containers/pill)
+ var/datum/reagent/drug/methamphetamine/meth = /datum/reagent/drug/methamphetamine
+
+ TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human somehow has ketchup before eating")
+
+ fooditem.attack(human, human)
+
+ TEST_ASSERT(belly.reagents.has_reagent(/datum/reagent/consumable/ketchup), "Stomach doesn't have ketchup after eating")
+ TEST_ASSERT_EQUAL(human.reagents.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human body has ketchup after eating it should only be in the stomach")
+
+ //Give them meth and let it kick in
+ pill.reagents.add_reagent(meth, initial(meth.metabolization_rate) * 1.9)
+ pill.attack(human, human)
+ human.Life()
+
+ TEST_ASSERT(human.reagents.has_reagent(meth), "Human body does not have meth after life tick")
+ TEST_ASSERT(human.has_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine), "Human consumed meth, but did not gain movespeed modifier")
+
+ belly.Remove(human)
+ human.reagents.remove_all(human.reagents.total_volume)
+
+ TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human has reagents after clearing")
+
+ fooditem.attack(human, human)
+
+ TEST_ASSERT_EQUAL(human.has_reagent(/datum/reagent/consumable/ketchup), FALSE, "Human has ketchup without a stomach")
+
+
+
+/datum/unit_test/stomach/Destroy()
+ SSmobs.ignite()
+ return ..()
diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm
index 7b8145ac19..6348057f79 100644
--- a/code/modules/unit_tests/surgeries.dm
+++ b/code/modules/unit_tests/surgeries.dm
@@ -2,14 +2,14 @@
var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human)
var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human)
- TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 0, "Patient is somehow missing limbs before surgery")
+ TEST_ASSERT_EQUAL(length(patient.get_missing_limbs()), 0, "Patient is somehow missing limbs before surgery")
var/datum/surgery/amputation/surgery = new(patient, BODY_ZONE_R_ARM, patient.get_bodypart(BODY_ZONE_R_ARM))
var/datum/surgery_step/sever_limb/sever_limb = new
sever_limb.success(user, patient, BODY_ZONE_R_ARM, null, surgery)
- TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 1, "Patient did not lose any limbs")
+ TEST_ASSERT_EQUAL(length(patient.get_missing_limbs()), 1, "Patient did not lose any limbs")
TEST_ASSERT_EQUAL(patient.get_missing_limbs()[1], BODY_ZONE_R_ARM, "Patient is missing a limb that isn't the one we operated on")
/datum/unit_test/brain_surgery/Run()
@@ -27,6 +27,33 @@
TEST_ASSERT(!patient.has_trauma_type(), "Patient kept their brain trauma after brain surgery")
TEST_ASSERT(patient.getOrganLoss(ORGAN_SLOT_BRAIN) < 20, "Patient did not heal their brain damage after brain surgery")
+/datum/unit_test/head_transplant/Run()
+ var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human)
+ var/mob/living/carbon/human/alice = allocate(/mob/living/carbon/human)
+ var/mob/living/carbon/human/bob = allocate(/mob/living/carbon/human)
+
+ alice.fully_replace_character_name(null, "Alice")
+ bob.fully_replace_character_name(null, "Bob")
+
+ var/obj/item/bodypart/head/alices_head = alice.get_bodypart(BODY_ZONE_HEAD)
+ alices_head.drop_limb()
+
+ var/obj/item/bodypart/head/bobs_head = bob.get_bodypart(BODY_ZONE_HEAD)
+ bobs_head.drop_limb()
+
+ TEST_ASSERT_EQUAL(alice.get_bodypart(BODY_ZONE_HEAD), null, "Alice still has a head after dismemberment")
+ TEST_ASSERT_EQUAL(alice.get_visible_name(), "Unknown", "Alice's head was dismembered, but they are not Unknown")
+
+ TEST_ASSERT_EQUAL(bobs_head.real_name, "Bob", "Bob's head does not remember that it is from Bob")
+
+ // Put Bob's head onto Alice's body
+ var/datum/surgery_step/add_prosthetic/add_prosthetic = new
+ user.put_in_active_hand(bobs_head)
+ add_prosthetic.success(user, alice, BODY_ZONE_HEAD, bobs_head)
+
+ TEST_ASSERT(!isnull(alice.get_bodypart(BODY_ZONE_HEAD)), "Alice has no head after prosthetic replacement")
+ TEST_ASSERT_EQUAL(alice.get_visible_name(), "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob")
+
/datum/unit_test/multiple_surgeries/Run()
var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human)
var/mob/living/carbon/human/patient_zero = allocate(/mob/living/carbon/human)
@@ -41,8 +68,6 @@
TEST_ASSERT(surgery_for_zero.step_in_progress, "Surgery on patient zero was not initiated")
var/datum/surgery/organ_manipulation/surgery_for_one = new
-
- sleep(0.2) // if we don't have this, then the next surgery step can start *before* the previous one does, which is no good
// Without waiting for the incision to complete, try to start a new surgery
TEST_ASSERT(!surgery_step.initiate(user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one), "Was allowed to start a second surgery without the rod of asclepius")
diff --git a/code/modules/unit_tests/teleporters.dm b/code/modules/unit_tests/teleporters.dm
new file mode 100644
index 0000000000..fa2624adaa
--- /dev/null
+++ b/code/modules/unit_tests/teleporters.dm
@@ -0,0 +1,10 @@
+/datum/unit_test/auto_teleporter_linking/Run()
+ // Put down the teleporter machinery
+ var/obj/machinery/teleport/hub/hub = allocate(/obj/machinery/teleport/hub)
+ var/obj/machinery/teleport/station/station = allocate(/obj/machinery/teleport/station, locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z))
+ var/obj/machinery/computer/teleporter/computer = allocate(/obj/machinery/computer/teleporter, locate(run_loc_bottom_left.x + 2, run_loc_bottom_left.y, run_loc_bottom_left.z))
+
+ TEST_ASSERT_EQUAL(hub.power_station, station, "Hub didn't link to the station")
+ TEST_ASSERT_EQUAL(station.teleporter_console, computer, "Station didn't link to the teleporter console")
+ TEST_ASSERT_EQUAL(station.teleporter_hub, hub, "Station didn't link to the hub")
+ TEST_ASSERT_EQUAL(computer.power_station, station, "Teleporter console didn't link to the hub")
diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm
index 36b406e75e..15fe6b466c 100644
--- a/code/modules/unit_tests/unit_test.dm
+++ b/code/modules/unit_tests/unit_test.dm
@@ -1,9 +1,14 @@
/*
+
Usage:
Override /Run() to run your test code
+
Call Fail() to fail the test (You should specify a reason)
+
You may use /New() and /Destroy() for setup/teardown respectively
+
You can use the run_loc_bottom_left and run_loc_top_right to get turfs for testing
+
*/
GLOBAL_DATUM(current_test, /datum/unit_test)
@@ -14,19 +19,33 @@ GLOBAL_VAR(test_log)
//Bit of metadata for the future maybe
var/list/procs_tested
- //usable vars
+ /// The bottom left turf of the testing zone
var/turf/run_loc_bottom_left
+
+ /// The top right turf of the testing zone
var/turf/run_loc_top_right
+ /// The type of turf to allocate for the testing zone
+ var/test_turf_type = /turf/open/floor/plasteel
+
//internal shit
+ var/focus = FALSE
var/succeeded = TRUE
var/list/allocated
var/list/fail_reasons
+ var/static/datum/turf_reservation/turf_reservation
+
/datum/unit_test/New()
+ if (isnull(turf_reservation))
+ turf_reservation = SSmapping.RequestBlockReservation(5, 5)
+
+ for (var/turf/reserved_turf in turf_reservation.reserved_turfs)
+ reserved_turf.ChangeTurf(test_turf_type)
+
allocated = new
- run_loc_bottom_left = locate(1, 1, 1)
- run_loc_top_right = locate(5, 5, 1)
+ run_loc_bottom_left = locate(turf_reservation.bottom_left_coords[1], turf_reservation.bottom_left_coords[2], turf_reservation.bottom_left_coords[3])
+ run_loc_top_right = locate(turf_reservation.top_right_coords[1], turf_reservation.top_right_coords[2], turf_reservation.top_right_coords[3])
/datum/unit_test/Destroy()
//clear the test area
@@ -61,7 +80,14 @@ GLOBAL_VAR(test_log)
/proc/RunUnitTests()
CHECK_TICK
- for(var/I in subtypesof(/datum/unit_test))
+ var/tests_to_run = subtypesof(/datum/unit_test)
+ for (var/_test_to_run in tests_to_run)
+ var/datum/unit_test/test_to_run = _test_to_run
+ if (initial(test_to_run.focus))
+ tests_to_run = list(test_to_run)
+ break
+
+ for(var/I in tests_to_run)
var/datum/unit_test/test = new I
GLOB.current_test = test
diff --git a/code/modules/uplink/uplink_items/uplink_stealth.dm b/code/modules/uplink/uplink_items/uplink_stealth.dm
index ff6d66a483..1bd75fa2b1 100644
--- a/code/modules/uplink/uplink_items/uplink_stealth.dm
+++ b/code/modules/uplink/uplink_items/uplink_stealth.dm
@@ -102,6 +102,7 @@
along with slurred speech, aggression, and the ability to infect others with this agent."
item = /obj/item/storage/box/syndie_kit/romerol
cost = 25
+ player_minimum = 25
cant_discount = TRUE
exclude_modes = list(/datum/game_mode/nuclear)
@@ -115,7 +116,7 @@
cost = 4
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
-datum/uplink_item/stealthy_weapons/taeclowndo_shoes
+/datum/uplink_item/stealthy_weapons/taeclowndo_shoes
name = "Tae-clown-do Shoes"
desc = "A pair of shoes for the most elite agents of the honkmotherland. They grant the mastery of taeclowndo with some honk-fu moves as long as they're worn."
cost = 12
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index b4490f715b..264d262a1d 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -120,7 +120,14 @@
/obj/item/clothing/ears/headphones = 2,
/obj/item/clothing/head/wig/random = 3,
/obj/item/clothing/suit/ran = 2,
- /obj/item/clothing/head/ran = 2)
+ /obj/item/clothing/head/ran = 2,
+ /obj/item/clothing/mask/gas/timidcostume = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/timidcostume = 3,
+ /obj/item/clothing/shoes/timidcostume = 3,
+ /obj/item/clothing/mask/gas/timidcostume/man = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/timidcostume/man = 3,
+ /obj/item/clothing/shoes/timidcostume/man = 3,
+ )
contraband = list(/obj/item/clothing/suit/judgerobe = 1,
/obj/item/clothing/head/powdered_wig = 1,
/obj/item/gun/magic/wand = 2,
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 462d4b5cb5..8d19d46530 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -34,6 +34,20 @@
/obj/item/clothing/under/costume/kilt = 3,
/obj/item/clothing/under/misc/overalls = 3,
/obj/item/clothing/under/suit/sl = 3,
+ /obj/item/clothing/accessory/sweater = 3,
+ /obj/item/clothing/accessory/sweater/pink = 3,
+ /obj/item/clothing/accessory/sweater/heart = 3,
+ /obj/item/clothing/accessory/sweater/blue = 3,
+ /obj/item/clothing/accessory/sweater/nt = 3,
+ /obj/item/clothing/accessory/sweater/mint = 3,
+ /obj/item/clothing/accessory/sweater/shoulderless = 3,
+ /obj/item/clothing/accessory/sweater/flower = 3,
+ /obj/item/clothing/accessory/turtleneck = 2,
+ /obj/item/clothing/accessory/turtleneck/red = 2,
+ /obj/item/clothing/accessory/turtleneck/comfy = 2,
+ /obj/item/clothing/accessory/turtleneck/tactifool = 2,
+ /obj/item/clothing/accessory/turtleneck/tactifool/green = 2,
+ /obj/item/clothing/accessory/turtleneck/tactifool/blue = 2,
/obj/item/clothing/under/sweater = 3,
/obj/item/clothing/under/sweater/black = 3,
/obj/item/clothing/under/sweater/purple = 3,
@@ -50,6 +64,11 @@
/obj/item/clothing/under/pants/black = 4,
/obj/item/clothing/under/pants/tan = 4,
/obj/item/clothing/under/pants/track = 3,
+ /obj/item/clothing/accessory/suitjacket = 2,
+ /obj/item/clothing/accessory/suitjacket/charcoal = 2,
+ /obj/item/clothing/accessory/suitjacket/navy = 2,
+ /obj/item/clothing/accessory/suitjacket/burgundy = 2,
+ /obj/item/clothing/accessory/suitjacket/checkered = 2,
/obj/item/clothing/suit/jacket/miljacket = 5,
/obj/item/clothing/under/suit/white_on_white/skirt = 2,
/obj/item/clothing/under/rank/captain/suit/skirt = 2,
@@ -74,6 +93,12 @@
/obj/item/clothing/neck/stripedbluescarf = 3,
/obj/item/clothing/neck/stripedgreenscarf = 3,
/obj/item/clothing/accessory/waistcoat = 2,
+ /obj/item/clothing/accessory/waistcoat/red = 2,
+ /obj/item/clothing/accessory/waistcoat/grey = 2,
+ /obj/item/clothing/accessory/waistcoat/brown = 2,
+ /obj/item/clothing/accessory/waistcoat/sweatervest = 2,
+ /obj/item/clothing/accessory/waistcoat/sweatervest/blue = 2,
+ /obj/item/clothing/accessory/waistcoat/sweatervest/red = 2,
/obj/item/clothing/under/dress/skirt = 3,
/obj/item/clothing/under/dress/skirt/blue = 3,
/obj/item/clothing/under/dress/skirt/red = 3,
@@ -132,22 +157,22 @@
/obj/item/clothing/ears/headphones = 10,
/obj/item/clothing/suit/apron/purple_bartender = 4,
/obj/item/clothing/under/rank/civilian/bartender/purple = 4,
+
/* Commenting out until next Christmas or made automatic
+ /obj/item/clothing/accessory/sweater/uglyxmas = 3,
/obj/item/clothing/under/costume/christmas = 3,
/obj/item/clothing/under/costume/christmas/green = 3,
/obj/item/clothing/under/costume/christmas/croptop = 3,
/obj/item/clothing/under/costume/christmas/croptop/green = 3,
- */
/obj/item/clothing/suit/hooded/wintercoat/christmascoatr = 3,
/obj/item/clothing/suit/hooded/wintercoat/christmascoatg = 3,
/obj/item/clothing/suit/hooded/wintercoat/christmascoatrg = 3,
- /*Commenting out until next Christmas or made automatic
/obj/item/clothing/head/christmashat = 3,
/obj/item/clothing/head/christmashatg = 3,
- */
/obj/item/clothing/shoes/winterboots/christmasbootsr = 3,
/obj/item/clothing/shoes/winterboots/christmasbootsg = 3,
/obj/item/clothing/shoes/winterboots/santaboots = 3,
+ */
/obj/item/clothing/head/cowboyhat = 3,
/obj/item/clothing/head/cowboyhat/black = 3,
/obj/item/clothing/head/cowboyhat/white = 3,
@@ -161,7 +186,8 @@
/obj/item/clothing/under/costume/cheongsam/white = 3,
/obj/item/clothing/under/costume/cheongsam/red = 3,
/obj/item/storage/backpack/snail = 3)
- contraband = list(/obj/item/clothing/under/syndicate/tacticool = 3,
+ contraband = list(/obj/item/clothing/accessory/turtleneck/tactifool/syndicate = 3,
+ /obj/item/clothing/under/syndicate/tacticool = 3,
/obj/item/clothing/under/syndicate/tacticool/skirt = 3,
/obj/item/clothing/mask/balaclava = 3,
/obj/item/clothing/head/ushanka = 3,
diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm
index e522583772..2316682e68 100644
--- a/code/modules/vending/kinkmate.dm
+++ b/code/modules/vending/kinkmate.dm
@@ -2,7 +2,6 @@
name = "KinkMate"
desc = "A vending machine for all your unmentionable desires."
icon_state = "kink"
- circuit = /obj/item/circuitboard/machine/kinkmate
product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
vend_reply = "Have fun, you shameless pervert!"
products = list(
@@ -13,6 +12,7 @@
/obj/item/clothing/neck/petcollar = 5,
/obj/item/clothing/neck/petcollar/choker = 5,
/obj/item/clothing/neck/petcollar/leather = 5,
+ /obj/item/clothing/neck/necklace/cowbell = 5,
/obj/item/restraints/handcuffs/fake/kinky = 5,
/obj/item/clothing/glasses/sunglasses/blindfold = 4,
/obj/item/clothing/mask/muzzle = 4,
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index 795d35adc4..a24233b17c 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -34,7 +34,8 @@
/obj/item/healthanalyzer/wound = 4,
/obj/item/stack/medical/ointment = 2,
/obj/item/stack/medical/suture = 2,
- /obj/item/stack/medical/bone_gel = 4)
+ /obj/item/stack/medical/bone_gel = 4,
+ /obj/item/stack/medical/nanogel = 4)
contraband = list(/obj/item/reagent_containers/pill/tox = 3,
/obj/item/reagent_containers/pill/morphine = 4,
/obj/item/reagent_containers/pill/charcoal = 6)
diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm
index 31f3dc49f1..2d4c30080d 100644
--- a/code/modules/vending/medical_wall.dm
+++ b/code/modules/vending/medical_wall.dm
@@ -13,6 +13,7 @@
/obj/item/reagent_containers/medspray/sterilizine = 1,
/obj/item/healthanalyzer/wound = 2,
/obj/item/stack/medical/bone_gel = 2,
+ /obj/item/stack/medical/nanogel = 2,
/obj/item/reagent_containers/syringe/dart = 10)
contraband = list(/obj/item/reagent_containers/pill/tox = 2,
/obj/item/reagent_containers/pill/morphine = 2)
diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm
index 88f65506a6..2d77b2fc51 100644
--- a/code/modules/vending/robotics.dm
+++ b/code/modules/vending/robotics.dm
@@ -17,7 +17,8 @@
/obj/item/tank/internals/anesthetic = 2,
/obj/item/clothing/mask/breath/medical = 5,
/obj/item/screwdriver = 5,
- /obj/item/crowbar = 5)
+ /obj/item/crowbar = 6,
+ /obj/item/stack/medical/nanogel = 5)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
default_price = PRICE_EXPENSIVE
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 482cdb7d86..e88cfe33a3 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -212,7 +212,7 @@
/obj/item/clothing/under/rank/rnd/roboticist/sleek = 3,
/obj/item/clothing/under/rank/rnd/roboticist/skirt = 3,
/obj/item/clothing/suit/hooded/wintercoat/robotics = 3,
- /obj/item/clothing/suit/toggle/labcoat = 3,
+ /obj/item/clothing/suit/toggle/labcoat/roboticist = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
/obj/item/clothing/head/soft/black = 3,
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index 7f8aed83ef..8e74dd3c92 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -248,7 +248,7 @@
for(var/mob/living/H in hearing_mobs)
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
var/sound/releasement = GLOB.pred_release_sounds[release_sound]
- H.playsound_local(owner.loc, releasement, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
+ H.playsound_local(owner.loc, releasement, 75, TRUE)
else if(H?.client && (H in contents))
var/sound/releasement = GLOB.prey_release_sounds[release_sound]
SEND_SOUND(H,releasement)
@@ -304,7 +304,7 @@
for(var/mob/living/H in hearing_mobs)
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
var/sound/releasement = GLOB.pred_release_sounds[release_sound]
- H.playsound_local(owner.loc, releasement, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
+ H.playsound_local(owner.loc, releasement, 75, TRUE)
else if(H?.client && (H in contents))
var/sound/releasement = GLOB.prey_release_sounds[release_sound]
SEND_SOUND(H,releasement)
@@ -366,7 +366,7 @@
for(var/mob/living/H in hearing_mobs)
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
var/sound/eating = GLOB.pred_vore_sounds[vore_sound]
- H.playsound_local(owner.loc, eating, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
+ H.playsound_local(owner.loc, eating, 75, TRUE)
else if(H?.client && (H in contents))
var/sound/eating = GLOB.prey_vore_sounds[vore_sound]
SEND_SOUND(H,eating)
@@ -585,14 +585,14 @@
if(is_wet)
for(var/mob/living/H in hearing_mobs)
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
- H.playsound_local(owner.loc, pred_struggle_snuggle, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
+ H.playsound_local(owner.loc, pred_struggle_snuggle, 75, TRUE)
else if(H && H.client && (H in contents))
SEND_SOUND(H,prey_struggle_snuggle)
else
for(var/mob/living/H in hearing_mobs)
if(H && H.client)
- H.playsound_local(owner.loc, struggle_rustle, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
+ H.playsound_local(owner.loc, struggle_rustle, 75, TRUE)
for(var/mob/living/H in hearing_mobs)
if(H && H.client && (isturf(H.loc)))
diff --git a/code/modules/vore/eating/bellymodes.dm b/code/modules/vore/eating/bellymodes.dm
index 291ef8654f..7cf36ebc50 100644
--- a/code/modules/vore/eating/bellymodes.dm
+++ b/code/modules/vore/eating/bellymodes.dm
@@ -245,7 +245,7 @@
last_hearcheck = world.time
for(var/mob/M in hearing_mobs) //so we don't fill the whole room with the sound effect
if(M && M.client && (isturf(M.loc) || (M.loc != src.contents))) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
- M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
+ M.playsound_local(owner.loc, play_sound, 75, TRUE)
//these are all external sound triggers now, so it's ok.
if(to_update)
for(var/mob/living/M in contents)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index a0ae58a44d..41d7da16a1 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -359,6 +359,10 @@
if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
+ if(ishuman(tasted))
+ var/mob/living/carbon/human/H = tasted
+ H.wash_cream()
+
visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
diff --git a/code/world.dm b/code/world.dm
index 344ca9be79..71a9853d01 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -1,12 +1,22 @@
//This file is just for the necessary /world definition
//Try looking in game/world.dm
+/**
+ * # World
+ *
+ * Two possibilities exist: either we are alone in the Universe or we are not. Both are equally terrifying. ~ Arthur C. Clarke
+ *
+ * The byond world object stores some basic byond level config, and has a few hub specific procs for managing hub visiblity
+ *
+ * The world /New() is the root of where a round itself begins
+ */
/world
mob = /mob/dead/new_player
turf = /turf/open/space/basic
area = /area/space
view = "15x15"
hub = "Exadv1.spacestation13"
+ hub_password = "kMZy3U5jJHSiBQjr"
name = "/tg/ Station 13"
fps = 20
#ifdef FIND_REF_NO_CHECK_TICK
diff --git a/config/game_options.txt b/config/game_options.txt
index 3c53d9fecb..7776d87d4e 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -675,3 +675,6 @@ TURF_DIRT_THRESHOLD 100
## Default alpha of dirt on spawn
DIRT_ALPHA_STARTING 127
+
+## Allows pAI custom holoforms
+PAI_CUSTOM_HOLOFORMS
diff --git a/dependencies.sh b/dependencies.sh
index 75e49f3fe1..e8709d10b1 100644
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -11,16 +11,13 @@ export BYOND_MINOR=${LIST[1]}
unset LIST
#rust_g git tag
-export RUST_G_VERSION=0.4.4
-
-#bsql git tag
-export BSQL_VERSION=v1.4.0.0
+export RUST_G_VERSION=0.4.7
#node version
export NODE_VERSION=12
-# PHP version
-export PHP_VERSION=5.6
-
# SpacemanDMM git tag
-export SPACEMAN_DMM_VERSION=suite-1.4
+export SPACEMAN_DMM_VERSION=suite-1.6
+
+# Extools git tag
+export EXTOOLS_VERSION=v0.0.6
diff --git a/html/changelog.html b/html/changelog.html
index 8a1401744e..5ec3e6068b 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,896 +50,841 @@
-->
-
04 October 2020
-
DeltaFire15 updated:
+
05 February 2021
+
SmArtKar updated:
-
Synths / IPCs are no longer wound immune.
-
Husked IPCs / Synths should now be rendered correctly.
-
Falling vendors now squish synths / IPCs' limbs again.
-
Synths and IPCs now do not have some fun roundstart oversights anymore.
-
Regenerate_limbs now works for carbons with the ROBOTIC_LIMBS trait.
-
Pacifists no longer counterattack on parries if that attack would be harmful.
-
Heretic sacrifices now husk with the reason of burn, and deal some additional damage.
-
Neovgre can no longer become invincible on clock tiles.
-
Plushlings no longer break when absorbing snowflake plushies.
+
The orbit menu now has an Auto-Observe button! No more sifting through the lame observe menu to snoop in people's backpacks! Also, orbit menu now refreshes.
+
KAs are no longer getting broken when fired by a circuit
-
Detective-Google updated:
+
keronshb updated:
-
the snow cabin doors actually bolt now
-
-
Putnam3145 updated:
-
-
Ghosts are no longer incapable of going away.
-
-
monster860 updated:
-
-
The slimeperson swap-body UI stays open when you switch bodies
-
-
timothyteakettle updated:
-
-
limb id entry in mutant bodyparts now supports switching to/from species with gendered body parts
-
the minimum brightness of mutant parts is now a define
-
-
-
02 October 2020
-
ArcaneMusic, with minor tweaks by TheObserver-sys updated:
-
-
Adds and modifies fertilizers, as well as a new stat, Instability.
-
Removes the rather disused functionality of irrigation hoses, temporarily disables circuit use on hydroponics trays.
-
Plant Analyzer have been upgraded. Using one in hand will now switch between a stat view of your plant, and a chemical view of your plant. tweak:Trays now accept and store reagents, as well as coming with an autogrow mode. However, these upgrades came at the cost of old self sufficiency, meaning you must attend to your plants a bit more often.
-
Earthsblood, while not being able to gild trays anymore, has been found to still be quite powerful as a fertilizer.
-
-
CoreFlare updated:
-
-
Altcloaks! Available in loadout.
-
-
Detective-Google updated:
-
-
a smattering of clothes from the RP server
-
detective wardrobe
-
-
EmeraldSundisk updated:
-
-
Adds the "Skelter" space ruin
-
Creates a few new area designations for the Skelter
-
Cargo techs now have access to a "long pants" variant of their standard work uniform
-
Adds said uniform to CargoDrobes and the loadout menu
-
-
ItzGabby updated:
-
-
Three new turf tiles.
-
Turf icons with multiple damage icons, with in-hand icons for each tile.
-
Edited the name and description to wooden.
-
-
LetterN updated:
-
-
craftable railings
-
ports robust savefiles
-
-
MrJWhit updated:
-
-
tweaked heavy suit dmi
-
Fixes drones not being able to quickslot items
-
-
Putnam3145 updated:
-
-
New policy config for pyroclastic slimes.
-
SDGF clones now naked.
-
SDGF is now way more likely to make a clone that will align with the creator's goals, with purity, making it a better antagging tool.
-
SDGF clones now have the same traits as the original.
-
transfer_ckey now resets view, preventing things like SDGF clones with much larger view range.
-
Policy configs have been added for SDGF, currently unused: SDGF, SDGF_ALIGNED, SDGF_UNALIGNED.
-
Shivering now has thresholds and fever's thresholds now work.
-
Made allturfs setup actually set up all turfs.
-
Dynamic is now more aggressive with adding antags.
-
Fixes vore pref saving.
-
-
SandPoot updated:
-
-
Fixes headslugs being unable to recover their human form.
-
-
Tupinambis updated:
-
-
Adds methane and methyl bromide gases.
-
Minor gas name/desc changes to improve consistency
-
Ports the methyl bromide tank from bay. Adds two new canister sprites for the new gases and CH4 screen alerts.
-
fixed a mispelling in the wound armor value for the bounty hunter suit
-
-
dapnee updated:
-
-
atrium, clinic, an extra office, a pseudo public mining area, two more deluxe dorms, micro beach, aux bathroom, two construction areas, mass driver, more intercoms
-
moved all of service, chapel, dorms, garden, holodeck to a different z-level, RnD is more open, maintenance is a bit more random, more firelocks, added more mine-able rock
-
fixed the buttons in xenobio, gave shutters to cargo's storage area, fixed holodeck so it works now, fixed some techfabs being lathes, added sensors to atmos tanks, more decals, couple more signs, little floral areas and sitting areas added to break up hallway monotony, mech chargers are no longer missing their consoles, whiteship won't crash into arrivals anymore while the area it takes up is more telegraphed, APC placement on AI sat entrance, missing wire node for the outer portion of the AI sat, civilian level now has a telecom relay
-
-
lolman360 updated:
-
-
smonk machine runtimes
-
automatic hydro tray has a unique sprite now (fancy robot arm)
-
-
timothyteakettle updated:
-
-
added luminescent and stargazer sprites as selectable body sprites for slimes
-
wound exponent lowered slightly from 1.225 to 1.2
-
wound exponent and limb damage multiplier are now config values
-
ipcs and synthlizards are now treated as actual robots, with robotic limbs, an extra organ, and better emp acts
-
surgeries for healing robotic limbs, and brain surgery for robotic heads
-
androids limbs now show up as intended
-
emps now work from 1-100 severity instead of 1/2 and the severity reduces as you move from the epicentre
-
-
zeroisthebiggay updated:
-
-
ratvar gf is complete
-
-
-
01 October 2020
-
BlueWildrose updated:
-
-
Slimepeople are given unique laughs and screams.
-
Adds "warbles", "chimpers", and "puffs" to the customizable speech verbs for character.
-
-
-
29 September 2020
-
timothyteakettle updated:
-
-
fixed a typo causing your right eye colour to save as the left eye colour
-
-
-
28 September 2020
-
ArchieBeepBoop updated:
-
-
Craftable Micro Powered Fans
-
-
Degirin2120 updated:
-
-
Added engineering hazard jumpsuits, can be found in the engidrobe, comes in 3 varieties.
-
-
Putnam3145 updated:
-
-
Added a brute-force check-every-single-tile step to SSair when it has enough time to run.
-
G fuid production is now much lower.
-
Supermatter sabotage objective's gone.
-
Subterfuge objectives are now all equally likely.
-
Replaced a "(hopefully) 1" with a "2"
-
Cryoing no longer unwins already-won objectives.
-
-
SiliconMain updated:
-
-
Minor adjustment to material cost of long range atmos analyzer
-
-
Trilbyspaceclone updated:
-
-
Most drinks now have some animation in them, from basic soda bubbles fizzing around to ice cubes bobbing just a bit.
-
-
Tupinambis updated:
-
-
Ghost poly's color value is now a hex value instead of an oct value. This has been a thing for OVER FIVE YEARS
-
Updates TEG, Antimatter, Jetpack sprites (CO2 and Oxy from Eris).
-
Replaced old chair sprites with new ones ported and modified from eris.
-
Beds can now be placed both right and left.
-
Subtle changes to stool legs to give them more of a shine.
+
Force and damage > 15 from 18/25
+
Knockdown put down to 5 from 30
+
Armor pen down to 10 from 100.
+
Makes cell chargers, charge faster.
raspy-on-osu updated:
-
TEG power generation
-
-
thakyZ updated:
-
-
Added the ability to print the Light Replacer at the Engineering Protolathe
-
-
timothyteakettle updated:
-
-
turrets can once again be broken
-
you can now have heterochromia and select individual eye colours
-
-
-
27 September 2020
-
SiliconMain updated:
-
-
Holograms made from projectors (atmos, engi, sec, medical, ect...) can no longer be contaminated by radiation
-
-
-
26 September 2020
-
CoreFlare updated:
-
-
IPC's can have hair. Why wasn't this added earlier. Use the bald hairstyle for no hair.
-
-
-
25 September 2020
-
Putnam3145 updated:
-
-
Removed a non-working proc that already had its functionality implemented in another proc in the same file.
-
-
-
24 September 2020
-
Putnam3145 updated:
-
-
Atmos is free.
-
-
-
22 September 2020
-
Arturlang updated:
-
-
TGUI Statpanel
-
-
YakumoChen updated:
-
-
Mechsuits, robotics jumpsuits added to RoboDrobe
-
-
timothyteakettle updated:
-
-
character previews should be more consistent now
-
-
-
20 September 2020
-
DeltaFire15 updated:
-
-
Sutures work on simplemobs again.
-
Attacking dismembered bodyparts now targets the chest instead, for weapons aswell as unarmed attacks.
-
-
MrJWhit updated:
-
-
New sprites for chess pieces! You can craft them in-game with metal sheets.
-
-
silicons updated:
-
-
hulks can smash again (walls no longer break their hands)
-
acid no longer degrades armor
-
-
-
17 September 2020
-
DeltaFire15 updated:
-
-
Failing the plushmium reaction can now create peculiar plushies, depending on reaction volume.
-
The mood-buff from petting a plushie now works properly again.
-
Fixed wacky necropolis loot chest behavior
-
-
EmeraldSundisk updated:
-
-
Adds the Research Director's office to Omega Station
-
Adds 2 new solar arrays (and control rooms)
-
Adds some action figures that weren't there previously
-
The CMO's office now has a light switch
-
Slight readjustments to impacted areas
-
Readjusts the toxins air supply line to (ideally) be easier to service
-
Department camera consoles should now be able to actually check appropriate cameras
-
Xenobiology can now be locked down (by the Research Director)
-
-
MrJWhit updated:
-
-
Adds a brain damage line
-
-
Putnam3145 updated:
-
-
Your balls finally feel full, again.
-
-
timothyteakettle updated:
-
-
due to changes in policy, and several lawsuits, Nanotrasen has been forced to allow disabled people to sign up
-
-
-
16 September 2020
-
timothyteakettle updated:
-
-
fixed an icon path
-
-
-
12 September 2020
-
01 October 2020
-
BlueWildrose updated:
-
-
Slimepeople are given unique laughs and screams.
-
Adds "warbles", "chimpers", and "puffs" to the customizable speech verbs for character.
-
-
-
30 August 2020
-
raspy-on-osu updated:
-
-
new explosion echoes
-
explosion echo range
-
5 new explosion related sounds
-
-
-
28 August 2020
-
EmeraldSundisk updated:
-
-
Adds more paper to the library
-
The law office now has a desk window
-
Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding areas to accommodate this.
-
Updates some of CogStation's paperwork
-
The rat in the morgue turned themselves into a possum. Funniest shit I've ever seen.
-
Adjusts some area designations so cameras should receive power properly
-
Cleans up an errant decal
-
-
Hatterhat updated:
-
-
Traitor holoparasites can now only be bought once, because apparently you can only have one active holopara.
-
PDA bombs can now only be bought once per uplink.
-
-
lolman360 updated:
-
-
atmos = radiation = chemistry.
+
alien royals can no longer ventcrawl
shellspeed1 updated:
-
Adds slow mode for iv drips
+
There actually needs to be people for zombies to happen now.
timothyteakettle updated:
-
an ancient game over a thousand years old has re-emerged among crewmembers - rock paper scissors
-
customization features appear in alphabetical order where necessary
-
bokken do two more stamina damage now
-
you can now choose a body sprite as an anthromorph or anthromorphic insect, and can choose from aquatic/avian and apid respectively (and obviously back to the defaults too)
+
dwarf facial hair is no longer randomised
-
27 August 2020
-
silicons updated:
-
-
eyebeam lighting can only have 128 maximum HSV saturation now.
-
no more shotgun stripper clips in boxes.
-
goliath tentacles now do 20 damage to mechs at 25% ap
-
-
timothyteakettle updated:
-
-
changing your character's gender won't randomize its hairstyle and facial hairstyle now
-
-
-
26 August 2020
-
ancientpower updated:
-
-
Ghosts can read newscasters by clicking on them.
-
-
silicons updated:
-
-
hierophant vortex blasts now have 50% armor penetration vs mecha
-
ventcrawling now kicks off every attached/buckled mob, even for non humans.
-
-
-
25 August 2020
+
03 February 2021
Hatterhat updated:
-
Insidious combat gloves have been replaced by insidious guerilla gloves. They're generally the same, except now you can tackle with them.
+
The green energy sabre's sprite now respects proper handedness.
-
Literallynotpickles updated:
+
+
02 February 2021
+
silicons updated:
-
You can now equip handheld crew monitors on all medical-related winter coats.
+
pais can now be carried around piggybacking/fireman
+
Meth and Nuka Cola once again, speed you up.
+
+
31 January 2021
Putnam3145 updated:
-
vore now ejects occupants on death
+
fermichem explosion EMPs don't cover the entire station
+
+
+
30 January 2021
+
timothyteakettle updated:
+
+
adds 'clucks', 'caws' and 'gekkers' to the speech verb list
+
+
zeroisthebiggay updated:
+
+
some more FUCKING hairs
+
uncodersprites the advanced extinguisher
+
+
+
29 January 2021
+
MrJWhit updated:
+
+
Ported the QM, Captain, CMO, and HoS cloaks from beestation.
+
Removes excess air alarms from boxstation
+
+
TripleShades updated:
+
+
fixes engineering secure storage being the wrong area because I fucked that up previously my bad
+
removes funny extra light switch under right surgery table in surgery oops
+
Added chairs to the corpse launch viewing area
+
Small garden plot for flowers for parity with other station Chapels
+
Plain Bible to glass tables in Chapel
+
Candles and Matchbox to glass tables in Chapel
+
More glass tables, with a chaplain figure and another spare bible.
+
Bookcase to Box Chapel for parity with other station Chapels
+
Minimoog to Box Chapel as substitute for a church organ
+
Holy department sign just below Chapel change: Expanded the corpse launching area to feel less congested change: Added windows to the corpse launch so you can look inside I guess? change: Moved flowers and burial garments to the corner next to the corpse launcher change: Box Chaplain's office door is moved over one change: Confessional is now connected to Chaplain's office for parity with other station Chapels change: Moved coffins over to old confessional location change: Box Chapel now has pews instead of stools change: Box Chapel Confessional is now lit instead of being nearly pitch black remove: Two coffins from Chapel
+
+
timothyteakettle updated:
+
+
the miner bedsheet will now increment its progress when you redeem points from the ORM
+
you can add custom names and descriptions to item's on the loadout now
+
+
zeroisthebiggay updated:
+
+
roundstart aesthetic sterile masks and roundstart paper masks
+
more accessory slot items
+
cowbell necklace happy 2021
+
shibari ropes & torn pantyhose
+
+
+
28 January 2021
+
silicons updated:
+
+
colormates can now paint some mobs.
+
1 dev explosions shouldn't delete brains anymore
+
+
+
27 January 2021
+
ArcaneMusic, ported by Hatterhat updated:
+
+
Strike a hydroponics tray with a fully-charged floral somatoray to lock in a mutation.
+
Floral somatorays now have the ability to force a mutation in a plant. This should drain the cell in a single shot, but we'll see.
+
Somatorays now take uranium to craft instead of radium.
+
+
Arturlang updated:
+
+
Actually adds a right click give option
+
Revenants can now clickdrag to throw stuff at people, with some items doing various things at the same time.
+
+
DeltaFire15 updated:
+
+
The woundmending rite no longer causes runtimes.
+
Ratvarian borgs can now use their tier-0 spells.
+
Ratvarian borgs can always use their assigned spells, if there is enough power.
+
The heretic antag panel now shows their sacrifices & current sacrifice targets.
+
The heretic roundend report now shows their sacrifices and nonsacrificed targets.
+
Living hearts can no longer select the same target as another living heart, removing a certain problem.
+
+
Hatterhat updated:
+
+
Department budget cards have been readded. TO THE CODE. NOT LOCKERS.
+
Also budget cards now look more like every other ID - see tgstation#55001.
+
One of the contractor tablet's payouts has been raised from a small payout to a medium payout.
+
The free golem ship's GPSes no longer start on. They were never meant to, but they did.
+
Headsets can't be found on most legion corpses now.
+
The flash on the assistant corpse is gone, too.
+
+
MrJWhit updated:
+
+
Remaps some air alarms for sanity.
+
+
SandPoot updated:
+
+
The drop circuit can no longer drop things that are not inside it.
raspy-on-osu updated:
-
Thermoelectric Generator power output
+
bespoke ventcrawling element not detaching due to malformed call
+
+
shellspeed1 updated:
+
+
Floorbots had had a software update, preventing them from dogpiling on their target as easily as they did before.
+
Floorbots will now play a small chime when stacked on top of each other to indicate that they're moving apart.
timothyteakettle updated:
-
I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them.
+
blobs can use the 'me' verb
+
adminhelps and pms only sanitize once instead of twice
-
24 August 2020
+
25 January 2021
MrJWhit updated:
-
Fixes areas on expanded airlocks
+
Alien radio code
+
Microwave can now be cleaned by a damp rag as well as soap.
+
Removes some unused code, and improves some other code.
+
The AI has a verb to look up and down z-levels
+
Making a monkey into a human doesn't unanchor random things on the tile
+
Makes a few slight improvements to drinking code
+
Makes encryption keys be put in the hands of the user when able instead of being dropped on the floor when removed from headsets
+
+
raspy-on-osu updated:
+
+
ventcrawling
silicons updated:
-
wormhole jaunters work
-
wormhole jaunters no longer get interference from bags of holding
-
airlocks now only shock on pulse/wirecutters instead of on tgui panel open.
-
-
timothyteakettle updated:
-
-
three new items are in the loadout for all donators
-
-
zeroisthebiggay updated:
-
-
contraband black evening gloves in kinkvend
+
you can now shove yourself up in any intent, not just help.
-
23 August 2020
+
22 January 2021
+
Arturlang updated:
+
+
Adds a way to give items to people, you can combat mode rightclick to offer it to one person, right click on people without mode and click the give verb, or use the hotkey CTRL G to offer it to everyone around you
+
+
+
21 January 2021
+
Acer202 updated:
+
+
Main mining shuttle should no longer look at the public mining shuttle and attempt to dock ontop of it. Monastery shuttle should now function again.
+
+
Acer202, with minor help from The0bserver updated:
+
+
After internal deliberation, CentCom has decided to run a limited reinstatement of public mining shuttles for use in more tried and true station classes. CentCom would like to remind you that this privilege is easily revoked, and that abuse may result in immediate detonation.
+
Restores the mining shuttle on Pubby, Box, Delta, Meta, and Lambda Station.
+
+
ArcaneMusic, The0bserver-sys updated:
+
+
New from Hydrowear LLC: The Botanical Belt! This handy yellow belt lets you hold most of your botany gear, and a few beakers for reduced bag and floor clutter!
+
Gives Hydrotrays plumbing pipes automatically, allowing you to make a self sustaining tray via plumbing.
+
Gives Service access to Bluespace Beakers, at last, gives Cargo, Science, and Medical the ability to construct reinforced plungers for use on lavaland.
+
+
ArchieBeepBoop updated:
+
+
Upgraded Advanced RTG Machine Preset
+
Outlet Injector Mapping Asset Layer Fix
+
Jacqueen and the Christmas tree should no longer spawn abstract things that can cause shittons of runtimes.
+
+
Arturlang updated:
+
+
You can't tackle in nograv anymore
+
You cannot spam drink from blood bags anymore
+
Blood bag drinking inefficiency is now the right way, so you loose some of the blood drinking it straight
+
Handles more edge cases with construct soul returning
+
Being sacrificed by the cult no longer removes all hope of rescue.
+
Makes construct mind returning more robust
+
Prayers to admins now do a wee ding sound for all prayers, instead of just chaplains
+
Fixes the mint machine's UI
+
Hopefully fixes whitescreen issues for TGUI UI's by giving assets more time to get to the client
+
Fixes hijack implant APC UI, again
+
Comments out spaceman dmm do not sleeps for mob/proc/CommonClickOn, atom/proc/attack_hand, datum/proc/keyLoop and mob/living/proc/Life
+
Bloodsuckers tresspass ability can no longer work while they are not awake.
+
The cursed heart now only takes away half as much blood every loop, and can be used as long as you are alive, instead if only you are awake/able to use your hands
+
+
Bhijn updated:
+
+
Changeling loudness is now determined as an average of all their abilities, rather than the sum
+
To compensate for this, blood tests now require a loudness value of 1 or higher to detect ling blood. Additionally, blood test explosions are now triggered only when the loudness value is higher than 2.
+
+
BlackMajor updated:
+
+
Cyborg hypospray no longer injects if it means OD'ing while on help intent.
+
+
BlueWildrose updated:
+
+
Nyctophobia quirk now has some light lag compensation.
+
Fixes cloning computer UI not updating when pressing certain buttons - also adds extra check for names to update a message
+
Removes oversized genitalia analysis from medical scanners, since huge dick and titty are no longer a problem anymore thanks to advancements in that kind of technology when it comes to chemical fun times growth.
+
Fixed species-specific drinks not giving a mood boost if you are that species.
+
You will now only unbuckle fireman-carried/piggybacked people on disarm or harm intent.
+
The traitor AI can no longer activate the doomsday device while carded.
+
Fixes noodle size appearance for 12+ inch members.
+
Fixed the subtle hotkey being weird with its input prompts.
+
Adds a subtler anti-ghost hotkey. Default key is 6.
+
No more straining when your cock or breasts are growing via incubus draft or succubus milk.
+
PubbyStation now has two Christmas Tree spawners.
+
You can now have a max-roundstart-dicksize-config inch long johnson before you start suffering blood loss and slowdowns instead of a 20 inch one.
+
Color Mates have been added to all stations (except Snaxi). Enjoy coloring your attire without having to bug science!
+
Polychromic hoodies that were obtained from the loadout have functional colorable hoods now.
+
Adds in timid woman/man costumes. Available at your autodrobe! Also adds in garters as some new socks.
+
Corrected the capitalization in gasmask concealment examine text
+
+
Chiirno updated:
+
+
Added the paramedics EVA suit as a purchase from the cargo console.
+
Paramedics office and Surgery Storage Room
+
Remodeled the surgery room, as well as shrunk Morgue and Starboard Emergency Storage. Fiddled with some areas for better map edit clarity and fixed one runtime in Vacant Office A.
+
Added the paramedic closet sprite, a paramedic colored medical3 closet.
+
Added a paramedic closet, which is the standard medical3 closet with their suit, a pinpointer, and a crew monitor added.
+
Nightmare now deals additional damage to most light sources.
+
Nightmare now one-shots miners beacons and glowshrooms
+
Portable Chem Mixer now researchable from biotech node.
+
Chem masters can now dispense 20 instances of its outputs instead of 10.
+
+
Delams-The-SM updated:
+
+
Added 3 new emotes *hiss *purr *meow
+
ported sounds from Citadel RP for *purr and *meow
+
fixed randomization of colors for things like mulligan and Stabilized green slime extract for matrixed body parts
+
DeltaFire15 updated:
-
silicons and clockies can now access APCs properly
+
Biomechanical (hybrid) bodyparts now have access to wound-fixing surgeries.
+
A wound being fixed no longer just qdel()s surgeries connected to it.
+
Some robotic surgery steps are now a bit more clear.
+
Organs no longer get fed to people after successfully being inserted into them.
+
Not completing the do_after of a surgery no longer causes you to attack the target with whatever you were holding.
+
IPC cells & power cords are now printable after they are researched.
+
A new surgery, allowing revival of synths without a defib at hand.
+
Semi-permanent damage of Synth limbs caused by passing the damage threshold: 10 <- 15.
+
The embed removal surgery now has a version for Synths.
+
EMPs no longer hardstun Synths.
+
Portals no longer runtime because of incorrect args.
+
Abductors now can use experimental organ replacement surgery on robots / synthetics.
+
Fixes a minor incorrectness in ratvarian borg slabs (ratvar_act -> ui_act)
+
Changelings no longer double-deathgasp when activating the regen stasis ability while not dead.
+
People installing KA modkits in miner borgs is no longer broken.
+
Fixes the tail entwine messages displaying incorrectly.
+
Antagging / Deantagging Heretics now properly sets their special role.
+
The borg VTEC ability now actually gets removed when the upgrade is removed.
+
Supplypods shouldn't cause runtimes anymore, and shrapnel (pelletclouds) should work for them.
+
Robots (anyone with the robotic_organism trait) have toxins damage replaced with system corruption. See the PR for details.
+
Clockwork rites now support hiding specific rites from neutered servants.
+
AIs now only have to kill people once instead of permanently.
+
Scripture no longer sometimes eats part of its invocation.
+
APCs and silicons are now more susceptible to powerdrains (by the power_drain() proc, which is rare)
+
Void Volt has been modified from a chant to a singular pulse.
+
Robotpeople are now fully immune to the effects of alcohol (drunkness etc.)
+
Renames the alcohol intolerance trait in the code to make what it does more clear.
Brass welders now actually recharge faster than experimental ones.
+
Repeatable surgery steps can no longer cause an infinite loop if not completing the do_after
+
The Revenant self-revive ability is no longer broken.
+
Loot items mobs drop are no longer always failing to initialize.
+
Instant summons can no longer do wacky stuff with disposals (and nukes).
+
Objectives are no longer very broken.
+
Bloodcult stunhands now work against clockies like they were supposed to instead of hardstunning.
+
zeolites are now actual fermichems instead of being incredibly easy to make.
+
Using syringes / droppers on chem heaters with beakers in them works again.
+
Some edge cases causing issues with system corruption shouldn't be able to occur anymore.
+
Cyborg B.o.r.i.s. installation now checks for if the chest has a cell, just like how it does with MMIs.
+
The 'Your body is in a cloner' notification works again
+
Hijack implants should work properly again (or, at least better)
+
Liches are now good skeletons again instead of weak ones
+
The piratepad control cannot be destroyed again.
+
Pirates have received new supplies of jetpacks instead of useless oxygen tanks
+
Ratvarian AIs are once again able to show their linked borgs Ratvar's light
+
Hijackers are once again unable to detonate borgs without being adjacent to the console
+
Automated annoucement systems and gulag ore consoles no longer waste emag charges
+
Automated announcement systems once again can be remote controlled by non-AIs with silicon access
+
APCs being hijacked multiple times at once is no longer possible, preventing some issues
+
Recharging APCs no longer use 0.2% of the power they should be using.
+
APCs no longer always use as much power as they can for their cell, even if it is full.
+
Vampire shapeshifting should now behave as intended
+
Some synth damage stuff has been a bit rebalanced, see the PR for details.
+
Nanogel, available at medical and robotics, which fixes internal damage in sufficiently repaired robotic limbs.
+
Robotic Limbs now each have their own damage threshhold values
+
Robotic Limb damage threshholds are now seperated into threshhold itself and mindamage when passed balance; Hybrid limbs can now be injected with hypos, but not sprayed (Still not healed by chems)
+
Brain surgery has been tweaked back to allowing robotic limbs, blacklisting IPC brains instead.
+
Robot brain surgery can now be used on organic heads, if there is a IPC brain in them somehow.
+
The robot limb heal surgery can now be used even if the target's torso is not robotic, as long as they have robotic limbs
+
BODYPART_ROBOTIC / BODYPART_ORGANIC checks replaced with helper-procs whereever possible.
+
Added a BODYPART_HYBRID define for robotic bodyparts that behave organic in some regards.
+
The transmission sigil power drain works now
+
A certain lizard (totally not me) being stupid is no longer going to break regenerate_bodyparts
+
Combat mode now will not stay permanently disabled due to status effects not working as intended.
+
Attacking some certain objects no longer has no clickdelay.
+
the blacksmithing skill now works properly
+
Anvils cannot be interacted with with hammers whilst they are already being used
+
If someone has no gloves when interacting with heated ingots, they no longer ignore their effects.
+
A runtime caused by hallucinations is gone.
+
Cargo packs marked as 'no private buying' now actually register as such.
+
Fleshmend, Anatomic Panacea and bloodsucker healing now work for Synths / IPCs.
+
Medibots now ignore people they cannot help due to their biology.
+
get_damaged_bodyparts() is no longer broken.
+
Your target cryoing will no longer give you a free greentext.
+
Sleeper UI interactiveness now behaves correctly.
+
+
Detective-Google updated:
+
+
arcade carpet
+
explosions now get broadcasted to deadchat.
+
Lick radial
+
Hilbert's jukebox works
+
arcade carpets now actually work
+
the snow taxi is no longer the slow taxi
+
+
ERP mains updated:
+
+
Subtler Around Table is now a verb
+
+
EdgeLordExe, MoonFalcon updated:
+
+
Ported a bunch of heretic-related tweaks and changes from tg
EmeraldSundisk updated:
-
Medbay now has a smartfridge for organ storage
-
Slight enhancements to the station's electrical wiring layout
-
Very small library renovation
-
Exterior airlocks have been given proper air systems for safety's sake
+
Adds a few new area designations primarily for CogStation, incorporates them into said map
+
Reorganizes some area designations for ease of use, along with renaming the central "Router" to "Routing Depot"
+
Fixes an incorrectly designated area in CogStation
+
Changes the area designations to be not varedited since the code didn't like that anymore
+
The cargo bay conveyor belts not only work with the shuttle now but go in the right direction to boot
+
Slight visual adjustments to cargo in light of this
+
The arcade's got RAD carpet now
+
Fixes the conveyor belt issues in Delta Station's cargo wing
+
Removes some of the dirt around the affected area (presumably they would have cleaned it up while working on it)
+
Adds a floor light to fix the "dark spot" cargo had
+
Adds a new "Computer Core" area designation for CogStation
+
Fixes some missing area strings
+
Replaces some firelocks with directional ones as to ensure desks/counters can still be accessed
+
The "Skelter ruin" now has stechkins as opposed to M1911s
+
Skelter's decorative bullet casings replaced to factor in the change in caliber
+
Skelter now has a combat knife and fluff note
Ghommie updated:
-
Stops shielded hardsuits from slowly turning the wearer into a big glowing ball of stacked energy shield overlays.
-
the shielding overlay is merely visual as result. Aim your clicks.
+
You can access the mime / clown mask skins radial menu once again.
+
Dice bags no longer act like cardboard boxes.
+
Abductors should be no longer mute.
+
Item action buttons should now properly show the item current overlays, most times.
+
The blackbox should now go into your hand slot when pried out, rather than tumbling on the ground everytime.
+
The Quick Equip hotkey is now usable by all living mobs (so long they have hands and equipment slots)
-
Ludox235 updated:
+
Ghommie, porting PRs by MMMiracles and pireamaineach, credits to BlueWildrose too. updated:
-
no more 10 pop xenos (25pop now)
-
-
MrJWhit updated:
-
-
Increases the majority of airlocks by 1 tile.
-
Minor adjustments to the TEG engine.
-
-
Putnam3145 updated:
-
-
Simplemobs no longer count in dynamic.
-
"Story" storyteller no longer starts at a ludicrously low threat, always.
-
Blob threat now scales with coverage.
-
One person with their pref on no longer overpowers 40 people who might not even know there is one.
-
Negative-weight rulesets are no longer put into the list.
-
-
kiwedespars updated:
-
-
removed durathread from armwraps recipe.
-
-
lolman360 updated:
-
-
breath mask balaclava
-
-
timothyteakettle updated:
-
-
lizards are now a recommended species for mam snouts
-
-
zeroisthebiggay updated:
-
-
new sprites for the temporal katana
-
suiciding with the temporal katana omae wa mou shinderius you into the shadow realm
-
twilight isnt earrape
-
-
-
22 August 2020
-
Time-Green (copypasta'd by lolman360) updated:
-
-
plumbing
-
automatic hydro trays
-
-
-
21 August 2020
-
LetterN updated:
-
-
Updates and adds some of the tips
-
-
Putnam3145 updated:
-
-
added reftracking as a compile flag
-
-
SmArtKar updated:
-
-
RSD limitation is now 500 tiles
-
Fixed broken RSD sprites
-
Removed that shuttle limit
-
-
timothyteakettle updated:
-
-
two snouts can once again be chosen in customization
-
lizard snouts work again
-
-
-
20 August 2020
-
DeltaFire15 updated:
-
-
The cooking oil damage formula is no longer scuffed.
-
Changed the clockie help-link to lead to our own wiki.
-
-
Fikou updated:
-
-
admins can now do html in ahelps properly
+
You can now draw on plasmaman helmets with a crayon to turn their frown upside-down.
+
Plasmaman helmets no longer hide your identity when worn by themselves.
+
Plasmaman helmets now have welding visors, which can't stack with their torches in the helmet and are visible.
Hatterhat updated:
-
Pirate threats are now announced as "business propositions", and their arrivals are now also announced properly.
+
Energy sabre reskin for the energy sword - access via alt-click.
+
Alt-click reskins are fixed.
+
Defibrillators and their many, many overlays were moved to another .dmi.
+
You can now change the color of an energy sword via multitool. Not deswords. Yet.
+
The Syndicate appear to be issuing new revolver variants.
+
Basic sticky technology is now a roundstart tech. Advanced sticky technology is BEPIS-locked, though. Theoretically.
+
Non-smithed katanas (including the temporal katana) can now fit in the twin sheath.
+
Cotton and durathread processing by hand now acts like grass. Stand on a pile of cotton (or durathread) and use a single bundle from it.
+
Utility uniforms now comply with the "nonproper equipment names" thing.
+
The CapDrobe now allows the captain to get his own clothes for free. Probably.
+
All captains' clothes now offer 15 woundarmor, up from the 5. Because apparently only the suit and tie and its suitskirt subtype have this wound armor, which is dumb.
+
The nature interaction shuttle with the monkeys now has tiny fans on the airlocks in, because that's apparently a feature that was missing.
+
More bags have been added to department vendors.
+
Every roundstart species (and also ash walkers) now has flesh and bone that can be wounded.
+
Recipes for sutures, regen mesh, and sterilized gauze have been adjusted to be easier, mostly.
+
Sterilized gauze is better at absorbing blood and being a splint.
+
Energy sabres now have an off inhand.
+
The bone gauntlets should be slightly less murderously punchy on the fast punches mode.
+
RPEDs now drop their lowest part tier first when quick-emptied (used inhand).
+
Improvised gauzes can now be crafted in stacks up to 10, like their maximum stacksize implies they should be capable of doing.
+
Pouring sterilizine on gauze now takes the proper 5u per sterilized gauze instead of 10u.
+
Cryogenics now screams on common again when your fuckbuddy heads out.
+
Survival daggers! A slightly more expensive survival knife that comes with a brighter flashlight. On the blade.
+
Luxury pod capsules look different from normal capsules.
+
The wastes of Lavaland and the icy caverns of Snow Taxi rumble in unison.
+
Exosuits sold on the Supply shuttle no longer leave wreckages.
+
Apparently, shrink rays were buyable again, despite a PR having been made a while ago specifically for removing shrink rays. They're gone again.
+
Changeling bone gauntlets! They punch the shit out of people really good.
+
Guerilla gloves and gorilla gloves inherit the strip modifiers of their predecessors, because apparently they had those.
+
Pugilists now always hit the targeted limb and never miss.
+
The dock-silver standard set by Box and Meta has been enforced across maps in rotation (Delta, Pubby, Lambda).
+
The Box whiteship now has its missing tiny fan back.
+
The survival dagger light on the sprite now actually turns on and off.
+
The survival dagger in the glaive kit that can also be bought by itself is now better at butchering things.
-
tiramisuapimancer updated:
+
HeroWithYay updated:
-
Ethereal hair is now their body color instead of accidentally white
-
-
-
18 August 2020
-
DeltaFire15 updated:
-
-
kindle cast time: 15ds -> 25ds
-
Moved the Belligerent Scripture to where it should be in the code
-
-
Detective-Google updated:
-
-
glass floors
-
uncrowbarrable plasma floors tweak:disco inferno's plasma floors can no longer be crowbarred.
-
ghost cafe has funky fresh art
-
you can actually remove glass floors now
-
get_equipped_items is hopefully less gross
-
plasma cutters are no longer gay
-
-
Hatterhat updated:
-
-
Slaughter demons (and laughter demons, being a subtype) are MOB_SIZE_LARGE, with one of the more immediate effects being able to mark them with a crusher and backstab them.
-
The funny blyat men have stumbled upon another surplus of Mosin-Nagants and are starting to pack them into crates again.
-
Vehicle riders can now, by default, get shot in the face and/or chest.
-
Adminspawn only .357 DumDum rounds! Because sometimes the other guy just really needs to hurt.
-
Bluespace beakers now have a chemical window through the side that shows chemical overlays.
-
Plant DNA manipulators now let you chuck things over them. Or they WOULD, if LETPASSTHROW worked half a damn.
-
-
LetterN updated:
-
-
uplink implant states
-
tweaks how role assigning works
-
-
MrJWhit updated:
-
-
Gives ashwalkers nightvision
-
Makes tesla blast people, not the environment, to save the server.
-
-
TheObserver-sys updated:
-
-
moves Garlic sprites from growing.dmi to growing_vegetable.dmi
-
Removes the unused Electric Lime mutation, it just takes up space with no actual function nor sprites.
-
Gives Catnip growing sprites
-
Removes redundant images in growing.dmi
-
-
kiwedespars updated:
-
-
10 force to a fucking rubber cock.
-
-
lolman360 updated:
-
-
shotgun stripper clip nerf. ammoboxes can now accept a load_delay that happens when they attack a magazine, internal or external.
-
-
ported from tg updated:
-
-
bronze airlocks and windows can now be built
-
i also tweaked bronze flooring to be cheaper.
-
-
silicons updated:
-
-
stamina draining projectiles without stamina for their primary damage type now has their stamina damage taken into account for shield blocking, rather than the block being done for free for that.
-
-
timothyteakettle updated:
-
-
snowflake code tidyup
-
snowflake code for mutant bodypart selection has been rewritten to be ~14x shorter
-
meat type and horns can now be selected by any species
-
-
-
17 August 2020
-
DeltaFire15 updated:
-
-
Cogscarabs are no longer always Pogscarabs
-
-
Strazyplus updated:
-
-
Added drakeborgs
-
Added drakeplushies
-
added drakeborg sprites
-
added drakeplushie sprites
-
changed some code - added drakeplushies to backpack loadout Removed duplicate voresleeper belly sprites from engdrake & jantidrake. [CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/)
-
Added CC BY-NC-SA 3.0 license details to icon/mob/cyborg moved drakeborg.dmi to icon/mob/cyborg
-
-
-
16 August 2020
-
kiwedespars updated:
-
-
nerfed hypereut chaplain weapon.
-
50% rng blockchance -> 0%
-
parry made much worse because it's an actual weapon and a roundstart one at that.
-
-
zeroisthebiggay updated:
-
-
tips
-
-
-
15 August 2020
-
LetterN updated:
-
-
missing anomaly core icons
-
wrong state. blame the tg vertion i copied
-
-
silicons updated:
-
-
the 8 rotation limit from clockwork chairs has been removed. please don't abuse this.
The temporal katana is now slightly more worthy of the 2 spell point cost, with a smaller, antimagic respecting timestop, less force, and no random blockchance. Society has progressed past the need for blockchance.
-
-
LetterN updated:
-
-
Mafia Component
-
Fixed missing icons and handtele
-
-
Putnam3145 updated:
-
-
a whole lot of jank regarding funny part sprite display.
-
-
Toriate updated:
-
-
Opossums have migrated into the maintenance tunnels! Seek them out at your own peril!
-
-
ancientpower updated:
-
-
Doors added to the west side of box medbay to make things a bit more manageable.
-
-
kappa-sama updated:
-
-
smuggler satchel cost 2->1
-
radio jammer cost 5->2
-
smuggler satchel uplink description now implies that persistence is disabled
-
-
lolman360 updated:
-
-
renameable necklace (accessory, attaches to suit) and ring (glove slot.)
-
custom rename is now 2048 characters? i think it's characters.
-
-
silicons updated:
-
-
You can now use anything as an emoji by doing :/obj/item/path/to/item:. This works for any /atom or subtype.
-
-
timothyteakettle updated:
-
-
syndicate agents now have access to mechanical aim enhancers which allow them to aim bullets to bounce off walls
-
ricochets work properly now for the bullets that support them
-
-
zeroisthebiggay updated:
-
-
hair and some sechuds
-
ce hardsuit radproofing
-
-
-
11 August 2020
-
Hatterhat updated:
-
-
PDA uplinks can now steal from pens. Properly. Just make sure to have a pen in your PDA, first.
-
-
kappa-sama updated:
-
-
tracer no longer gives you full stamheals per use
-
-
zeroisthebiggay updated:
-
-
volaju two
-
-
-
10 August 2020
-
Hatterhat updated:
-
-
Parry counterattack text now shows up.
-
Sterilized gauze is now better at stopping bleeding, and applies slightly faster. Very slightly faster.
-
Ointment and sutures now hold more in a stack (12 and 15, respectively).
-
Sterilized gauze can now be made by just pouring 10u sterilizine onto standard medical gauze, instead of having to craft it. Why you had to craft it, I will honestly never know.
-
Proto-kinetic glaives are more expensive, stagger/cooldown on failed parries increased slightly, perfect parries required for counterattack.
-
New item: Temporal Katana. 2 points for wizards, timestops upon successful parry, bokken quickparry stats (100 force on melee counter!).
-
Also you can *smirk. This has no mechanical effect, other than being smug.
+
Changed description of Necrotizing Fasciitis symptom.
+
Wormhole Projector and Gravity Gun now require anomaly cores to function instead of firing pins.
KeRSedChaplain updated:
-
Added a guide for romerol usage
-
made infectious zombies not enter softcrit and take no stamina damage
+
Resprited the brass claw
LetterN updated:
-
clocktheme color
-
Ports TGUI-4
-
-
Lynxless updated:
-
-
Ports TG #51879
-
-
Owai-Seek updated:
-
-
Meatballs now spawn raw from food processors.
-
-
Putnam3145 updated:
-
-
Ethereals
-
(Hexa)crocin
-
(Hexa)camphor
-
Tweaked wording for marking tickets IC issue.
-
Rerolling your traitor goals will ONLY give you "proper" objectives.
-
-
Seris02 updated:
-
-
borgs being able to select and use a module when it's too damaged
-
-
Sishen1542 updated:
-
-
gave chairs active block/parry in exchange for removal of block_chance
-
replaces box whiteship tbaton with truncheon
-
-
kappa-sama updated:
-
-
made the Dirty Magazines crate cost 4000 instead of 12000 credits
-
MODS I SPILLED MU JUICE HEJPPHRLP HELPJ JLEP HELP
-
-
silicons updated:
-
-
player made areas are no longer valid for malf hacking
-
default space levels is 4 again.
-
rats now swarm instead of stacking on one spot.
-
getting hit by an explosion will now barely hard knockdown, but will leave you somewhat winded.
-
-
timothyteakettle updated:
-
-
speech verbs copy through dna copying now
-
-
-
09 August 2020
-
Hatterhat updated:
-
-
Proto-kinetic glaives (not crushers) can parry now.
-
-
MrJWhit updated:
-
-
Adds a second shutter on the top of the hop line
-
-
silicons updated:
-
-
immovable rods no longer drop down chasms
-
fun removal: squeaking objects now have an 1 second cooldown between squeaks, and will have a 33% chance of interrupting any other squeaking object when Cross()ing, meaning no more ear-fuck conveyor belts.
-
-
-
08 August 2020
-
DeltaFire15 updated:
-
-
Roundstart cultists now start with a replica fabricator - no brass though, make your own.
-
Kindle cast time: 10 > 15, mute after stun end: 2 > 5, slur after mute end: 3 > 5
-
The ratvarian spear no longer adds negative vitality under very specific circumstances.
-
The Ratvarian Spear can parry now! Short parries with low leeway, but low cooldown.
-
The brass claw, a implant-based weapon which gains combo on consecutive hits against the same target.
-
The sigil of rites, a sigil used to perform various rites with a cost of power and materials
-
The Rite of Advancement: Used to add a organ or cyberimplant to a clockie without need for surgery.
-
The Rite of Woundmending: Used to heal all wounds on another cultist, causing toxins damage in return.
-
The Rite of the Claw: Used to summon a brass claw implant. Maximum of 4 uses per round.
-
-
Hatterhat updated:
-
-
You can now buy a toolbox's worth of Mosin-Nagant ammo for a fairly discounted price.
-
Revolvers from the dedicated kit now have reskinning capabilities.
-
You can now actually buy the riflery primer, which lets you pump shotguns and work the Mosin's bolt faster.
-
Bulldog slug magazines now have a unique sprite.
-
-
Ludox235 updated:
-
-
Removed an abductee objective that told you to remove all oxygen.
-
Added a new abductee objective to replace the removed one.
-
-
Sishen1542 updated:
-
-
🅱️oneless
-
squishy slime emotes
-
-
timothyteakettle updated:
-
-
heparin makes you bleed half as much now
-
cuts make you bleed 25% less now
-
more items in the loadout and loadout has subcategories now for easier searching
-
-
-
07 August 2020
-
dapnee updated:
-
-
fixed active tufs on some space ruins, murderdome VR, and a few on pubby, changed cargo autolathe to techfab, messed with pipe room leading to monastery.
-
-
lolman360 updated:
-
-
vendors are now unanchored when tipped. it just fell over it's not bolted to the ground anymore.
-
podpeople no fat when sunbathing.
-
-
silicons updated:
-
-
explosions only recurse one level into storage before dropping 1 level per storage layer.
-
volumetric storage is now minimum 16 pixels per item because 8 was ridiculous
-
shieldbash balanace --> balance
-
attempting to send too long of an emote will now reflect it back to you instead of cutting it off and discarding the overflow.
-
holoparasites can now play music
-
lethal blood now causes damaging bleeding instead of outright gibbing
-
-
-
06 August 2020
-
Auris456852 updated:
-
-
Added B.O.O.P. Remote Control cartridges to the PTech.
-
-
Hatterhat updated:
-
-
Proto-kinetic glaives! Essentially a proto-kinetic crusher with a different blade, handguard, and goliath hide grip. Expensive, but elegant.
-
Door charges no longer knock people out.
-
-
Ludox235 updated:
-
-
You can now buy damaged AI upload modules in the traitor's uplink.
-
-
Seris02 updated:
-
-
fixed ghost chilis
-
-
Trilbyspaceclone updated:
-
-
4 New blends of tea have been shipped to the station, and how to make them has been leaked!
-
-
b1tt3r1n0 updated:
-
-
Added the warp implant
-
-
dapnee updated:
-
-
added a hallway to telecoms for engineers to get there on meta
-
-
kappa-sama updated:
-
-
dildo circuit assemblies
-
-
lolman360 updated:
-
-
The Tendril-Mother on Lavaland has remembered how to make ashwalkers who know how to speak Draconic again.
-
-
timothyteakettle updated:
-
-
nanotrasen has decided to fire all disabled members of the security division and confiscate certain sentimental items from doctors
-
the custom tongue preference now passes through cloning so you spawn with your selected tongue
-
several changes to travelling traders so they look better and spawn slightly less often
-
-
zeroisthebiggay updated:
-
-
nukies can buy holoparasites
-
-
-
04 August 2020
-
Seris02 updated:
-
-
lizard spines
-
-
timothyteakettle updated:
-
-
due to further advancements in medical technology, you can now have holes poked into your body for fun and enjoyment
-
-
zeroisthebiggay updated:
-
-
prefs for headpat wagging
-
-
-
03 August 2020
-
KeRSedChaplain updated:
-
-
fixed clockwork guardians being able to reflect ranged weapons
entertainment monitors now light up and display text when motion is detected in thunderdome
+
lizard snouts are no longer *slightly* lighter than they are supposed to be.
-
dapnee updated:
+
MrJWhit updated:
-
active turfs on box and xenohive, maintenance bar APC not being stringed correctly, turned a monitor to face a direction that makes sense, changed tag of camera in gravgen being misnamed
+
Expanded space hermit base
+
Replaced engineering fuel tank with a large fuel tank
+
Changed access to sec suit storage from armory access in every map to other security access
+
Adds a space loop to every map in toxins
+
+
Added the ability for cargo to buy a large welding tank
+
Tweaked large tank reagent sprites to /tg/'s
+
Gives metastation toxins storage a scrubber and a vent
+
Updates suit storage info on Tip Of the Round.
+
Increased christmas event from 22th to 27th to 10th to 27th
+
Removes an opposum from the wall
+
Donut boxes show what's inside of them now
+
Updated meat icons
+
Canceling events gives more time to stop from 10 to 30
+
Fixes two chairs on one table
+
Removed the wires connecting the AI from the rest of the station on cogstation.
+
Fixes experimenter on cogstation.
+
Less pipes in the overall area in toxins on cogstation
+
Small fixes on security on boxstation
+
Updated jukebox sprite.
+
Fixes maint area in boxstation
+
Christmas starts on the 18th now
+
Adds a goose bar sign
+
Effects can no longer trigger landmines
+
Removes the screen flashing on climax.
+
Makes gas sensors fireproof.
+
A small bucket of random fixes,
+
Minor fixes to kilo
+
Porting garbage collection tweak from /tg/
+
Updates our dark gygax sprites to /tg/'s
+
Bugfix of a morph becoming an AI eye
+
Mining station oxygen locker on the cycling airlock starts out wrenched.
+
Nerf combat knife damage
+
Code improvement on ventcrawling
+
+
NT Cleaning Crews On Break updated:
+
+
Most kinds of dirt, grime, and debris are now persistent. Get to work, jannies.
+
Dirt can now be removed by tile replacements. Other cleanable decals can't, though.
+
+
Putnam3145 updated:
+
+
Replaces majority judgement with usual judgement.
+
Toilet loot spawners don't lag the server on server start with forced hard dels.
+
vore prefs save now
+
gear harness no longer magically covers up the body mechanically despite covering up nothing visually
+
Regen coma now puts into a coma even from crit or while unconscious.
+
Regen coma now properly weakens while asleep.
+
Multi-surgery unit test no longer fails at random.
+
Dwarf speech is no longer absolutely paranoid about word replacement.
+
Spontaneous brain trauma now requires minimum 5 players
+
Grab bag works as advertised.
+
Xeno threat in dynamic tripled.
+
Vote system #defines are now strings
+
Stat panel UI for ranked choice votes
+
A fallback for dynamic antag rolling that allows for it to just try between traitor, blood brothers, heretics, changeling, bloodsucker and devil until there are enough roundstart antags. This can also happen randomly anyway. Blood brothers and devil are disabled for now, but the code is there to enable them.
+
A new storyteller, "Grab Bag", that forces the above round type.
+
atmos subsystem no longer dies if there's too many gases
+
Emotes can properly be filtered for in TGUI.
+
Holofirelocks work now.
+
adminhelping no longer removes entire admin tab
+
end of round no longer removes entire admin tab
+
Fixed a runtime in every healing nanite program.
+
removed a unit test causing master to fail
+
Planetary atmos no longer does superconduction.
+
Dynamic vote no longer shows the none-storyteller.
+
You can now exit polycircuit input
+
Polycircuits now check for range
+
gear harness alt-click is now sane
+
rolldown() and toggle_jumpsuit_adjust() now no longer mix behavior-that-should-be-overridden and behavior-that-shouldn't-be-overridden in ways that make no sense.
+
Gear harness now covers nothing.
+
Chemical stuff now displays fermichem stuff properly
+
Rad collectors now get 1.25x as much energy from radiation
+
Rad collectors now put out 1.25x as much stored energy per tick
+
Above two rad collector changes give a total 56.25% power output increase
+
Zeolites now only generate 1/5 the heat when reacting and don't require a catalyst.
+
+
Ryll/Shaps updated:
+
+
Fixed an issue with player logs becoming confused when someone triggers multiple events within one second (like being attacked by two people at the same time) that would cause holes in the logs
+
+
SandPoot updated:
+
+
You can attack a pile of money on the floor with your id to put it all in quickly.
+
Changes the limb grower a lot.
+
"Limb" costs on limbgrower are actually displayed like it was meant to all along.
+
Swaps the gift static blacklist with a global list one.
+
+
SiliconMain updated:
+
+
Engi department has gas masks in loadout
+
hololocks (which haven't worked for god knows how long) commented out until auxmos is merged
+
+
Sonic121x updated:
+
+
alarm ert hardsuit sprite for naga and canine
+
adjust the naga ert hardsuit to cover the hand
+
cydonia hardsuit helmet
+
digi sprite uniform
+
digi leg suit
+
+
SpaceManiac updated:
+
+
Fixed the maphook
+
+
Thalpy updated:
+
+
fixes some bugs in jacqs code from edits to the codebase
+
+
The Grinch updated:
+
+
infinite presents from hilbert hotel
+
+
TheObserver updated:
+
+
Re-adds the rifle stock, and sets the improv shotgun to be as it was.
+
The maintenance rifle has been shelved - for now. Watch this space.
+
+
TheObserver-sys updated:
+
+
Drake? Where's the dead fairygrass sprite?
+
+
TheSpaghetti updated:
+
+
no more tumor bread double punctuation
+
+
Trilbyspaceclone updated:
+
+
Zeolites now use gold rather then uranium for catalyst
+
Zeolites are not as hard to make ph wise
+
Making Zeolites heats up the beaker less allowing for better control
+
ASP 9mm and M1911 can now have suppressers added
+
Brass welders are 50% faster at refueling
+
redoes self fueling welders in the code to be less speggie
+
the corporate unifoms can now be gotton in the clothing mate vender
+
+
TripleShades updated:
+
+
Firelock to Surgery Bay drapes change: Swapped Nanomed and Fire Alarm button locations in both Surgery Bays change: Removes the double mirror in both Surgery Bays to be a singular mirror change: Moved an intercom to not be doorstuck below Paramedical Office remove: One Surgery Observation Fire Alarm button
+
New Paramedic Office next to Genetics where the old Genetics Reception used to be change: Surgery, Surgery Observation, and Recovery Hall layout revamped drastically change: Maints below Surgery lowered by one tile to recover lost tile space from Surgery expansion
+
+
Tupinambis updated:
+
+
Arachnids (spider people) with limited night vision, flash vulnerability, and webbing.
+
+
Vynzill updated:
+
+
new gateway mission mapadd: jungleresort map
+
fixes high luminosity eyes
+
+
Xantholne updated:
+
+
Fixed new birds changing back to basic parrot when sitting
+
New parrots from the RP server, can be found in Bird Crate in Cargo
+
You can now tuck disky into bed
+
You can now make beds by applying a bed sheet to them
+
You can now tuck in pai cards into bed
+
Added bed tucking element, can be added to any held object to allow tucking into beds
+
Twin Sword Sheaths have an equipment icon and icon when worn now and make a sound when sheathed/unsheathed
+
+
Yakumo Chen updated:
+
+
Slime Jelly is no longer obtainable from slimepeople. Go ask Xenobio
+
+
YakumoChen updated:
+
+
To lower production costs, Buzz Fuzz is now manufactured with Real™️ Synthetic honey.
+
+
Zandario updated:
+
+
Added some framework for future species expansions, including clothing refitting.
+
Made majority of the relevant Species IDs and Categories pre-defined, also for easier expansion and use.
+
lum slime sprites work again
+
Slapped the Species Defines where relevant
+
+
corin9090 updated:
+
+
The chaplain's prayer beads can now be worn on your belt slot
+
+
kappa-sama updated:
+
+
super saiyan
+
ishotgun crafting recipe no longer requires plasteel and is slightly more convenient
+
ishotgun does 45 damage now instead of 40.5
+
s
+
A new spell for the wizard and his martial apprentices, the Inner Mantra technique. It makes you punch people really good and makes you durable, but drains your energy while it's active.
+
A self-buffing spell for valiant bubblegum slayers that is ultimately useless on lavaland and probably overpowered for miner antagonists. Go figure. At least all it does is let you punch hard while draining your health every second.
+
bubblegum now drops a book that makes you into an abusive father instead of a shotgun that plays like pre-nerf shotguns
+
a powerup and powerdown sound effect
+
two icons for two buff spells
+
+
keronshb updated:
+
+
Allows Energy Bola to be caught
+
This also allows them to be dropped/picked up.
+
Adds a reduced stamina buffer for SCarp users
+
Gives SCarp users a better parry
+
Adds the SCarp bundle which includes a bo staff
+
Lets Carp costumes carry Bo Staffs
+
reduces the stamina damage of scarp slightly
+
reduced the blockchance of the bo staff
+
Adds more room to northwest maint
+
Adds a bridge between Atmos and the Turbine.
+
Blob Resource Tower to 2 points per instead of 1 point per.
+
Blob Factory Towers can be placed 5 tiles apart instead of 7.
+
Fixes Blobbernaut Factories consuming Factories if no naut is chosen.
+
Fixes Reflective Blobs
+
Re-adds the Clown Car to the clown uplink
+
15 >16 TC cost
+
bonks on external airlocks
+
Fixes the parry data for scarp
+
+
kittycat2002 updated:
+
+
set the name of /datum/reagent/consumable/ethanol/species_drink to Species Drink
+
+
kiwedespars updated:
+
+
balanced bone gauntlets.
+
the robust dildo weapon now has sound.
+
+
necromanceranne updated:
+
+
Fixes various sprites for bokken, as well as being unable to craft certain parts and duplicate entries.
+
Bokken now come in two lengths; full and wakizashi, and two varieties: wood and ironwood. They have different stats for all four.
+
Bokken require menu crafting and part construction, as well as more complicated materials.
+
Bokken (long and short) require wood, cloth and leather to craft with a hatchet and screwdriver.
+
Ironwood bokken (long and short) require ironcap logs, cloth and leather to craft with a hatchet, screwdriver and welder.
+
Twin sheathes can only fit a pair of blades (longsword + shortsword) or they can fit two shortswords.
+
Fixed a twin sheath runtime.
+
A lot of bokken related sprites received an overhaul. Added overlay sprites for weapons sheathed in the twin sheathes.
+
The extradimensional blade received improved sprites for inhands/back sprites.
+
You can now make all the variants of the bokken.
+
Removes a duplicate sprite.
+
Renames all instances of 'ironwood' to 'steelwood'.
+
Adds new roboticist labcoat sprites!
+
+
qwertyquerty updated:
+
+
Flash the screen on climax
+
+
raspy-on-osu updated:
+
+
salicylic acid
+
space heater heating range and power
+
windoor open length
+
+
shellspeed1 updated:
+
+
Wings from Cit RP have been ported over
+
Moth wings from cit have been ported over
+
Cleaned up some pixels on existing moth wings.
+
Organized the lists for wings by if they are for moths or not and than by alphabetical.
+
Lings now have infinite space for DNA.
+
All xenomorph types have been added as corpses for mapping purposes
+
The dead xenomorphs in the lavaland xenomorph hive now have more variety.
+
Floor bots are now buildable with all toolboxes.
+
Xenomorph hybrids can now select wings ~~add: Xenomorph hybrids can now speak xenomorph~~
+
Xenomorph tongues are available for customization.
+
Mining borgs can claim points again
+
Construction bags have been added, use them to carry all sorts of construction bits.
+
A recipe has been added to cloth stacks to make material and construction bags.
+
Material bags and construction bags are now available in engineering lockers.
+
Adds the disposable sentry gun from tg for 11tc each.
+
The exofab can now print prosthetic limbs
+
The exofab was missing access to multiple cybernetic organs. This has now been rectified.
+
A new recipe for a spicy has been given to us by a strange business man.
+
The bluespace navigation gigabeacon design has been added to shuttle research for those wanting to take their ships around space more.
+
Xenomorph powers now list plasma cost in their description.
silicons updated:
-
shoves have been buffed to apply a status effect rather than a 0.85 movespeed modifier, meaning repeatedly shoving someone now renews the debuff
-
shoves now stagger for 3.5 seconds.
-
war operatives now actually time 20 minutes since roundstart to depart instead of 15.
-
explosive stand bombs can now be examined from any distance
-
explosive stand bombs are now a component.
+
nanite resistances tweaked
+
new nanite programs added for locking the user out from being modified by consoles or antivirals.
+
anomalies no longer spawn in walls
+
Twitch Plays: Clown Car
+
pugilists can now parry
+
c4 can no longer gib mobs
+
medium screens are better now
+
text formatting now uses one character instead of two around the text to emphasize.
+
colormates
+
shoving yourself up now costs 50% more
+
dullahans enabled
+
tailed individuals can now target groin to intertwine tails on grab intent.
+
Clowns now have unpredictable effects on supermatter crystals when dusting from contact.
+
anyone new to the server is lucky enough to have their sprint default to toggle instead of hold
+
stamina crit is only removed when at or under 100 stamina, rather than 140. stamina crit threshold is still at 140.
+
luxury shuttle no longer has noteleport
+
now only poly gets a headset on spawn, not all birds.
+
the warp implant now actually warps you back 10 seconds. leaves a trail, though. now unlimited us.
+
things in DEATHCOMA do not deathgasp on death
+
Meth and changeling adrenals no longer ignore all slowdowns, rather damage slowdowns.
+
you can now be an angel using a magic mirror again
+
command headsets are 120% instead of 160%
+
no more emote italics
+
players can now respawn/return to lobby as a ghost after a 15 minute (default) delay and rejoin on another character with some/many restrictions
+
cryo now preserves everything
+
Magrifle ammo no longer glows.
+
temperature slowdown divisor nerfed to 35 from 20.
+
dna melt drops all items being destroying you
+
keybinds generate anti-collision bindings where necessary automatically now
+
changeling combat mutations rebalanced. most of them take chemicals to upkeep now.
+
set-pose has been added
+
temporary flavor text renamed to set pose, fully visible in examine
+
ninja gloves no longer hardstun
+
ninja gloves now cost half as much to use to compensate
+
simple mobs are now immune to radioactive contamination
+
+
timothyteakettle updated:
+
+
time for memory loss message to show up when being revived is now correctly 300 seconds, instead of 30
+
the load away mission verb won't crash the server now
+
roundstart slimes can turn into puddles now
+
all gas masks (but welding + glass) can be alt clicked to show/hide identity
+
autosurgeons from travelling trader rewards now only have one use
+
fixes held items proccing crossed when passing someone
+
you can now get a family heirlooms based off your species instead of job
+
changeling stings retract upon turning into a slime puddle
+
you cannot transform into a slime puddle with a no drop item in your hands
+
slime puddles are now transparent and their colour looks more natural in comparison to the user
+
slime puddles are now even slower
+
slime puddles now get no protection from worn clothing
+
removes two debug messages left in from my prior eye customization pr
+
adds unlockable loadout items, corresponding category in loadouts, etc
+
added in-game age verification as an alternative to access requests
+
disabling adminhelp noises no longer disables looc
+
apids render now
+
you can now only entwine tails with people who have a tail
+
custom eyes and tongues now properly carry across cloning
+
re-adds the holoform verb for people who want to use it over going through the char list
+
eye sprites should look normal once more
+
licking people washes pie off their face
+
you can now pick your eye sprites from customization
+
looking at loadout equips loadout items on your preview image instead of job items
+
custom holoforms are now accessible through an action instead of through verbs
+
AI holoforms can now emote
+
cloning now correctly copies your blood colour, body sprite type and eye type
+
species with NOTRANSSTING cannot have envy's knife used on them
+
avian/digitigrade legs have been added for slimes
+
you can teleport bread
+
slime puddles are no longer layered down one layer
+
you cannot tackle with two paralysed arms
+
tackling with a single paralysed arm lowers your tackle roll by 2
+
circuits get pin data proc is sanitized when text is returned as data
+
loadout now has save slot support and colour choosing/saving for polychromic items
+
polychromic maid outfit
+
you can rebind communication hotkeys and they're the default now
+
you can now customize your size from 90% to 130%, going below 100% makes you have 10 less max health
+
*squeak
+
anthromorphic synth species
+
improvements to the automatic age gate
+
antag items are now of critical importance and wont fail to be placed on the character
+
a tonne of fixes to colourisation of parts, too many to name, including some sprite fixes
+
things now have their own individual primary/(secondary)/(tertiary) colours as required, and these can be modified by you
+
+
uomo91 updated:
+
+
Fixed "Show All" tab in player panel logs being broken.
+
Whispers, OOC, and various other things display differently in logs, visually distinguishing them from say logs.
+
Player panel logs will now show all logs chronologically, so you'll see commingled say and attack logs if you're on the "Show All" tab, etc...
+
+
yorii updated:
+
+
fixed botany rounding error that caused grass and other plants to misbehave
+
+
zeroisthebiggay updated:
+
+
legion now drops chests
+
Traitor assistants can now purchase the patented POGBox! Put TC into it for even higher damage!
+
MEGAFAUNA DROPS ARE LAVAPROOF
+
cool codex cicatrix inhands
+
gravitokinetic stands from tg
+
buffs stands overall
+
protector stands no longer become tposing invisible apes sometimes
+
jacqueline spawns on boxstation
+
secsheath for your cool stunsword at your local security vendor. you gotta hack it first though.
+
fuck the r*d cr*ss
+
The legion megafauna has been reworked. The fight should now be both slightly harder and faster.
+
You can no longer cheese the colossus by being a sand golem and simply being immune.
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 99ffc455c3..2f7e30ae28 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -27524,3 +27524,863 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: limb id entry in mutant bodyparts now supports switching to/from species
with gendered body parts
- tweak: the minimum brightness of mutant parts is now a define
+2021-01-21:
+ Acer202:
+ - bugfix: Main mining shuttle should no longer look at the public mining shuttle
+ and attempt to dock ontop of it. Monastery shuttle should now function again.
+ Acer202, with minor help from The0bserver:
+ - rscadd: After internal deliberation, CentCom has decided to run a limited reinstatement
+ of public mining shuttles for use in more tried and true station classes. CentCom
+ would like to remind you that this privilege is easily revoked, and that abuse
+ may result in immediate detonation.
+ - rscadd: Restores the mining shuttle on Pubby, Box, Delta, Meta, and Lambda Station.
+ ArcaneMusic, The0bserver-sys:
+ - rscadd: 'New from Hydrowear LLC: The Botanical Belt! This handy yellow belt lets
+ you hold most of your botany gear, and a few beakers for reduced bag and floor
+ clutter!'
+ - tweak: Gives Hydrotrays plumbing pipes automatically, allowing you to make a self
+ sustaining tray via plumbing.
+ - tweak: Gives Service access to Bluespace Beakers, at last, gives Cargo, Science,
+ and Medical the ability to construct reinforced plungers for use on lavaland.
+ ArchieBeepBoop:
+ - rscadd: Upgraded Advanced RTG Machine Preset
+ - bugfix: Outlet Injector Mapping Asset Layer Fix
+ - bugfix: Jacqueen and the Christmas tree should no longer spawn abstract things
+ that can cause shittons of runtimes.
+ Arturlang:
+ - bugfix: You can't tackle in nograv anymore
+ - tweak: You cannot spam drink from blood bags anymore
+ - bugfix: Blood bag drinking inefficiency is now the right way, so you loose some
+ of the blood drinking it straight
+ - bugfix: Handles more edge cases with construct soul returning
+ - tweak: Being sacrificed by the cult no longer removes all hope of rescue.
+ - bugfix: Makes construct mind returning more robust
+ - tweak: Prayers to admins now do a wee ding sound for all prayers, instead of just
+ chaplains
+ - bugfix: Fixes the mint machine's UI
+ - bugfix: Hopefully fixes whitescreen issues for TGUI UI's by giving assets more
+ time to get to the client
+ - bugfix: Fixes hijack implant APC UI, again
+ - code_imp: Comments out spaceman dmm do not sleeps for mob/proc/CommonClickOn,
+ atom/proc/attack_hand, datum/proc/keyLoop and mob/living/proc/Life
+ - bugfix: Bloodsuckers tresspass ability can no longer work while they are not awake.
+ - tweak: The cursed heart now only takes away half as much blood every loop, and
+ can be used as long as you are alive, instead if only you are awake/able to
+ use your hands
+ Bhijn:
+ - tweak: Changeling loudness is now determined as an average of all their abilities,
+ rather than the sum
+ - tweak: To compensate for this, blood tests now require a loudness value of 1 or
+ higher to detect ling blood. Additionally, blood test explosions are now triggered
+ only when the loudness value is higher than 2.
+ BlackMajor:
+ - tweak: Cyborg hypospray no longer injects if it means OD'ing while on help intent.
+ BlueWildrose:
+ - tweak: Nyctophobia quirk now has some light lag compensation.
+ - bugfix: Fixes cloning computer UI not updating when pressing certain buttons -
+ also adds extra check for names to update a message
+ - rscdel: Removes oversized genitalia analysis from medical scanners, since huge
+ dick and titty are no longer a problem anymore thanks to advancements in that
+ kind of technology when it comes to chemical fun times growth.
+ - bugfix: Fixed species-specific drinks not giving a mood boost if you are that
+ species.
+ - tweak: You will now only unbuckle fireman-carried/piggybacked people on disarm
+ or harm intent.
+ - balance: The traitor AI can no longer activate the doomsday device while carded.
+ - bugfix: Fixes noodle size appearance for 12+ inch members.
+ - bugfix: Fixed the subtle hotkey being weird with its input prompts.
+ - rscadd: Adds a subtler anti-ghost hotkey. Default key is 6.
+ - tweak: No more straining when your cock or breasts are growing via incubus draft
+ or succubus milk.
+ - rscadd: PubbyStation now has two Christmas Tree spawners.
+ - tweak: You can now have a max-roundstart-dicksize-config inch long johnson before
+ you start suffering blood loss and slowdowns instead of a 20 inch one.
+ - rscadd: Color Mates have been added to all stations (except Snaxi). Enjoy coloring
+ your attire without having to bug science!
+ - bugfix: Polychromic hoodies that were obtained from the loadout have functional
+ colorable hoods now.
+ - rscadd: Adds in timid woman/man costumes. Available at your autodrobe! Also adds
+ in garters as some new socks.
+ - spellcheck: Corrected the capitalization in gasmask concealment examine text
+ Chiirno:
+ - rscadd: Added the paramedics EVA suit as a purchase from the cargo console.
+ - rscadd: Paramedics office and Surgery Storage Room
+ - tweak: Remodeled the surgery room, as well as shrunk Morgue and Starboard Emergency
+ Storage. Fiddled with some areas for better map edit clarity and fixed one runtime
+ in Vacant Office A.
+ - imageadd: Added the paramedic closet sprite, a paramedic colored medical3 closet.
+ - code_imp: Added a paramedic closet, which is the standard medical3 closet with
+ their suit, a pinpointer, and a crew monitor added.
+ - tweak: Nightmare now deals additional damage to most light sources.
+ - bugfix: Nightmare now one-shots miners beacons and glowshrooms
+ - bugfix: Portable Chem Mixer now researchable from biotech node.
+ - tweak: Chem masters can now dispense 20 instances of its outputs instead of 10.
+ Delams-The-SM:
+ - rscadd: Added 3 new emotes *hiss *purr *meow
+ - soundadd: ported sounds from Citadel RP for *purr and *meow
+ - bugfix: fixed randomization of colors for things like mulligan and Stabilized
+ green slime extract for matrixed body parts
+ DeltaFire15:
+ - balance: Biomechanical (hybrid) bodyparts now have access to wound-fixing surgeries.
+ - tweak: A wound being fixed no longer just qdel()s surgeries connected to it.
+ - tweak: Some robotic surgery steps are now a bit more clear.
+ - bugfix: Organs no longer get fed to people after successfully being inserted into
+ them.
+ - tweak: Not completing the do_after of a surgery no longer causes you to attack
+ the target with whatever you were holding.
+ - rscadd: IPC cells & power cords are now printable after they are researched.
+ - rscadd: A new surgery, allowing revival of synths without a defib at hand.
+ - balance: 'Semi-permanent damage of Synth limbs caused by passing the damage threshold:
+ 10 <- 15.'
+ - tweak: The embed removal surgery now has a version for Synths.
+ - balance: EMPs no longer hardstun Synths.
+ - bugfix: Portals no longer runtime because of incorrect args.
+ - tweak: Abductors now can use experimental organ replacement surgery on robots
+ / synthetics.
+ - bugfix: Fixes a minor incorrectness in ratvarian borg slabs (ratvar_act -> ui_act)
+ - bugfix: Changelings no longer double-deathgasp when activating the regen stasis
+ ability while not dead.
+ - bugfix: People installing KA modkits in miner borgs is no longer broken.
+ - bugfix: Fixes the tail entwine messages displaying incorrectly.
+ - bugfix: Antagging / Deantagging Heretics now properly sets their special role.
+ - bugfix: The borg VTEC ability now actually gets removed when the upgrade is removed.
+ - bugfix: Supplypods shouldn't cause runtimes anymore, and shrapnel (pelletclouds)
+ should work for them.
+ - rscadd: Robots (anyone with the robotic_organism trait) have toxins damage replaced
+ with system corruption. See the PR for details.
+ - code_imp: Clockwork rites now support hiding specific rites from neutered servants.
+ - tweak: AIs now only have to kill people once instead of permanently.
+ - bugfix: Scripture no longer sometimes eats part of its invocation.
+ - balance: APCs and silicons are now more susceptible to powerdrains (by the power_drain()
+ proc, which is rare)
+ - balance: Void Volt has been modified from a chant to a singular pulse.
+ - balance: Robotpeople are now fully immune to the effects of alcohol (drunkness
+ etc.)
+ - tweak: Renames the alcohol intolerance trait in the code to make what it does
+ more clear.
+ - bugfix: Self-fueling weldingtools recharge fuel properly again.
+ - bugfix: Brass welders now actually recharge faster than experimental ones.
+ - bugfix: Repeatable surgery steps can no longer cause an infinite loop if not completing
+ the do_after
+ - bugfix: The Revenant self-revive ability is no longer broken.
+ - bugfix: Loot items mobs drop are no longer always failing to initialize.
+ - tweak: Instant summons can no longer do wacky stuff with disposals (and nukes).
+ - bugfix: Objectives are no longer very broken.
+ - bugfix: Bloodcult stunhands now work against clockies like they were supposed
+ to instead of hardstunning.
+ - balance: zeolites are now actual fermichems instead of being incredibly easy to
+ make.
+ - bugfix: Using syringes / droppers on chem heaters with beakers in them works again.
+ - bugfix: Some edge cases causing issues with system corruption shouldn't be able
+ to occur anymore.
+ - bugfix: Cyborg B.o.r.i.s. installation now checks for if the chest has a cell,
+ just like how it does with MMIs.
+ - bugfix: The 'Your body is in a cloner' notification works again
+ - bugfix: Hijack implants should work properly again (or, at least better)
+ - bugfix: Liches are now good skeletons again instead of weak ones
+ - bugfix: The piratepad control cannot be destroyed again.
+ - bugfix: Pirates have received new supplies of jetpacks instead of useless oxygen
+ tanks
+ - bugfix: Ratvarian AIs are once again able to show their linked borgs Ratvar's
+ light
+ - bugfix: Hijackers are once again unable to detonate borgs without being adjacent
+ to the console
+ - bugfix: Automated annoucement systems and gulag ore consoles no longer waste emag
+ charges
+ - bugfix: Automated announcement systems once again can be remote controlled by
+ non-AIs with silicon access
+ - bugfix: APCs being hijacked multiple times at once is no longer possible, preventing
+ some issues
+ - bugfix: Recharging APCs no longer use 0.2% of the power they should be using.
+ - bugfix: APCs no longer always use as much power as they can for their cell, even
+ if it is full.
+ - bugfix: Vampire shapeshifting should now behave as intended
+ - balance: Some synth damage stuff has been a bit rebalanced, see the PR for details.
+ - rscadd: Nanogel, available at medical and robotics, which fixes internal damage
+ in sufficiently repaired robotic limbs.
+ - balance: Robotic Limbs now each have their own damage threshhold values
+ - balance: Robotic Limb damage threshholds are now seperated into threshhold itself
+ and mindamage when passed balance; Hybrid limbs can now be injected with hypos,
+ but not sprayed (Still not healed by chems)
+ - tweak: Brain surgery has been tweaked back to allowing robotic limbs, blacklisting
+ IPC brains instead.
+ - tweak: Robot brain surgery can now be used on organic heads, if there is a IPC
+ brain in them somehow.
+ - tweak: The robot limb heal surgery can now be used even if the target's torso
+ is not robotic, as long as they have robotic limbs
+ - refactor: BODYPART_ROBOTIC / BODYPART_ORGANIC checks replaced with helper-procs
+ whereever possible.
+ - code_imp: Added a BODYPART_HYBRID define for robotic bodyparts that behave organic
+ in some regards.
+ - bugfix: The transmission sigil power drain works now
+ - bugfix: A certain lizard (totally not me) being stupid is no longer going to break
+ regenerate_bodyparts
+ - bugfix: Combat mode now will not stay permanently disabled due to status effects
+ not working as intended.
+ - bugfix: Attacking some certain objects no longer has no clickdelay.
+ - bugfix: the blacksmithing skill now works properly
+ - tweak: Anvils cannot be interacted with with hammers whilst they are already being
+ used
+ - tweak: If someone has no gloves when interacting with heated ingots, they no longer
+ ignore their effects.
+ - bugfix: A runtime caused by hallucinations is gone.
+ - bugfix: Cargo packs marked as 'no private buying' now actually register as such.
+ - balance: Fleshmend, Anatomic Panacea and bloodsucker healing now work for Synths
+ / IPCs.
+ - tweak: Medibots now ignore people they cannot help due to their biology.
+ - bugfix: get_damaged_bodyparts() is no longer broken.
+ - bugfix: Your target cryoing will no longer give you a free greentext.
+ - bugfix: Sleeper UI interactiveness now behaves correctly.
+ Detective-Google:
+ - rscadd: arcade carpet
+ - rscadd: explosions now get broadcasted to deadchat.
+ - rscadd: Lick radial
+ - bugfix: Hilbert's jukebox works
+ - bugfix: arcade carpets now actually work
+ - tweak: the snow taxi is no longer the slow taxi
+ ERP mains:
+ - rscadd: Subtler Around Table is now a verb
+ EdgeLordExe, MoonFalcon:
+ - balance: Ported a bunch of heretic-related tweaks and changes from tg
+ EmeraldSundisk:
+ - rscadd: Adds a few new area designations primarily for CogStation, incorporates
+ them into said map
+ - tweak: Reorganizes some area designations for ease of use, along with renaming
+ the central "Router" to "Routing Depot"
+ - bugfix: Fixes an incorrectly designated area in CogStation
+ - bugfix: Changes the area designations to be not varedited since the code didn't
+ like that anymore
+ - bugfix: The cargo bay conveyor belts not only work with the shuttle now but go
+ in the right direction to boot
+ - tweak: Slight visual adjustments to cargo in light of this
+ - rscadd: The arcade's got RAD carpet now
+ - bugfix: Fixes the conveyor belt issues in Delta Station's cargo wing
+ - rscdel: Removes some of the dirt around the affected area (presumably they would
+ have cleaned it up while working on it)
+ - rscadd: Adds a floor light to fix the "dark spot" cargo had
+ - rscadd: Adds a new "Computer Core" area designation for CogStation
+ - bugfix: Fixes some missing area strings
+ - tweak: Replaces some firelocks with directional ones as to ensure desks/counters
+ can still be accessed
+ - balance: The "Skelter ruin" now has stechkins as opposed to M1911s
+ - tweak: Skelter's decorative bullet casings replaced to factor in the change in
+ caliber
+ - rscadd: Skelter now has a combat knife and fluff note
+ Ghommie:
+ - bugfix: You can access the mime / clown mask skins radial menu once again.
+ - bugfix: Dice bags no longer act like cardboard boxes.
+ - bugfix: Abductors should be no longer mute.
+ - bugfix: Item action buttons should now properly show the item current overlays,
+ most times.
+ - bugfix: The blackbox should now go into your hand slot when pried out, rather
+ than tumbling on the ground everytime.
+ - tweak: The Quick Equip hotkey is now usable by all living mobs (so long they have
+ hands and equipment slots)
+ Ghommie, porting PRs by MMMiracles and pireamaineach, credits to BlueWildrose too.:
+ - rscadd: You can now draw on plasmaman helmets with a crayon to turn their frown
+ upside-down.
+ - balance: Plasmaman helmets no longer hide your identity when worn by themselves.
+ - balance: Plasmaman helmets now have welding visors, which can't stack with their
+ torches in the helmet and are visible.
+ Hatterhat:
+ - rscadd: Energy sabre reskin for the energy sword - access via alt-click.
+ - bugfix: Alt-click reskins are fixed.
+ - tweak: Defibrillators and their many, many overlays were moved to another .dmi.
+ - tweak: You can now change the color of an energy sword via multitool. Not deswords.
+ Yet.
+ - imageadd: The Syndicate appear to be issuing new revolver variants.
+ - rscadd: Basic sticky technology is now a roundstart tech. Advanced sticky technology
+ is BEPIS-locked, though. Theoretically.
+ - tweak: Non-smithed katanas (including the temporal katana) can now fit in the
+ twin sheath.
+ - tweak: Cotton and durathread processing by hand now acts like grass. Stand on
+ a pile of cotton (or durathread) and use a single bundle from it.
+ - spellcheck: Utility uniforms now comply with the "nonproper equipment names" thing.
+ - bugfix: The CapDrobe now allows the captain to get his own clothes for free. Probably.
+ - tweak: All captains' clothes now offer 15 woundarmor, up from the 5. Because apparently
+ only the suit and tie and its suitskirt subtype have this wound armor, which
+ is dumb.
+ - rscadd: The nature interaction shuttle with the monkeys now has tiny fans on the
+ airlocks in, because that's apparently a feature that was missing.
+ - rscadd: More bags have been added to department vendors.
+ - balance: Every roundstart species (and also ash walkers) now has flesh and bone
+ that can be wounded.
+ - balance: Recipes for sutures, regen mesh, and sterilized gauze have been adjusted
+ to be easier, mostly.
+ - balance: Sterilized gauze is better at absorbing blood and being a splint.
+ - bugfix: Energy sabres now have an off inhand.
+ - balance: The bone gauntlets should be slightly less murderously punchy on the
+ fast punches mode.
+ - tweak: RPEDs now drop their lowest part tier first when quick-emptied (used inhand).
+ - tweak: Improvised gauzes can now be crafted in stacks up to 10, like their maximum
+ stacksize implies they should be capable of doing.
+ - bugfix: Pouring sterilizine on gauze now takes the proper 5u per sterilized gauze
+ instead of 10u.
+ - bugfix: Cryogenics now screams on common again when your fuckbuddy heads out.
+ - rscadd: Survival daggers! A slightly more expensive survival knife that comes
+ with a brighter flashlight. On the blade.
+ - tweak: Luxury pod capsules look different from normal capsules.
+ - rscadd: The wastes of Lavaland and the icy caverns of Snow Taxi rumble in unison.
+ - tweak: Exosuits sold on the Supply shuttle no longer leave wreckages.
+ - rscdel: Apparently, shrink rays were buyable again, despite a PR having been made
+ a while ago specifically for removing shrink rays. They're gone again.
+ - rscadd: Changeling bone gauntlets! They punch the shit out of people really good.
+ - tweak: Guerilla gloves and gorilla gloves inherit the strip modifiers of their
+ predecessors, because apparently they had those.
+ - balance: Pugilists now always hit the targeted limb and never miss.
+ - rscadd: The dock-silver standard set by Box and Meta has been enforced across
+ maps in rotation (Delta, Pubby, Lambda).
+ - bugfix: The Box whiteship now has its missing tiny fan back.
+ - bugfix: The survival dagger light on the sprite now actually turns on and off.
+ - balance: The survival dagger in the glaive kit that can also be bought by itself
+ is now better at butchering things.
+ HeroWithYay:
+ - bugfix: Changed description of Necrotizing Fasciitis symptom.
+ - tweak: Wormhole Projector and Gravity Gun now require anomaly cores to function
+ instead of firing pins.
+ KeRSedChaplain:
+ - imageadd: Resprited the brass claw
+ LetterN:
+ - rscadd: 2 more ways to get up from z1
+ - tweak: tweaked the z2 garden to be less blank
+ - bugfix: fixed telecomms pda log
+ - rscadd: Coin & Holochip support for slot machine
+ - admin: Stickybans are now saved in the DB too
+ - soundadd: Immersive ™ audio reverbs. (also adds multiz audio)
+ - code_imp: Semi-hardsync from TG
+ - code_imp: Updates rust-g
+ - code_imp: Uses git CI instead of travis/appveyor now
+ - code_imp: Updates git and build tests.
+ - bugfix: minimap text
+ - code_imp: ports cinematic upgrades
+ Linzolle:
+ - bugfix: entertainment monitors no longer invisible
+ - rscadd: entertainment monitors now light up and display text when motion is detected
+ in thunderdome
+ - bugfix: lizard snouts are no longer *slightly* lighter than they are supposed
+ to be.
+ MrJWhit:
+ - rscadd: Expanded space hermit base
+ - tweak: Replaced engineering fuel tank with a large fuel tank
+ - tweak: Changed access to sec suit storage from armory access in every map to other
+ security access
+ - rscadd: Adds a space loop to every map in toxins
+ - rscadd: ''
+ - tweak: Added the ability for cargo to buy a large welding tank
+ - imageadd: Tweaked large tank reagent sprites to /tg/'s
+ - tweak: Gives metastation toxins storage a scrubber and a vent
+ - tweak: Updates suit storage info on Tip Of the Round.
+ - tweak: Increased christmas event from 22th to 27th to 10th to 27th
+ - tweak: Removes an opposum from the wall
+ - tweak: Donut boxes show what's inside of them now
+ - tweak: Updated meat icons
+ - admin: Canceling events gives more time to stop from 10 to 30
+ - tweak: Fixes two chairs on one table
+ - tweak: Removed the wires connecting the AI from the rest of the station on cogstation.
+ - tweak: Fixes experimenter on cogstation.
+ - tweak: Less pipes in the overall area in toxins on cogstation
+ - tweak: Small fixes on security on boxstation
+ - tweak: Updated jukebox sprite.
+ - tweak: Fixes maint area in boxstation
+ - tweak: Christmas starts on the 18th now
+ - rscadd: Adds a goose bar sign
+ - bugfix: Effects can no longer trigger landmines
+ - rscdel: Removes the screen flashing on climax.
+ - rscadd: Makes gas sensors fireproof.
+ - tweak: A small bucket of random fixes,
+ - tweak: Minor fixes to kilo
+ - tweak: Porting garbage collection tweak from /tg/
+ - tweak: Updates our dark gygax sprites to /tg/'s
+ - tweak: Bugfix of a morph becoming an AI eye
+ - tweak: Mining station oxygen locker on the cycling airlock starts out wrenched.
+ - balance: Nerf combat knife damage
+ - bugfix: Code improvement on ventcrawling
+ NT Cleaning Crews On Break:
+ - rscadd: Most kinds of dirt, grime, and debris are now persistent. Get to work,
+ jannies.
+ - rscadd: Dirt can now be removed by tile replacements. Other cleanable decals can't,
+ though.
+ Putnam3145:
+ - tweak: Replaces majority judgement with usual judgement.
+ - bugfix: Toilet loot spawners don't lag the server on server start with forced
+ hard dels.
+ - bugfix: vore prefs save now
+ - tweak: gear harness no longer magically covers up the body mechanically despite
+ covering up nothing visually
+ - balance: Regen coma now puts into a coma even from crit or while unconscious.
+ - bugfix: Regen coma now properly weakens while asleep.
+ - bugfix: Multi-surgery unit test no longer fails at random.
+ - refactor: Dwarf speech is no longer absolutely paranoid about word replacement.
+ - balance: Spontaneous brain trauma now requires minimum 5 players
+ - tweak: Grab bag works as advertised.
+ - balance: Xeno threat in dynamic tripled.
+ - code_imp: 'Vote system #defines are now strings'
+ - rscadd: Stat panel UI for ranked choice votes
+ - rscadd: A fallback for dynamic antag rolling that allows for it to just try between
+ traitor, blood brothers, heretics, changeling, bloodsucker and devil until there
+ are enough roundstart antags. This can also happen randomly anyway. Blood brothers
+ and devil are disabled for now, but the code is there to enable them.
+ - rscadd: A new storyteller, "Grab Bag", that forces the above round type.
+ - bugfix: atmos subsystem no longer dies if there's too many gases
+ - bugfix: Emotes can properly be filtered for in TGUI.
+ - bugfix: Holofirelocks work now.
+ - bugfix: adminhelping no longer removes entire admin tab
+ - bugfix: end of round no longer removes entire admin tab
+ - bugfix: Fixed a runtime in every healing nanite program.
+ - bugfix: removed a unit test causing master to fail
+ - tweak: Planetary atmos no longer does superconduction.
+ - bugfix: Dynamic vote no longer shows the none-storyteller.
+ - tweak: You can now exit polycircuit input
+ - bugfix: Polycircuits now check for range
+ - bugfix: gear harness alt-click is now sane
+ - code_imp: rolldown() and toggle_jumpsuit_adjust() now no longer mix behavior-that-should-be-overridden
+ and behavior-that-shouldn't-be-overridden in ways that make no sense.
+ - tweak: Gear harness now covers nothing.
+ - bugfix: Chemical stuff now displays fermichem stuff properly
+ - balance: Rad collectors now get 1.25x as much energy from radiation
+ - balance: Rad collectors now put out 1.25x as much stored energy per tick
+ - balance: Above two rad collector changes give a total 56.25% power output increase
+ - balance: Zeolites now only generate 1/5 the heat when reacting and don't require
+ a catalyst.
+ Ryll/Shaps:
+ - admin: Fixed an issue with player logs becoming confused when someone triggers
+ multiple events within one second (like being attacked by two people at the
+ same time) that would cause holes in the logs
+ SandPoot:
+ - tweak: You can attack a pile of money on the floor with your id to put it all
+ in quickly.
+ - refactor: Changes the limb grower a lot.
+ - bugfix: '"Limb" costs on limbgrower are actually displayed like it was meant to
+ all along.'
+ - code_imp: Swaps the gift static blacklist with a global list one.
+ SiliconMain:
+ - tweak: Engi department has gas masks in loadout
+ - tweak: hololocks (which haven't worked for god knows how long) commented out until
+ auxmos is merged
+ Sonic121x:
+ - rscadd: alarm ert hardsuit sprite for naga and canine
+ - tweak: adjust the naga ert hardsuit to cover the hand
+ - bugfix: cydonia hardsuit helmet
+ - rscadd: digi sprite uniform
+ - bugfix: digi leg suit
+ SpaceManiac:
+ - bugfix: Fixed the maphook
+ Thalpy:
+ - bugfix: fixes some bugs in jacqs code from edits to the codebase
+ The Grinch:
+ - rscdel: infinite presents from hilbert hotel
+ TheObserver:
+ - rscadd: Re-adds the rifle stock, and sets the improv shotgun to be as it was.
+ - rscdel: The maintenance rifle has been shelved - for now. Watch this space.
+ TheObserver-sys:
+ - bugfix: Drake? Where's the dead fairygrass sprite?
+ TheSpaghetti:
+ - bugfix: no more tumor bread double punctuation
+ Trilbyspaceclone:
+ - tweak: Zeolites now use gold rather then uranium for catalyst
+ - tweak: Zeolites are not as hard to make ph wise
+ - tweak: Making Zeolites heats up the beaker less allowing for better control
+ - tweak: ASP 9mm and M1911 can now have suppressers added
+ - balance: Brass welders are 50% faster at refueling
+ - code_imp: redoes self fueling welders in the code to be less speggie
+ - rscadd: the corporate unifoms can now be gotton in the clothing mate vender
+ TripleShades:
+ - rscadd: 'Firelock to Surgery Bay drapes change: Swapped Nanomed and Fire Alarm
+ button locations in both Surgery Bays change: Removes the double mirror in both
+ Surgery Bays to be a singular mirror change: Moved an intercom to not be doorstuck
+ below Paramedical Office remove: One Surgery Observation Fire Alarm button'
+ - rscadd: 'New Paramedic Office next to Genetics where the old Genetics Reception
+ used to be change: Surgery, Surgery Observation, and Recovery Hall layout revamped
+ drastically change: Maints below Surgery lowered by one tile to recover lost
+ tile space from Surgery expansion'
+ Tupinambis:
+ - rscadd: Arachnids (spider people) with limited night vision, flash vulnerability,
+ and webbing.
+ Vynzill:
+ - rscadd: 'new gateway mission mapadd: jungleresort map'
+ - bugfix: fixes high luminosity eyes
+ Xantholne:
+ - bugfix: Fixed new birds changing back to basic parrot when sitting
+ - rscadd: New parrots from the RP server, can be found in Bird Crate in Cargo
+ - rscadd: You can now tuck disky into bed
+ - rscadd: You can now make beds by applying a bed sheet to them
+ - rscadd: You can now tuck in pai cards into bed
+ - rscadd: Added bed tucking element, can be added to any held object to allow tucking
+ into beds
+ - bugfix: Twin Sword Sheaths have an equipment icon and icon when worn now and make
+ a sound when sheathed/unsheathed
+ Yakumo Chen:
+ - balance: Slime Jelly is no longer obtainable from slimepeople. Go ask Xenobio
+ YakumoChen:
+ - balance: "To lower production costs, Buzz Fuzz is now manufactured with Real\u2122\
+ \uFE0F Synthetic honey."
+ Zandario:
+ - code_imp: Added some framework for future species expansions, including clothing
+ refitting.
+ - refactor: Made majority of the relevant Species IDs and Categories pre-defined,
+ also for easier expansion and use.
+ - bugfix: lum slime sprites work again
+ - code_imp: Slapped the Species Defines where relevant
+ corin9090:
+ - tweak: The chaplain's prayer beads can now be worn on your belt slot
+ kappa-sama:
+ - bugfix: super saiyan
+ - tweak: ishotgun crafting recipe no longer requires plasteel and is slightly more
+ convenient
+ - balance: ishotgun does 45 damage now instead of 40.5
+ - rscadd: s
+ - tweak: s
+ - balance: s
+ - bugfix: s
+ - rscadd: A new spell for the wizard and his martial apprentices, the Inner Mantra
+ technique. It makes you punch people really good and makes you durable, but
+ drains your energy while it's active.
+ - rscadd: A self-buffing spell for valiant bubblegum slayers that is ultimately
+ useless on lavaland and probably overpowered for miner antagonists. Go figure.
+ At least all it does is let you punch hard while draining your health every
+ second.
+ - balance: bubblegum now drops a book that makes you into an abusive father instead
+ of a shotgun that plays like pre-nerf shotguns
+ - soundadd: a powerup and powerdown sound effect
+ - imageadd: two icons for two buff spells
+ keronshb:
+ - bugfix: Allows Energy Bola to be caught
+ - balance: This also allows them to be dropped/picked up.
+ - rscadd: Adds a reduced stamina buffer for SCarp users
+ - rscadd: Gives SCarp users a better parry
+ - rscadd: Adds the SCarp bundle which includes a bo staff
+ - rscadd: Lets Carp costumes carry Bo Staffs
+ - balance: reduces the stamina damage of scarp slightly
+ - balance: reduced the blockchance of the bo staff
+ - rscadd: Adds more room to northwest maint
+ - rscadd: Adds a bridge between Atmos and the Turbine.
+ - balance: Blob Resource Tower to 2 points per instead of 1 point per.
+ - balance: Blob Factory Towers can be placed 5 tiles apart instead of 7.
+ - bugfix: Fixes Blobbernaut Factories consuming Factories if no naut is chosen.
+ - bugfix: Fixes Reflective Blobs
+ - rscadd: Re-adds the Clown Car to the clown uplink
+ - balance: 15 >16 TC cost
+ - balance: bonks on external airlocks
+ - bugfix: Fixes the parry data for scarp
+ kittycat2002:
+ - rscadd: set the name of /datum/reagent/consumable/ethanol/species_drink to Species
+ Drink
+ kiwedespars:
+ - balance: balanced bone gauntlets.
+ - rscadd: the robust dildo weapon now has sound.
+ necromanceranne:
+ - bugfix: Fixes various sprites for bokken, as well as being unable to craft certain
+ parts and duplicate entries.
+ - rscadd: 'Bokken now come in two lengths; full and wakizashi, and two varieties:
+ wood and ironwood. They have different stats for all four.'
+ - rscadd: Bokken require menu crafting and part construction, as well as more complicated
+ materials.
+ - tweak: Bokken (long and short) require wood, cloth and leather to craft with a
+ hatchet and screwdriver.
+ - tweak: Ironwood bokken (long and short) require ironcap logs, cloth and leather
+ to craft with a hatchet, screwdriver and welder.
+ - balance: Twin sheathes can only fit a pair of blades (longsword + shortsword)
+ or they can fit two shortswords.
+ - bugfix: Fixed a twin sheath runtime.
+ - imageadd: A lot of bokken related sprites received an overhaul. Added overlay
+ sprites for weapons sheathed in the twin sheathes.
+ - imageadd: The extradimensional blade received improved sprites for inhands/back
+ sprites.
+ - bugfix: You can now make all the variants of the bokken.
+ - bugfix: Removes a duplicate sprite.
+ - tweak: Renames all instances of 'ironwood' to 'steelwood'.
+ - rscadd: Adds new roboticist labcoat sprites!
+ qwertyquerty:
+ - bugfix: Flash the screen on climax
+ raspy-on-osu:
+ - spellcheck: salicylic acid
+ - tweak: space heater heating range and power
+ - tweak: windoor open length
+ shellspeed1:
+ - rscadd: Wings from Cit RP have been ported over
+ - rscadd: Moth wings from cit have been ported over
+ - bugfix: Cleaned up some pixels on existing moth wings.
+ - tweak: Organized the lists for wings by if they are for moths or not and than
+ by alphabetical.
+ - balance: Lings now have infinite space for DNA.
+ - rscadd: All xenomorph types have been added as corpses for mapping purposes
+ - balance: The dead xenomorphs in the lavaland xenomorph hive now have more variety.
+ - tweak: Floor bots are now buildable with all toolboxes.
+ - rscadd: 'Xenomorph hybrids can now select wings ~~add: Xenomorph hybrids can now
+ speak xenomorph~~'
+ - rscadd: Xenomorph tongues are available for customization.
+ - rscadd: Mining borgs can claim points again
+ - rscadd: Construction bags have been added, use them to carry all sorts of construction
+ bits.
+ - rscadd: A recipe has been added to cloth stacks to make material and construction
+ bags.
+ - balance: Material bags and construction bags are now available in engineering
+ lockers.
+ - rscadd: Adds the disposable sentry gun from tg for 11tc each.
+ - rscadd: The exofab can now print prosthetic limbs
+ - bugfix: The exofab was missing access to multiple cybernetic organs. This has
+ now been rectified.
+ - rscadd: A new recipe for a spicy has been given to us by a strange business man.
+ - rscadd: The bluespace navigation gigabeacon design has been added to shuttle research
+ for those wanting to take their ships around space more.
+ - tweak: Xenomorph powers now list plasma cost in their description.
+ silicons:
+ - tweak: nanite resistances tweaked
+ - rscadd: new nanite programs added for locking the user out from being modified
+ by consoles or antivirals.
+ - rscdel: anomalies no longer spawn in walls
+ - rscadd: 'Twitch Plays: Clown Car'
+ - rscadd: pugilists can now parry
+ - balance: c4 can no longer gib mobs
+ - tweak: medium screens are better now
+ - tweak: text formatting now uses one character instead of two around the text to
+ emphasize.
+ - rscadd: colormates
+ - balance: shoving yourself up now costs 50% more
+ - bugfix: dullahans enabled
+ - rscadd: tailed individuals can now target groin to intertwine tails on grab intent.
+ - rscadd: Clowns now have unpredictable effects on supermatter crystals when dusting
+ from contact.
+ - tweak: anyone new to the server is lucky enough to have their sprint default to
+ toggle instead of hold
+ - balance: stamina crit is only removed when at or under 100 stamina, rather than
+ 140. stamina crit threshold is still at 140.
+ - tweak: luxury shuttle no longer has noteleport
+ - rscdel: now only poly gets a headset on spawn, not all birds.
+ - tweak: the warp implant now actually warps you back 10 seconds. leaves a trail,
+ though. now unlimited us.
+ - bugfix: things in DEATHCOMA do not deathgasp on death
+ - tweak: Meth and changeling adrenals no longer ignore all slowdowns, rather damage
+ slowdowns.
+ - rscadd: you can now be an angel using a magic mirror again
+ - tweak: command headsets are 120% instead of 160%
+ - bugfix: no more emote italics
+ - rscadd: players can now respawn/return to lobby as a ghost after a 15 minute (default)
+ delay and rejoin on another character with some/many restrictions
+ - rscadd: cryo now preserves everything
+ - bugfix: Magrifle ammo no longer glows.
+ - tweak: temperature slowdown divisor nerfed to 35 from 20.
+ - balance: dna melt drops all items being destroying you
+ - bugfix: keybinds generate anti-collision bindings where necessary automatically
+ now
+ - balance: changeling combat mutations rebalanced. most of them take chemicals to
+ upkeep now.
+ - rscadd: set-pose has been added
+ - tweak: temporary flavor text renamed to set pose, fully visible in examine
+ - bugfix: ninja gloves no longer hardstun
+ - balance: ninja gloves now cost half as much to use to compensate
+ - bugfix: simple mobs are now immune to radioactive contamination
+ timothyteakettle:
+ - bugfix: time for memory loss message to show up when being revived is now correctly
+ 300 seconds, instead of 30
+ - bugfix: the load away mission verb won't crash the server now
+ - rscadd: roundstart slimes can turn into puddles now
+ - rscadd: all gas masks (but welding + glass) can be alt clicked to show/hide identity
+ - tweak: autosurgeons from travelling trader rewards now only have one use
+ - bugfix: fixes held items proccing crossed when passing someone
+ - tweak: you can now get a family heirlooms based off your species instead of job
+ - tweak: changeling stings retract upon turning into a slime puddle
+ - tweak: you cannot transform into a slime puddle with a no drop item in your hands
+ - tweak: slime puddles are now transparent and their colour looks more natural in
+ comparison to the user
+ - tweak: slime puddles are now even slower
+ - tweak: slime puddles now get no protection from worn clothing
+ - rscdel: removes two debug messages left in from my prior eye customization pr
+ - rscadd: adds unlockable loadout items, corresponding category in loadouts, etc
+ - rscadd: added in-game age verification as an alternative to access requests
+ - bugfix: disabling adminhelp noises no longer disables looc
+ - bugfix: apids render now
+ - bugfix: you can now only entwine tails with people who have a tail
+ - bugfix: custom eyes and tongues now properly carry across cloning
+ - rscadd: re-adds the holoform verb for people who want to use it over going through
+ the char list
+ - bugfix: eye sprites should look normal once more
+ - rscadd: licking people washes pie off their face
+ - rscadd: you can now pick your eye sprites from customization
+ - tweak: looking at loadout equips loadout items on your preview image instead of
+ job items
+ - tweak: custom holoforms are now accessible through an action instead of through
+ verbs
+ - tweak: AI holoforms can now emote
+ - tweak: cloning now correctly copies your blood colour, body sprite type and eye
+ type
+ - bugfix: species with NOTRANSSTING cannot have envy's knife used on them
+ - rscadd: avian/digitigrade legs have been added for slimes
+ - rscadd: you can teleport bread
+ - tweak: slime puddles are no longer layered down one layer
+ - tweak: you cannot tackle with two paralysed arms
+ - tweak: tackling with a single paralysed arm lowers your tackle roll by 2
+ - bugfix: circuits get pin data proc is sanitized when text is returned as data
+ - rscadd: loadout now has save slot support and colour choosing/saving for polychromic
+ items
+ - rscadd: polychromic maid outfit
+ - rscadd: you can rebind communication hotkeys and they're the default now
+ - rscadd: you can now customize your size from 90% to 130%, going below 100% makes
+ you have 10 less max health
+ - rscadd: '*squeak'
+ - rscadd: anthromorphic synth species
+ - rscadd: improvements to the automatic age gate
+ - tweak: antag items are now of critical importance and wont fail to be placed on
+ the character
+ - bugfix: a tonne of fixes to colourisation of parts, too many to name, including
+ some sprite fixes
+ - rscadd: things now have their own individual primary/(secondary)/(tertiary) colours
+ as required, and these can be modified by you
+ uomo91:
+ - bugfix: Fixed "Show All" tab in player panel logs being broken.
+ - bugfix: Whispers, OOC, and various other things display differently in logs, visually
+ distinguishing them from say logs.
+ - refactor: Player panel logs will now show all logs chronologically, so you'll
+ see commingled say and attack logs if you're on the "Show All" tab, etc...
+ yorii:
+ - bugfix: fixed botany rounding error that caused grass and other plants to misbehave
+ zeroisthebiggay:
+ - bugfix: legion now drops chests
+ - rscadd: Traitor assistants can now purchase the patented POGBox! Put TC into it
+ for even higher damage!
+ - balance: MEGAFAUNA DROPS ARE LAVAPROOF
+ - imageadd: cool codex cicatrix inhands
+ - rscadd: gravitokinetic stands from tg
+ - balance: buffs stands overall
+ - bugfix: protector stands no longer become tposing invisible apes sometimes
+ - bugfix: jacqueline spawns on boxstation
+ - rscadd: secsheath for your cool stunsword at your local security vendor. you gotta
+ hack it first though.
+ - imageadd: fuck the r*d cr*ss
+ - rscadd: The legion megafauna has been reworked. The fight should now be both slightly
+ harder and faster.
+ - balance: You can no longer cheese the colossus by being a sand golem and simply
+ being immune.
+2021-01-22:
+ Arturlang:
+ - rscadd: Adds a way to give items to people, you can combat mode rightclick to
+ offer it to one person, right click on people without mode and click the give
+ verb, or use the hotkey CTRL G to offer it to everyone around you
+2021-01-25:
+ MrJWhit:
+ - bugfix: Alien radio code
+ - rscadd: Microwave can now be cleaned by a damp rag as well as soap.
+ - bugfix: Removes some unused code, and improves some other code.
+ - rscadd: The AI has a verb to look up and down z-levels
+ - bugfix: Making a monkey into a human doesn't unanchor random things on the tile
+ - bugfix: Makes a few slight improvements to drinking code
+ - tweak: Makes encryption keys be put in the hands of the user when able instead
+ of being dropped on the floor when removed from headsets
+ raspy-on-osu:
+ - refactor: ventcrawling
+ silicons:
+ - tweak: you can now shove yourself up in any intent, not just help.
+2021-01-27:
+ ArcaneMusic, ported by Hatterhat:
+ - rscadd: Strike a hydroponics tray with a fully-charged floral somatoray to lock
+ in a mutation.
+ - rscadd: Floral somatorays now have the ability to force a mutation in a plant.
+ This should drain the cell in a single shot, but we'll see.
+ - balance: Somatorays now take uranium to craft instead of radium.
+ Arturlang:
+ - rscadd: Actually adds a right click give option
+ - rscadd: Revenants can now clickdrag to throw stuff at people, with some items
+ doing various things at the same time.
+ DeltaFire15:
+ - bugfix: The woundmending rite no longer causes runtimes.
+ - bugfix: Ratvarian borgs can now use their tier-0 spells.
+ - balance: Ratvarian borgs can always use their assigned spells, if there is enough
+ power.
+ - admin: The heretic antag panel now shows their sacrifices & current sacrifice
+ targets.
+ - tweak: The heretic roundend report now shows their sacrifices and nonsacrificed
+ targets.
+ - bugfix: Living hearts can no longer select the same target as another living heart,
+ removing a certain problem.
+ Hatterhat:
+ - tweak: Department budget cards have been readded. TO THE CODE. NOT LOCKERS.
+ - tweak: Also budget cards now look more like every other ID - see tgstation#55001.
+ - balance: One of the contractor tablet's payouts has been raised from a small payout
+ to a medium payout.
+ - balance: The free golem ship's GPSes no longer start on. They were never meant
+ to, but they did.
+ - rscdel: Headsets can't be found on most legion corpses now.
+ - rscdel: The flash on the assistant corpse is gone, too.
+ MrJWhit:
+ - tweak: Remaps some air alarms for sanity.
+ SandPoot:
+ - bugfix: The drop circuit can no longer drop things that are not inside it.
+ raspy-on-osu:
+ - bugfix: bespoke ventcrawling element not detaching due to malformed call
+ shellspeed1:
+ - bugfix: Floorbots had had a software update, preventing them from dogpiling on
+ their target as easily as they did before.
+ - soundadd: Floorbots will now play a small chime when stacked on top of each other
+ to indicate that they're moving apart.
+ timothyteakettle:
+ - rscadd: blobs can use the 'me' verb
+ - admin: adminhelps and pms only sanitize once instead of twice
+2021-01-28:
+ silicons:
+ - rscadd: colormates can now paint some mobs.
+ - bugfix: 1 dev explosions shouldn't delete brains anymore
+2021-01-29:
+ MrJWhit:
+ - tweak: Ported the QM, Captain, CMO, and HoS cloaks from beestation.
+ - rscdel: Removes excess air alarms from boxstation
+ TripleShades:
+ - bugfix: fixes engineering secure storage being the wrong area because I fucked
+ that up previously my bad
+ - bugfix: removes funny extra light switch under right surgery table in surgery
+ oops
+ - rscadd: Added chairs to the corpse launch viewing area
+ - rscadd: Small garden plot for flowers for parity with other station Chapels
+ - rscadd: Plain Bible to glass tables in Chapel
+ - rscadd: Candles and Matchbox to glass tables in Chapel
+ - rscadd: More glass tables, with a chaplain figure and another spare bible.
+ - rscadd: Bookcase to Box Chapel for parity with other station Chapels
+ - rscadd: Minimoog to Box Chapel as substitute for a church organ
+ - rscadd: 'Holy department sign just below Chapel change: Expanded the corpse launching
+ area to feel less congested change: Added windows to the corpse launch so you
+ can look inside I guess? change: Moved flowers and burial garments to the corner
+ next to the corpse launcher change: Box Chaplain''s office door is moved over
+ one change: Confessional is now connected to Chaplain''s office for parity with
+ other station Chapels change: Moved coffins over to old confessional location
+ change: Box Chapel now has pews instead of stools change: Box Chapel Confessional
+ is now lit instead of being nearly pitch black remove: Two coffins from Chapel'
+ timothyteakettle:
+ - bugfix: the miner bedsheet will now increment its progress when you redeem points
+ from the ORM
+ - rscadd: you can add custom names and descriptions to item's on the loadout now
+ zeroisthebiggay:
+ - rscadd: roundstart aesthetic sterile masks and roundstart paper masks
+ - rscadd: more accessory slot items
+ - rscadd: cowbell necklace happy 2021
+ - rscadd: shibari ropes & torn pantyhose
+2021-01-30:
+ timothyteakettle:
+ - rscadd: adds 'clucks', 'caws' and 'gekkers' to the speech verb list
+ zeroisthebiggay:
+ - rscadd: some more FUCKING hairs
+ - imageadd: uncodersprites the advanced extinguisher
+2021-01-31:
+ Putnam3145:
+ - balance: fermichem explosion EMPs don't cover the entire station
+2021-02-02:
+ silicons:
+ - rscadd: pais can now be carried around piggybacking/fireman
+ - balance: Meth and Nuka Cola once again, speed you up.
+2021-02-03:
+ Hatterhat:
+ - bugfix: The green energy sabre's sprite now respects proper handedness.
+2021-02-05:
+ SmArtKar:
+ - rscadd: The orbit menu now has an Auto-Observe button! No more sifting through
+ the lame observe menu to snoop in people's backpacks! Also, orbit menu now refreshes.
+ - bugfix: KAs are no longer getting broken when fired by a circuit
+ keronshb:
+ - balance: Force and damage > 15 from 18/25
+ - balance: Knockdown put down to 5 from 30
+ - balance: Armor pen down to 10 from 100.
+ - balance: Makes cell chargers, charge faster.
+ raspy-on-osu:
+ - bugfix: alien royals can no longer ventcrawl
+ shellspeed1:
+ - balance: There actually needs to be people for zombies to happen now.
+ timothyteakettle:
+ - rscadd: dwarf facial hair is no longer randomised
diff --git a/html/changelogs/AutoChangeLog-pr-13014.yml b/html/changelogs/AutoChangeLog-pr-13014.yml
deleted file mode 100644
index 861e797669..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13014.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "The wastes of Lavaland and the icy caverns of Snow Taxi rumble in unison."
diff --git a/html/changelogs/AutoChangeLog-pr-13193.yml b/html/changelogs/AutoChangeLog-pr-13193.yml
deleted file mode 100644
index 980a9366d8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13193.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "medium screens are better now"
diff --git a/html/changelogs/AutoChangeLog-pr-13233.yml b/html/changelogs/AutoChangeLog-pr-13233.yml
deleted file mode 100644
index 4366abec64..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13233.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "Changeling bone gauntlets! They punch the shit out of people really good."
- - tweak: "Guerilla gloves and gorilla gloves inherit the strip modifiers of their predecessors, because apparently they had those."
- - balance: "Pugilists now always hit the targeted limb and never miss."
diff --git a/html/changelogs/AutoChangeLog-pr-13252.yml b/html/changelogs/AutoChangeLog-pr-13252.yml
deleted file mode 100644
index 5de40bb80b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13252.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "looking at loadout equips loadout items on your preview image instead of job items"
diff --git a/html/changelogs/AutoChangeLog-pr-13346.yml b/html/changelogs/AutoChangeLog-pr-13346.yml
deleted file mode 100644
index 2e3d4e3280..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13346.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - refactor: "Dwarf speech is no longer absolutely paranoid about word replacement."
diff --git a/html/changelogs/AutoChangeLog-pr-13349.yml b/html/changelogs/AutoChangeLog-pr-13349.yml
deleted file mode 100644
index 2469b31ecd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13349.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "LetterN"
-delete-after: True
-changes:
- - code_imp: "Updates git and build tests."
diff --git a/html/changelogs/AutoChangeLog-pr-13405.yml b/html/changelogs/AutoChangeLog-pr-13405.yml
deleted file mode 100644
index 176e886b0d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13405.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "the warp implant now actually warps you back 10 seconds. leaves a trail, though. now unlimited us."
diff --git a/html/changelogs/AutoChangeLog-pr-13444.yml b/html/changelogs/AutoChangeLog-pr-13444.yml
deleted file mode 100644
index d24babda2e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13444.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "you can now get a family heirlooms based off your species instead of job"
diff --git a/html/changelogs/AutoChangeLog-pr-13461.yml b/html/changelogs/AutoChangeLog-pr-13461.yml
deleted file mode 100644
index e2397a7aa0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13461.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - rscadd: "arcade carpet"
diff --git a/html/changelogs/AutoChangeLog-pr-13472.yml b/html/changelogs/AutoChangeLog-pr-13472.yml
deleted file mode 100644
index 8e8d043de6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13472.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "roundstart slimes can turn into puddles now"
diff --git a/html/changelogs/AutoChangeLog-pr-13473.yml b/html/changelogs/AutoChangeLog-pr-13473.yml
deleted file mode 100644
index aebdfbb3cb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13473.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Tupinambis"
-delete-after: True
-changes:
- - rscadd: "Arachnids (spider people) with limited night vision, flash vulnerability, and webbing."
diff --git a/html/changelogs/AutoChangeLog-pr-13479.yml b/html/changelogs/AutoChangeLog-pr-13479.yml
deleted file mode 100644
index fcfe65a47e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13479.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "LetterN"
-delete-after: True
-changes:
- - bugfix: "minimap text"
- - code_imp: "ports cinematic upgrades"
diff --git a/html/changelogs/AutoChangeLog-pr-13481.yml b/html/changelogs/AutoChangeLog-pr-13481.yml
deleted file mode 100644
index f6049c552b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13481.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "the blacksmithing skill now works properly"
- - tweak: "Anvils cannot be interacted with with hammers whilst they are already being used"
- - tweak: "If someone has no gloves when interacting with heated ingots, they no longer ignore their effects."
diff --git a/html/changelogs/AutoChangeLog-pr-13483.yml b/html/changelogs/AutoChangeLog-pr-13483.yml
deleted file mode 100644
index 1db9304ffb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13483.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "The Revenant self-revive ability is no longer broken."
diff --git a/html/changelogs/AutoChangeLog-pr-13487.yml b/html/changelogs/AutoChangeLog-pr-13487.yml
deleted file mode 100644
index 4b0f92adfb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13487.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "People installing KA modkits in miner borgs is no longer broken."
diff --git a/html/changelogs/AutoChangeLog-pr-13496.yml b/html/changelogs/AutoChangeLog-pr-13496.yml
deleted file mode 100644
index 30308efaff..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13496.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - rscadd: "explosions now get broadcasted to deadchat."
diff --git a/html/changelogs/AutoChangeLog-pr-13497.yml b/html/changelogs/AutoChangeLog-pr-13497.yml
deleted file mode 100644
index c5f569bad3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13497.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Zandario"
-delete-after: True
-changes:
- - code_imp: "Added some framework for future species expansions, including clothing refitting."
- - refactor: "Made majority of the relevant Species IDs and Categories pre-defined, also for easier expansion and use."
diff --git a/html/changelogs/AutoChangeLog-pr-13498.yml b/html/changelogs/AutoChangeLog-pr-13498.yml
deleted file mode 100644
index f956ee4b07..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13498.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Bhijn"
-delete-after: True
-changes:
- - tweak: "Changeling loudness is now determined as an average of all their abilities, rather than the sum"
- - tweak: "To compensate for this, blood tests now require a loudness value of 1 or higher to detect ling blood. Additionally, blood test explosions are now triggered only when the loudness value is higher than 2."
diff --git a/html/changelogs/AutoChangeLog-pr-13499.yml b/html/changelogs/AutoChangeLog-pr-13499.yml
deleted file mode 100644
index 804fa9fc34..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13499.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Toilet loot spawners don't lag the server on server start with forced hard dels."
diff --git a/html/changelogs/AutoChangeLog-pr-13500.yml b/html/changelogs/AutoChangeLog-pr-13500.yml
deleted file mode 100644
index 7ba1eb64f3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13500.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "LetterN"
-delete-after: True
-changes:
- - rscadd: "2 more ways to get up from z1"
- - tweak: "tweaked the z2 garden to be less blank"
diff --git a/html/changelogs/AutoChangeLog-pr-13501.yml b/html/changelogs/AutoChangeLog-pr-13501.yml
deleted file mode 100644
index dcdd868e37..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13501.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Holofirelocks work now."
diff --git a/html/changelogs/AutoChangeLog-pr-13503.yml b/html/changelogs/AutoChangeLog-pr-13503.yml
deleted file mode 100644
index c68eaf44f0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13503.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "Survival daggers! A slightly more expensive survival knife that comes with a brighter flashlight. On the blade."
- - tweak: "Luxury pod capsules look different from normal capsules."
diff --git a/html/changelogs/AutoChangeLog-pr-13504.yml b/html/changelogs/AutoChangeLog-pr-13504.yml
deleted file mode 100644
index 7f59b120b6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13504.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - rscadd: "gravitokinetic stands from tg"
- - balance: "buffs stands overall"
- - bugfix: "protector stands no longer become tposing invisible apes sometimes"
diff --git a/html/changelogs/AutoChangeLog-pr-13509.yml b/html/changelogs/AutoChangeLog-pr-13509.yml
deleted file mode 100644
index e666a6b2a4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13509.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "EmeraldSundisk"
-delete-after: True
-changes:
- - balance: "The \"Skelter ruin\" now has stechkins as opposed to M1911s"
- - tweak: "Skelter's decorative bullet casings replaced to factor in the change in caliber"
- - rscadd: "Skelter now has a combat knife and fluff note"
diff --git a/html/changelogs/AutoChangeLog-pr-13511.yml b/html/changelogs/AutoChangeLog-pr-13511.yml
deleted file mode 100644
index e819d8752d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13511.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - imageadd: "The Syndicate appear to be issuing new revolver variants."
diff --git a/html/changelogs/AutoChangeLog-pr-13512.yml b/html/changelogs/AutoChangeLog-pr-13512.yml
deleted file mode 100644
index f96f13a156..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13512.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - bugfix: "Cryogenics now screams on common again when your fuckbuddy heads out."
diff --git a/html/changelogs/AutoChangeLog-pr-13513.yml b/html/changelogs/AutoChangeLog-pr-13513.yml
deleted file mode 100644
index 0cff979e8c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13513.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "you can now pick your eye sprites from customization"
diff --git a/html/changelogs/AutoChangeLog-pr-13514.yml b/html/changelogs/AutoChangeLog-pr-13514.yml
deleted file mode 100644
index bd1605fb96..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13514.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Thalpy"
-delete-after: True
-changes:
- - bugfix: "fixes some bugs in jacqs code from edits to the codebase"
diff --git a/html/changelogs/AutoChangeLog-pr-13516.yml b/html/changelogs/AutoChangeLog-pr-13516.yml
deleted file mode 100644
index 30e22f4f48..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13516.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "yorii"
-delete-after: True
-changes:
- - bugfix: "fixed botany rounding error that caused grass and other plants to misbehave"
diff --git a/html/changelogs/AutoChangeLog-pr-13517.yml b/html/changelogs/AutoChangeLog-pr-13517.yml
deleted file mode 100644
index 8f29517058..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13517.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - bugfix: "simple mobs are now immune to radioactive contamination"
diff --git a/html/changelogs/AutoChangeLog-pr-13518.yml b/html/changelogs/AutoChangeLog-pr-13518.yml
deleted file mode 100644
index 565754f48b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13518.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TheObserver-sys"
-delete-after: True
-changes:
- - bugfix: "Drake? Where's the dead fairygrass sprite?"
diff --git a/html/changelogs/AutoChangeLog-pr-13519.yml b/html/changelogs/AutoChangeLog-pr-13519.yml
deleted file mode 100644
index 0c4978a7d8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13519.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - rscadd: "Lick radial"
diff --git a/html/changelogs/AutoChangeLog-pr-13521.yml b/html/changelogs/AutoChangeLog-pr-13521.yml
deleted file mode 100644
index 77aca8c363..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13521.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - balance: "zeolites are now actual fermichems instead of being incredibly easy to make."
- - bugfix: "Using syringes / droppers on chem heaters with beakers in them works again."
diff --git a/html/changelogs/AutoChangeLog-pr-13523.yml b/html/changelogs/AutoChangeLog-pr-13523.yml
deleted file mode 100644
index ac2019bb88..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13523.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - bugfix: "arcade carpets now actually work"
diff --git a/html/changelogs/AutoChangeLog-pr-13525.yml b/html/changelogs/AutoChangeLog-pr-13525.yml
deleted file mode 100644
index eb441f04c3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13525.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - bugfix: "Hilbert's jukebox works"
diff --git a/html/changelogs/AutoChangeLog-pr-13526.yml b/html/changelogs/AutoChangeLog-pr-13526.yml
deleted file mode 100644
index 104b76bd94..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13526.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "vore prefs save now"
diff --git a/html/changelogs/AutoChangeLog-pr-13527.yml b/html/changelogs/AutoChangeLog-pr-13527.yml
deleted file mode 100644
index 7e65116e83..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13527.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ArchieBeepBoop"
-delete-after: True
-changes:
- - rscadd: "Upgraded Advanced RTG Machine Preset"
diff --git a/html/changelogs/AutoChangeLog-pr-13528.yml b/html/changelogs/AutoChangeLog-pr-13528.yml
deleted file mode 100644
index b7bd0d4618..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13528.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - balance: "Robotic Limbs now each have their own damage threshhold values"
- - balance: "Robotic Limb damage threshholds are now seperated into threshhold itself and mindamage when passed
-balance; Hybrid limbs can now be injected with hypos, but not sprayed (Still not healed by chems)"
- - tweak: "Brain surgery has been tweaked back to allowing robotic limbs, blacklisting IPC brains instead."
- - tweak: "Robot brain surgery can now be used on organic heads, if there is a IPC brain in them somehow."
- - tweak: "The robot limb heal surgery can now be used even if the target's torso is not robotic, as long as they have robotic limbs"
- - refactor: "BODYPART_ROBOTIC / BODYPART_ORGANIC checks replaced with helper-procs whereever possible."
- - code_imp: "Added a BODYPART_HYBRID define for robotic bodyparts that behave organic in some regards."
diff --git a/html/changelogs/AutoChangeLog-pr-13529.yml b/html/changelogs/AutoChangeLog-pr-13529.yml
deleted file mode 100644
index 54f775b5c8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13529.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "Planetary atmos no longer does superconduction."
diff --git a/html/changelogs/AutoChangeLog-pr-13530.yml b/html/changelogs/AutoChangeLog-pr-13530.yml
deleted file mode 100644
index b99ed1c545..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13530.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscadd: "Clowns now have unpredictable effects on supermatter crystals when dusting from contact."
diff --git a/html/changelogs/AutoChangeLog-pr-13531.yml b/html/changelogs/AutoChangeLog-pr-13531.yml
deleted file mode 100644
index 3c138ef98d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13531.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "A certain lizard (totally not me) being stupid is no longer going to break regenerate_bodyparts"
diff --git a/html/changelogs/AutoChangeLog-pr-13533.yml b/html/changelogs/AutoChangeLog-pr-13533.yml
deleted file mode 100644
index 1ba14c689c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13533.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - rscadd: "A new recipe for a spicy has been given to us by a strange business man."
diff --git a/html/changelogs/AutoChangeLog-pr-13535.yml b/html/changelogs/AutoChangeLog-pr-13535.yml
deleted file mode 100644
index b020587eb8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13535.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "Energy sabre reskin for the energy sword - access via alt-click."
- - bugfix: "Alt-click reskins are fixed."
- - tweak: "Defibrillators and their many, many overlays were moved to another .dmi."
- - tweak: "You can now change the color of an energy sword via multitool. Not deswords. Yet."
diff --git a/html/changelogs/AutoChangeLog-pr-13539.yml b/html/changelogs/AutoChangeLog-pr-13539.yml
deleted file mode 100644
index a1f3df4fd0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13539.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscdel: "removes two debug messages left in from my prior eye customization pr"
diff --git a/html/changelogs/AutoChangeLog-pr-13540.yml b/html/changelogs/AutoChangeLog-pr-13540.yml
deleted file mode 100644
index 0d7d9b8d2c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13540.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "ArcaneMusic, The0bserver-sys"
-delete-after: True
-changes:
- - rscadd: "New from Hydrowear LLC: The Botanical Belt! This handy yellow belt lets you hold most of your botany gear, and a few beakers for reduced bag and floor clutter!"
- - tweak: "Gives Hydrotrays plumbing pipes automatically, allowing you to make a self sustaining tray via plumbing."
- - tweak: "Gives Service access to Bluespace Beakers, at last, gives Cargo, Science, and Medical the ability to construct reinforced plungers for use on lavaland."
diff --git a/html/changelogs/AutoChangeLog-pr-13543.yml b/html/changelogs/AutoChangeLog-pr-13543.yml
deleted file mode 100644
index be2cb215c9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13543.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - rscadd: "The legion megafauna has been reworked. The fight should now be both slightly harder and faster."
- - balance: "You can no longer cheese the colossus by being a sand golem and simply being immune."
diff --git a/html/changelogs/AutoChangeLog-pr-13544.yml b/html/changelogs/AutoChangeLog-pr-13544.yml
deleted file mode 100644
index 61cf99090d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13544.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Portals no longer runtime because of incorrect args."
diff --git a/html/changelogs/AutoChangeLog-pr-13547.yml b/html/changelogs/AutoChangeLog-pr-13547.yml
deleted file mode 100644
index 0355a871d1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13547.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - rscadd: "secsheath for your cool stunsword at your local security vendor. you gotta hack it first though."
diff --git a/html/changelogs/AutoChangeLog-pr-13549.yml b/html/changelogs/AutoChangeLog-pr-13549.yml
deleted file mode 100644
index 5d46fbcb6c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13549.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - bugfix: "Fixes cloning computer UI not updating when pressing certain buttons - also adds extra check for names to update a message"
diff --git a/html/changelogs/AutoChangeLog-pr-13552.yml b/html/changelogs/AutoChangeLog-pr-13552.yml
deleted file mode 100644
index 1504d1d3a0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13552.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Multi-surgery unit test no longer fails at random."
diff --git a/html/changelogs/AutoChangeLog-pr-13553.yml b/html/changelogs/AutoChangeLog-pr-13553.yml
deleted file mode 100644
index 2759fa2754..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13553.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "eye sprites should look normal once more"
diff --git a/html/changelogs/AutoChangeLog-pr-13554.yml b/html/changelogs/AutoChangeLog-pr-13554.yml
deleted file mode 100644
index 3a14adff37..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13554.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Vynzill"
-delete-after: True
-changes:
- - bugfix: "fixes high luminosity eyes"
diff --git a/html/changelogs/AutoChangeLog-pr-13558.yml b/html/changelogs/AutoChangeLog-pr-13558.yml
deleted file mode 100644
index 2a5b2dc576..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13558.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Zandario"
-delete-after: True
-changes:
- - bugfix: "lum slime sprites work again"
- - code_imp: "Slapped the Species Defines where relevant"
diff --git a/html/changelogs/AutoChangeLog-pr-13561.yml b/html/changelogs/AutoChangeLog-pr-13561.yml
deleted file mode 100644
index 097336bc3b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13561.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Your target cryoing will no longer give you a free greentext."
diff --git a/html/changelogs/AutoChangeLog-pr-13562.yml b/html/changelogs/AutoChangeLog-pr-13562.yml
deleted file mode 100644
index 7fabc05c7b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13562.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Vampire shapeshifting should now behave as intended"
diff --git a/html/changelogs/AutoChangeLog-pr-13563.yml b/html/changelogs/AutoChangeLog-pr-13563.yml
deleted file mode 100644
index c4c9b68c39..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13563.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "cloning now correctly copies your blood colour, body sprite type and eye type"
diff --git a/html/changelogs/AutoChangeLog-pr-13566.yml b/html/changelogs/AutoChangeLog-pr-13566.yml
deleted file mode 100644
index 14ee8755a9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13566.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - bugfix: "legion now drops chests"
diff --git a/html/changelogs/AutoChangeLog-pr-13567.yml b/html/changelogs/AutoChangeLog-pr-13567.yml
deleted file mode 100644
index d51db8e3b8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13567.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "changeling stings retract upon turning into a slime puddle"
- - tweak: "you cannot transform into a slime puddle with a no drop item in your hands"
- - tweak: "slime puddles are now transparent and their colour looks more natural in comparison to the user"
- - tweak: "slime puddles are now even slower"
- - tweak: "slime puddles now get no protection from worn clothing"
diff --git a/html/changelogs/AutoChangeLog-pr-13570.yml b/html/changelogs/AutoChangeLog-pr-13570.yml
deleted file mode 100644
index 6a4fb6af66..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13570.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Fixed a runtime in every healing nanite program."
diff --git a/html/changelogs/AutoChangeLog-pr-13571.yml b/html/changelogs/AutoChangeLog-pr-13571.yml
deleted file mode 100644
index 864967dffc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13571.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - bugfix: "Code improvement on ventcrawling"
diff --git a/html/changelogs/AutoChangeLog-pr-13573.yml b/html/changelogs/AutoChangeLog-pr-13573.yml
deleted file mode 100644
index 9bac0ce44d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13573.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "removed a unit test causing master to fail"
diff --git a/html/changelogs/AutoChangeLog-pr-13575.yml b/html/changelogs/AutoChangeLog-pr-13575.yml
deleted file mode 100644
index 164581b11f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13575.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - bugfix: "Fixed the subtle hotkey being weird with its input prompts."
- - rscadd: "Adds a subtler anti-ghost hotkey. Default key is 6."
diff --git a/html/changelogs/AutoChangeLog-pr-13576.yml b/html/changelogs/AutoChangeLog-pr-13576.yml
deleted file mode 100644
index 9443b13dcb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13576.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Sonic121x"
-delete-after: True
-changes:
- - rscadd: "digi sprite uniform"
- - bugfix: "digi leg suit"
diff --git a/html/changelogs/AutoChangeLog-pr-13577.yml b/html/changelogs/AutoChangeLog-pr-13577.yml
deleted file mode 100644
index 7463a3ad39..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13577.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Chemical stuff now displays fermichem stuff properly"
diff --git a/html/changelogs/AutoChangeLog-pr-13581.yml b/html/changelogs/AutoChangeLog-pr-13581.yml
deleted file mode 100644
index 42db54450b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13581.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Ghommie, porting PRs by MMMiracles and pireamaineach, credits to BlueWildrose too."
-delete-after: True
-changes:
- - rscadd: "You can now draw on plasmaman helmets with a crayon to turn their frown upside-down."
- - balance: "Plasmaman helmets no longer hide your identity when worn by themselves."
- - balance: "Plasmaman helmets now have welding visors, which can't stack with their torches in the helmet and are visible."
diff --git a/html/changelogs/AutoChangeLog-pr-13582.yml b/html/changelogs/AutoChangeLog-pr-13582.yml
deleted file mode 100644
index 78f8be1cd0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13582.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "a tonne of fixes to colourisation of parts, too many to name, including some sprite fixes"
- - rscadd: "things now have their own individual primary/(secondary)/(tertiary) colours as required, and these can be modified by you"
diff --git a/html/changelogs/AutoChangeLog-pr-13585.yml b/html/changelogs/AutoChangeLog-pr-13585.yml
deleted file mode 100644
index 0369e0827f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13585.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - bugfix: "Fixed species-specific drinks not giving a mood boost if you are that species."
diff --git a/html/changelogs/AutoChangeLog-pr-13586.yml b/html/changelogs/AutoChangeLog-pr-13586.yml
deleted file mode 100644
index 5f61b1dc54..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13586.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "KeRSedChaplain"
-delete-after: True
-changes:
- - imageadd: "Resprited the brass claw"
diff --git a/html/changelogs/AutoChangeLog-pr-13587.yml b/html/changelogs/AutoChangeLog-pr-13587.yml
deleted file mode 100644
index ea3f4c5efa..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13587.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Detective-Google"
-delete-after: True
-changes:
- - tweak: "the snow taxi is no longer the slow taxi"
diff --git a/html/changelogs/AutoChangeLog-pr-13588.yml b/html/changelogs/AutoChangeLog-pr-13588.yml
deleted file mode 100644
index 7ab9d67bab..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13588.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Delams-The-SM"
-delete-after: True
-changes:
- - rscadd: "Added 3 new emotes *hiss *purr *meow"
- - soundadd: "ported sounds from Citadel RP for *purr and *meow"
diff --git a/html/changelogs/AutoChangeLog-pr-13589.yml b/html/changelogs/AutoChangeLog-pr-13589.yml
deleted file mode 100644
index 877012914e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13589.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "autosurgeons from travelling trader rewards now only have one use"
diff --git a/html/changelogs/AutoChangeLog-pr-13592.yml b/html/changelogs/AutoChangeLog-pr-13592.yml
deleted file mode 100644
index 76e12e8c89..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13592.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - rscadd: "Stat panel UI for ranked choice votes"
diff --git a/html/changelogs/AutoChangeLog-pr-13593.yml b/html/changelogs/AutoChangeLog-pr-13593.yml
deleted file mode 100644
index 08310f6013..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13593.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - code_imp: "Vote system #defines are now strings"
diff --git a/html/changelogs/AutoChangeLog-pr-13598.yml b/html/changelogs/AutoChangeLog-pr-13598.yml
deleted file mode 100644
index 7bef81fa1a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13598.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "Fixes hijack implant APC UI, again"
diff --git a/html/changelogs/AutoChangeLog-pr-13599.yml b/html/changelogs/AutoChangeLog-pr-13599.yml
deleted file mode 100644
index 3deea2b2be..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13599.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Delams-The-SM"
-delete-after: True
-changes:
- - bugfix: "fixed randomization of colors for things like mulligan and Stabilized green slime extract for matrixed body parts"
diff --git a/html/changelogs/AutoChangeLog-pr-13601.yml b/html/changelogs/AutoChangeLog-pr-13601.yml
deleted file mode 100644
index 0cfb64b48b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13601.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "antag items are now of critical importance and wont fail to be placed on the character"
diff --git a/html/changelogs/AutoChangeLog-pr-13602.yml b/html/changelogs/AutoChangeLog-pr-13602.yml
deleted file mode 100644
index 24185b1792..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13602.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - rscadd: "A fallback for dynamic antag rolling that allows for it to just try between traitor, blood brothers, heretics, changeling, bloodsucker and devil until there are enough roundstart antags. This can also happen randomly anyway. Blood brothers and devil are disabled for now, but the code is there to enable them."
- - rscadd: "A new storyteller, \"Grab Bag\", that forces the above round type."
diff --git a/html/changelogs/AutoChangeLog-pr-13603.yml b/html/changelogs/AutoChangeLog-pr-13603.yml
deleted file mode 100644
index 4fcff30da0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13603.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "kappa-sama"
-delete-after: True
-changes:
- - tweak: "ishotgun crafting recipe no longer requires plasteel and is slightly more convenient"
- - balance: "ishotgun does 45 damage now instead of 40.5"
diff --git a/html/changelogs/AutoChangeLog-pr-13604.yml b/html/changelogs/AutoChangeLog-pr-13604.yml
deleted file mode 100644
index 2ac141215b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13604.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - balance: "Brass welders are 50% faster at refueling"
- - code_imp: "redoes self fueling welders in the code to be less speggie"
diff --git a/html/changelogs/AutoChangeLog-pr-13605.yml b/html/changelogs/AutoChangeLog-pr-13605.yml
deleted file mode 100644
index 707de17870..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13605.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "the corporate unifoms can now be gotton in the clothing mate vender"
diff --git a/html/changelogs/AutoChangeLog-pr-13606.yml b/html/changelogs/AutoChangeLog-pr-13606.yml
deleted file mode 100644
index 568f8cf7e6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13606.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "adminhelping no longer removes entire admin tab"
- - bugfix: "end of round no longer removes entire admin tab"
diff --git a/html/changelogs/AutoChangeLog-pr-13607.yml b/html/changelogs/AutoChangeLog-pr-13607.yml
deleted file mode 100644
index 0ed47b1d44..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13607.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "polychromic maid outfit"
diff --git a/html/changelogs/AutoChangeLog-pr-13608.yml b/html/changelogs/AutoChangeLog-pr-13608.yml
deleted file mode 100644
index b7c0201cab..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13608.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SpaceManiac"
-delete-after: True
-changes:
- - bugfix: "Fixed the maphook"
diff --git a/html/changelogs/AutoChangeLog-pr-13611.yml b/html/changelogs/AutoChangeLog-pr-13611.yml
deleted file mode 100644
index d7e6e8f9a1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13611.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - rscadd: "Adds a space loop to every map in toxins"
diff --git a/html/changelogs/AutoChangeLog-pr-13612.yml b/html/changelogs/AutoChangeLog-pr-13612.yml
deleted file mode 100644
index 9a67ec5aa3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13612.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - rscadd: "Expanded space hermit base"
diff --git a/html/changelogs/AutoChangeLog-pr-13616.yml b/html/changelogs/AutoChangeLog-pr-13616.yml
deleted file mode 100644
index 3032d0331f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13616.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "You can access the mime / clown mask skins radial menu once again."
diff --git a/html/changelogs/AutoChangeLog-pr-13617.yml b/html/changelogs/AutoChangeLog-pr-13617.yml
deleted file mode 100644
index 532882eecc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13617.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "loadout now has save slot support and colour choosing/saving for polychromic items"
diff --git a/html/changelogs/AutoChangeLog-pr-13618.yml b/html/changelogs/AutoChangeLog-pr-13618.yml
deleted file mode 100644
index b301c39e6b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13618.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Vynzill"
-delete-after: True
-changes:
- - rscadd: "new gateway mission
-mapadd: jungleresort map"
diff --git a/html/changelogs/AutoChangeLog-pr-13626.yml b/html/changelogs/AutoChangeLog-pr-13626.yml
deleted file mode 100644
index fa5331e005..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13626.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - balance: "MEGAFAUNA DROPS ARE LAVAPROOF"
diff --git a/html/changelogs/AutoChangeLog-pr-13627.yml b/html/changelogs/AutoChangeLog-pr-13627.yml
deleted file mode 100644
index 087cbde3ae..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13627.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Dice bags no longer act like cardboard boxes."
- - bugfix: "Abductors should be no longer mute."
- - bugfix: "Item action buttons should now properly show the item current overlays, most times."
- - bugfix: "The blackbox should now go into your hand slot when pried out, rather than tumbling on the ground everytime."
- - tweak: "The Quick Equip hotkey is now usable by all living mobs (so long they have hands and equipment slots)"
diff --git a/html/changelogs/AutoChangeLog-pr-13629.yml b/html/changelogs/AutoChangeLog-pr-13629.yml
deleted file mode 100644
index 954f6972ec..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13629.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscdel: "anomalies no longer spawn in walls"
diff --git a/html/changelogs/AutoChangeLog-pr-13630.yml b/html/changelogs/AutoChangeLog-pr-13630.yml
deleted file mode 100644
index f7e80aaf9e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13630.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "you can now customize your size from 90% to 130%, going below 100% makes you have 10 less max health"
diff --git a/html/changelogs/AutoChangeLog-pr-13632.yml b/html/changelogs/AutoChangeLog-pr-13632.yml
deleted file mode 100644
index bf478ec97c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13632.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "time for memory loss message to show up when being revived is now correctly 300 seconds, instead of 30"
diff --git a/html/changelogs/AutoChangeLog-pr-13633.yml b/html/changelogs/AutoChangeLog-pr-13633.yml
deleted file mode 100644
index d9246cfff6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13633.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ArchieBeepBoop"
-delete-after: True
-changes:
- - bugfix: "Outlet Injector Mapping Asset Layer Fix"
diff --git a/html/changelogs/AutoChangeLog-pr-13635.yml b/html/changelogs/AutoChangeLog-pr-13635.yml
deleted file mode 100644
index 21730d4cf5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13635.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - balance: "The bone gauntlets should be slightly less murderously punchy on the fast punches mode."
diff --git a/html/changelogs/AutoChangeLog-pr-13636.yml b/html/changelogs/AutoChangeLog-pr-13636.yml
deleted file mode 100644
index 75124f759f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13636.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SiliconMain"
-delete-after: True
-changes:
- - tweak: "Engi department has gas masks in loadout"
diff --git a/html/changelogs/AutoChangeLog-pr-13639.yml b/html/changelogs/AutoChangeLog-pr-13639.yml
deleted file mode 100644
index a511d0a909..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13639.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - tweak: "ASP 9mm and M1911 can now have suppressers added"
diff --git a/html/changelogs/AutoChangeLog-pr-13641.yml b/html/changelogs/AutoChangeLog-pr-13641.yml
deleted file mode 100644
index b0c429da75..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13641.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - balance: "Nerf combat knife damage"
diff --git a/html/changelogs/AutoChangeLog-pr-13644.yml b/html/changelogs/AutoChangeLog-pr-13644.yml
deleted file mode 100644
index 71417788a7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13644.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - balance: "Biomechanical (hybrid) bodyparts now have access to wound-fixing surgeries."
- - tweak: "A wound being fixed no longer just qdel()s surgeries connected to it."
- - tweak: "Some robotic surgery steps are now a bit more clear."
- - bugfix: "Organs no longer get fed to people after successfully being inserted into them."
- - tweak: "Not completing the do_after of a surgery no longer causes you to attack the target with whatever you were holding."
diff --git a/html/changelogs/AutoChangeLog-pr-13647.yml b/html/changelogs/AutoChangeLog-pr-13647.yml
deleted file mode 100644
index b3211ee759..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13647.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - bugfix: "jacqueline spawns on boxstation"
diff --git a/html/changelogs/AutoChangeLog-pr-13648.yml b/html/changelogs/AutoChangeLog-pr-13648.yml
deleted file mode 100644
index 4148230385..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13648.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "The 'Your body is in a cloner' notification works again"
- - bugfix: "Hijack implants should work properly again (or, at least better)"
- - bugfix: "Liches are now good skeletons again instead of weak ones"
- - bugfix: "The piratepad control cannot be destroyed again."
- - bugfix: "Pirates have received new supplies of jetpacks instead of useless oxygen tanks"
- - bugfix: "Ratvarian AIs are once again able to show their linked borgs Ratvar's light"
- - bugfix: "Hijackers are once again unable to detonate borgs without being adjacent to the console"
- - bugfix: "Automated annoucement systems and gulag ore consoles no longer waste emag charges"
- - bugfix: "Automated announcement systems once again can be remote controlled by non-AIs with silicon access"
- - bugfix: "APCs being hijacked multiple times at once is no longer possible, preventing some issues"
diff --git a/html/changelogs/AutoChangeLog-pr-13653.yml b/html/changelogs/AutoChangeLog-pr-13653.yml
deleted file mode 100644
index 2f920da353..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13653.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Minor fixes to kilo"
diff --git a/html/changelogs/AutoChangeLog-pr-13654.yml b/html/changelogs/AutoChangeLog-pr-13654.yml
deleted file mode 100644
index cb67c6e6be..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13654.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ArchieBeepBoop"
-delete-after: True
-changes:
- - bugfix: "Jacqueen and the Christmas tree should no longer spawn abstract things that can cause shittons of runtimes."
diff --git a/html/changelogs/AutoChangeLog-pr-13655.yml b/html/changelogs/AutoChangeLog-pr-13655.yml
deleted file mode 100644
index 6e48c84054..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13655.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "fixes held items proccing crossed when passing someone"
diff --git a/html/changelogs/AutoChangeLog-pr-13656.yml b/html/changelogs/AutoChangeLog-pr-13656.yml
deleted file mode 100644
index 017f0d99c2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13656.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - admin: "Canceling events gives more time to stop from 10 to 30"
diff --git a/html/changelogs/AutoChangeLog-pr-13657.yml b/html/changelogs/AutoChangeLog-pr-13657.yml
deleted file mode 100644
index 6f445f6b71..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13657.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "The transmission sigil power drain works now"
diff --git a/html/changelogs/AutoChangeLog-pr-13658.yml b/html/changelogs/AutoChangeLog-pr-13658.yml
deleted file mode 100644
index 09b22d38ad..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13658.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Scripture no longer sometimes eats part of its invocation."
- - balance: "APCs and silicons are now more susceptible to powerdrains (by the power_drain() proc, which is rare)"
- - balance: "Void Volt has been modified from a chant to a singular pulse."
diff --git a/html/changelogs/AutoChangeLog-pr-13659.yml b/html/changelogs/AutoChangeLog-pr-13659.yml
deleted file mode 100644
index 85eee3b78d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13659.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "the load away mission verb won't crash the server now"
diff --git a/html/changelogs/AutoChangeLog-pr-13661.yml b/html/changelogs/AutoChangeLog-pr-13661.yml
deleted file mode 100644
index 81b5a735dc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13661.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "added in-game age verification as an alternative to access requests"
diff --git a/html/changelogs/AutoChangeLog-pr-13662.yml b/html/changelogs/AutoChangeLog-pr-13662.yml
deleted file mode 100644
index 6ac16937d8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13662.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscadd: "you can now be an angel using a magic mirror again"
diff --git a/html/changelogs/AutoChangeLog-pr-13669.yml b/html/changelogs/AutoChangeLog-pr-13669.yml
deleted file mode 100644
index c682500501..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13669.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - tweak: "Being sacrificed by the cult no longer removes all hope of rescue."
diff --git a/html/changelogs/AutoChangeLog-pr-13670.yml b/html/changelogs/AutoChangeLog-pr-13670.yml
deleted file mode 100644
index 594e459d5a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13670.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - tweak: "Floor bots are now buildable with all toolboxes."
diff --git a/html/changelogs/AutoChangeLog-pr-13671.yml b/html/changelogs/AutoChangeLog-pr-13671.yml
deleted file mode 100644
index 855028d9ed..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13671.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - code_imp: "Clockwork rites now support hiding specific rites from neutered servants."
diff --git a/html/changelogs/AutoChangeLog-pr-13673.yml b/html/changelogs/AutoChangeLog-pr-13673.yml
deleted file mode 100644
index 40b45d80f4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13673.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "Makes construct mind returning more robust"
diff --git a/html/changelogs/AutoChangeLog-pr-13674.yml b/html/changelogs/AutoChangeLog-pr-13674.yml
deleted file mode 100644
index ccbd96aeb4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13674.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "The borg VTEC ability now actually gets removed when the upgrade is removed."
diff --git a/html/changelogs/AutoChangeLog-pr-13675.yml b/html/changelogs/AutoChangeLog-pr-13675.yml
deleted file mode 100644
index d46d4490d3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13675.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Sleeper UI interactiveness now behaves correctly."
diff --git a/html/changelogs/AutoChangeLog-pr-13676.yml b/html/changelogs/AutoChangeLog-pr-13676.yml
deleted file mode 100644
index d584af38dc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13676.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Fixes a minor incorrectness in ratvarian borg slabs (ratvar_act -> ui_act)"
diff --git a/html/changelogs/AutoChangeLog-pr-13678.yml b/html/changelogs/AutoChangeLog-pr-13678.yml
deleted file mode 100644
index 261ecc3475..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13678.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - code_imp: "Comments out spaceman dmm do not sleeps for mob/proc/CommonClickOn, atom/proc/attack_hand, datum/proc/keyLoop and mob/living/proc/Life"
diff --git a/html/changelogs/AutoChangeLog-pr-13679.yml b/html/changelogs/AutoChangeLog-pr-13679.yml
deleted file mode 100644
index 37b9d287b0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13679.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - rscadd: "Robots (anyone with the robotic_organism trait) have toxins damage replaced with system corruption. See the PR for details."
diff --git a/html/changelogs/AutoChangeLog-pr-13680.yml b/html/changelogs/AutoChangeLog-pr-13680.yml
deleted file mode 100644
index a1e58ac3a5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13680.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "A runtime caused by hallucinations is gone."
diff --git a/html/changelogs/AutoChangeLog-pr-13681.yml b/html/changelogs/AutoChangeLog-pr-13681.yml
deleted file mode 100644
index c51a7b51b0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13681.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Supplypods shouldn't cause runtimes anymore, and shrapnel (pelletclouds) should work for them."
diff --git a/html/changelogs/AutoChangeLog-pr-13682.yml b/html/changelogs/AutoChangeLog-pr-13682.yml
deleted file mode 100644
index e5fececf4e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13682.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "EmeraldSundisk"
-delete-after: True
-changes:
- - bugfix: "Changes the area designations to be not varedited since the code didn't like that anymore"
- - bugfix: "The cargo bay conveyor belts not only work with the shuttle now but go in the right direction to boot"
- - tweak: "Slight visual adjustments to cargo in light of this"
- - rscadd: "The arcade's got RAD carpet now"
diff --git a/html/changelogs/AutoChangeLog-pr-13683.yml b/html/changelogs/AutoChangeLog-pr-13683.yml
deleted file mode 100644
index da7ecab5c6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13683.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SandPoot"
-delete-after: True
-changes:
- - code_imp: "Swaps the gift static blacklist with a global list one."
diff --git a/html/changelogs/AutoChangeLog-pr-13685.yml b/html/changelogs/AutoChangeLog-pr-13685.yml
deleted file mode 100644
index 10d53c9065..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13685.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "uomo91"
-delete-after: True
-changes:
- - bugfix: "Fixed \"Show All\" tab in player panel logs being broken."
- - bugfix: "Whispers, OOC, and various other things display differently in logs, visually distinguishing them from say logs."
- - refactor: "Player panel logs will now show all logs chronologically, so you'll see commingled say and attack logs if you're on the \"Show All\" tab, etc..."
diff --git a/html/changelogs/AutoChangeLog-pr-13686.yml b/html/changelogs/AutoChangeLog-pr-13686.yml
deleted file mode 100644
index 72f9a2bd54..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13686.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "Hopefully fixes whitescreen issues for TGUI UI's by giving assets more time to get to the client"
diff --git a/html/changelogs/AutoChangeLog-pr-13687.yml b/html/changelogs/AutoChangeLog-pr-13687.yml
deleted file mode 100644
index e2baddbd2a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13687.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscadd: "tailed individuals can now target groin to intertwine tails on grab intent."
diff --git a/html/changelogs/AutoChangeLog-pr-13688.yml b/html/changelogs/AutoChangeLog-pr-13688.yml
deleted file mode 100644
index 4013705549..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13688.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Repeatable surgery steps can no longer cause an infinite loop if not completing the do_after"
diff --git a/html/changelogs/AutoChangeLog-pr-13689.yml b/html/changelogs/AutoChangeLog-pr-13689.yml
deleted file mode 100644
index eb476895e7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13689.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Recharging APCs no longer use 0.2% of the power they should be using."
- - bugfix: "APCs no longer always use as much power as they can for their cell, even if it is full."
diff --git a/html/changelogs/AutoChangeLog-pr-13694.yml b/html/changelogs/AutoChangeLog-pr-13694.yml
deleted file mode 100644
index 75a4bbb549..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13694.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Acer202, with minor help from The0bserver"
-delete-after: True
-changes:
- - rscadd: "After internal deliberation, CentCom has decided to run a limited reinstatement of public mining shuttles for use in more tried and true station classes. CentCom would like to remind you that this privilege is easily revoked, and that abuse may result in immediate detonation."
- - rscadd: "Restores the mining shuttle on Pubby, Box, Delta, Meta, and Lambda Station."
diff --git a/html/changelogs/AutoChangeLog-pr-13695.yml b/html/changelogs/AutoChangeLog-pr-13695.yml
deleted file mode 100644
index 551d1f4df5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13695.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - balance: "Lings now have infinite space for DNA."
diff --git a/html/changelogs/AutoChangeLog-pr-13697.yml b/html/changelogs/AutoChangeLog-pr-13697.yml
deleted file mode 100644
index 329a621c48..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13697.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - balance: "Spontaneous brain trauma now requires minimum 5 players"
diff --git a/html/changelogs/AutoChangeLog-pr-13698.yml b/html/changelogs/AutoChangeLog-pr-13698.yml
deleted file mode 100644
index 10072ba948..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13698.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "you can rebind communication hotkeys and they're the default now"
diff --git a/html/changelogs/AutoChangeLog-pr-13699.yml b/html/changelogs/AutoChangeLog-pr-13699.yml
deleted file mode 100644
index 5b2234224e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13699.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "nanite resistances tweaked"
- - rscadd: "new nanite programs added for locking the user out from being modified by consoles or antivirals."
diff --git a/html/changelogs/AutoChangeLog-pr-13702.yml b/html/changelogs/AutoChangeLog-pr-13702.yml
deleted file mode 100644
index 24f79c7cda..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13702.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "gear harness no longer magically covers up the body mechanically despite covering up nothing visually"
diff --git a/html/changelogs/AutoChangeLog-pr-13703.yml b/html/changelogs/AutoChangeLog-pr-13703.yml
deleted file mode 100644
index fd3ba2198f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13703.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Dynamic vote no longer shows the none-storyteller."
diff --git a/html/changelogs/AutoChangeLog-pr-13704.yml b/html/changelogs/AutoChangeLog-pr-13704.yml
deleted file mode 100644
index 0ef8ca4a1d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13704.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Emotes can properly be filtered for in TGUI."
diff --git a/html/changelogs/AutoChangeLog-pr-13705.yml b/html/changelogs/AutoChangeLog-pr-13705.yml
deleted file mode 100644
index c1b366aeb7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13705.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - balance: "Rad collectors now get 1.25x as much energy from radiation"
- - balance: "Rad collectors now put out 1.25x as much stored energy per tick"
- - balance: "Above two rad collector changes give a total 56.25% power output increase"
diff --git a/html/changelogs/AutoChangeLog-pr-13707.yml b/html/changelogs/AutoChangeLog-pr-13707.yml
deleted file mode 100644
index a7dd977cca..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13707.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - balance: "Robotpeople are now fully immune to the effects of alcohol (drunkness etc.)"
- - tweak: "Renames the alcohol intolerance trait in the code to make what it does more clear."
diff --git a/html/changelogs/AutoChangeLog-pr-13711.yml b/html/changelogs/AutoChangeLog-pr-13711.yml
deleted file mode 100644
index e6fde23e8c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13711.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - tweak: "Medibots now ignore people they cannot help due to their biology."
- - bugfix: "get_damaged_bodyparts() is no longer broken."
diff --git a/html/changelogs/AutoChangeLog-pr-13713.yml b/html/changelogs/AutoChangeLog-pr-13713.yml
deleted file mode 100644
index 36228f10c5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13713.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "all gas masks (but welding + glass) can be alt clicked to show/hide identity"
diff --git a/html/changelogs/AutoChangeLog-pr-13715.yml b/html/changelogs/AutoChangeLog-pr-13715.yml
deleted file mode 100644
index 70b22a9bc9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13715.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Removes an opposum from the wall"
diff --git a/html/changelogs/AutoChangeLog-pr-13717.yml b/html/changelogs/AutoChangeLog-pr-13717.yml
deleted file mode 100644
index 268730c58e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13717.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Acer202"
-delete-after: True
-changes:
- - bugfix: "Main mining shuttle should no longer look at the public mining shuttle and attempt to dock ontop of it. Monastery shuttle should now function again."
diff --git a/html/changelogs/AutoChangeLog-pr-13719.yml b/html/changelogs/AutoChangeLog-pr-13719.yml
deleted file mode 100644
index c676072a35..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13719.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - rscadd: "Construction bags have been added, use them to carry all sorts of construction bits."
- - rscadd: "A recipe has been added to cloth stacks to make material and construction bags."
- - balance: "Material bags and construction bags are now available in engineering lockers."
diff --git a/html/changelogs/AutoChangeLog-pr-13721.yml b/html/changelogs/AutoChangeLog-pr-13721.yml
deleted file mode 100644
index 44b3c7283c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13721.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Increased christmas event from 22th to 27th to 10th to 27th"
diff --git a/html/changelogs/AutoChangeLog-pr-13725.yml b/html/changelogs/AutoChangeLog-pr-13725.yml
deleted file mode 100644
index 5105de865e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13725.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - bugfix: "keybinds generate anti-collision bindings where necessary automatically now"
diff --git a/html/changelogs/AutoChangeLog-pr-13733.yml b/html/changelogs/AutoChangeLog-pr-13733.yml
deleted file mode 100644
index a10719fdc6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13733.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Fixes the tail entwine messages displaying incorrectly."
diff --git a/html/changelogs/AutoChangeLog-pr-13734.yml b/html/changelogs/AutoChangeLog-pr-13734.yml
deleted file mode 100644
index a4ea9fdfac..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13734.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - bugfix: "Fixes Reflective Blobs"
diff --git a/html/changelogs/AutoChangeLog-pr-13736.yml b/html/changelogs/AutoChangeLog-pr-13736.yml
deleted file mode 100644
index dfa5e7cb66..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13736.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - tweak: "Abductors now can use experimental organ replacement surgery on robots / synthetics."
diff --git a/html/changelogs/AutoChangeLog-pr-13737.yml b/html/changelogs/AutoChangeLog-pr-13737.yml
deleted file mode 100644
index 6c1121256f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13737.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "qwertyquerty"
-delete-after: True
-changes:
- - bugfix: "Flash the screen on climax"
diff --git a/html/changelogs/AutoChangeLog-pr-13738.yml b/html/changelogs/AutoChangeLog-pr-13738.yml
deleted file mode 100644
index f34f9d505a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13738.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "EdgeLordExe, MoonFalcon"
-delete-after: True
-changes:
- - balance: "Ported a bunch of heretic-related tweaks and changes from tg"
diff --git a/html/changelogs/AutoChangeLog-pr-13739.yml b/html/changelogs/AutoChangeLog-pr-13739.yml
deleted file mode 100644
index 6db29bf922..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13739.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "custom eyes and tongues now properly carry across cloning"
diff --git a/html/changelogs/AutoChangeLog-pr-13740.yml b/html/changelogs/AutoChangeLog-pr-13740.yml
deleted file mode 100644
index 2bbd9b877a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13740.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Linzolle"
-delete-after: True
-changes:
- - bugfix: "lizard snouts are no longer *slightly* lighter than they are supposed to be."
diff --git a/html/changelogs/AutoChangeLog-pr-13741.yml b/html/changelogs/AutoChangeLog-pr-13741.yml
deleted file mode 100644
index c49015ab28..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13741.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Objectives are no longer very broken."
diff --git a/html/changelogs/AutoChangeLog-pr-13743.yml b/html/changelogs/AutoChangeLog-pr-13743.yml
deleted file mode 100644
index 00ff1a55bd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13743.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Linzolle"
-delete-after: True
-changes:
- - bugfix: "entertainment monitors no longer invisible"
- - rscadd: "entertainment monitors now light up and display text when motion is detected in thunderdome"
diff --git a/html/changelogs/AutoChangeLog-pr-13745.yml b/html/changelogs/AutoChangeLog-pr-13745.yml
deleted file mode 100644
index af6cb787b6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13745.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "Handles more edge cases with construct soul returning"
diff --git a/html/changelogs/AutoChangeLog-pr-13746.yml b/html/changelogs/AutoChangeLog-pr-13746.yml
deleted file mode 100644
index 73c7ab4058..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13746.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - rscadd: "Adds more room to northwest maint"
- - rscadd: "Adds a bridge between Atmos and the Turbine."
diff --git a/html/changelogs/AutoChangeLog-pr-13747.yml b/html/changelogs/AutoChangeLog-pr-13747.yml
deleted file mode 100644
index f8b6111c08..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13747.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - rscadd: ""
- - tweak: "Added the ability for cargo to buy a large welding tank"
- - imageadd: "Tweaked large tank reagent sprites to /tg/'s"
diff --git a/html/changelogs/AutoChangeLog-pr-13750.yml b/html/changelogs/AutoChangeLog-pr-13750.yml
deleted file mode 100644
index a89abdd440..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13750.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "EmeraldSundisk"
-delete-after: True
-changes:
- - bugfix: "Fixes the conveyor belt issues in Delta Station's cargo wing"
- - rscdel: "Removes some of the dirt around the affected area (presumably they would have cleaned it up while working on it)"
- - rscadd: "Adds a floor light to fix the \"dark spot\" cargo had"
diff --git a/html/changelogs/AutoChangeLog-pr-13751.yml b/html/changelogs/AutoChangeLog-pr-13751.yml
deleted file mode 100644
index 2d8c964a14..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13751.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "text formatting now uses one character instead of two around the text to emphasize."
diff --git a/html/changelogs/AutoChangeLog-pr-13752.yml b/html/changelogs/AutoChangeLog-pr-13752.yml
deleted file mode 100644
index 2175ed469b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13752.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - balance: "stamina crit is only removed when at or under 100 stamina, rather than 140. stamina crit threshold is still at 140."
diff --git a/html/changelogs/AutoChangeLog-pr-13753.yml b/html/changelogs/AutoChangeLog-pr-13753.yml
deleted file mode 100644
index e752df79a0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13753.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - balance: "shoving yourself up now costs 50% more"
diff --git a/html/changelogs/AutoChangeLog-pr-13755.yml b/html/changelogs/AutoChangeLog-pr-13755.yml
deleted file mode 100644
index e50cd0199f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13755.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscadd: "colormates"
diff --git a/html/changelogs/AutoChangeLog-pr-13757.yml b/html/changelogs/AutoChangeLog-pr-13757.yml
deleted file mode 100644
index a36e67943e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13757.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "improvements to the automatic age gate"
diff --git a/html/changelogs/AutoChangeLog-pr-13758.yml b/html/changelogs/AutoChangeLog-pr-13758.yml
deleted file mode 100644
index fc4adc1614..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13758.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "custom holoforms are now accessible through an action instead of through verbs"
- - tweak: "AI holoforms can now emote"
diff --git a/html/changelogs/AutoChangeLog-pr-13761.yml b/html/changelogs/AutoChangeLog-pr-13761.yml
deleted file mode 100644
index c8ab365fe3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13761.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - balance: "dna melt drops all items being destroying you"
diff --git a/html/changelogs/AutoChangeLog-pr-13762.yml b/html/changelogs/AutoChangeLog-pr-13762.yml
deleted file mode 100644
index 841e4d91c0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13762.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "luxury shuttle no longer has noteleport"
diff --git a/html/changelogs/AutoChangeLog-pr-13763.yml b/html/changelogs/AutoChangeLog-pr-13763.yml
deleted file mode 100644
index 68eeaf1022..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13763.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - tweak: "RPEDs now drop their lowest part tier first when quick-emptied (used inhand)."
diff --git a/html/changelogs/AutoChangeLog-pr-13764.yml b/html/changelogs/AutoChangeLog-pr-13764.yml
deleted file mode 100644
index 514705fd78..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13764.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - tweak: "Exosuits sold on the Supply shuttle no longer leave wreckages."
diff --git a/html/changelogs/AutoChangeLog-pr-13765.yml b/html/changelogs/AutoChangeLog-pr-13765.yml
deleted file mode 100644
index 7ca1695d0f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13765.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Updated jukebox sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-13766.yml b/html/changelogs/AutoChangeLog-pr-13766.yml
deleted file mode 100644
index 8ba317afed..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13766.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Updates our dark gygax sprites to /tg/'s"
diff --git a/html/changelogs/AutoChangeLog-pr-13767.yml b/html/changelogs/AutoChangeLog-pr-13767.yml
deleted file mode 100644
index 2d38af77e3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13767.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Updated meat icons"
diff --git a/html/changelogs/AutoChangeLog-pr-13769.yml b/html/changelogs/AutoChangeLog-pr-13769.yml
deleted file mode 100644
index 04d1cbc11c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13769.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - rscadd: "Adds a goose bar sign"
diff --git a/html/changelogs/AutoChangeLog-pr-13771.yml b/html/changelogs/AutoChangeLog-pr-13771.yml
deleted file mode 100644
index e450508681..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13771.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Donut boxes show what's inside of them now"
diff --git a/html/changelogs/AutoChangeLog-pr-13772.yml b/html/changelogs/AutoChangeLog-pr-13772.yml
deleted file mode 100644
index 109360cace..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13772.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscadd: "players can now respawn/return to lobby as a ghost after a 15 minute (default) delay and rejoin on another character with some/many restrictions"
- - rscadd: "cryo now preserves everything"
diff --git a/html/changelogs/AutoChangeLog-pr-13773.yml b/html/changelogs/AutoChangeLog-pr-13773.yml
deleted file mode 100644
index 498ac42561..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13773.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - tweak: "Zeolites now use gold rather then uranium for catalyst"
- - tweak: "Zeolites are not as hard to make ph wise"
- - tweak: "Making Zeolites heats up the beaker less allowing for better control"
diff --git a/html/changelogs/AutoChangeLog-pr-13774.yml b/html/changelogs/AutoChangeLog-pr-13774.yml
deleted file mode 100644
index ea3af475f2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13774.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - rscadd: "Re-adds the Clown Car to the clown uplink"
- - balance: "15 >16 TC cost"
- - balance: "bonks on external airlocks"
diff --git a/html/changelogs/AutoChangeLog-pr-13776.yml b/html/changelogs/AutoChangeLog-pr-13776.yml
deleted file mode 100644
index 773aae9745..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13776.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - tweak: "AIs now only have to kill people once instead of permanently."
diff --git a/html/changelogs/AutoChangeLog-pr-13777.yml b/html/changelogs/AutoChangeLog-pr-13777.yml
deleted file mode 100644
index 0013a93ef5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13777.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "The Grinch"
-delete-after: True
-changes:
- - rscdel: "infinite presents from hilbert hotel"
diff --git a/html/changelogs/AutoChangeLog-pr-13784.yml b/html/changelogs/AutoChangeLog-pr-13784.yml
deleted file mode 100644
index df8cf7ad57..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13784.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - bugfix: "Effects can no longer trigger landmines"
diff --git a/html/changelogs/AutoChangeLog-pr-13785.yml b/html/changelogs/AutoChangeLog-pr-13785.yml
deleted file mode 100644
index 973fb3f74e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13785.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "Grab bag works as advertised."
- - balance: "Xeno threat in dynamic tripled."
diff --git a/html/changelogs/AutoChangeLog-pr-13790.yml b/html/changelogs/AutoChangeLog-pr-13790.yml
deleted file mode 100644
index 45ebf00ee7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13790.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Replaced engineering fuel tank with a large fuel tank"
- - tweak: "Changed access to sec suit storage from armory access in every map to other security access"
diff --git a/html/changelogs/AutoChangeLog-pr-13796.yml b/html/changelogs/AutoChangeLog-pr-13796.yml
deleted file mode 100644
index 827cbf7443..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13796.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - rscadd: "Adds a reduced stamina buffer for SCarp users"
- - rscadd: "Gives SCarp users a better parry"
- - rscadd: "Adds the SCarp bundle which includes a bo staff"
- - rscadd: "Lets Carp costumes carry Bo Staffs"
- - balance: "reduces the stamina damage of scarp slightly"
- - balance: "reduced the blockchance of the bo staff"
diff --git a/html/changelogs/AutoChangeLog-pr-13799.yml b/html/changelogs/AutoChangeLog-pr-13799.yml
deleted file mode 100644
index 4f8168aa45..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13799.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - bugfix: "ninja gloves no longer hardstun"
- - balance: "ninja gloves now cost half as much to use to compensate"
diff --git a/html/changelogs/AutoChangeLog-pr-13801.yml b/html/changelogs/AutoChangeLog-pr-13801.yml
deleted file mode 100644
index e33b6f4056..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13801.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SandPoot"
-delete-after: True
-changes:
- - refactor: "Changes the limb grower a lot."
- - bugfix: "\"Limb\" costs on limbgrower are actually displayed like it was meant to all along."
diff --git a/html/changelogs/AutoChangeLog-pr-13803.yml b/html/changelogs/AutoChangeLog-pr-13803.yml
deleted file mode 100644
index 68791ea87a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13803.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - balance: "The traitor AI can no longer activate the doomsday device while carded."
diff --git a/html/changelogs/AutoChangeLog-pr-13804.yml b/html/changelogs/AutoChangeLog-pr-13804.yml
deleted file mode 100644
index 6b6d56dc5c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13804.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "circuits get pin data proc is sanitized when text is returned as data"
diff --git a/html/changelogs/AutoChangeLog-pr-13808.yml b/html/changelogs/AutoChangeLog-pr-13808.yml
deleted file mode 100644
index fc97da6161..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13808.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "You can now exit polycircuit input"
- - bugfix: "Polycircuits now check for range"
diff --git a/html/changelogs/AutoChangeLog-pr-13809.yml b/html/changelogs/AutoChangeLog-pr-13809.yml
deleted file mode 100644
index d63ee33ff1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13809.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "Gear harness now covers nothing."
diff --git a/html/changelogs/AutoChangeLog-pr-13811.yml b/html/changelogs/AutoChangeLog-pr-13811.yml
deleted file mode 100644
index da2691d8f5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13811.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlackMajor"
-delete-after: True
-changes:
- - tweak: "Cyborg hypospray no longer injects if it means OD'ing while on help intent."
diff --git a/html/changelogs/AutoChangeLog-pr-13813.yml b/html/changelogs/AutoChangeLog-pr-13813.yml
deleted file mode 100644
index ce283eb788..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13813.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "command headsets are 120% instead of 160%"
- - bugfix: "no more emote italics"
diff --git a/html/changelogs/AutoChangeLog-pr-13814.yml b/html/changelogs/AutoChangeLog-pr-13814.yml
deleted file mode 100644
index 9bd0be5ac0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13814.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xantholne"
-delete-after: True
-changes:
- - bugfix: "Twin Sword Sheaths have an equipment icon and icon when worn now and make a sound when sheathed/unsheathed"
diff --git a/html/changelogs/AutoChangeLog-pr-13815.yml b/html/changelogs/AutoChangeLog-pr-13815.yml
deleted file mode 100644
index 630ca9d7f7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13815.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Yakumo Chen"
-delete-after: True
-changes:
- - balance: "Slime Jelly is no longer obtainable from slimepeople. Go ask Xenobio"
diff --git a/html/changelogs/AutoChangeLog-pr-13819.yml b/html/changelogs/AutoChangeLog-pr-13819.yml
deleted file mode 100644
index 77b1ec9a3d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13819.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - bugfix: "The survival dagger light on the sprite now actually turns on and off."
- - balance: "The survival dagger in the glaive kit that can also be bought by itself is now better at butchering things."
diff --git a/html/changelogs/AutoChangeLog-pr-13822.yml b/html/changelogs/AutoChangeLog-pr-13822.yml
deleted file mode 100644
index 743bdb500b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13822.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Bloodcult stunhands now work against clockies like they were supposed to instead of hardstunning."
diff --git a/html/changelogs/AutoChangeLog-pr-13823.yml b/html/changelogs/AutoChangeLog-pr-13823.yml
deleted file mode 100644
index 35d70339f7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13823.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Christmas starts on the 18th now"
diff --git a/html/changelogs/AutoChangeLog-pr-13825.yml b/html/changelogs/AutoChangeLog-pr-13825.yml
deleted file mode 100644
index ae82c1cd8e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13825.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "raspy-on-osu"
-delete-after: True
-changes:
- - tweak: "windoor open length"
diff --git a/html/changelogs/AutoChangeLog-pr-13828.yml b/html/changelogs/AutoChangeLog-pr-13828.yml
deleted file mode 100644
index 282b8a01e0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13828.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "you can now only entwine tails with people who have a tail"
diff --git a/html/changelogs/AutoChangeLog-pr-13830.yml b/html/changelogs/AutoChangeLog-pr-13830.yml
deleted file mode 100644
index c126670246..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13830.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "apids render now"
diff --git a/html/changelogs/AutoChangeLog-pr-13832.yml b/html/changelogs/AutoChangeLog-pr-13832.yml
deleted file mode 100644
index 756edb7657..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13832.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "Bloodsuckers tresspass ability can no longer work while they are not awake."
diff --git a/html/changelogs/AutoChangeLog-pr-13833.yml b/html/changelogs/AutoChangeLog-pr-13833.yml
deleted file mode 100644
index 8312c7a5a3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13833.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kiwedespars"
-delete-after: True
-changes:
- - balance: "balanced bone gauntlets."
diff --git a/html/changelogs/AutoChangeLog-pr-13834.yml b/html/changelogs/AutoChangeLog-pr-13834.yml
deleted file mode 100644
index 46cedff5d5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13834.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - rscadd: "Traitor assistants can now purchase the patented POGBox! Put TC into it for even higher damage!"
diff --git a/html/changelogs/AutoChangeLog-pr-13835.yml b/html/changelogs/AutoChangeLog-pr-13835.yml
deleted file mode 100644
index 0ac90921c3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13835.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscadd: "pugilists can now parry"
diff --git a/html/changelogs/AutoChangeLog-pr-13837.yml b/html/changelogs/AutoChangeLog-pr-13837.yml
deleted file mode 100644
index eda0b77a83..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13837.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "anyone new to the server is lucky enough to have their sprint default to toggle instead of hold"
diff --git a/html/changelogs/AutoChangeLog-pr-13838.yml b/html/changelogs/AutoChangeLog-pr-13838.yml
deleted file mode 100644
index deff5913b3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13838.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - bugfix: "things in DEATHCOMA do not deathgasp on death"
diff --git a/html/changelogs/AutoChangeLog-pr-13844.yml b/html/changelogs/AutoChangeLog-pr-13844.yml
deleted file mode 100644
index cd1f7a25d4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13844.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "Fixes the mint machine's UI"
diff --git a/html/changelogs/AutoChangeLog-pr-13845.yml b/html/changelogs/AutoChangeLog-pr-13845.yml
deleted file mode 100644
index d10485ae9f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13845.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - bugfix: "dullahans enabled"
diff --git a/html/changelogs/AutoChangeLog-pr-13846.yml b/html/changelogs/AutoChangeLog-pr-13846.yml
deleted file mode 100644
index 68e013acf0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13846.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - balance: "Fleshmend, Anatomic Panacea and bloodsucker healing now work for Synths / IPCs."
diff --git a/html/changelogs/AutoChangeLog-pr-13850.yml b/html/changelogs/AutoChangeLog-pr-13850.yml
deleted file mode 100644
index 64c47ade40..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13850.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Self-fueling weldingtools recharge fuel properly again."
- - bugfix: "Brass welders now actually recharge faster than experimental ones."
diff --git a/html/changelogs/AutoChangeLog-pr-13855.yml b/html/changelogs/AutoChangeLog-pr-13855.yml
deleted file mode 100644
index 0eed195acd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13855.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Chiirno"
-delete-after: True
-changes:
- - rscadd: "Paramedics office and Surgery Storage Room"
- - tweak: "Remodeled the surgery room, as well as shrunk Morgue and Starboard Emergency Storage.
-Fiddled with some areas for better map edit clarity and fixed one runtime in Vacant Office A."
- - imageadd: "Added the paramedic closet sprite, a paramedic colored medical3 closet."
- - code_imp: "Added a paramedic closet, which is the standard medical3 closet with their suit, a pinpointer, and a crew monitor added."
diff --git a/html/changelogs/AutoChangeLog-pr-13856.yml b/html/changelogs/AutoChangeLog-pr-13856.yml
deleted file mode 100644
index 583fb38cc2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13856.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "gear harness alt-click is now sane"
- - code_imp: "rolldown() and toggle_jumpsuit_adjust() now no longer mix behavior-that-should-be-overridden and behavior-that-shouldn't-be-overridden in ways that make no sense."
diff --git a/html/changelogs/AutoChangeLog-pr-13859.yml b/html/changelogs/AutoChangeLog-pr-13859.yml
deleted file mode 100644
index 2d6dc5c25a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13859.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "adds unlockable loadout items, corresponding category in loadouts, etc"
diff --git a/html/changelogs/AutoChangeLog-pr-13867.yml b/html/changelogs/AutoChangeLog-pr-13867.yml
deleted file mode 100644
index dd1e44e64c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13867.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - balance: "Zeolites now only generate 1/5 the heat when reacting and don't require a catalyst."
diff --git a/html/changelogs/AutoChangeLog-pr-13869.yml b/html/changelogs/AutoChangeLog-pr-13869.yml
deleted file mode 100644
index 5d4ca4817c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13869.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "slime puddles are no longer layered down one layer"
- - tweak: "you cannot tackle with two paralysed arms"
- - tweak: "tackling with a single paralysed arm lowers your tackle roll by 2"
diff --git a/html/changelogs/AutoChangeLog-pr-13870.yml b/html/changelogs/AutoChangeLog-pr-13870.yml
deleted file mode 100644
index 820c524224..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13870.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - bugfix: "Magrifle ammo no longer glows."
diff --git a/html/changelogs/AutoChangeLog-pr-13871.yml b/html/changelogs/AutoChangeLog-pr-13871.yml
deleted file mode 100644
index f667abe816..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13871.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "NT Cleaning Crews On Break"
-delete-after: True
-changes:
- - rscadd: "Most kinds of dirt, grime, and debris are now persistent. Get to work, jannies."
- - rscadd: "Dirt can now be removed by tile replacements. Other cleanable decals can't, though."
diff --git a/html/changelogs/AutoChangeLog-pr-13873.yml b/html/changelogs/AutoChangeLog-pr-13873.yml
deleted file mode 100644
index 320a5b69a4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13873.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - tweak: "Nyctophobia quirk now has some light lag compensation."
diff --git a/html/changelogs/AutoChangeLog-pr-13881.yml b/html/changelogs/AutoChangeLog-pr-13881.yml
deleted file mode 100644
index 0ad2d3afc8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13881.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - rscadd: "PubbyStation now has two Christmas Tree spawners."
diff --git a/html/changelogs/AutoChangeLog-pr-13882.yml b/html/changelogs/AutoChangeLog-pr-13882.yml
deleted file mode 100644
index fe545bdc23..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13882.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ERP mains"
-delete-after: True
-changes:
- - rscadd: "Subtler Around Table is now a verb"
diff --git a/html/changelogs/AutoChangeLog-pr-13883.yml b/html/changelogs/AutoChangeLog-pr-13883.yml
deleted file mode 100644
index 884adafffe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13883.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscadd: "set-pose has been added"
- - tweak: "temporary flavor text renamed to set pose, fully visible in examine"
diff --git a/html/changelogs/AutoChangeLog-pr-13884.yml b/html/changelogs/AutoChangeLog-pr-13884.yml
deleted file mode 100644
index f2b9233690..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13884.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "The dock-silver standard set by Box and Meta has been enforced across maps in rotation (Delta, Pubby, Lambda)."
- - bugfix: "The Box whiteship now has its missing tiny fan back."
diff --git a/html/changelogs/AutoChangeLog-pr-13885.yml b/html/changelogs/AutoChangeLog-pr-13885.yml
deleted file mode 100644
index 88c23d30f1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13885.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "raspy-on-osu"
-delete-after: True
-changes:
- - tweak: "space heater heating range and power"
diff --git a/html/changelogs/AutoChangeLog-pr-13887.yml b/html/changelogs/AutoChangeLog-pr-13887.yml
deleted file mode 100644
index 83069a4e64..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13887.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "HeroWithYay"
-delete-after: True
-changes:
- - bugfix: "Changed description of Necrotizing Fasciitis symptom."
diff --git a/html/changelogs/AutoChangeLog-pr-13892.yml b/html/changelogs/AutoChangeLog-pr-13892.yml
deleted file mode 100644
index 976b395826..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13892.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - balance: "changeling combat mutations rebalanced. most of them take chemicals to upkeep now."
diff --git a/html/changelogs/AutoChangeLog-pr-13893.yml b/html/changelogs/AutoChangeLog-pr-13893.yml
deleted file mode 100644
index 9eb7a3f79d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13893.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "Meth and changeling adrenals no longer ignore all slowdowns, rather damage slowdowns."
diff --git a/html/changelogs/AutoChangeLog-pr-13894.yml b/html/changelogs/AutoChangeLog-pr-13894.yml
deleted file mode 100644
index 31e1e66328..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13894.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "temperature slowdown divisor nerfed to 35 from 20."
diff --git a/html/changelogs/AutoChangeLog-pr-13896.yml b/html/changelogs/AutoChangeLog-pr-13896.yml
deleted file mode 100644
index f733efa09d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13896.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Sonic121x"
-delete-after: True
-changes:
- - rscadd: "alarm ert hardsuit sprite for naga and canine"
- - tweak: "adjust the naga ert hardsuit to cover the hand"
- - bugfix: "cydonia hardsuit helmet"
diff --git a/html/changelogs/AutoChangeLog-pr-13897.yml b/html/changelogs/AutoChangeLog-pr-13897.yml
deleted file mode 100644
index 05637b0908..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13897.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - bugfix: "Allows Energy Bola to be caught"
- - balance: "This also allows them to be dropped/picked up."
diff --git a/html/changelogs/AutoChangeLog-pr-13898.yml b/html/changelogs/AutoChangeLog-pr-13898.yml
deleted file mode 100644
index cb4e0fd52d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13898.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - balance: "Regen coma now puts into a coma even from crit or while unconscious."
- - bugfix: "Regen coma now properly weakens while asleep."
diff --git a/html/changelogs/AutoChangeLog-pr-13900.yml b/html/changelogs/AutoChangeLog-pr-13900.yml
deleted file mode 100644
index a25c8af1ed..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13900.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xantholne"
-delete-after: True
-changes:
- - rscadd: "New parrots from the RP server, can be found in Bird Crate in Cargo"
diff --git a/html/changelogs/AutoChangeLog-pr-13902.yml b/html/changelogs/AutoChangeLog-pr-13902.yml
deleted file mode 100644
index ca548d816f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13902.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "avian/digitigrade legs have been added for slimes"
diff --git a/html/changelogs/AutoChangeLog-pr-13903.yml b/html/changelogs/AutoChangeLog-pr-13903.yml
deleted file mode 100644
index fd66c4b0c6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13903.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Changelings no longer double-deathgasp when activating the regen stasis ability while not dead."
diff --git a/html/changelogs/AutoChangeLog-pr-13904.yml b/html/changelogs/AutoChangeLog-pr-13904.yml
deleted file mode 100644
index 90f7d77e17..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13904.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - tweak: "Instant summons can no longer do wacky stuff with disposals (and nukes)."
diff --git a/html/changelogs/AutoChangeLog-pr-13905.yml b/html/changelogs/AutoChangeLog-pr-13905.yml
deleted file mode 100644
index 16b464bc20..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13905.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - imageadd: "cool codex cicatrix inhands"
diff --git a/html/changelogs/AutoChangeLog-pr-13909.yml b/html/changelogs/AutoChangeLog-pr-13909.yml
deleted file mode 100644
index e4f0f1e401..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13909.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - rscadd: "Twitch Plays: Clown Car"
diff --git a/html/changelogs/AutoChangeLog-pr-13911.yml b/html/changelogs/AutoChangeLog-pr-13911.yml
deleted file mode 100644
index 9e96103b2b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13911.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "raspy-on-osu"
-delete-after: True
-changes:
- - spellcheck: "salicylic acid"
diff --git a/html/changelogs/AutoChangeLog-pr-13913.yml b/html/changelogs/AutoChangeLog-pr-13913.yml
deleted file mode 100644
index a25e054a6f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13913.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - bugfix: "Fixes the parry data for scarp"
diff --git a/html/changelogs/AutoChangeLog-pr-13914.yml b/html/changelogs/AutoChangeLog-pr-13914.yml
deleted file mode 100644
index b9efe2a893..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13914.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "EmeraldSundisk"
-delete-after: True
-changes:
- - rscadd: "Adds a few new area designations primarily for CogStation, incorporates them into said map"
- - tweak: "Reorganizes some area designations for ease of use, along with renaming the central \"Router\" to \"Routing Depot\""
- - bugfix: "Fixes an incorrectly designated area in CogStation"
diff --git a/html/changelogs/AutoChangeLog-pr-13915.yml b/html/changelogs/AutoChangeLog-pr-13915.yml
deleted file mode 100644
index 2853dcb9ad..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13915.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xantholne"
-delete-after: True
-changes:
- - bugfix: "Fixed new birds changing back to basic parrot when sitting"
diff --git a/html/changelogs/AutoChangeLog-pr-13916.yml b/html/changelogs/AutoChangeLog-pr-13916.yml
deleted file mode 100644
index 0ec04707a5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13916.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "re-adds the holoform verb for people who want to use it over going through the char list"
diff --git a/html/changelogs/AutoChangeLog-pr-13917.yml b/html/changelogs/AutoChangeLog-pr-13917.yml
deleted file mode 100644
index 5eabd640f7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13917.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "*squeak"
diff --git a/html/changelogs/AutoChangeLog-pr-13924.yml b/html/changelogs/AutoChangeLog-pr-13924.yml
deleted file mode 100644
index 71092c567d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13924.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SandPoot"
-delete-after: True
-changes:
- - tweak: "You can attack a pile of money on the floor with your id to put it all in quickly."
diff --git a/html/changelogs/AutoChangeLog-pr-13926.yml b/html/changelogs/AutoChangeLog-pr-13926.yml
deleted file mode 100644
index 4e92bacdb4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13926.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - rscdel: "Removes the screen flashing on climax."
diff --git a/html/changelogs/AutoChangeLog-pr-13930.yml b/html/changelogs/AutoChangeLog-pr-13930.yml
deleted file mode 100644
index 282f3fa30a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13930.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Small fixes on security on boxstation"
diff --git a/html/changelogs/AutoChangeLog-pr-13931.yml b/html/changelogs/AutoChangeLog-pr-13931.yml
deleted file mode 100644
index fd903f2d6e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13931.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - rscadd: "Adds the disposable sentry gun from tg for 11tc each."
diff --git a/html/changelogs/AutoChangeLog-pr-13932.yml b/html/changelogs/AutoChangeLog-pr-13932.yml
deleted file mode 100644
index 955d9f5741..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13932.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - tweak: "Xenomorph powers now list plasma cost in their description."
diff --git a/html/changelogs/AutoChangeLog-pr-13934.yml b/html/changelogs/AutoChangeLog-pr-13934.yml
deleted file mode 100644
index 74f8ece6fc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13934.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - rscadd: "The bluespace navigation gigabeacon design has been added to shuttle research for those wanting to take their ships around space more."
diff --git a/html/changelogs/AutoChangeLog-pr-13936.yml b/html/changelogs/AutoChangeLog-pr-13936.yml
deleted file mode 100644
index 9b15d2232a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13936.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - bugfix: "Polychromic hoodies that were obtained from the loadout have functional colorable hoods now."
diff --git a/html/changelogs/AutoChangeLog-pr-13938.yml b/html/changelogs/AutoChangeLog-pr-13938.yml
deleted file mode 100644
index 34d76a190b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13938.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "anthromorphic synth species"
diff --git a/html/changelogs/AutoChangeLog-pr-13940.yml b/html/changelogs/AutoChangeLog-pr-13940.yml
deleted file mode 100644
index 60cbcc9a19..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13940.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Chiirno"
-delete-after: True
-changes:
- - rscadd: "Added the paramedics EVA suit as a purchase from the cargo console."
diff --git a/html/changelogs/AutoChangeLog-pr-13941.yml b/html/changelogs/AutoChangeLog-pr-13941.yml
deleted file mode 100644
index 5a72376ebb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13941.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Chiirno"
-delete-after: True
-changes:
- - bugfix: "Portable Chem Mixer now researchable from biotech node."
diff --git a/html/changelogs/AutoChangeLog-pr-13943.yml b/html/changelogs/AutoChangeLog-pr-13943.yml
deleted file mode 100644
index 405d6b0d93..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13943.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - spellcheck: "Utility uniforms now comply with the \"nonproper equipment names\" thing."
- - bugfix: "The CapDrobe now allows the captain to get his own clothes for free. Probably."
- - tweak: "All captains' clothes now offer 15 woundarmor, up from the 5. Because apparently only the suit and tie and its suitskirt subtype have this wound armor, which is dumb."
diff --git a/html/changelogs/AutoChangeLog-pr-13945.yml b/html/changelogs/AutoChangeLog-pr-13945.yml
deleted file mode 100644
index 91b8bb9498..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13945.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - rscadd: "IPC cells & power cords are now printable after they are researched."
diff --git a/html/changelogs/AutoChangeLog-pr-13946.yml b/html/changelogs/AutoChangeLog-pr-13946.yml
deleted file mode 100644
index d7f3e15024..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13946.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ryll/Shaps"
-delete-after: True
-changes:
- - admin: "Fixed an issue with player logs becoming confused when someone triggers multiple events within one second (like being attacked by two people at the same time) that would cause holes in the logs"
diff --git a/html/changelogs/AutoChangeLog-pr-13947.yml b/html/changelogs/AutoChangeLog-pr-13947.yml
deleted file mode 100644
index 0388efc701..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13947.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Chiirno"
-delete-after: True
-changes:
- - tweak: "Chem masters can now dispense 20 instances of its outputs instead of 10."
diff --git a/html/changelogs/AutoChangeLog-pr-13948.yml b/html/changelogs/AutoChangeLog-pr-13948.yml
deleted file mode 100644
index 73c5ba6b1a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13948.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - rscadd: "Bokken now come in two lengths; full and wakizashi, and two varieties: wood and ironwood. They have different stats for all four."
- - rscadd: "Bokken require menu crafting and part construction, as well as more complicated materials."
- - tweak: "Bokken (long and short) require wood, cloth and leather to craft with a hatchet and screwdriver."
- - tweak: "Ironwood bokken (long and short) require ironcap logs, cloth and leather to craft with a hatchet, screwdriver and welder."
- - balance: "Twin sheathes can only fit a pair of blades (longsword + shortsword) or they can fit two shortswords."
- - bugfix: "Fixed a twin sheath runtime."
- - imageadd: "A lot of bokken related sprites received an overhaul. Added overlay sprites for weapons sheathed in the twin sheathes."
- - imageadd: "The extradimensional blade received improved sprites for inhands/back sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-13950.yml b/html/changelogs/AutoChangeLog-pr-13950.yml
deleted file mode 100644
index 28affe7ebe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13950.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "TripleShades"
-delete-after: True
-changes:
- - rscadd: "New Paramedic Office next to Genetics where the old Genetics Reception used to be
-change: Surgery, Surgery Observation, and Recovery Hall layout revamped drastically
-change: Maints below Surgery lowered by one tile to recover lost tile space from Surgery expansion"
diff --git a/html/changelogs/AutoChangeLog-pr-13951.yml b/html/changelogs/AutoChangeLog-pr-13951.yml
deleted file mode 100644
index fe3ac84523..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13951.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - tweak: "You can now have a max-roundstart-dicksize-config inch long johnson before you start suffering blood loss and slowdowns instead of a 20 inch one."
diff --git a/html/changelogs/AutoChangeLog-pr-13954.yml b/html/changelogs/AutoChangeLog-pr-13954.yml
deleted file mode 100644
index a8751d66ca..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13954.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "EmeraldSundisk"
-delete-after: True
-changes:
- - rscadd: "Adds a new \"Computer Core\" area designation for CogStation"
- - bugfix: "Fixes some missing area strings"
- - tweak: "Replaces some firelocks with directional ones as to ensure desks/counters can still be accessed"
diff --git a/html/changelogs/AutoChangeLog-pr-13955.yml b/html/changelogs/AutoChangeLog-pr-13955.yml
deleted file mode 100644
index 1d43dd6b95..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13955.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Chiirno"
-delete-after: True
-changes:
- - tweak: "Nightmare now deals additional damage to most light sources."
- - bugfix: "Nightmare now one-shots miners beacons and glowshrooms"
diff --git a/html/changelogs/AutoChangeLog-pr-13959.yml b/html/changelogs/AutoChangeLog-pr-13959.yml
deleted file mode 100644
index 1303768344..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13959.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - bugfix: "You can now make all the variants of the bokken."
- - bugfix: "Removes a duplicate sprite."
- - tweak: "Renames all instances of 'ironwood' to 'steelwood'."
diff --git a/html/changelogs/AutoChangeLog-pr-13961.yml b/html/changelogs/AutoChangeLog-pr-13961.yml
deleted file mode 100644
index f0a6cc267d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13961.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Removed the wires connecting the AI from the rest of the station on cogstation."
- - tweak: "Fixes experimenter on cogstation."
- - tweak: "Less pipes in the overall area in toxins on cogstation"
diff --git a/html/changelogs/AutoChangeLog-pr-13965.yml b/html/changelogs/AutoChangeLog-pr-13965.yml
deleted file mode 100644
index 69f5a90122..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13965.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xantholne"
-delete-after: True
-changes:
- - rscadd: "You can now tuck disky into bed"
- - rscadd: "You can now make beds by applying a bed sheet to them"
- - rscadd: "You can now tuck in pai cards into bed"
- - rscadd: "Added bed tucking element, can be added to any held object to allow tucking into beds"
diff --git a/html/changelogs/AutoChangeLog-pr-13967.yml b/html/changelogs/AutoChangeLog-pr-13967.yml
deleted file mode 100644
index d2e580b531..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13967.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - balance: "Blob Resource Tower to 2 points per instead of 1 point per."
- - balance: "Blob Factory Towers can be placed 5 tiles apart instead of 7."
- - bugfix: "Fixes Blobbernaut Factories consuming Factories if no naut is chosen."
diff --git a/html/changelogs/AutoChangeLog-pr-13968.yml b/html/changelogs/AutoChangeLog-pr-13968.yml
deleted file mode 100644
index e3ce9e4615..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13968.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - tweak: "Prayers to admins now do a wee ding sound for all prayers, instead of just chaplains"
diff --git a/html/changelogs/AutoChangeLog-pr-13970.yml b/html/changelogs/AutoChangeLog-pr-13970.yml
deleted file mode 100644
index 54d8d9992d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13970.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "TripleShades"
-delete-after: True
-changes:
- - rscadd: "Firelock to Surgery Bay drapes
-change: Swapped Nanomed and Fire Alarm button locations in both Surgery Bays
-change: Removes the double mirror in both Surgery Bays to be a singular mirror
-change: Moved an intercom to not be doorstuck below Paramedical Office
-remove: One Surgery Observation Fire Alarm button"
diff --git a/html/changelogs/AutoChangeLog-pr-13972.yml b/html/changelogs/AutoChangeLog-pr-13972.yml
deleted file mode 100644
index fdfdd4786d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13972.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Fixes maint area in boxstation"
diff --git a/html/changelogs/AutoChangeLog-pr-13975.yml b/html/changelogs/AutoChangeLog-pr-13975.yml
deleted file mode 100644
index ff643cd19c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13975.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - imageadd: "fuck the r*d cr*ss"
diff --git a/html/changelogs/AutoChangeLog-pr-13976.yml b/html/changelogs/AutoChangeLog-pr-13976.yml
deleted file mode 100644
index dac85f8e9a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13976.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "you can teleport bread"
diff --git a/html/changelogs/AutoChangeLog-pr-13978.yml b/html/changelogs/AutoChangeLog-pr-13978.yml
deleted file mode 100644
index 94c19edec4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13978.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - balance: "c4 can no longer gib mobs"
diff --git a/html/changelogs/AutoChangeLog-pr-13980.yml b/html/changelogs/AutoChangeLog-pr-13980.yml
deleted file mode 100644
index 6838ba48a2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13980.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - rscadd: "Makes gas sensors fireproof."
diff --git a/html/changelogs/AutoChangeLog-pr-13983.yml b/html/changelogs/AutoChangeLog-pr-13983.yml
deleted file mode 100644
index ba0bf62e6a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13983.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - rscadd: "Xenomorph hybrids can now select wings
-~~add: Xenomorph hybrids can now speak xenomorph~~"
- - rscadd: "Xenomorph tongues are available for customization."
diff --git a/html/changelogs/AutoChangeLog-pr-13988.yml b/html/changelogs/AutoChangeLog-pr-13988.yml
deleted file mode 100644
index 262e5f804f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13988.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Cargo packs marked as 'no private buying' now actually register as such."
diff --git a/html/changelogs/AutoChangeLog-pr-13993.yml b/html/changelogs/AutoChangeLog-pr-13993.yml
deleted file mode 100644
index d99ed0e0d1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13993.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - tweak: "The cursed heart now only takes away half as much blood every loop, and can be used as long as you are alive, instead if only you are awake/able to use your hands"
diff --git a/html/changelogs/AutoChangeLog-pr-13995.yml b/html/changelogs/AutoChangeLog-pr-13995.yml
deleted file mode 100644
index e58ee3103c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13995.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Attacking some certain objects no longer has no clickdelay."
diff --git a/html/changelogs/AutoChangeLog-pr-13996.yml b/html/changelogs/AutoChangeLog-pr-13996.yml
deleted file mode 100644
index 5bea075460..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13996.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Bugfix of a morph becoming an AI eye"
diff --git a/html/changelogs/AutoChangeLog-pr-13997.yml b/html/changelogs/AutoChangeLog-pr-13997.yml
deleted file mode 100644
index 354f66010a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13997.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Porting garbage collection tweak from /tg/"
diff --git a/html/changelogs/AutoChangeLog-pr-14001.yml b/html/changelogs/AutoChangeLog-pr-14001.yml
deleted file mode 100644
index 31c9e560ab..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14001.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Fixes two chairs on one table"
diff --git a/html/changelogs/AutoChangeLog-pr-14005.yml b/html/changelogs/AutoChangeLog-pr-14005.yml
deleted file mode 100644
index 253f4e137a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14005.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Loot items mobs drop are no longer always failing to initialize."
diff --git a/html/changelogs/AutoChangeLog-pr-14006.yml b/html/changelogs/AutoChangeLog-pr-14006.yml
deleted file mode 100644
index 519ad32752..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14006.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Cyborg B.o.r.i.s. installation now checks for if the chest has a cell, just like how it does with MMIs."
diff --git a/html/changelogs/AutoChangeLog-pr-14007.yml b/html/changelogs/AutoChangeLog-pr-14007.yml
deleted file mode 100644
index 498aa6b807..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14007.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Antagging / Deantagging Heretics now properly sets their special role."
diff --git a/html/changelogs/AutoChangeLog-pr-14008.yml b/html/changelogs/AutoChangeLog-pr-14008.yml
deleted file mode 100644
index 836eefd99a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14008.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TheSpaghetti"
-delete-after: True
-changes:
- - bugfix: "no more tumor bread double punctuation"
diff --git a/html/changelogs/AutoChangeLog-pr-14009.yml b/html/changelogs/AutoChangeLog-pr-14009.yml
deleted file mode 100644
index 03a1ca39dd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14009.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - rscadd: "Wings from Cit RP have been ported over"
- - rscadd: "Moth wings from cit have been ported over"
- - bugfix: "Cleaned up some pixels on existing moth wings."
- - tweak: "Organized the lists for wings by if they are for moths or not and than by alphabetical."
diff --git a/html/changelogs/AutoChangeLog-pr-14010.yml b/html/changelogs/AutoChangeLog-pr-14010.yml
deleted file mode 100644
index 643f28dc99..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14010.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "shellspeed1"
-delete-after: True
-changes:
- - rscadd: "The exofab can now print prosthetic limbs"
- - bugfix: "The exofab was missing access to multiple cybernetic organs. This has now been rectified."
diff --git a/html/changelogs/AutoChangeLog-pr-14014.yml b/html/changelogs/AutoChangeLog-pr-14014.yml
deleted file mode 100644
index ac29b1567b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14014.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - bugfix: "Fixes various sprites for bokken, as well as being unable to craft certain parts and duplicate entries."
diff --git a/html/changelogs/AutoChangeLog-pr-14015.yml b/html/changelogs/AutoChangeLog-pr-14015.yml
deleted file mode 100644
index fe507d0a1e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14015.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - balance: "Some synth damage stuff has been a bit rebalanced, see the PR for details."
diff --git a/html/changelogs/AutoChangeLog-pr-14016.yml b/html/changelogs/AutoChangeLog-pr-14016.yml
deleted file mode 100644
index 1aab587190..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14016.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "disabling adminhelp noises no longer disables looc"
diff --git a/html/changelogs/AutoChangeLog-pr-14019.yml b/html/changelogs/AutoChangeLog-pr-14019.yml
deleted file mode 100644
index 37bdd52948..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14019.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - bugfix: "species with NOTRANSSTING cannot have envy's knife used on them"
diff --git a/html/changelogs/AutoChangeLog-pr-14021.yml b/html/changelogs/AutoChangeLog-pr-14021.yml
deleted file mode 100644
index aab94ae724..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14021.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Combat mode now will not stay permanently disabled due to status effects not working as intended."
diff --git a/html/changelogs/AutoChangeLog-pr-14025.yml b/html/changelogs/AutoChangeLog-pr-14025.yml
deleted file mode 100644
index 6db185baa3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14025.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - rscadd: "A new surgery, allowing revival of synths without a defib at hand."
- - balance: "Semi-permanent damage of Synth limbs caused by passing the damage threshold: 10 <- 15."
- - tweak: "The embed removal surgery now has a version for Synths."
- - balance: "EMPs no longer hardstun Synths."
diff --git a/html/changelogs/AutoChangeLog-pr-14026.yml b/html/changelogs/AutoChangeLog-pr-14026.yml
deleted file mode 100644
index 1ae9cb5c28..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14026.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - bugfix: "Fixes noodle size appearance for 12+ inch members."
diff --git a/html/changelogs/AutoChangeLog-pr-14032.yml b/html/changelogs/AutoChangeLog-pr-14032.yml
deleted file mode 100644
index 67f0a80f83..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14032.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "kappa-sama"
-delete-after: True
-changes:
- - rscadd: "A new spell for the wizard and his martial apprentices, the Inner Mantra technique. It makes you punch people really good and makes you durable, but drains your energy while it's active."
- - rscadd: "A self-buffing spell for valiant bubblegum slayers that is ultimately useless on lavaland and probably overpowered for miner antagonists. Go figure. At least all it does is let you punch hard while draining your health every second."
- - balance: "bubblegum now drops a book that makes you into an abusive father instead of a shotgun that plays like pre-nerf shotguns"
- - soundadd: "a powerup and powerdown sound effect"
- - imageadd: "two icons for two buff spells"
diff --git a/html/changelogs/AutoChangeLog-pr-14033.yml b/html/changelogs/AutoChangeLog-pr-14033.yml
deleted file mode 100644
index db6a6b0691..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14033.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - rscadd: "Color Mates have been added to all stations (except Snaxi). Enjoy coloring your attire without having to bug science!"
diff --git a/html/changelogs/AutoChangeLog-pr-14034.yml b/html/changelogs/AutoChangeLog-pr-14034.yml
deleted file mode 100644
index ecd0d4ca10..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14034.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Some edge cases causing issues with system corruption shouldn't be able to occur anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-14035.yml b/html/changelogs/AutoChangeLog-pr-14035.yml
deleted file mode 100644
index b8690368a3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14035.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SiliconMain"
-delete-after: True
-changes:
- - tweak: "hololocks (which haven't worked for god knows how long) commented out until auxmos is merged"
diff --git a/html/changelogs/AutoChangeLog-pr-14036.yml b/html/changelogs/AutoChangeLog-pr-14036.yml
deleted file mode 100644
index a2bb654233..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14036.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - tweak: "You will now only unbuckle fireman-carried/piggybacked people on disarm or harm intent."
diff --git a/html/changelogs/AutoChangeLog-pr-14038.yml b/html/changelogs/AutoChangeLog-pr-14038.yml
deleted file mode 100644
index 906f6f7053..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14038.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "The nature interaction shuttle with the monkeys now has tiny fans on the airlocks in, because that's apparently a feature that was missing."
- - rscadd: "More bags have been added to department vendors."
- - balance: "Every roundstart species (and also ash walkers) now has flesh and bone that can be wounded."
- - balance: "Recipes for sutures, regen mesh, and sterilized gauze have been adjusted to be easier, mostly."
- - balance: "Sterilized gauze is better at absorbing blood and being a splint."
- - bugfix: "Energy sabres now have an off inhand."
diff --git a/html/changelogs/AutoChangeLog-pr-14039.yml b/html/changelogs/AutoChangeLog-pr-14039.yml
deleted file mode 100644
index a799003a02..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14039.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "Basic sticky technology is now a roundstart tech. Advanced sticky technology is BEPIS-locked, though. Theoretically."
diff --git a/html/changelogs/AutoChangeLog-pr-14040.yml b/html/changelogs/AutoChangeLog-pr-14040.yml
deleted file mode 100644
index 6202f0b3e1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14040.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "LetterN"
-delete-after: True
-changes:
- - bugfix: "fixed telecomms pda log"
diff --git a/html/changelogs/AutoChangeLog-pr-14042.yml b/html/changelogs/AutoChangeLog-pr-14042.yml
deleted file mode 100644
index a924ff582f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14042.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kiwedespars"
-delete-after: True
-changes:
- - rscadd: "the robust dildo weapon now has sound."
diff --git a/html/changelogs/AutoChangeLog-pr-14044.yml b/html/changelogs/AutoChangeLog-pr-14044.yml
deleted file mode 100644
index e19b6266a7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14044.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "corin9090"
-delete-after: True
-changes:
- - tweak: "The chaplain's prayer beads can now be worn on your belt slot"
diff --git a/html/changelogs/AutoChangeLog-pr-14048.yml b/html/changelogs/AutoChangeLog-pr-14048.yml
deleted file mode 100644
index b7b1448b37..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14048.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "Updates suit storage info on Tip Of the Round."
diff --git a/html/changelogs/AutoChangeLog-pr-14054.yml b/html/changelogs/AutoChangeLog-pr-14054.yml
deleted file mode 100644
index 406e6b2713..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14054.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "TheObserver"
-delete-after: True
-changes:
- - rscadd: "Re-adds the rifle stock, and sets the improv shotgun to be as it was."
- - rscdel: "The maintenance rifle has been shelved - for now. Watch this space."
diff --git a/html/changelogs/AutoChangeLog-pr-14060.yml b/html/changelogs/AutoChangeLog-pr-14060.yml
deleted file mode 100644
index f9750fc9be..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14060.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscdel: "Apparently, shrink rays were buyable again, despite a PR having been made a while ago specifically for removing shrink rays. They're gone again."
diff --git a/html/changelogs/AutoChangeLog-pr-14062.yml b/html/changelogs/AutoChangeLog-pr-14062.yml
deleted file mode 100644
index 84e40850ec..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14062.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kappa-sama"
-delete-after: True
-changes:
- - bugfix: "super saiyan"
diff --git a/html/changelogs/example.yml b/html/changelogs/example.yml
index 48aa13aa11..c44f796755 100644
--- a/html/changelogs/example.yml
+++ b/html/changelogs/example.yml
@@ -8,16 +8,41 @@
#
# Valid Prefixes:
# bugfix
-# wip (For works in progress)
+# - (fixes bugs)
+# wip
+# - (work in progress)
# tweak
+# - (tweaks something)
# soundadd
+# - (adds a sound)
# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
+# - (removes a sound)
+# rscdel
+# - (adds a feature)
+# rscadd
+# - (removes a feature)
# imageadd
+# - (adds an image or sprite)
# imagedel
-# spellcheck (typo fixes)
+# - (removes an image or sprite)
+# spellcheck
+# - (fixes spelling or grammar)
# experiment
+# - (experimental change)
+# tgs
+# - (TGS change)
+# balance
+# - (balance changes)
+# code_imp
+# - (misc internal code change)
+# refactor
+# - (refactors code)
+# config
+# - (makes a change to the config files)
+# admin
+# - (makes changes to administrator tools)
+# server
+# - (miscellaneous changes to server)
#################################
# Your name.
diff --git a/html/safe_dial.png b/html/safe_dial.png
new file mode 100644
index 0000000000..de24f16b67
Binary files /dev/null and b/html/safe_dial.png differ
diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi
index 743ed03f48..3d1f58743c 100644
Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ
diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi
index 67d1849ef6..227ae83166 100644
Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ
diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi
index f798850ee7..43244e99b9 100644
Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 4b0c56c4d2..23b981031c 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index ecc6e2dd2c..7d9433525a 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/mask_muzzled.dmi b/icons/mob/clothing/mask_muzzled.dmi
index a1404cfbce..8ca05969bf 100644
Binary files a/icons/mob/clothing/mask_muzzled.dmi and b/icons/mob/clothing/mask_muzzled.dmi differ
diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi
index 084a2c3649..df1037b8fa 100644
Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index a3d75644da..ae7117d53b 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/clothing/suit_digi.dmi b/icons/mob/clothing/suit_digi.dmi
index b109c2095e..f80cb4a426 100644
Binary files a/icons/mob/clothing/suit_digi.dmi and b/icons/mob/clothing/suit_digi.dmi differ
diff --git a/icons/mob/clothing/underwear.dmi b/icons/mob/clothing/underwear.dmi
index 8cf1144a68..71461e21e8 100644
Binary files a/icons/mob/clothing/underwear.dmi and b/icons/mob/clothing/underwear.dmi differ
diff --git a/icons/mob/hair.dmi b/icons/mob/hair.dmi
index 6dfa78fcff..6ecaad55a5 100644
Binary files a/icons/mob/hair.dmi and b/icons/mob/hair.dmi differ
diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi
index 6dc8d82753..95106e3dbf 100644
Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ
diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi
index ca87f74a6f..2c1909108b 100644
Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 0a82845910..6f747f1265 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index abfbb18f84..af14ba7784 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index 8716c3627f..e5c3c2f5c9 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi
index 13a0725b05..1bd94f2424 100644
Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ
diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi
index 510adc97b4..e452ca687b 100644
Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index 1178588ee7..5f31a65ffa 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi
index cc5f4f3392..7ea22d34bc 100644
Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index ee6cf90597..9fa3e527ca 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 106195e968..acd64bb424 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi
index c4c9c94f48..d7e0c9c24b 100644
Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index d3e4c0f7e9..42ef740c4a 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index f9eabaa44c..ba9f94e67a 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 7e7e4a644b..158c95ee5d 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 119e612c40..e832bf64d3 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 94568b8633..740c64b1dc 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi
index cbd6b9e85e..19e12dec86 100644
Binary files a/icons/obj/smith.dmi and b/icons/obj/smith.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index 1cdb3b6443..3136cf34b2 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/_loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm
index 2a7b77bd47..5f895c4805 100644
--- a/modular_citadel/code/modules/client/loadout/_loadout.dm
+++ b/modular_citadel/code/modules/client/loadout/_loadout.dm
@@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/path //item-to-spawn path
var/cost = 1 //normally, each loadout costs a single point.
var/geargroupID //defines the ID that the gear inherits from the config
- var/loadout_flags = 0
+ var/loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
var/list/loadout_initial_colors = list()
//NEW DONATOR SYTSEM STUFF
diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm
index fd03e2279f..d1c2c69b99 100644
--- a/modular_citadel/code/modules/client/loadout/head.dm
+++ b/modular_citadel/code/modules/client/loadout/head.dm
@@ -15,6 +15,18 @@
name = "Black beret"
path = /obj/item/clothing/head/beret/black
+/datum/gear/head/redberet
+ name = "Red beret"
+ path = /obj/item/clothing/head/beret
+
+/datum/gear/head/purpleberet
+ name = "Purple beret"
+ path = /obj/item/clothing/head/beret/purple
+
+/datum/gear/head/blueberet
+ name = "Blue beret"
+ path = /obj/item/clothing/head/beret/blue
+
/datum/gear/head/flatcap
name = "Flat cap"
path = /obj/item/clothing/head/flatcap
diff --git a/modular_citadel/code/modules/client/loadout/mask.dm b/modular_citadel/code/modules/client/loadout/mask.dm
index 9468c9303d..576b29cddc 100644
--- a/modular_citadel/code/modules/client/loadout/mask.dm
+++ b/modular_citadel/code/modules/client/loadout/mask.dm
@@ -20,3 +20,14 @@
path = /obj/item/clothing/mask/gas
cost = 2
restricted_roles = list("Chief Engineer", "Atmospheric Technician", "Station Engineer") //*shrug
+
+/datum/gear/mask/sterile
+ name = "Aesthetic sterile mask"
+ path = /obj/item/clothing/mask/surgical/aesthetic
+ cost = 2
+
+/datum/gear/mask/paper
+ name = "Paper mask"
+ path = /obj/item/clothing/mask/paper
+ cost = 2
+
diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm
index 7c3c11f25c..300b98fbe9 100644
--- a/modular_citadel/code/modules/client/loadout/neck.dm
+++ b/modular_citadel/code/modules/client/loadout/neck.dm
@@ -30,6 +30,10 @@
name = "Choker"
path = /obj/item/clothing/neck/petcollar/choker
+/datum/gear/neck/cowbell
+ name = "Cowbell collar"
+ path = /obj/item/clothing/neck/necklace/cowbell
+
/datum/gear/neck/scarf
name = "White scarf"
subcategory = LOADOUT_SUBCATEGORY_NECK_SCARVES
@@ -86,7 +90,7 @@
/datum/gear/neck/polycloak
name = "Polychromatic Cloak"
path = /obj/item/clothing/neck/cloak/polychromic
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#FFFFFF", "#FFFFFF", "#808080")
/datum/gear/neck/altpolycloak
diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm
index 7c21ed84d0..f7ef891104 100644
--- a/modular_citadel/code/modules/client/loadout/suit.dm
+++ b/modular_citadel/code/modules/client/loadout/suit.dm
@@ -101,7 +101,7 @@
name = "Polychromic winter coat"
path = /obj/item/clothing/suit/hooded/wintercoat/polychromic
cost = 4 //too many people with neon green coats is hard on the eyes
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#6A6964", "#C4B8A6", "#0000FF")
/datum/gear/suit/coat/med
diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm
index b76e223f25..303783e1c5 100644
--- a/modular_citadel/code/modules/client/loadout/uniform.dm
+++ b/modular_citadel/code/modules/client/loadout/uniform.dm
@@ -47,7 +47,7 @@
/datum/gear/uniform/maidcostume/polychromic
name = "Polychromic maid costume"
path = /obj/item/clothing/under/rank/civilian/janitor/maid/polychromic
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#FFFFFF", "#000000")
/datum/gear/uniform/mailmanuniform
@@ -229,49 +229,49 @@
name = "Polychromic Jumpsuit"
path = /obj/item/clothing/under/misc/polyjumpsuit
cost = 2
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#FFFFFF", "#808080", "#353535")
/datum/gear/uniform/skirt/poly
name = "Polychromic Jumpskirt"
path = /obj/item/clothing/under/dress/skirt/polychromic
cost = 2
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#FFFFFF", "#F08080", "#808080")
/datum/gear/uniform/suit/poly
name = "Polychromic Button-up Shirt"
path = /obj/item/clothing/under/misc/poly_shirt
cost = 3
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#FFFFFF", "#353535", "#353535")
/datum/gear/uniform/skirt/poly/pleated
name = "Polychromic Pleated Sweaterskirt"
path = /obj/item/clothing/under/dress/skirt/polychromic/pleated
cost = 3
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#8CC6FF", "#808080", "#FF3535")
/datum/gear/uniform/polykilt
name = "Polychromic Kilt"
path = /obj/item/clothing/under/costume/kilt/polychromic
cost = 3
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#FFFFFF", "#F08080")
/datum/gear/uniform/shorts/poly
name = "Polychromic Shorts"
path = /obj/item/clothing/under/misc/polyshorts
cost = 3
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#353535", "#808080", "#808080")
/datum/gear/uniform/shorts/poly/athletic
name = "Polychromic Athletic Shorts"
path = /obj/item/clothing/under/shorts/polychromic
cost = 2
- loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#FFFFFF", "#F08080")
/datum/gear/uniform/hopcasual
diff --git a/modular_citadel/code/modules/client/loadout/unlockable.dm b/modular_citadel/code/modules/client/loadout/unlockable.dm
index 6e522812b8..67e0c06d8c 100644
--- a/modular_citadel/code/modules/client/loadout/unlockable.dm
+++ b/modular_citadel/code/modules/client/loadout/unlockable.dm
@@ -27,4 +27,4 @@
path = /obj/item/bedsheet/unlockable/miner
progress_required = 100000
- progress_key = "miner"
\ No newline at end of file
+ progress_key = "miner"
diff --git a/modular_citadel/code/modules/clothing/trek.dm b/modular_citadel/code/modules/clothing/trek.dm
index f7e8b6778e..dd02a6d0f8 100644
--- a/modular_citadel/code/modules/clothing/trek.dm
+++ b/modular_citadel/code/modules/clothing/trek.dm
@@ -51,58 +51,58 @@
blood_overlay_type = "coat"
body_parts_covered = CHEST|GROIN|ARMS
allowed = list(
- /obj/item/tank/internals/emergency_oxygen,
- /obj/item/flashlight,
- /obj/item/analyzer,
- /obj/item/radio,
- /obj/item/gun,
- /obj/item/melee/baton,
- /obj/item/restraints/handcuffs,
- /obj/item/reagent_containers/hypospray,
- /obj/item/hypospray,
- /obj/item/healthanalyzer,
- /obj/item/reagent_containers/syringe,
- /obj/item/reagent_containers/glass/bottle/vial,
- /obj/item/reagent_containers/glass/beaker,
- /obj/item/storage/pill_bottle,
- /obj/item/taperecorder)
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/flashlight,
+ /obj/item/analyzer,
+ /obj/item/radio,
+ /obj/item/gun,
+ /obj/item/melee/baton,
+ /obj/item/restraints/handcuffs,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/hypospray,
+ /obj/item/healthanalyzer,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/glass/bottle/vial,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/storage/pill_bottle,
+ /obj/item/taperecorder)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- var/unbuttoned = 0
+ var/unbuttoned = FALSE
- verb/toggle()
- set name = "Toggle coat buttons"
- set category = "Object"
- set src in usr
+/obj/item/clothing/suit/storage/fluff/fedcoat/verb/toggle()
+ set name = "Toggle coat buttons"
+ set category = "Object"
+ set src in usr
- var/mob/living/L = usr
- if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE))
- return FALSE
+ var/mob/living/L = usr
+ if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE))
+ return FALSE
- switch(unbuttoned)
- if(0)
- icon_state = "[initial(icon_state)]_open"
- item_state = "[initial(item_state)]_open"
- unbuttoned = 1
- to_chat(usr,"You unbutton the coat.")
- if(1)
- icon_state = "[initial(icon_state)]"
- item_state = "[initial(item_state)]"
- unbuttoned = 0
- to_chat(usr,"You button up the coat.")
- usr.update_inv_wear_suit()
+ switch(unbuttoned)
+ if(FALSE)
+ icon_state = "[initial(icon_state)]_open"
+ item_state = "[initial(item_state)]_open"
+ unbuttoned = TRUE
+ to_chat(usr,"You unbutton the coat.")
+ if(TRUE)
+ icon_state = "[initial(icon_state)]"
+ item_state = "[initial(item_state)]"
+ unbuttoned = FALSE
+ to_chat(usr,"You button up the coat.")
+ usr.update_inv_wear_suit()
- //Variants
+//Variants
/obj/item/clothing/suit/storage/fluff/fedcoat/medsci
- icon_state = "fedblue"
- item_state = "fedblue"
+ icon_state = "fedblue"
+ item_state = "fedblue"
/obj/item/clothing/suit/storage/fluff/fedcoat/eng
- icon_state = "fedeng"
- item_state = "fedeng"
+ icon_state = "fedeng"
+ item_state = "fedeng"
/obj/item/clothing/suit/storage/fluff/fedcoat/capt
- icon_state = "fedcapt"
- item_state = "fedcapt"
+ icon_state = "fedcapt"
+ item_state = "fedcapt"
//"modern" ones for fancy
@@ -124,18 +124,18 @@
)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- //Variants
+//Variants
/obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
- icon_state = "fedmodernblue"
- item_state = "fedmodernblue"
+ icon_state = "fedmodernblue"
+ item_state = "fedmodernblue"
/obj/item/clothing/suit/storage/fluff/modernfedcoat/eng
- icon_state = "fedmoderneng"
- item_state = "fedmoderneng"
+ icon_state = "fedmoderneng"
+ item_state = "fedmoderneng"
/obj/item/clothing/suit/storage/fluff/modernfedcoat/sec
- icon_state = "fedmodernsec"
- item_state = "fedmodernsec"
+ icon_state = "fedmodernsec"
+ item_state = "fedmodernsec"
/obj/item/clothing/head/caphat/formal/fedcover
name = "Federation Officer's Cap"
@@ -146,22 +146,22 @@
mob_overlay_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
item_state = "fedcapofficer"
- //Variants
+//Variants
/obj/item/clothing/head/caphat/formal/fedcover/medsci
- icon_state = "fedcapsci"
- item_state = "fedcapsci"
+ icon_state = "fedcapsci"
+ item_state = "fedcapsci"
/obj/item/clothing/head/caphat/formal/fedcover/eng
- icon_state = "fedcapeng"
- item_state = "fedcapeng"
+ icon_state = "fedcapeng"
+ item_state = "fedcapeng"
/obj/item/clothing/head/caphat/formal/fedcover/sec
- icon_state = "fedcapsec"
- item_state = "fedcapsec"
+ icon_state = "fedcapsec"
+ item_state = "fedcapsec"
/obj/item/clothing/head/caphat/formal/fedcover/black
- icon_state = "fedcapblack"
- item_state = "fedcapblack"
+ icon_state = "fedcapblack"
+ item_state = "fedcapblack"
//orvilike caps
/obj/item/clothing/head/kepi/orvi
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
index 65609f5830..9a8ee4bab1 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -2,7 +2,7 @@
The Recolourable Energy Gun
*//////////////////////////////////////////////////////////////////////////////////////////////
-obj/item/gun/energy/e_gun/cx
+/obj/item/gun/energy/e_gun/cx
name = "\improper CX Model D Energy Gun"
desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating."
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
@@ -14,18 +14,18 @@ obj/item/gun/energy/e_gun/cx
flight_y_offset = 10
var/body_color = "#252528"
-obj/item/gun/energy/e_gun/cx/ComponentInitialize()
+/obj/item/gun/energy/e_gun/cx/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
-obj/item/gun/energy/e_gun/cx/update_overlays()
+/obj/item/gun/energy/e_gun/cx/update_overlays()
. = ..()
var/mutable_appearance/body_overlay = mutable_appearance('modular_citadel/icons/obj/guns/cit_guns.dmi', "cxegun_body")
if(body_color)
body_overlay.color = body_color
. += body_overlay
-obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
+/obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
. = ..()
if(!in_range(src, user)) //Basic checks to prevent abuse
return
@@ -39,7 +39,7 @@ obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
update_icon()
-obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
+/obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(isinhands)
var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
index ac3ef96505..2e5f3b8994 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
@@ -30,7 +30,6 @@
inverse_chem = /datum/reagent/fermi/BEsmaller //At really impure vols, it just becomes 100% inverse
can_synth = FALSE
value = REAGENT_VALUE_VERY_RARE
- var/message_spam = FALSE
/datum/reagent/fermi/breast_enlarger/on_mob_metabolize(mob/living/M)
. = ..()
@@ -81,16 +80,7 @@
H.reagents.remove_reagent(type, 5)
B.Insert(H)
- //If they have them, increase size. If size is comically big, limit movement and rip clothes.
B.modify_size(0.05)
-
- if (ISINRANGE_EX(B.cached_size, 8.5, 9) && (H.w_uniform || H.wear_suit))
- var/target = H.get_bodypart(BODY_ZONE_CHEST)
- if(!message_spam)
- to_chat(H, "Your breasts begin to strain against your clothes tightly!")
- message_spam = TRUE
- H.adjustOxyLoss(5, 0)
- H.apply_damage(1, BRUTE, target)
return ..()
/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders.
@@ -189,7 +179,6 @@
inverse_chem = /datum/reagent/fermi/PEsmaller //At really impure vols, it just becomes 100% inverse and shrinks instead.
can_synth = FALSE
value = REAGENT_VALUE_VERY_RARE
- var/message_spam = FALSE
/datum/reagent/fermi/penis_enlarger/on_mob_metabolize(mob/living/M)
. = ..()
@@ -232,14 +221,6 @@
P.Insert(H)
P.modify_size(0.1)
- var/max_D = CONFIG_GET(number/penis_max_inches_prefs)
- if (ISINRANGE_EX(P.length, max_D + 0.5, max_D + 1) && (H.w_uniform || H.wear_suit))
- var/target = H.get_bodypart(BODY_ZONE_CHEST)
- if(!message_spam)
- to_chat(H, "Your cock begin to strain against your clothes tightly!")
- message_spam = TRUE
- H.apply_damage(2.5, BRUTE, target)
-
return ..()
/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/human/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders.
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
index f214df6cd0..c6fae2ff8f 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -216,7 +216,6 @@
..()
/datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C)
- //var/component/nanites/N = M.GetComponent(/datum/component/nanites)
var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites)
if(prob(5))
to_chat(C, "The residual voltage from the nanites causes you to seize up!")
@@ -230,7 +229,7 @@
N.adjust_nanites(-10*cached_purity)
..()
-datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
+/datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
for(var/active_obj in react_objs)
if(O == active_obj)
return
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index 21f525088c..c144fa9196 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -93,9 +93,8 @@
e.set_up(round((volume/28)*(pH-9)), T, 0, 0)
e.start()
- if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less)
- ImpureTot *= volume
- empulse(T, volume, 1)
+ if(ImpureTot) //If impure, v.small emp (0.6 or less)
+ empulse(T, ImpureTot, 1)
my_atom.reagents.clear_reagents() //just in case
return
diff --git a/rust_g.dll b/rust_g.dll
old mode 100755
new mode 100644
index 8cd62b8ca4..8ef1c59a10
Binary files a/rust_g.dll and b/rust_g.dll differ
diff --git a/sound/effects/whistlereset.ogg b/sound/effects/whistlereset.ogg
new file mode 100644
index 0000000000..cf55c06ca8
Binary files /dev/null and b/sound/effects/whistlereset.ogg differ
diff --git a/sound/machines/grill/grillsizzle.ogg b/sound/machines/grill/grillsizzle.ogg
new file mode 100644
index 0000000000..056ce45941
Binary files /dev/null and b/sound/machines/grill/grillsizzle.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 532e57148a..5ea3b652e7 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -79,6 +79,7 @@
#include "code\__DEFINES\mobs.dm"
#include "code\__DEFINES\monkeys.dm"
#include "code\__DEFINES\move_force.dm"
+#include "code\__DEFINES\movement.dm"
#include "code\__DEFINES\movespeed_modification.dm"
#include "code\__DEFINES\nanites.dm"
#include "code\__DEFINES\networks.dm"
@@ -154,7 +155,6 @@
#include "code\__DEFINES\storage\_storage.dm"
#include "code\__DEFINES\storage\volumetrics.dm"
#include "code\__HELPERS\_cit_helpers.dm"
-#include "code\__HELPERS\_extools_api.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
#include "code\__HELPERS\_string_lists.dm"
@@ -202,6 +202,7 @@
#include "code\__HELPERS\sorts\InsertSort.dm"
#include "code\__HELPERS\sorts\MergeSort.dm"
#include "code\__HELPERS\sorts\TimSort.dm"
+#include "code\_globalvars\admin.dm"
#include "code\_globalvars\bitfields.dm"
#include "code\_globalvars\configuration.dm"
#include "code\_globalvars\game_modes.dm"
@@ -619,6 +620,7 @@
#include "code\datums\elements\tactical.dm"
#include "code\datums\elements\update_icon_blocker.dm"
#include "code\datums\elements\update_icon_updates_onmob.dm"
+#include "code\datums\elements\ventcrawling.dm"
#include "code\datums\elements\wuv.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
diff --git a/tgui/packages/tgui/interfaces/Orbit.js b/tgui/packages/tgui/interfaces/Orbit.js
index 7423dadbc4..1b6daccabc 100644
--- a/tgui/packages/tgui/interfaces/Orbit.js
+++ b/tgui/packages/tgui/interfaces/Orbit.js
@@ -1,10 +1,10 @@
import { createSearch } from 'common/string';
+import { multiline } from 'common/string';
import { resolveAsset } from '../assets';
import { useBackend, useLocalState } from '../backend';
-import { Box, Button, Flex, Icon, Input, Section } from '../components';
+import { Box, Button, Divider, Flex, Icon, Input, Section } from '../components';
import { Window } from '../layouts';
-const PATTERN_DESCRIPTOR = / \[(?:ghost|dead)\]$/;
const PATTERN_NUMBER = / \(([0-9]+)\)$/;
const searchFor = searchText => createSearch(searchText, thing => thing.name);
@@ -43,7 +43,7 @@ const BasicSection = (props, context) => {
{things.map(thing => (