From e6baab0c23ef37a55cb3d090be0ca7c072668d52 Mon Sep 17 00:00:00 2001 From: Mykhailo Bykhovtsev Date: Wed, 18 Apr 2018 15:03:46 -0700 Subject: [PATCH] Code and Map Bugfixes (#4514) - Access to Research Division Maintenance airlock is fixed #4477 - Changed shower to wash any mob present on active shower tile, also added damage to slimes. #4483 - Added missing emergency firelocks in interstatial level of security. #4444 - Fixed wrong spelling of broken light bulb icon state, issue #4541 - Added for pool to use reagents water on mobs or objects, now pool cleans itself and user, plus damages slimes. #4544 #4545 - `crush_act` now checks if atom is simulated. #4001 - turbolifts now use `crush_act` on atoms. - Closets have their own crush_act. They now gib mobs inside of them. issue #4538 - Closets uses its internal function to dump content upon destruction. - Closet now spawn one sheet of steel when destroyed. - Fixed chainsaw unwielded force to be appropriate. Buffed chainsaw on wielded/unwielded force. Wielded is now `60` and unwielded is `30` if it is powered. #4586 - Added missing cameras to medical construction level. #4581 - Hydroponics tray status no longer blocked by light fixture, moved it in a better spot. Added one more light to hydroponics to not have shadows. #4449 --- code/game/machinery/crusher_piston.dm | 22 +-- .../items/weapons/material/twohanded.dm | 6 +- .../structures/crates_lockers/closets.dm | 19 ++- code/game/objects/structures/watercloset.dm | 10 +- code/game/turfs/simulated/water.dm | 140 ++++++++++++++++-- code/modules/turbolift/turbolift.dm | 6 +- html/changelogs/Sindorman-bugfixes.yml | 16 ++ maps/aurora/aurora-4_mainlevel.dmm | 25 +++- maps/aurora/aurora-5_interstitial.dmm | 82 ++++++---- maps/aurora/aurora-8_derelict.dmm | 8 +- 10 files changed, 261 insertions(+), 73 deletions(-) create mode 100644 html/changelogs/Sindorman-bugfixes.yml 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,