From 5fde45d366871ad58f332a08d505684a5024c782 Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Fri, 10 Sep 2021 15:55:22 +0100 Subject: [PATCH 01/13] fences and railings --- code/game/atoms.dm | 7 + code/game/objects/items/stacks/rods.dm | 15 +- code/game/objects/structures/fence.dm | 168 +++++++++++++++++++++++ code/game/objects/structures/railings.dm | 124 +++++++++++++++++ icons/obj/fence.dmi | Bin 0 -> 7530 bytes paradise.dme | 2 + 6 files changed, 314 insertions(+), 2 deletions(-) create mode 100644 code/game/objects/structures/fence.dm create mode 100644 code/game/objects/structures/railings.dm create mode 100644 icons/obj/fence.dmi diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d8dd3bb44c8..b067e6f0812 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1153,3 +1153,10 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) if(degrees) appearance_flags |= PIXEL_SCALE transform = M + +///Setter for the `density` variable to append behavior related to its changing. +/atom/proc/set_density(new_value) + if(density == new_value) + return + . = density + density = new_value diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index c736026bca8..48a60768b28 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,6 +1,17 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ - new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = 1, on_floor = 1), \ + null, + new /datum/stack_recipe("railing", /obj/structure/railing, 3, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("railing corner", /obj/structure/railing/corner, 3, time = 10, one_per_turf = 1, on_floor = 1), \ + null, + new /datum/stack_recipe_list("chainlink fence", list( \ + new/datum/stack_recipe("chainlink fence", /obj/structure/fence, 5, time = 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("chainlink fence post", /obj/structure/fence/post, 5, time = 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("chainlink fence corner", /obj/structure/fence/corner, 5, time = 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("chainlink fence door", /obj/structure/fence/door, 10, time = 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("chainlink fence end", /obj/structure/fence/end, 3, time = 10, one_per_turf = 1, on_floor = 1), \ + )), \ )) /obj/item/stack/rods diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm new file mode 100644 index 00000000000..361cef688d6 --- /dev/null +++ b/code/game/objects/structures/fence.dm @@ -0,0 +1,168 @@ +//Chain link fences +//Sprites ported from /VG/ + + +#define CUT_TIME 100 +#define CLIMB_TIME 150 + +#define NO_HOLE 0 //section is intact +#define MEDIUM_HOLE 1 //medium hole in the section - can climb through +#define LARGE_HOLE 2 //large hole in the section - can walk through +#define MAX_HOLE_SIZE LARGE_HOLE +#define HOLE_REPAIR (hole_size * 2) //How many rods to fix these sections + +/obj/structure/fence + name = "fence" + desc = "A chain link fence. Not as effective as a wall, but generally it keeps people out." + density = TRUE + anchored = TRUE + + icon = 'icons/obj/fence.dmi' + icon_state = "straight" + + var/cuttable = TRUE + var/hole_size= NO_HOLE + var/invulnerable = FALSE + +/obj/structure/fence/Initialize() + . = ..() + + update_cut_status() + +/obj/structure/fence/examine(mob/user) + . = ..() + + switch(hole_size) + if(MEDIUM_HOLE) + . += "There is a large hole in \the [src]." + if(LARGE_HOLE) + . += "\The [src] has been completely cut through." + +/obj/structure/fence/end + icon_state = "end" + cuttable = FALSE + +/obj/structure/fence/corner + icon_state = "corner" + cuttable = FALSE + +/obj/structure/fence/post + icon_state = "post" + cuttable = FALSE + +/obj/structure/fence/cut/medium + icon_state = "straight_cut2" + hole_size = MEDIUM_HOLE + +/obj/structure/fence/cut/large + icon_state = "straight_cut3" + hole_size = LARGE_HOLE + + +/obj/structure/fence/wirecutter_act(mob/living/user, obj/item/W) + if(!cuttable) + to_chat(user, "This section of the fence can't be cut!") + return + if(invulnerable) + to_chat(user, "This fence is too strong to cut through!") + return + var/current_stage = hole_size + if(current_stage >= MAX_HOLE_SIZE) + to_chat(user, "This fence has too much cut out of it already!") + return + + user.visible_message("\The [user] starts cutting through \the [src] with \the [W].",\ + "You start cutting through \the [src] with \the [W].") + if(W.use_tool(src, user, CUT_TIME * W.toolspeed, volume = W.tool_volume)) + if(current_stage == hole_size) + switch(++hole_size) + if(MEDIUM_HOLE) + visible_message("\The [user] cuts into \the [src] some more.") + to_chat(user, "You could probably fit yourself through that hole now. Although climbing through would be much faster if you made it even bigger.") + climbable = TRUE + if(LARGE_HOLE) + visible_message("\The [user] completely cuts through \the [src].") + to_chat(user, "The hole in \the [src] is now big enough to walk through.") + climbable = FALSE + update_cut_status() + return + + +/obj/structure/fence/attackby(obj/item/C, mob/user) + . = ..() + if(istype(C, /obj/item/stack/rods)) + if(hole_size == NO_HOLE) + return + var/obj/item/stack/rods/R = C + if(R.get_amount() < HOLE_REPAIR) + to_chat(user, "You need [HOLE_REPAIR] rods to fix this fence!") + return TRUE + else + to_chat(user, "You begin repairing the fence...") + if(do_after(user, 30 * C.toolspeed, target = src)) + if(R.get_amount() >= HOLE_REPAIR && !(hole_size == NO_HOLE)) + hole_size = NO_HOLE + playsound(src, C.usesound, 80, 1) + R.use(2) + to_chat(user, "You repair the fence.") + update_cut_status() + return TRUE + +/obj/structure/fence/proc/update_cut_status() + if(!cuttable) + return + var/new_density = TRUE + switch(hole_size) + if(NO_HOLE) + icon_state = initial(icon_state) + if(MEDIUM_HOLE) + icon_state = "straight_cut2" + if(LARGE_HOLE) + icon_state = "straight_cut3" + new_density = FALSE + set_density(new_density) + +//FENCE DOORS + +/obj/structure/fence/door + name = "fence door" + desc = "Not very useful without a real lock." + icon_state = "door_closed" + cuttable = FALSE + var/open = FALSE + +/obj/structure/fence/door/Initialize() + . = ..() + update_door_status() + +/obj/structure/fence/door/opened + icon_state = "door_opened" + open = TRUE + density = TRUE + +/obj/structure/fence/door/attack_hand(mob/user, list/modifiers) + if(can_open(user)) + toggle(user) + + return TRUE + +/obj/structure/fence/door/proc/toggle(mob/user) + open = !open + visible_message("\The [user] [open ? "opens" : "closes"] \the [src].") + update_door_status() + playsound(src, 'sound/machines/door_open.ogg', 100, TRUE) + +/obj/structure/fence/door/proc/update_door_status() + set_density(!density) + icon_state = density ? "door_closed" : "door_opened" + +/obj/structure/fence/door/proc/can_open(mob/user) + return TRUE + +#undef CUT_TIME +#undef CLIMB_TIME + +#undef NO_HOLE +#undef MEDIUM_HOLE +#undef LARGE_HOLE +#undef MAX_HOLE_SIZE diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm new file mode 100644 index 00000000000..ecfa334b337 --- /dev/null +++ b/code/game/objects/structures/railings.dm @@ -0,0 +1,124 @@ +/obj/structure/railing + name = "railing" + desc = "Basic railing meant to protect idiots like you from falling." + icon = 'icons/obj/fence.dmi' + icon_state = "railing" + density = TRUE + anchored = TRUE + climbable = TRUE + var/currently_climbed = FALSE + +/obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch + icon_state = "railing_corner" + density = FALSE + climbable = FALSE + +/obj/structure/railing/Initialize() + . = ..() + +/obj/structure/railing/attackby(obj/item/I, mob/living/user, params) + ..() + add_fingerprint(user) + +/obj/structure/railing/welder_act(mob/living/user, obj/item/I) + if(user.intent == INTENT_HELP) + if(obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount = 0)) + return + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 40, volume = 50)) + obj_integrity = max_integrity + to_chat(user, "You repair [src].") + return + + to_chat(user, "[src] is already in good condition!") + return + +/obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I) + . = ..() + if(!anchored) + to_chat(user, "You cut apart the railing.") + I.play_tool_sound(src, 100) + deconstruct() + return TRUE + +/obj/structure/railing/deconstruct(disassembled) + if(!(flags & NODECONSTRUCT)) + var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 3) + transfer_fingerprints_to(rod) + return ..() + +///Implements behaviour that makes it possible to unanchor the railing. +/obj/structure/railing/wrench_act(mob/living/user, obj/item/I) + . = ..() + if(flags & NODECONSTRUCT) + return + to_chat(user, "You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor...") + if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) + if(!anchored) + anchored = TRUE + else + anchored = FALSE + to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.") + return TRUE + +/obj/structure/railing/CanPass(atom/movable/mover, turf/target) + ..() + var/mob/living/M = mover + if(M.flying || M.floating || mover.throwing) + return TRUE + if(get_dir(loc, target) == dir) + return !density + return TRUE + +/obj/structure/railing/corner/CanPass() + ..() + return TRUE + +/obj/structure/railing/CheckExit(atom/movable/O, target) + var/mob/living/M = O + if(M.flying | M.floating) + return TRUE + if(O.throwing) + return TRUE + if(O.move_force >= MOVE_FORCE_EXTREMELY_STRONG) + return TRUE + if(currently_climbed) + if(get_turf(M) == get_turf(src)) + var/turf/T = target + if(T.density) + return TRUE + for(var/atom/A in T) + if(A.density) + return FALSE + currently_climbed = FALSE + return TRUE + if(get_dir(O.loc, target) == dir) + return FALSE + return TRUE + +/obj/structure/railing/do_climb(mob/living/user) + . = ..() + if(!climbable) + return + if(get_turf(user) == get_turf(src)) + currently_climbed = TRUE + +/obj/structure/railing/proc/can_be_rotated(mob/user, rotation_type) + if(anchored) + to_chat(user, "[src] cannot be rotated while it is fastened to the floor!") + return FALSE + + var/target_dir = turn(dir, -90) + + if(!valid_window_location(loc, target_dir)) //Expanded to include rails, as well! + to_chat(user, "[src] cannot be rotated in that direction!") + return FALSE + return TRUE + +/obj/structure/railing/proc/check_anchored(checked_anchored) + if(anchored == checked_anchored) + return TRUE + +/obj/structure/railing/proc/after_rotation(mob/user,rotation_type) + add_fingerprint(user) diff --git a/icons/obj/fence.dmi b/icons/obj/fence.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9debf92605378933d2128061630da337ebffb23f GIT binary patch literal 7530 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≫|vI z?GeZ4xBc_{i+s}INuA5}B}Sa6KV(MJ05AHW2v4N%!-ryUc2n+lnZgCTUwAe99_K3i;0Rws2+x9WjUVw>xcxrSJ04I;l~3Z-3^z}0cW_jr4zL} zA09IR{M2`bu0ea|;&^$;Hi38EJ0L7^cWLKrtKsoBly}f}c5lBs?q0lcLm)&XYbhFOwyYehfFbhfaoJ?p!!l&25?Xo! zr>1W9e&T#3t0s{t0le4QnkYZFYluL|A0grvtfGz;&XATBKpnO=QRkBV^ph|B%jzVG zei)a0yvbWX3n&l+1$;Dr@*x~k_BJqG8bNXB4ttn#Z`7}PH0k|hYfr|p1y}*0;q9&+ zq(8SivWKI0aL}>3x|+>uet33`qSP8BU`-L?=i~FDyA2UrJI^+Mx8i2 z;W3*{1c@4_^@ALX=hpXL(M^%F@$vQ5#;T}PO2s0HNEBIuAPAo{o1c1IEKt7hdISgwda!d>}<$@FnbmLa637=!Ts`1=@hkN zb{$W*!jKF-=-Cn=H8oX2NtjAc8SN2D7w*)WCC@sd*y@t%7mR%N)}@X-hD<}TwS8gJ zzrR{2Ii{J^voG({{uS8<1Tidvgh0cdUnbi%d~IVF^tQx`$$AfK3C?vPj2gyf`*;Dc zK!7_y^YtKtai~jzNq5W@QyS35HnCRGI(xvY&x8IfWqxIi^=va6*Or{@5w|NASoP85 z5S7E>!FW!b;C>}1nBe}9OjexW!KXYRSn~K?u)on7debvR@tU3FwhS{UBm3x=xS`Q# z88V`pF=vBxhD80>QEnakcsSddM9P4|jJNpfRO{q7Z$$YWb9Sf5L_ZEf?Qmm{TGZKj z(miKq=O5K4cT%abqgd!w%;Ngo5LF?3Z3lRBP4DtC_T$h32y+yh0TzKA(yZN^ptIOW z{a>y5!s08V4HaO~n1*$vjY^C;s=K7m527N7&$(E3rKQqyO+6=%Zqg$0l`rktU;fyl zeu7pDDk==+%3&Q3&aC^t=sB{`E6;FNEK1fQV5chF>`OyKN>u#|%-)G=kP3 zZCw^yJBBM#X^1`NO>c`^SX_i-4%oX%go15oG7oWt1AvtX;^?KtZ%(tu Date: Fri, 10 Sep 2021 16:28:01 +0100 Subject: [PATCH 02/13] shocking fences, railing layering, logical dirs --- code/game/objects/structures/fence.dm | 46 +++++++++++++++++++++++ code/game/objects/structures/railings.dm | 1 + icons/obj/fence.dmi | Bin 7530 -> 7603 bytes 3 files changed, 47 insertions(+) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 361cef688d6..8a84710fd94 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -23,6 +23,7 @@ var/cuttable = TRUE var/hole_size= NO_HOLE var/invulnerable = FALSE + var/shock_cooldown = TRUE /obj/structure/fence/Initialize() . = ..() @@ -58,8 +59,30 @@ icon_state = "straight_cut3" hole_size = LARGE_HOLE +// shock user with probability prb (if all connections & power are working) +// returns 1 if shocked, 0 otherwise +// Totally not stolen from code\game\objects\structures\grille.dm + +/obj/structure/fence/proc/shock(mob/user, prb) + if(!anchored || broken) // unanchored/broken fences are never connected + return FALSE + if(!prob(prb)) + return FALSE + if(!in_range(src, user)) //To prevent TK and mech users from getting shocked + return FALSE + var/turf/T = get_turf(src) + var/obj/structure/cable/C = T.get_cable_node() + if(C) + if(electrocute_mob(user, C, src, 1, TRUE)) + do_sparks(3, 1, src) + return TRUE + else + return FALSE + return FALSE /obj/structure/fence/wirecutter_act(mob/living/user, obj/item/W) + if(shock(user, 100)) + return if(!cuttable) to_chat(user, "This section of the fence can't be cut!") return @@ -90,6 +113,8 @@ /obj/structure/fence/attackby(obj/item/C, mob/user) . = ..() + if(shock(user, 90)) + return if(istype(C, /obj/item/stack/rods)) if(hole_size == NO_HOLE) return @@ -108,6 +133,22 @@ update_cut_status() return TRUE +/obj/structure/fence/Bumped(atom/user) + if(ismob(user)) + if(shock_cooldown) + return + shock(user, 70) + shock_cooldown = TRUE // We do not want bump shock spam! + addtimer(CALLBACK(src, .proc/shock_cooldown), 1 SECONDS, TIMER_OVERRIDE) + +/obj/structure/fence/proc/shock_cooldown() + shock_cooldown = FALSE + +/obj/structure/fence/attack_animal(mob/user) + . = ..() + if(. && !QDELETED(src) && !shock(user, 70)) + take_damage(rand(5,10), BRUTE, "melee", 1) + /obj/structure/fence/proc/update_cut_status() if(!cuttable) return @@ -159,6 +200,11 @@ /obj/structure/fence/door/proc/can_open(mob/user) return TRUE +/obj/structure/fence/door/CanAStarPass(ID, dir, caller) + if(open) + return TRUE + return FALSE + #undef CUT_TIME #undef CLIMB_TIME diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index ecfa334b337..688fa2c9c69 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -6,6 +6,7 @@ density = TRUE anchored = TRUE climbable = TRUE + layer = ABOVE_MOB_LAYER var/currently_climbed = FALSE /obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch diff --git a/icons/obj/fence.dmi b/icons/obj/fence.dmi index 9debf92605378933d2128061630da337ebffb23f..132482b4874ecafc382bb8f0a0695f31d1ad09f9 100644 GIT binary patch literal 7603 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≫|vI z?GeZ4xBc_{i+s}INuA5}B}Sa6KV(MJ05AHW2v4N%!-ryUc2n+lnZgCTUwAe99_K3i;0Rws2+x9WjUVw>xcxrSJ04I;l~3Z-3^z}0cW_jr4zL} zA09IR{M2`bu0ea|;&^$;Hi38EJ0L7^cWLKrtKsoBly}f}c5lBs?q0lcLm)&XYbhFOwyYehfFbhfaoJ?p!!l&25?Xo! zr>1W9e&T#3t0s{t0le4QnkYZFYluL|A0grvtfGz;&XATBKpnO=QRkBV^ph|B%jzVG zei)a0yvbWX3n&l+1$;Dr@*x~k_BJqG8bNXB4ttn#Z`7}PH0k|hYfr|p1y}*0;q9&+ zq(8SivWKI0aL}>3x|+>uet33`qSP8BU`-L?=i~FDyA2UrJI^+Mx8i2 z;W3*{1c@4_^@ALX=hpXL(M^%F@$vQ5#;T}PO2s0HNEBIuAPAo{o1c1IEKt7hdISgwda!d>}<$@FnbmLa637=!Ts`1=@hkN zb{$W*!jKF-=-Cn=H8oX2NtjAc8SN2D7w*)WCC@sd*y@t%7mR%N)}@X-hD<}TwS8gJ zzrR{2Ii{J^voG({{uS8<1Tidvgh0cdUnbi%d~IVF^tQx`$$AfK3C?vPj2gyf`*;Dc zK!7_y^YtKtai~jzNq5W@QyS35HnCRGI(xvY&x8IfWqxIi^=va6*Or{@5w|NASoP85 z5S7E>!FW!b;C>}1nBe}9OjexW!KXYRSn~K?u)on7debvR@tU3FwhS{UBm3x=xS`Q# z88V`pF=vBxhD80>QEnakcsSddM9P4|jJNpfRO{q7Z$$YWb9Sf5L_ZEf?Qmm{TGZKj z(miKq=O5K4cT%abqgd!w%;Ngo5LF?3Z3lRBP4DtC_T$h32y+yh0TzKA(yZN^ptIOW z{a>y5!s08V4HaO~n1*$vjY^C;s=K7m527N7&$(E3rKQqyO+6=%Zqg$0l`rktU;fyl zeu7pDDk==+%3&Q3&aC^t=sB{`E6;FNEK1fQV5chF>`OyKN>u#|%-)G=kP3 zZCw^yJBBM#X^1`NO>c`^SX_i-4%oX%go15oG7oWt1AvtX;^?KtZ%(tu Date: Fri, 10 Sep 2021 17:13:30 +0100 Subject: [PATCH 03/13] things now work --- code/game/objects/items/stacks/rods.dm | 10 ++-- code/game/objects/structures/fence.dm | 61 +++++++++++------------- code/game/objects/structures/railings.dm | 2 +- 3 files changed, 33 insertions(+), 40 deletions(-) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 48a60768b28..adf6fa59869 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -6,11 +6,11 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new /datum/stack_recipe("railing corner", /obj/structure/railing/corner, 3, time = 10, one_per_turf = 1, on_floor = 1), \ null, new /datum/stack_recipe_list("chainlink fence", list( \ - new/datum/stack_recipe("chainlink fence", /obj/structure/fence, 5, time = 10, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("chainlink fence post", /obj/structure/fence/post, 5, time = 10, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("chainlink fence corner", /obj/structure/fence/corner, 5, time = 10, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("chainlink fence door", /obj/structure/fence/door, 10, time = 10, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("chainlink fence end", /obj/structure/fence/end, 3, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("chainlink fence", /obj/structure/fence, 5, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("chainlink fence post", /obj/structure/fence/post, 5, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("chainlink fence corner", /obj/structure/fence/corner, 5, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("chainlink fence door", /obj/structure/fence/door, 10, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("chainlink fence end", /obj/structure/fence/end, 3, time = 10, one_per_turf = 1, on_floor = 1), \ )), \ )) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 8a84710fd94..c3a0080a69b 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -1,7 +1,6 @@ //Chain link fences //Sprites ported from /VG/ - #define CUT_TIME 100 #define CLIMB_TIME 150 @@ -23,7 +22,7 @@ var/cuttable = TRUE var/hole_size= NO_HOLE var/invulnerable = FALSE - var/shock_cooldown = TRUE + var/shock_cooldown = FALSE /obj/structure/fence/Initialize() . = ..() @@ -64,8 +63,6 @@ // Totally not stolen from code\game\objects\structures\grille.dm /obj/structure/fence/proc/shock(mob/user, prb) - if(!anchored || broken) // unanchored/broken fences are never connected - return FALSE if(!prob(prb)) return FALSE if(!in_range(src, user)) //To prevent TK and mech users from getting shocked @@ -76,11 +73,10 @@ if(electrocute_mob(user, C, src, 1, TRUE)) do_sparks(3, 1, src) return TRUE - else - return FALSE return FALSE /obj/structure/fence/wirecutter_act(mob/living/user, obj/item/W) + . = TRUE if(shock(user, 100)) return if(!cuttable) @@ -90,48 +86,50 @@ to_chat(user, "This fence is too strong to cut through!") return var/current_stage = hole_size - if(current_stage >= MAX_HOLE_SIZE) - to_chat(user, "This fence has too much cut out of it already!") - return - user.visible_message("\The [user] starts cutting through \the [src] with \the [W].",\ "You start cutting through \the [src] with \the [W].") if(W.use_tool(src, user, CUT_TIME * W.toolspeed, volume = W.tool_volume)) if(current_stage == hole_size) - switch(++hole_size) - if(MEDIUM_HOLE) + switch(hole_size) + if(NO_HOLE) visible_message("\The [user] cuts into \the [src] some more.") to_chat(user, "You could probably fit yourself through that hole now. Although climbing through would be much faster if you made it even bigger.") climbable = TRUE - if(LARGE_HOLE) + ++hole_size + if(MEDIUM_HOLE) visible_message("\The [user] completely cuts through \the [src].") to_chat(user, "The hole in \the [src] is now big enough to walk through.") climbable = FALSE + ++hole_size + if(LARGE_HOLE) + visible_message("\The [user] completely dismantles \the [src].") + to_chat(user, "You completely take apart \the [src].") + qdel(src) + return update_cut_status() return - /obj/structure/fence/attackby(obj/item/C, mob/user) - . = ..() - if(shock(user, 90)) - return if(istype(C, /obj/item/stack/rods)) if(hole_size == NO_HOLE) return var/obj/item/stack/rods/R = C if(R.get_amount() < HOLE_REPAIR) to_chat(user, "You need [HOLE_REPAIR] rods to fix this fence!") - return TRUE - else - to_chat(user, "You begin repairing the fence...") - if(do_after(user, 30 * C.toolspeed, target = src)) - if(R.get_amount() >= HOLE_REPAIR && !(hole_size == NO_HOLE)) - hole_size = NO_HOLE - playsound(src, C.usesound, 80, 1) - R.use(2) - to_chat(user, "You repair the fence.") - update_cut_status() - return TRUE + return + to_chat(user, "You begin repairing the fence...") + if(do_after(user, 30 * C.toolspeed, target = src)) + if(R.get_amount() >= HOLE_REPAIR && !(hole_size == NO_HOLE)) + R.use(HOLE_REPAIR) + playsound(src, C.usesound, 80, 1) + hole_size = NO_HOLE + obj_integrity = max_integrity + to_chat(user, "You repair the fence.") + update_cut_status() + return + . = ..() + if(shock(user, 90)) + return /obj/structure/fence/Bumped(atom/user) if(ismob(user)) @@ -182,9 +180,9 @@ density = TRUE /obj/structure/fence/door/attack_hand(mob/user, list/modifiers) + shock(user, 70) if(can_open(user)) toggle(user) - return TRUE /obj/structure/fence/door/proc/toggle(mob/user) @@ -200,11 +198,6 @@ /obj/structure/fence/door/proc/can_open(mob/user) return TRUE -/obj/structure/fence/door/CanAStarPass(ID, dir, caller) - if(open) - return TRUE - return FALSE - #undef CUT_TIME #undef CLIMB_TIME diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 688fa2c9c69..cce6b863a38 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -88,7 +88,7 @@ if(get_turf(M) == get_turf(src)) var/turf/T = target if(T.density) - return TRUE + return FALSE for(var/atom/A in T) if(A.density) return FALSE From 0c4dcd1b622723bbea7c177829d7d37b00937f0c Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Fri, 10 Sep 2021 19:07:02 +0100 Subject: [PATCH 04/13] projectiles can pass --- code/__DEFINES/flags.dm | 1 + code/game/objects/structures/fence.dm | 9 +++++++-- code/game/objects/structures/railings.dm | 6 +++++- code/modules/assembly/infrared.dm | 2 +- code/modules/projectiles/guns/alien.dm | 2 +- code/modules/projectiles/guns/medbeam.dm | 2 +- code/modules/projectiles/projectile/beams.dm | 2 +- code/modules/projectiles/projectile/bullets.dm | 1 + code/modules/projectiles/projectile/energy.dm | 1 + code/modules/projectiles/projectile/magic.dm | 1 + code/modules/projectiles/projectile/special.dm | 2 +- 11 files changed, 21 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index a68646224cf..7e0941d3e65 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -103,6 +103,7 @@ #define PASSBLOB 8 #define PASSMOB 16 #define LETPASSTHROW 32 +#define PASSFENCE 64 //turf-only flags #define NOJAUNT 1 diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index c3a0080a69b..4a48d192d34 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -26,12 +26,10 @@ /obj/structure/fence/Initialize() . = ..() - update_cut_status() /obj/structure/fence/examine(mob/user) . = ..() - switch(hole_size) if(MEDIUM_HOLE) . += "There is a large hole in \the [src]." @@ -58,6 +56,13 @@ icon_state = "straight_cut3" hole_size = LARGE_HOLE +/obj/structure/fence/CanPass(atom/movable/mover, turf/target) + if(istype(mover) && mover.checkpass(PASSFENCE)) + return TRUE + if(!density) + return TRUE + return FALSE + // shock user with probability prb (if all connections & power are working) // returns 1 if shocked, 0 otherwise // Totally not stolen from code\game\objects\structures\grille.dm diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index cce6b863a38..09859f89e9e 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -5,6 +5,7 @@ icon_state = "railing" density = TRUE anchored = TRUE + pass_flags = LETPASSTHROW climbable = TRUE layer = ABOVE_MOB_LAYER var/currently_climbed = FALSE @@ -64,6 +65,8 @@ return TRUE /obj/structure/railing/CanPass(atom/movable/mover, turf/target) + if(istype(mover) && mover.checkpass(PASSFENCE)) + return TRUE ..() var/mob/living/M = mover if(M.flying || M.floating || mover.throwing) @@ -73,10 +76,11 @@ return TRUE /obj/structure/railing/corner/CanPass() - ..() return TRUE /obj/structure/railing/CheckExit(atom/movable/O, target) + if(istype(O) && O.checkpass(PASSFENCE)) + return TRUE var/mob/living/M = O if(M.flying | M.floating) return TRUE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index d1efa862a63..cd83952fcae 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -215,7 +215,7 @@ var/life_cycles = 0 var/life_cap = 20 anchored = TRUE - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSFENCE /obj/effect/beam/i_beam/proc/hit() diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index 135923c6ef6..3c43aea531f 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -70,7 +70,7 @@ damage = 60 damage_type = BRUTE flag = "bullet" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSFENCE weaken = 5 stun = 5 diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index 452023946ae..459c6681aa2 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -81,7 +81,7 @@ if(!istype(user_turf)) return 0 var/obj/dummy = new(user_turf) - dummy.pass_flags |= PASSTABLE & PASSGLASS & PASSGRILLE //Grille/Glass so it can be used through common windows + dummy.pass_flags |= PASSTABLE & PASSGLASS & PASSGRILLE & PASSFENCE //Grille/Glass so it can be used through common windows for(var/turf/turf in getline(user_turf,target)) if(turf.density) qdel(dummy) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index b8e1348fb43..6101bbbad55 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -1,7 +1,7 @@ /obj/item/projectile/beam name = "laser" icon_state = "laser" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSFENCE damage = 20 damage_type = BURN hitsound = 'sound/weapons/sear.ogg' diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 027de5c9f54..4a0aa63e8c1 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -6,6 +6,7 @@ flag = "bullet" hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect + pass_flags = PASSFENCE /obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage name = "beanbag slug" diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index dc6f3fdf2da..1969e8d7b3c 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -5,6 +5,7 @@ damage_type = BURN flag = "energy" is_reflectable = TRUE + pass_flags = PASSFENCE /obj/item/projectile/energy/electrode name = "electrode" diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 512f9188606..b55383ab927 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -6,6 +6,7 @@ nodamage = 1 armour_penetration = 100 flag = "magic" + pass_flags = PASSFENCE /obj/item/projectile/magic/death name = "bolt of death" diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 490878ea74d..8635360afdb 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -53,7 +53,7 @@ nodamage = 1 flag = "energy" var/temperature = 300 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSFENCE /obj/item/projectile/temp/New(loc, shot_temp) ..() From 6d491f96a80254175d23c0a03d7067568a3cc154 Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Fri, 10 Sep 2021 22:07:46 +0100 Subject: [PATCH 05/13] okay, projectiles and bumping now properly works all the time --- code/game/objects/structures/fence.dm | 2 +- code/game/objects/structures/railings.dm | 28 ++++++++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 4a48d192d34..f367f50d036 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -142,7 +142,7 @@ return shock(user, 70) shock_cooldown = TRUE // We do not want bump shock spam! - addtimer(CALLBACK(src, .proc/shock_cooldown), 1 SECONDS, TIMER_OVERRIDE) + addtimer(CALLBACK(src, .proc/shock_cooldown), 1 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) /obj/structure/fence/proc/shock_cooldown() shock_cooldown = FALSE diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 09859f89e9e..979c851803b 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -65,25 +65,35 @@ return TRUE /obj/structure/railing/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && mover.checkpass(PASSFENCE)) + if(istype(mover) && mover.checkpass(PASSTABLE)) return TRUE - ..() - var/mob/living/M = mover - if(M.flying || M.floating || mover.throwing) + if(istype(mover, /obj/item/projectile)) return TRUE - if(get_dir(loc, target) == dir) - return !density - return TRUE + if(ismob(mover)) + var/mob/M = mover + if(M.flying) + return TRUE + if(mover.throwing) + return TRUE + if(get_dir(loc, target) != dir) + return density + return FALSE /obj/structure/railing/corner/CanPass() return TRUE +/obj/structure/railing/corner/CheckExit() + return TRUE + /obj/structure/railing/CheckExit(atom/movable/O, target) + var/mob/living/M = O if(istype(O) && O.checkpass(PASSFENCE)) return TRUE - var/mob/living/M = O - if(M.flying | M.floating) + if(istype(O, /obj/item/projectile)) return TRUE + if(ismob(O)) + if(M.flying | M.floating) + return TRUE if(O.throwing) return TRUE if(O.move_force >= MOVE_FORCE_EXTREMELY_STRONG) From adc250cdc5028aee0bacd7fb52a59a58c497b01b Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Fri, 10 Sep 2021 22:11:03 +0100 Subject: [PATCH 06/13] we don't need these with the istype checks --- code/modules/projectiles/guns/alien.dm | 2 +- code/modules/projectiles/projectile/beams.dm | 2 +- code/modules/projectiles/projectile/bullets.dm | 1 - code/modules/projectiles/projectile/energy.dm | 1 - code/modules/projectiles/projectile/magic.dm | 1 - code/modules/projectiles/projectile/special.dm | 2 +- 6 files changed, 3 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index 3c43aea531f..135923c6ef6 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -70,7 +70,7 @@ damage = 60 damage_type = BRUTE flag = "bullet" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSFENCE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE weaken = 5 stun = 5 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 6101bbbad55..b8e1348fb43 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -1,7 +1,7 @@ /obj/item/projectile/beam name = "laser" icon_state = "laser" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSFENCE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE damage = 20 damage_type = BURN hitsound = 'sound/weapons/sear.ogg' diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 4a0aa63e8c1..027de5c9f54 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -6,7 +6,6 @@ flag = "bullet" hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect - pass_flags = PASSFENCE /obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage name = "beanbag slug" diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 1969e8d7b3c..dc6f3fdf2da 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -5,7 +5,6 @@ damage_type = BURN flag = "energy" is_reflectable = TRUE - pass_flags = PASSFENCE /obj/item/projectile/energy/electrode name = "electrode" diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index b55383ab927..512f9188606 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -6,7 +6,6 @@ nodamage = 1 armour_penetration = 100 flag = "magic" - pass_flags = PASSFENCE /obj/item/projectile/magic/death name = "bolt of death" diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 8635360afdb..490878ea74d 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -53,7 +53,7 @@ nodamage = 1 flag = "energy" var/temperature = 300 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSFENCE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE /obj/item/projectile/temp/New(loc, shot_temp) ..() From eeff98224fd69106b940d6d3837d15f7e78e83be Mon Sep 17 00:00:00 2001 From: S34N <12197162+S34NW@users.noreply.github.com> Date: Fri, 10 Sep 2021 22:20:37 +0100 Subject: [PATCH 07/13] Update code/game/objects/structures/railings.dm --- code/game/objects/structures/railings.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 979c851803b..f5640b94bc1 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -65,7 +65,7 @@ return TRUE /obj/structure/railing/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && mover.checkpass(PASSTABLE)) + if(istype(mover) && mover.checkpass(PASSFENCE)) return TRUE if(istype(mover, /obj/item/projectile)) return TRUE From 1d6a0c643b86cab8505dd8a5a624008cfde432c0 Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Fri, 10 Sep 2021 22:26:35 +0100 Subject: [PATCH 08/13] projectiles and big fences are nice too --- code/game/objects/structures/fence.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index f367f50d036..6fd7f3ea8bf 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -20,7 +20,7 @@ icon_state = "straight" var/cuttable = TRUE - var/hole_size= NO_HOLE + var/hole_size = NO_HOLE var/invulnerable = FALSE var/shock_cooldown = FALSE @@ -59,6 +59,8 @@ /obj/structure/fence/CanPass(atom/movable/mover, turf/target) if(istype(mover) && mover.checkpass(PASSFENCE)) return TRUE + if(istype(mover, /obj/item/projectile)) + return TRUE if(!density) return TRUE return FALSE From e41c8ec8498b765003cb8780d7287c618f05178a Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Sat, 11 Sep 2021 09:08:57 +0100 Subject: [PATCH 09/13] railing rotate --- code/game/objects/structures/railings.dm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index f5640b94bc1..36b23bce61f 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -135,5 +135,14 @@ if(anchored == checked_anchored) return TRUE -/obj/structure/railing/proc/after_rotation(mob/user,rotation_type) +/obj/structure/railing/proc/after_rotation(mob/user, rotation_type) add_fingerprint(user) + +/obj/structure/railing/AltClick(mob/user) + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!Adjacent(user)) + return + if(can_be_rotated) + setDir(turn(dir, 90)) From 235ee0c4ac67228db06820327439d27bf34eb351 Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Sat, 11 Sep 2021 09:10:12 +0100 Subject: [PATCH 10/13] we dont need these args either --- code/game/objects/structures/railings.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 36b23bce61f..eb6fa650fee 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -119,7 +119,7 @@ if(get_turf(user) == get_turf(src)) currently_climbed = TRUE -/obj/structure/railing/proc/can_be_rotated(mob/user, rotation_type) +/obj/structure/railing/proc/can_be_rotated(mob/user) if(anchored) to_chat(user, "[src] cannot be rotated while it is fastened to the floor!") return FALSE @@ -135,7 +135,7 @@ if(anchored == checked_anchored) return TRUE -/obj/structure/railing/proc/after_rotation(mob/user, rotation_type) +/obj/structure/railing/proc/after_rotation(mob/user) add_fingerprint(user) /obj/structure/railing/AltClick(mob/user) @@ -144,5 +144,5 @@ return if(!Adjacent(user)) return - if(can_be_rotated) + if(can_be_rotated(user)) setDir(turn(dir, 90)) From fa8d8515afd6f3bc0913318127c0a7c2e70085d5 Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Sat, 11 Sep 2021 11:18:39 +0100 Subject: [PATCH 11/13] farie fixes --- code/game/atoms.dm | 7 ++- code/game/objects/structures/fence.dm | 58 ++++++++++++------------ code/game/objects/structures/railings.dm | 45 ++++++++---------- 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index b067e6f0812..e46086d9b2b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1154,7 +1154,12 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) appearance_flags |= PIXEL_SCALE transform = M -///Setter for the `density` variable to append behavior related to its changing. +/* + Setter for the `density` variable. + Arguments: + * new_value - the new density you would want it to set. + Returns: Either null if identical to existing density, or the new density if different. +*/ /atom/proc/set_density(new_value) if(density == new_value) return diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 6fd7f3ea8bf..21ad71f329f 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -51,6 +51,7 @@ /obj/structure/fence/cut/medium icon_state = "straight_cut2" hole_size = MEDIUM_HOLE + climbable = TRUE /obj/structure/fence/cut/large icon_state = "straight_cut3" @@ -65,10 +66,11 @@ return TRUE return FALSE -// shock user with probability prb (if all connections & power are working) -// returns 1 if shocked, 0 otherwise -// Totally not stolen from code\game\objects\structures\grille.dm - +/* + Shock user with probability prb (if all connections & power are working) + Returns TRUE if shocked, FALSE otherwise + Totally not stolen from code\game\objects\structures\grille.dm +*/ /obj/structure/fence/proc/shock(mob/user, prb) if(!prob(prb)) return FALSE @@ -101,22 +103,21 @@ if(NO_HOLE) visible_message("\The [user] cuts into \the [src] some more.") to_chat(user, "You could probably fit yourself through that hole now. Although climbing through would be much faster if you made it even bigger.") - climbable = TRUE - ++hole_size + hole_size = MEDIUM_HOLE if(MEDIUM_HOLE) visible_message("\The [user] completely cuts through \the [src].") to_chat(user, "The hole in \the [src] is now big enough to walk through.") - climbable = FALSE - ++hole_size + hole_size = LARGE_HOLE if(LARGE_HOLE) visible_message("\The [user] completely dismantles \the [src].") to_chat(user, "You completely take apart \the [src].") qdel(src) return update_cut_status() - return /obj/structure/fence/attackby(obj/item/C, mob/user) + if(shock(user, 90)) + return if(istype(C, /obj/item/stack/rods)) if(hole_size == NO_HOLE) return @@ -125,26 +126,23 @@ to_chat(user, "You need [HOLE_REPAIR] rods to fix this fence!") return to_chat(user, "You begin repairing the fence...") - if(do_after(user, 30 * C.toolspeed, target = src)) - if(R.get_amount() >= HOLE_REPAIR && !(hole_size == NO_HOLE)) - R.use(HOLE_REPAIR) - playsound(src, C.usesound, 80, 1) - hole_size = NO_HOLE - obj_integrity = max_integrity - to_chat(user, "You repair the fence.") - update_cut_status() - return - . = ..() - if(shock(user, 90)) + if(do_after(user, 3 SECONDS * C.toolspeed, target = src) && hole_size != NO_HOLE && R.use(HOLE_REPAIR)) + playsound(src, C.usesound, 80, 1) + hole_size = NO_HOLE + obj_integrity = max_integrity + to_chat(user, "You repair the fence.") + update_cut_status() return + . = ..() /obj/structure/fence/Bumped(atom/user) - if(ismob(user)) - if(shock_cooldown) - return - shock(user, 70) - shock_cooldown = TRUE // We do not want bump shock spam! - addtimer(CALLBACK(src, .proc/shock_cooldown), 1 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + if(!ismob(user)) + return + if(shock_cooldown) + return + shock(user, 70) + shock_cooldown = TRUE // We do not want bump shock spam! + addtimer(CALLBACK(src, .proc/shock_cooldown), 1 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) /obj/structure/fence/proc/shock_cooldown() shock_cooldown = FALSE @@ -161,11 +159,14 @@ switch(hole_size) if(NO_HOLE) icon_state = initial(icon_state) + climbable = FALSE if(MEDIUM_HOLE) icon_state = "straight_cut2" + climbable = TRUE if(LARGE_HOLE) icon_state = "straight_cut3" new_density = FALSE + climbable = FALSE set_density(new_density) //FENCE DOORS @@ -199,8 +200,8 @@ playsound(src, 'sound/machines/door_open.ogg', 100, TRUE) /obj/structure/fence/door/proc/update_door_status() - set_density(!density) - icon_state = density ? "door_closed" : "door_opened" + set_density(!open) + icon_state = open ? "door_opened" : "door_closed" /obj/structure/fence/door/proc/can_open(mob/user) return TRUE @@ -212,3 +213,4 @@ #undef MEDIUM_HOLE #undef LARGE_HOLE #undef MAX_HOLE_SIZE +#undef HOLE_REPAIR diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index eb6fa650fee..2f61eb51fed 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -15,34 +15,30 @@ density = FALSE climbable = FALSE -/obj/structure/railing/Initialize() - . = ..() - /obj/structure/railing/attackby(obj/item/I, mob/living/user, params) ..() add_fingerprint(user) /obj/structure/railing/welder_act(mob/living/user, obj/item/I) - if(user.intent == INTENT_HELP) - if(obj_integrity < max_integrity) - if(!I.tool_start_check(user, amount = 0)) - return - to_chat(user, "You begin repairing [src]...") - if(I.use_tool(src, user, 40, volume = 50)) - obj_integrity = max_integrity - to_chat(user, "You repair [src].") - return - + if(user.intent != INTENT_HELP) + return + if(obj_integrity >= max_integrity) to_chat(user, "[src] is already in good condition!") return + if(!I.tool_start_check(user, amount = 0)) + return + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 40, volume = 50)) + obj_integrity = max_integrity + to_chat(user, "You repair [src].") /obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I) - . = ..() - if(!anchored) - to_chat(user, "You cut apart the railing.") - I.play_tool_sound(src, 100) - deconstruct() - return TRUE + if(anchored) + return + to_chat(user, "You cut apart the railing.") + I.play_tool_sound(src, 100) + deconstruct() + return TRUE /obj/structure/railing/deconstruct(disassembled) if(!(flags & NODECONSTRUCT)) @@ -52,15 +48,11 @@ ///Implements behaviour that makes it possible to unanchor the railing. /obj/structure/railing/wrench_act(mob/living/user, obj/item/I) - . = ..() if(flags & NODECONSTRUCT) return to_chat(user, "You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor...") if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) - if(!anchored) - anchored = TRUE - else - anchored = FALSE + anchored = !anchored to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.") return TRUE @@ -92,7 +84,7 @@ if(istype(O, /obj/item/projectile)) return TRUE if(ismob(O)) - if(M.flying | M.floating) + if(M.flying || M.floating) return TRUE if(O.throwing) return TRUE @@ -115,9 +107,10 @@ /obj/structure/railing/do_climb(mob/living/user) . = ..() if(!climbable) - return + return FALSE if(get_turf(user) == get_turf(src)) currently_climbed = TRUE + return TRUE /obj/structure/railing/proc/can_be_rotated(mob/user) if(anchored) From 417f45eb88cd8e030f7e0d97b943eeae1550efa3 Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Sat, 11 Sep 2021 11:40:19 +0100 Subject: [PATCH 12/13] more farie code things --- code/game/objects/structures.dm | 11 ++++++----- code/game/objects/structures/railings.dm | 4 +--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 4d58c90a095..6d1b884177d 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -59,30 +59,31 @@ /obj/structure/proc/do_climb(mob/living/user) if(!can_touch(user) || !climbable) - return + return FALSE var/blocking_object = density_check() if(blocking_object) to_chat(user, "You cannot climb [src], as it is blocked by \a [blocking_object]!") - return + return FALSE var/turf/T = src.loc - if(!T || !istype(T)) return + if(!T || !istype(T)) return FALSE usr.visible_message("[user] starts climbing onto \the [src]!") climber = user if(!do_after(user, 50, target = src)) climber = null - return + return FALSE if(!can_touch(user) || !climbable) climber = null - return + return FALSE usr.loc = get_turf(src) if(get_turf(user) == get_turf(src)) usr.visible_message("[user] climbs onto \the [src]!") climber = null + return TRUE /obj/structure/proc/structure_shaken() diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 2f61eb51fed..21216996f6a 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -106,9 +106,7 @@ /obj/structure/railing/do_climb(mob/living/user) . = ..() - if(!climbable) - return FALSE - if(get_turf(user) == get_turf(src)) + if(.) currently_climbed = TRUE return TRUE From 9dc099ddc389554134444558d3471133538cdd0b Mon Sep 17 00:00:00 2001 From: S34NW <12197162+S34NW@users.noreply.github.com> Date: Sat, 11 Sep 2021 14:11:20 +0100 Subject: [PATCH 13/13] you now vault over railings, instead of weird things --- code/game/objects/structures/railings.dm | 29 +++++++++++------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 21216996f6a..2dc7a509206 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -56,6 +56,12 @@ to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.") return TRUE +/obj/structure/railing/corner/CanPass() + return TRUE + +/obj/structure/railing/corner/CheckExit() + return TRUE + /obj/structure/railing/CanPass(atom/movable/mover, turf/target) if(istype(mover) && mover.checkpass(PASSFENCE)) return TRUE @@ -71,12 +77,6 @@ return density return FALSE -/obj/structure/railing/corner/CanPass() - return TRUE - -/obj/structure/railing/corner/CheckExit() - return TRUE - /obj/structure/railing/CheckExit(atom/movable/O, target) var/mob/living/M = O if(istype(O) && O.checkpass(PASSFENCE)) @@ -91,24 +91,21 @@ if(O.move_force >= MOVE_FORCE_EXTREMELY_STRONG) return TRUE if(currently_climbed) - if(get_turf(M) == get_turf(src)) - var/turf/T = target - if(T.density) - return FALSE - for(var/atom/A in T) - if(A.density) - return FALSE - currently_climbed = FALSE - return TRUE + return TRUE if(get_dir(O.loc, target) == dir) return FALSE return TRUE /obj/structure/railing/do_climb(mob/living/user) + var/initial_mob_loc = get_turf(user) . = ..() if(.) currently_climbed = TRUE - return TRUE + if(initial_mob_loc != get_turf(src)) // If we are on the railing, we want to move in the same dir as the railing. Otherwise we get put on the railing + currently_climbed = FALSE + return + user.Move(get_step(user, dir), TRUE) + currently_climbed = FALSE /obj/structure/railing/proc/can_be_rotated(mob/user) if(anchored)