diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 4e83a662499..f4051c16279 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -91,7 +91,7 @@ return /obj/machinery/computer/attackby(obj/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) + if(istype(I, /obj/item/weapon/screwdriver) && circuit && !(flags&ABSTRACT)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << " You start to disconnect the monitor..." if(do_after(user, 20, target = src)) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 7d611a644c9..af7ab8934a3 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -26,7 +26,11 @@ electronics = null return ..() - +/obj/machinery/door/window/update_icon() + if(density) + icon_state = base_state + else + icon_state = "[src.base_state]open" /obj/machinery/door/window/proc/open_and_close() open() @@ -153,14 +157,15 @@ /obj/machinery/door/window/proc/take_damage(damage) src.health = max(0, src.health - damage) if (src.health <= 0) - var/debris = list( - new /obj/item/weapon/shard(src.loc), - new /obj/item/weapon/shard(src.loc), - new /obj/item/stack/rods(src.loc, 2), - new /obj/item/stack/cable_coil(src.loc, 2) - ) - for(var/obj/fragment in debris) - transfer_fingerprints_to(fragment) + if(!(flags&ABSTRACT)) + var/debris = list( + new /obj/item/weapon/shard(src.loc), + new /obj/item/weapon/shard(src.loc), + new /obj/item/stack/rods(src.loc, 2), + new /obj/item/stack/cable_coil(src.loc, 2) + ) + for(var/obj/fragment in debris) + transfer_fingerprints_to(fragment) src.density = 0 qdel(src) return @@ -271,63 +276,64 @@ add_fingerprint(user) - if(istype(I, /obj/item/weapon/screwdriver)) - if(src.density || src.operating) - user << "You need to open the door to access the maintenance panel!" + if(!(flags&ABSTRACT)) + if(istype(I, /obj/item/weapon/screwdriver)) + if(src.density || src.operating) + user << "You need to open the door to access the maintenance panel!" + return + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + src.p_open = !( src.p_open ) + user << "You [p_open ? "open":"close"] the maintenance panel of the [src.name]." return - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - src.p_open = !( src.p_open ) - user << "You [p_open ? "open":"close"] the maintenance panel of the [src.name]." - return - if(istype(I, /obj/item/weapon/crowbar)) - if(p_open && !src.density && !src.operating) - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user.visible_message("[user] removes the electronics from the [src.name].", \ - "You start to remove electronics from the [src.name]...") - if(do_after(user,40, target = src)) - if(src.p_open && !src.density && !src.operating && src.loc) - var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(src.loc) - switch(base_state) - if("left") - WA.facing = "l" - if("right") - WA.facing = "r" - if("leftsecure") - WA.facing = "l" - WA.secure = 1 - if("rightsecure") - WA.facing = "r" - WA.secure = 1 - WA.anchored = 1 - WA.state= "02" - WA.dir = src.dir - WA.ini_dir = src.dir - WA.update_icon() - WA.created_name = src.name + if(istype(I, /obj/item/weapon/crowbar)) + if(p_open && !src.density && !src.operating) + playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + user.visible_message("[user] removes the electronics from the [src.name].", \ + "You start to remove electronics from the [src.name]...") + if(do_after(user,40, target = src)) + if(src.p_open && !src.density && !src.operating && src.loc) + var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(src.loc) + switch(base_state) + if("left") + WA.facing = "l" + if("right") + WA.facing = "r" + if("leftsecure") + WA.facing = "l" + WA.secure = 1 + if("rightsecure") + WA.facing = "r" + WA.secure = 1 + WA.anchored = 1 + WA.state= "02" + WA.dir = src.dir + WA.ini_dir = src.dir + WA.update_icon() + WA.created_name = src.name - if(emagged) - user << "You discard the damaged electronics." - qdel(src) - return + if(emagged) + user << "You discard the damaged electronics." + qdel(src) + return - user << "You remove the airlock electronics." + user << "You remove the airlock electronics." - var/obj/item/weapon/electronics/airlock/ae - if(!electronics) - ae = new/obj/item/weapon/electronics/airlock( src.loc ) - if(req_one_access) - ae.use_one_access = 1 - ae.conf_access = src.req_one_access + var/obj/item/weapon/electronics/airlock/ae + if(!electronics) + ae = new/obj/item/weapon/electronics/airlock( src.loc ) + if(req_one_access) + ae.use_one_access = 1 + ae.conf_access = src.req_one_access + else + ae.conf_access = src.req_access else - ae.conf_access = src.req_access - else - ae = electronics - electronics = null - ae.loc = src.loc + ae = electronics + electronics = null + ae.loc = src.loc - qdel(src) - return + qdel(src) + return //If windoor is unpowered, crowbar, fireaxe and armblade can force it. diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 1c2c307973c..2de1afe916c 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -278,7 +278,7 @@ Class Procs: gl_uid++ /obj/machinery/proc/default_pry_open(obj/item/weapon/crowbar/C) - . = !(state_open || panel_open || is_operational()) && istype(C) + . = !(state_open || panel_open || is_operational() || (flags & ABSTRACT)) && istype(C) if(.) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) visible_message("[usr] pry open \the [src].", "You pry open \the [src].") @@ -286,7 +286,7 @@ Class Procs: return 1 /obj/machinery/proc/default_deconstruction_crowbar(obj/item/weapon/crowbar/C, ignore_panel = 0) - . = istype(C) && (panel_open || ignore_panel) + . = istype(C) && (panel_open || ignore_panel) && !(flags & ABSTRACT) if(.) deconstruction() playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) @@ -301,7 +301,7 @@ Class Procs: qdel(src) /obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/weapon/screwdriver/S) - if(istype(S)) + if(istype(S) && !(flags & ABSTRACT)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(!panel_open) panel_open = 1 @@ -323,7 +323,7 @@ Class Procs: return 0 /obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) - if(istype(W)) + if(istype(W) && !(flags & ABSTRACT)) user << "You begin [anchored ? "un" : ""]securing [name]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, time, target = src)) @@ -334,6 +334,8 @@ Class Procs: return 0 /obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W) + if(flags & ABSTRACT) + return var/shouldplaysound = 0 if(istype(W) && component_parts) if(panel_open || W.works_from_distance) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 66cb8cf9d13..5038feeaeb1 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -177,17 +177,12 @@ /obj/item/weapon/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity) if(!proximity) return - if(A && wielded && (istype(A,/obj/structure/window) || istype(A,/obj/structure/grille))) //destroys windows and grilles in one hit - if(istype(A,/obj/structure/window)) //should just make a window.Break() proc but couldn't bother with it + if(wielded) //destroys windows and grilles in one hit + if(istype(A,/obj/structure/window)) var/obj/structure/window/W = A - - new /obj/item/weapon/shard( W.loc ) - if(W.reinf) new /obj/item/stack/rods( W.loc) - - if (W.dir == SOUTHWEST) - new /obj/item/weapon/shard( W.loc ) - if(W.reinf) new /obj/item/stack/rods( W.loc) - qdel(A) + W.spawnfragments() // this will qdel and spawn shards + else if(istype(A,/obj/structure/grille)) + qdel(A) /* diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index df7d7673d92..c6d06d46405 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -58,7 +58,7 @@ qdel(src) /obj/structure/bed/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/wrench)) + if(istype(W, /obj/item/weapon/wrench) && !(flags&ABSTRACT)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(buildstacktype) new buildstacktype(loc, buildstackamount) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index fc34408821c..65568b54bca 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -165,7 +165,8 @@ /obj/structure/closet/ex_act(severity, target) contents_explosion(severity, target) - new material_drop(loc) + if(loc && ispath(material_drop) && !(flags & ABSTRACT)) + new material_drop(loc) dump_contents() qdel(src) ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 2d8da625c67..859dc5560bb 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -147,26 +147,26 @@ if (istype(I, /obj/item/weapon/grab)) tablepush(I, user) return - - if (istype(I, /obj/item/weapon/screwdriver)) - if(istype(src, /obj/structure/table/reinforced)) - var/obj/structure/table/reinforced/RT = src - if(RT.status == 1) + if(!(flags&ABSTRACT)) + if (istype(I, /obj/item/weapon/screwdriver)) + if(istype(src, /obj/structure/table/reinforced)) + var/obj/structure/table/reinforced/RT = src + if(RT.status == 1) + table_destroy(2, user) + return + else table_destroy(2, user) return - else - table_destroy(2, user) - return - if (istype(I, /obj/item/weapon/wrench)) - if(istype(src, /obj/structure/table/reinforced)) - var/obj/structure/table/reinforced/RT = src - if(RT.status == 1) + if (istype(I, /obj/item/weapon/wrench)) + if(istype(src, /obj/structure/table/reinforced)) + var/obj/structure/table/reinforced/RT = src + if(RT.status == 1) + table_destroy(3, user) + return + else table_destroy(3, user) return - else - table_destroy(3, user) - return if (istype(I, /obj/item/weapon/storage/bag/tray)) var/obj/item/weapon/storage/bag/tray/T = I @@ -205,7 +205,7 @@ #define TBL_DECONSTRUCT 3 /obj/structure/table/proc/table_destroy(destroy_type, mob/user) - if(!deconstructable) + if(!deconstructable || (flags&ABSTRACT)) return if(destroy_type == TBL_DESTROY) @@ -462,7 +462,7 @@ return /obj/structure/rack/attackby(obj/item/weapon/W, mob/user, params) - if (istype(W, /obj/item/weapon/wrench)) + if (istype(W, /obj/item/weapon/wrench) && !(flags&ABSTRACT)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) rack_destroy() return @@ -517,9 +517,10 @@ */ /obj/structure/rack/proc/rack_destroy() - density = 0 - var/obj/item/weapon/rack_parts/newparts = new(loc) - transfer_fingerprints_to(newparts) + if(!(flags&ABSTRACT)) + density = 0 + var/obj/item/weapon/rack_parts/newparts = new(loc) + transfer_fingerprints_to(newparts) qdel(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cb0c4bc4957..ae75bbc7808 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -30,17 +30,20 @@ health = maxhealth if(re) reinf = re - storeditems.Add(new/obj/item/weapon/shard(src)) - if(fulltile) - storeditems.Add(new/obj/item/weapon/shard(src)) - ini_dir = dir if(reinf) state = 2*anchored - var/obj/item/stack/rods/R = new/obj/item/stack/rods(src) - storeditems.Add(R) - if(fulltile) - R.add(1) + if(!(flags & ABSTRACT)) + storeditems.Add(new/obj/item/weapon/shard(src)) + if(fulltile) + storeditems.Add(new/obj/item/weapon/shard(src)) + if(reinf) + var/obj/item/stack/rods/R = new/obj/item/stack/rods(src) + storeditems.Add(R) + if(fulltile) + R.add(1) + + ini_dir = dir air_update_turf(1) return @@ -191,38 +194,8 @@ return 1 //skip the afterattack add_fingerprint(user) - if(istype(I, /obj/item/weapon/screwdriver)) - playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) - if(reinf && (state == 2 || state == 1)) - user << (state == 2 ? "You begin to unscrew the window from the frame..." : "You begin to screw the window to the frame...") - else if(reinf && state == 0) - user << (anchored ? "You begin to unscrew the frame from the floor..." : "You begin to screw the frame to the floor...") - else if(!reinf) - user << (anchored ? "You begin to unscrew the window from the floor..." : "You begin to screw the window to the floor...") - if(do_after(user, 40, target = src)) - if(reinf && (state == 1 || state == 2)) - //If state was unfastened, fasten it, else do the reverse - state = (state == 1 ? 2 : 1) - user << (state == 1 ? "You unfasten the window from the frame." : "You fasten the window to the frame.") - else if(reinf && state == 0) - anchored = !anchored - update_nearby_icons() - user << (anchored ? "You fasten the frame to the floor." : "You unfasten the frame from the floor.") - else if(!reinf) - anchored = !anchored - update_nearby_icons() - user << (anchored ? "You fasten the window to the floor." : "You unfasten the window.") - - else if (istype(I, /obj/item/weapon/crowbar) && reinf && (state == 0 || state == 1)) - user << (state == 0 ? "You begin to lever the window into the frame..." : "You begin to lever the window out of the frame...") - playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) - if(do_after(user, 40, target = src)) - //If state was out of frame, put into frame, else do the reverse - state = (state == 0 ? 1 : 0) - user << (state == 1 ? "You pry the window into the frame." : "You pry the window out of the frame.") - - else if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent == "help") + if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent == "help") var/obj/item/weapon/weldingtool/WT = I if(health < maxhealth) if(WT.remove_fuel(0,user)) @@ -235,32 +208,63 @@ user << "[src] is already in good condition!" return update_nearby_icons() + else if(!(flags&ABSTRACT)) + if(istype(I, /obj/item/weapon/screwdriver)) + playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) + if(reinf && (state == 2 || state == 1)) + user << (state == 2 ? "You begin to unscrew the window from the frame..." : "You begin to screw the window to the frame...") + else if(reinf && state == 0) + user << (anchored ? "You begin to unscrew the frame from the floor..." : "You begin to screw the frame to the floor...") + else if(!reinf) + user << (anchored ? "You begin to unscrew the window from the floor..." : "You begin to screw the window to the floor...") - else if(istype(I, /obj/item/weapon/wrench) && !anchored) - playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) - user << " You begin to disassemble [src]..." - if(do_after(user, 40, target = src)) - if(disassembled) - return //Prevents multiple deconstruction attempts + if(do_after(user, 40, target = src)) + if(reinf && (state == 1 || state == 2)) + //If state was unfastened, fasten it, else do the reverse + state = (state == 1 ? 2 : 1) + user << (state == 1 ? "You unfasten the window from the frame." : "You fasten the window to the frame.") + else if(reinf && state == 0) + anchored = !anchored + update_nearby_icons() + user << (anchored ? "You fasten the frame to the floor." : "You unfasten the frame from the floor.") + else if(!reinf) + anchored = !anchored + update_nearby_icons() + user << (anchored ? "You fasten the window to the floor." : "You unfasten the window.") - if(reinf) - var/obj/item/stack/sheet/rglass/RG = new (user.loc) - RG.add_fingerprint(user) - if(fulltile) //fulltiles drop two panes - RG = new (user.loc) + else if (istype(I, /obj/item/weapon/crowbar) && reinf && (state == 0 || state == 1)) + user << (state == 0 ? "You begin to lever the window into the frame..." : "You begin to lever the window out of the frame...") + playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) + if(do_after(user, 40, target = src)) + //If state was out of frame, put into frame, else do the reverse + state = (state == 0 ? 1 : 0) + user << (state == 1 ? "You pry the window into the frame." : "You pry the window out of the frame.") + + else if(istype(I, /obj/item/weapon/wrench) && !anchored) + playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) + user << " You begin to disassemble [src]..." + if(do_after(user, 40, target = src)) + if(disassembled) + return //Prevents multiple deconstruction attempts + + if(reinf) + var/obj/item/stack/sheet/rglass/RG = new (user.loc) RG.add_fingerprint(user) + if(fulltile) //fulltiles drop two panes + RG = new (user.loc) + RG.add_fingerprint(user) - else - var/obj/item/stack/sheet/glass/G = new (user.loc) - G.add_fingerprint(user) - if(fulltile) - G = new (user.loc) + else + var/obj/item/stack/sheet/glass/G = new (user.loc) G.add_fingerprint(user) + if(fulltile) + G = new (user.loc) + G.add_fingerprint(user) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - disassembled = 1 - user << "You successfully disassemble [src]." - qdel(src) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + disassembled = 1 + user << "You successfully disassemble [src]." + qdel(src) else if(istype(I, /obj/item/weapon/rcd)) //Do not attack the window if the user is holding an RCD return diff --git a/code/modules/holodeck/computer_funcs.dm b/code/modules/holodeck/computer_funcs.dm index 0913af05f55..7e15d97ef5f 100644 --- a/code/modules/holodeck/computer_funcs.dm +++ b/code/modules/holodeck/computer_funcs.dm @@ -70,15 +70,25 @@ // should also remove/limit/filter reagents? // this is an exercise left to others I'm afraid. -Sayu spawned = A.copy_contents_to(linked, 1, nerf_weapons = !emagged) + for(var/obj/machinery/M in spawned) + M.flags |= ABSTRACT + for(var/obj/structure/S in spawned) + S.flags |= ABSTRACT effects = list() spawn(30) + var/list/added = list() for(var/obj/effect/holodeck_effect/HE in spawned) effects += HE spawned -= HE var/atom/x = HE.activate(src) if(istype(x) || islist(x)) spawned += x // holocarp are not forever + added += x + for(var/obj/machinery/M in added) + M.flags |= ABSTRACT + for(var/obj/structure/S in added) + S.flags |= ABSTRACT /obj/machinery/computer/holodeck/proc/derez(var/obj/obj, var/silent = 1, var/forced = 0) // Emagging a machine creates an anomaly in the derez systems. diff --git a/code/modules/holodeck/tables.dm b/code/modules/holodeck/tables.dm index b91731b33e8..c96a1f1523b 100644 --- a/code/modules/holodeck/tables.dm +++ b/code/modules/holodeck/tables.dm @@ -22,47 +22,3 @@ icon_state = "poker_table" canSmoothWith = list(/obj/structure/table/holo/wood, /obj/structure/table/holo/poker) -/obj/structure/table/holo/attack_paw(mob/user as mob) - return - -/obj/structure/table/holo/attack_alien(mob/user as mob) - return - -/obj/structure/table/holo/attack_animal(mob/living/simple_animal/user as mob) - return - -/obj/structure/table/holo/attack_hand(mob/user as mob) - return -/obj/structure/table/holo/attack_hulk() - return - -/obj/structure/table/holo/attackby(obj/item/I, mob/user, params) - if (istype(I, /obj/item/weapon/grab)) - tablepush(I, user) - return - if (istype(I, /obj/item/weapon/storage/bag/tray)) - var/obj/item/weapon/storage/bag/tray/T = I - if(T.contents.len > 0) // If the tray isn't empty - var/list/obj/item/oldContents = T.contents.Copy() - T.quick_empty() - - for(var/obj/item/C in oldContents) - C.loc = src.loc - - user.visible_message("[user] empties [I] on [src].") - return - // If the tray IS empty, continue on (tray will be placed on the table like other items) - - if(isrobot(user)) - return - - if(!(I.flags & ABSTRACT)) //rip more parems rip in peace ;_; - if(user.drop_item()) - I.Move(loc) - var/list/click_params = params2list(params) - //Center the icon where the user clicked. - if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) - return - //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - I.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index b19c5bb019e..11d22461ae9 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -1,8 +1,8 @@ /turf/simulated/floor/holofloor icon_state = "floor" thermal_conductivity = 0 - broken_states = list() - burnt_states = list() + broken_states = list("engine") + burnt_states = list("engine") /turf/simulated/floor/holofloor/attackby(obj/item/weapon/W as obj, mob/user as mob) return // HOLOFLOOR DOES NOT GIVE A FUCK diff --git a/code/modules/holodeck/windows.dm b/code/modules/holodeck/windows.dm index 41d3de65da7..8a74e2317a2 100644 --- a/code/modules/holodeck/windows.dm +++ b/code/modules/holodeck/windows.dm @@ -7,29 +7,15 @@ layer = 3.2//Just above doors pressure_resistance = 4*ONE_ATMOSPHERE anchored = 1.0 - flags = ON_BORDER + flags = ON_BORDER | ABSTRACT maxhealth = 100 disassembled = 1 // prevents noise on destruction -/obj/structure/window/holo/New() - ..() - for(var/O in contents) - qdel(O) // standard window code generates stuff no matter what we want - -/obj/structure/window/holo/spawnfragments() - qdel(src) - return - -/obj/structure/window/holo/attackby(var/obj/item/I, var/mob/user) - if(istype(I,/obj/item/weapon/screwdriver)) - user << "You see no screws to unfasten!" - return - return ..() - /obj/structure/window/holo/hit(var/damage, var/sound_effect = 1) . = ..() spawn(50) // self-healing health += damage + update_icon() /obj/structure/window/holo/opaque name = "tinted window"