diff --git a/code/game/machinery/crusher_piston.dm b/code/game/machinery/crusher_piston.dm
index 95b9cc43068..0f82f6d453c 100644
--- a/code/game/machinery/crusher_piston.dm
+++ b/code/game/machinery/crusher_piston.dm
@@ -75,14 +75,14 @@
var/oldloc = loc
var/obj/machinery/crusher_base/left = locate(/obj/machinery/crusher_base, get_step(src, WEST))
var/obj/machinery/crusher_base/right = locate(/obj/machinery/crusher_base, get_step(src, EAST))
-
+
loc=null
if(left)
left.update_icon()
if(right)
right.update_icon()
loc=oldloc
-
+
QDEL_NULL(pstn)
return ..()
@@ -100,7 +100,7 @@
return
if(default_part_replacement(user, O))
return
-
+
//Stuff you can do if the maint hatch is open
if(panel_open)
if(iswrench(O))
@@ -138,7 +138,7 @@
if(QDELETED(left))
left = null
-
+
if(QDELETED(right))
right = null
@@ -164,7 +164,7 @@
holographic_overlay(src, icon, "[asmtype]-overlay-green")
if(panel_open)
add_overlay("[asmtype]-hatch")
- update_above()
+ update_above()
/obj/machinery/crusher_base/power_change()
..()
@@ -214,7 +214,7 @@
status = "stage1"
action_start_time = world.time
initial = 1
-
+
//Extend the second piston
else if(status == "stage1")
if(valve_check())
@@ -248,7 +248,7 @@
status = "stage3"
action_start_time = world.time
initial = 1
-
+
//Wait a moment, then reverse the direction
else if(status == "stage3")
if(initial)
@@ -308,7 +308,7 @@
action_start_time = world.time
initial = 1
update_icon()
-
+
//Move all the items in the move list
for(var/atom/movable/AM in items_to_move)
if(!AM.simulated)
@@ -322,7 +322,7 @@
if(!AM.piston_move())
items_to_crush += AM
CHECK_TICK
-
+
//Destroy all the items in the crush list
for(var/atom/movable/AM in items_to_crush)
items_to_crush -= AM
@@ -366,7 +366,7 @@
name = "trash compactor piston"
desc = "A colossal piston used for crushing garbage."
icon = 'icons/obj/machines/crusherpiston.dmi' //Placeholder TODO: Get a proper icon
- icon_state = "piston_0"
+ icon_state = "piston_0"
density = 0
anchored = 1
pixel_y = -64
@@ -513,6 +513,8 @@
// The crush act proc
//
/atom/movable/proc/crush_act()
+ if(!simulated)
+ return
ex_act(1)
if(!QDELETED(src))
qdel(src)//Just as a failsafe
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index 99317004992..d4f83e4a7e7 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -317,6 +317,7 @@
base_icon = "chainsaw_off"
flags = CONDUCT
force = 10
+ force_unwielded = 10
force_wielded = 20
throwforce = 5
w_class = ITEMSIZE_LARGE
@@ -361,8 +362,9 @@
var/turf/T = get_turf(src)
T.audible_message(span("notice", "\The [src] rumbles to life."))
playsound(src, "sound/weapons/chainsawstart.ogg", 25, 0, 30)
- force = 20
- force_wielded = 40
+ force = 15
+ force_unwielded = 30
+ force_wielded = 60
throwforce = 20
icon_state = "chainsaw_on"
base_icon = "chainsaw_on"
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index f5ce9bacc24..5ec2c2a26d0 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -182,7 +182,6 @@
update_icon()
return 1
-// this should probably use dump_contents()
/obj/structure/closet/ex_act(severity)
switch(severity)
if(1)
@@ -194,15 +193,16 @@
if (health <= 0)
for (var/atom/movable/A as mob|obj in src)
- A.forceMove(loc)
A.ex_act(severity + 1)
+ dump_contents()
+ new /obj/item/stack/material/steel(get_turf(src))
qdel(src)
/obj/structure/closet/proc/damage(var/damage)
health -= damage
if(health <= 0)
- for(var/atom/movable/A in src)
- A.forceMove(loc)
+ dump_contents()
+ new /obj/item/stack/material/steel(get_turf(src))
qdel(src)
/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj)
@@ -452,3 +452,14 @@
/obj/structure/closet/onDropInto(var/atom/movable/AM)
return
+
+/obj/structure/closet/crush_act()
+ for (var/atom/movable/A in src)
+ if(istype(A, /mob/living))
+ var/mob/living/M = A
+ M.gib()
+ else if(A.simulated)
+ A.ex_act(1)
+ dump_contents()
+ new /obj/item/stack/material/steel(get_turf(src))
+ qdel(src)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index ea0d4fc66b9..b79518a17b3 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -134,6 +134,7 @@
density = 0
anchored = 1
use_power = 0
+ var/spray_amount = 20
var/on = 0
var/obj/effect/mist/mymist = null
var/ismist = 0 //needs a var so we can make it linger~
@@ -221,10 +222,10 @@
/obj/machinery/shower/proc/wash(atom/movable/O as obj|mob)
if(!on) return
- if(isliving(O))
- var/mob/living/L = O
- L.ExtinguishMob()
- L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily
+ var/obj/effect/effect/water/W = new(O)
+ W.create_reagents(spray_amount)
+ W.reagents.add_reagent("water", spray_amount)
+ W.set_up(O, spray_amount)
if(iscarbon(O))
var/mob/living/carbon/M = O
@@ -326,6 +327,7 @@
wash_floor()
if(!mobpresent) return
for(var/mob/living/L in loc)
+ wash(L) // Why was it not here before?
process_heat(L)
/obj/machinery/shower/proc/wash_floor()
diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm
index ef5afab1fcf..c07a0c9cb47 100644
--- a/code/game/turfs/simulated/water.dm
+++ b/code/game/turfs/simulated/water.dm
@@ -23,6 +23,7 @@
movement_cost = 2
var/watertype = "water5"
var/obj/effect/water_effect/water_overlay
+ var/numobjects = 0
/turf/simulated/floor/beach/water/pool
name = "pool"
@@ -56,6 +57,7 @@
var/obj/effect/water_effect/W = new /obj/effect/water_effect(src)
W.icon_state = watertype
water_overlay = W
+ create_reagents(2)
/turf/simulated/floor/beach/water/Destroy()
if(water_overlay)
@@ -86,20 +88,44 @@
return return_air() // Otherwise their head is above the water, so get the air from the atmosphere instead.
/turf/simulated/floor/beach/water/Entered(atom/movable/AM, atom/oldloc)
- if(istype(AM, /mob/living))
+ if(!SSATOMS_IS_PROBABLY_DONE)
+ return
+ reagents.add_reagent("water", 2)
+ clean(src)
+ START_PROCESSING(SSprocessing, src)
+ if(istype(AM, /obj))
+ numobjects += 1
+ else if(istype(AM, /mob/living))
+ numobjects += 1
var/mob/living/L = AM
if(!istype(oldloc, /turf/simulated/floor/beach/water))
to_chat(L, "You get drenched in water from entering \the [src]!")
- AM.water_act(5)
+ wash(L)
..()
/turf/simulated/floor/beach/water/Exited(atom/movable/AM, atom/newloc)
- if(istype(AM, /mob/living))
+ if(!SSATOMS_IS_PROBABLY_DONE)
+ return
+ reagents.add_reagent("water", 2)
+ clean(src)
+ if(istype(AM, /obj) && numobjects)
+ numobjects -= 1
+ else if(istype(AM, /mob/living))
+ if(numobjects)
+ numobjects -= 1
var/mob/living/L = AM
if(!istype(newloc, /turf/simulated/floor/beach/water))
to_chat(L, "You climb out of \the [src].")
..()
+/turf/simulated/floor/beach/water/process()
+ reagents.add_reagent("water", 2)
+ clean(src)
+ for(var/mob/living/L in src)
+ wash(L)
+ if(!numobjects)
+ STOP_PROCESSING(SSprocessing, src)
+
/mob/living/proc/can_breathe_water()
return FALSE
@@ -108,11 +134,105 @@
return species.can_breathe_water()
return ..()
-// Use this to have things react to having water applied to them.
-/atom/movable/proc/water_act(amount)
- return
+// Taken from shower
+/turf/simulated/floor/beach/water/proc/wash(atom/movable/O as obj|mob)
-/mob/living/water_act(amount)
- adjust_fire_stacks(-amount * 5)
- for(var/atom/movable/AM in contents)
- AM.water_act(amount)
\ No newline at end of file
+ var/obj/effect/effect/water/W = new(O)
+ W.create_reagents(100)
+ W.reagents.add_reagent("water", 100)
+ W.set_up(O, 100)
+
+ if(iscarbon(O))
+ var/mob/living/carbon/M = O
+ if(M.r_hand)
+ M.r_hand.clean_blood()
+ if(M.l_hand)
+ M.l_hand.clean_blood()
+ if(M.back)
+ if(M.back.clean_blood())
+ M.update_inv_back(0)
+
+ //flush away reagents on the skin
+ if(M.touching)
+ var/remove_amount = M.touching.maximum_volume * M.reagent_permeability() //take off your suit first
+ M.touching.remove_any(remove_amount)
+
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/washgloves = 1
+ var/washshoes = 1
+ var/washmask = 1
+ var/washears = 1
+ var/washglasses = 1
+
+ if(H.wear_suit)
+ washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES)
+ washshoes = !(H.wear_suit.flags_inv & HIDESHOES)
+
+ if(H.head)
+ washmask = !(H.head.flags_inv & HIDEMASK)
+ washglasses = !(H.head.flags_inv & HIDEEYES)
+ washears = !(H.head.flags_inv & HIDEEARS)
+
+ if(H.wear_mask)
+ if (washears)
+ washears = !(H.wear_mask.flags_inv & HIDEEARS)
+ if (washglasses)
+ washglasses = !(H.wear_mask.flags_inv & HIDEEYES)
+
+ if(H.head)
+ if(H.head.clean_blood())
+ H.update_inv_head(0)
+ if(H.wear_suit)
+ if(H.wear_suit.clean_blood())
+ H.update_inv_wear_suit(0)
+ else if(H.w_uniform)
+ if(H.w_uniform.clean_blood())
+ H.update_inv_w_uniform(0)
+ if(H.gloves && washgloves)
+ if(H.gloves.clean_blood())
+ H.update_inv_gloves(0)
+ if(H.shoes && washshoes)
+ if(H.shoes.clean_blood())
+ H.update_inv_shoes(0)
+ if(H.wear_mask && washmask)
+ if(H.wear_mask.clean_blood())
+ H.update_inv_wear_mask(0)
+ if(H.glasses && washglasses)
+ if(H.glasses.clean_blood())
+ H.update_inv_glasses(0)
+ if(H.l_ear && washears)
+ if(H.l_ear.clean_blood())
+ H.update_inv_ears(0)
+ if(H.r_ear && washears)
+ if(H.r_ear.clean_blood())
+ H.update_inv_ears(0)
+ if(H.belt)
+ if(H.belt.clean_blood())
+ H.update_inv_belt(0)
+ H.clean_blood(washshoes)
+ else
+ if(M.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags
+ if(M.wear_mask.clean_blood())
+ M.update_inv_wear_mask(0)
+ M.clean_blood()
+ else
+ O.clean_blood()
+
+ if(istype(O, /obj/item/weapon/light))
+ var/obj/item/weapon/light/L = O
+ L.brightness_color = initial(L.brightness_color)
+ L.update()
+ else if(istype(O, /obj/machinery/light))
+ var/obj/machinery/light/L = O
+ L.brightness_color = initial(L.brightness_color)
+ L.update()
+
+ O.color = initial(O.color)
+
+ if(isturf(loc))
+ var/turf/tile = loc
+ loc.clean_blood()
+ for(var/obj/effect/E in tile)
+ if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay))
+ qdel(E)
diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm
index 6b1c67d5de1..0dd1df07e1e 100644
--- a/code/modules/turbolift/turbolift.dm
+++ b/code/modules/turbolift/turbolift.dm
@@ -94,11 +94,7 @@
if (!moving_upwards || next_floor == floors[floors.len]) // If moving down or moving to the top floor, squish.
for(var/turf/T in destination)
for(var/atom/movable/AM in T)
- if(istype(AM, /mob/living))
- var/mob/living/M = AM
- M.gib()
- else if(AM.simulated && !istype(AM, /mob/abstract/eye))
- qdel(AM)
+ AM.crush_act()
origin.move_contents_to(destination)
diff --git a/html/changelogs/Sindorman-bugfixes.yml b/html/changelogs/Sindorman-bugfixes.yml
new file mode 100644
index 00000000000..bea93cd973f
--- /dev/null
+++ b/html/changelogs/Sindorman-bugfixes.yml
@@ -0,0 +1,16 @@
+author: PoZe
+
+delete-after: True
+
+changes:
+ - maptweak: "Access to Research Division Maint door is fixed"
+ - maptweak: "Added missing firelocks to construction level of security"
+ - bugfix: "Fixed broken small light icon to appear properly"
+ - tweak: "Shower now reacts with mobs as water supposed to, damaging slimes."
+ - tweak: "Pool, Ocean or generic water turfs now cleans anything that enters it, cleans it's own turf and damages slimes."
+ - tweak: "Fixed chainsaw unwielded force"
+ - balance: "Chainsaw powered force buffed, 30 unwielded and 60 wielded"
+ - tweak: "Closets now spawn one sheet of metal upon being destroyed"
+ - tweak: "Turbolifts now properly destroy atoms, and gib any mobs that are in closets"
+ - bugfix: "Crusher no longer kills AI eye"
+ - maptweak: "Medical construction level now has full camera coverage"
diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm
index bb01a39ecbf..a230c423093 100644
--- a/maps/aurora/aurora-4_mainlevel.dmm
+++ b/maps/aurora/aurora-4_mainlevel.dmm
@@ -51453,7 +51453,7 @@
/obj/machinery/door/airlock/maintenance{
name = "Research Division Maintenance";
req_access = list(47);
- req_one_access = newlist()
+ req_one_access = null
},
/obj/machinery/door/blast/regular{
density = 0;
@@ -56021,6 +56021,10 @@
pixel_x = 0;
pixel_y = 32
},
+/obj/machinery/light{
+ dir = 1;
+ icon_state = "tube1"
+ },
/turf/simulated/floor/tiled,
/area/hydroponics)
"bSh" = (
@@ -57144,7 +57148,8 @@
"bUv" = (
/obj/machinery/portable_atmospherics/hydroponics,
/obj/machinery/light{
- dir = 1
+ dir = 1;
+ icon_state = "tube1"
},
/turf/simulated/floor/tiled/dark,
/area/hydroponics)
@@ -64623,6 +64628,18 @@
icon_state = "asteroidplating"
},
/area/outpost/mining_main/eva)
+"clx" = (
+/obj/effect/floor_decal/corner/green{
+ icon_state = "corner_white";
+ dir = 9
+ },
+/obj/machinery/light{
+ dir = 8;
+ icon_state = "tube1";
+ pixel_y = 0
+ },
+/turf/simulated/floor/tiled,
+/area/hydroponics)
(1,1,1) = {"
aaa
@@ -90500,7 +90517,7 @@ bUu
bSO
bSO
bSO
-bSO
+clx
bWn
bWm
bWY
@@ -91529,7 +91546,7 @@ bUT
bVs
bVN
bWb
-bWp
+bTt
bWm
bXb
bXp
diff --git a/maps/aurora/aurora-5_interstitial.dmm b/maps/aurora/aurora-5_interstitial.dmm
index 7c3c80b67ac..935d4c64c8c 100644
--- a/maps/aurora/aurora-5_interstitial.dmm
+++ b/maps/aurora/aurora-5_interstitial.dmm
@@ -2764,8 +2764,24 @@
/turf/simulated/floor/carpet,
/area/security/detectives_office)
"ff" = (
-/turf/simulated/floor/holofloor/tiled,
-/area/security/training)
+/obj/effect/floor_decal/corner/green/full{
+ icon_state = "corner_white_full";
+ dir = 1
+ },
+/obj/structure/flora/pottedplant,
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1";
+ pixel_x = 0
+ },
+/obj/machinery/alarm{
+ dir = 8;
+ icon_state = "alarm0";
+ pixel_x = 24
+ },
+/obj/machinery/camera/network/medbay,
+/turf/simulated/floor/tiled/white,
+/area/medical/psych)
"fg" = (
/obj/effect/floor_decal/corner/green{
icon_state = "corner_white";
@@ -3329,6 +3345,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/machinery/door/firedoor,
/turf/simulated/floor/wood,
/area/security/detectives_office)
"gh" = (
@@ -3535,6 +3552,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/machinery/door/firedoor,
/turf/simulated/floor/tiled,
/area/security/forensics_office)
"gy" = (
@@ -4072,6 +4090,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/machinery/door/firedoor,
/turf/simulated/floor/plating,
/area/security/investigations)
"hk" = (
@@ -4132,7 +4151,6 @@
/area/security/forensics_office)
"hn" = (
/obj/structure/grille,
-/obj/machinery/door/firedoor,
/obj/structure/window/reinforced{
dir = 4
},
@@ -4141,6 +4159,7 @@
dir = 1
},
/obj/structure/window/reinforced,
+/obj/machinery/door/firedoor,
/turf/simulated/floor/plating,
/area/security/forensics_office)
"ho" = (
@@ -4234,6 +4253,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/machinery/door/firedoor,
/turf/simulated/floor/tiled,
/area/security/training)
"hw" = (
@@ -4555,6 +4575,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/machinery/door/firedoor,
/turf/simulated/floor/plating,
/area/security/training)
"ib" = (
@@ -5339,13 +5360,22 @@
/turf/simulated/floor/tiled,
/area/security/training)
"jA" = (
-/obj/effect/floor_decal/corner/red{
+/obj/effect/floor_decal/corner/green{
icon_state = "corner_white";
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
-/obj/structure/weightlifter,
-/turf/simulated/floor/tiled,
-/area/mine/unexplored)
+/obj/machinery/firealarm/west,
+/obj/machinery/camera/network/medbay{
+ c_tag = "Medical - Isolation Room";
+ dir = 4;
+ icon_state = "camera";
+ network = list("Medical","Isolation Room")
+ },
+/turf/simulated/floor/tiled/white,
+/area/medical/psych)
"jB" = (
/obj/effect/floor_decal/corner/blue/full{
icon_state = "corner_white_full";
@@ -5466,32 +5496,18 @@
/turf/simulated/floor/tiled/white,
/area/medical/psych)
"jP" = (
-/obj/effect/floor_decal/corner/green/full{
- icon_state = "corner_white_full";
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
},
-/obj/structure/flora/pottedplant,
-/obj/machinery/light{
- dir = 4;
- icon_state = "tube1";
- pixel_x = 0
- },
-/obj/machinery/alarm{
- dir = 8;
- icon_state = "alarm0";
- pixel_x = 24
- },
-/turf/simulated/floor/tiled/white,
+/obj/machinery/camera/network/medbay,
+/turf/simulated/floor/tiled/dark,
/area/medical/psych)
"jQ" = (
/obj/effect/floor_decal/corner/green{
icon_state = "corner_white";
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
-/obj/machinery/firealarm/west,
+/obj/machinery/camera/network/medbay,
/turf/simulated/floor/tiled/white,
/area/medical/psych)
"jR" = (
@@ -6512,6 +6528,12 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
},
+/obj/machinery/camera/network/medbay{
+ c_tag = "Medical - Isolation Room";
+ dir = 4;
+ icon_state = "camera";
+ network = list("Medical","Isolation Room")
+ },
/turf/simulated/floor/tiled/white,
/area/medical/psych)
"lH" = (
@@ -42446,7 +42468,7 @@ ab
ab
jG
jL
-jQ
+jA
kb
kl
kw
@@ -44761,7 +44783,7 @@ jH
jM
jV
jG
-ko
+jP
kB
jG
kS
@@ -45792,7 +45814,7 @@ jG
kr
jG
jG
-jM
+jQ
lf
lq
kc
@@ -46300,7 +46322,7 @@ aa
ab
ab
jG
-jP
+ff
jX
ki
kt
diff --git a/maps/aurora/aurora-8_derelict.dmm b/maps/aurora/aurora-8_derelict.dmm
index d68d5fed85f..08fc949e1bc 100644
--- a/maps/aurora/aurora-8_derelict.dmm
+++ b/maps/aurora/aurora-8_derelict.dmm
@@ -6343,9 +6343,9 @@
/area/derelict/hallway/southeast)
"sR" = (
/obj/machinery/light/small{
- icon_state = "bulb-broken";
+ base_state = "bulb_broken";
dir = 8;
- base_state = "bulb-broken"
+ icon_state = "bulb_broken"
},
/turf/simulated/floor/airless,
/area/derelict/hallway/southeast)
@@ -7739,9 +7739,9 @@
/area/derelict/hallway/southeast)
"wp" = (
/obj/machinery/light/small{
- base_state = "bulb-broken";
+ base_state = "bulb_broken";
dir = 4;
- icon_state = "bulb-broken"
+ icon_state = "bulb_broken"
},
/obj/structure/closet/walllocker/emerglocker/north,
/turf/simulated/floor/airless,