From 0e01aec35d07dcdb692f239965605fc3d2cf4295 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 12:18:18 +0200 Subject: [PATCH 01/29] a --- code/game/objects/structures/girders.dm | 22 +++ code/modules/watchtower/watchtower.dm | 211 ++++++++++++++++++++++++ icons/obj/structures/watchtower.dmi | Bin 0 -> 6405 bytes 3 files changed, 233 insertions(+) create mode 100644 code/modules/watchtower/watchtower.dm create mode 100644 icons/obj/structures/watchtower.dmi diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 325af12c814b..fc5e7158c81e 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -176,6 +176,28 @@ if(STATE_REINFORCED_WALL) return do_reinforced_wall(W, user) if(STATE_DISPLACED) + if(HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + var/list/obj/structure/girder/girders = list() + + for(var/turf/current_turf in turfs) + var/found_girder = FALSE + for(var/obj/structure/girder/girder in current_turf) + if(girder.state == STATE_DISPLACED) + found_girder = TRUE + girders += girder + if(!found_girder) + return + + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + new /obj/structure/watchtower(loc) + + for(var/list/obj/structure/girder as anything in girders) + qdel(girder) + if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) var/turf/open/floor = loc if(!floor.allow_construction) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm new file mode 100644 index 000000000000..84e0e3bf4f19 --- /dev/null +++ b/code/modules/watchtower/watchtower.dm @@ -0,0 +1,211 @@ +/obj/structure/watchtower + name = "watchtower" + icon = 'icons/obj/structures/watchtower.dmi' + icon_state = "stage1" + + density = TRUE + bound_width = 64 + bound_height = 96 + + var/stage = 1 + +/obj/structure/watchtower/Initialize() + var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + + for(var/turf/current_turf in turfs) + new /obj/structure/blocker/invisible_wall(current_turf) + +/obj/structure/watchtower/Destroy() + var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + + for(var/turf/current_turf in turfs) + for(var/obj/structure/blocker/invisible_wall in current_turf.contents) + qdel(invisible_wall) + new /obj/structure/girder(current_turf) + +/obj/structure/watchtower/update_icon(roof=TRUE) + . = ..() + icon_state = "stage[stage]" + + if(stage >= 5) + overlays += image(icon=icon, icon_state="railings", layer=ABOVE_MOB_LAYER, pixel_y=25) + + if (stage == 7 && roof) + overlays += image(icon=icon, icon_state="roof", layer=ABOVE_MOB_LAYER, pixel_y=51) + +/obj/structure/watchtower/attackby(obj/item/W, mob/user) + switch(stage) + if(1) + if(!istype(W, /obj/item/stack/rods)) + return + + var/obj/item/stack/rods/rods = W + + if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) + return + + if(rods.use(10)) + to_chat(user, SPAN_NOTICE("You add connection rods to the watchtower.")) + stage = 2 + update_icon() + else + to_chat(user, SPAN_NOTICE("You failed to construct the connection rods. You need more rods.")) + + return + if(2) + if(!iswelder(W)) + return + + if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) + return + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + to_chat(user, SPAN_NOTICE("You weld the connection rods to the frame.")) + stage = 2.5 + + return + if(2.5) + if(!HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + return + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + to_chat(user, SPAN_NOTICE("You summon a black hole and somehow produce more matter to elevate the frame.")) + stage = 3 + update_icon() + + return + if(3) + if(!HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + return + + var/obj/item/stack/sheet/metal/metal = user.get_inactive_hand() + if(!istype(metal)) + to_chat(user, SPAN_BOLDWARNING("You need metal sheets in your offhand to continue construction of the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(metal.use(10)) + to_chat(user, SPAN_NOTICE("You construct the watchtower platform.")) + stage = 4 + update_icon() + else + to_chat(user, SPAN_NOTICE("You failed to construct the watchtower platform, you need more metal sheets in your offhand.")) + + return + if(4) + if(!HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) + return + + var/obj/item/stack/sheet/plasteel/plasteel = user.get_inactive_hand() + if(!istype(plasteel)) + to_chat(user, SPAN_BOLDWARNING("You need plasteel sheets in your offhand to continue construction of the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(plasteel.use(10)) + to_chat(user, SPAN_NOTICE("You construct the watchtower railing.")) + stage = 5 + update_icon() + else + to_chat(user, SPAN_NOTICE("You failed to construct the watchtower railing, you need more plasteel sheets in your offhand.")) + + return + if(5) + if (!HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + return + + var/obj/item/stack/rods/rods = user.get_inactive_hand() + if(!istype(rods)) + to_chat(user, SPAN_BOLDWARNING("You need metal rods in your offhand to continue construction of the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(rods.use(10)) + to_chat(user, SPAN_NOTICE("You construct the watchtower support rods.")) + stage = 6 + update_icon() + else + to_chat(user, SPAN_NOTICE("You failed to construct the watchtower support rods, you need more metal rods in your offhand.")) + + return + if(6) + if (!iswelder(W)) + return + + if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) + return + + var/obj/item/stack/sheet/plasteel/plasteel = user.get_inactive_hand() + if(!istype(plasteel)) + to_chat(user, SPAN_BOLDWARNING("You need plasteel sheets in your offhand to continue construction of the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(plasteel.use(10)) + to_chat(user, SPAN_NOTICE("You complete the watchtower.")) + stage = 7 + update_icon() + + + else + to_chat(user, SPAN_NOTICE("You failed to complete the watchtower, you need more plasteel sheets in your offhand.")) + + return + +/obj/structure/watchtower/proc/complete() + var/turf/above = (get_turf(src)).above() + var/list/turf/turfs = CORNER_BLOCK(above, 2, 3) + + for(var/turf/current_turf in turfs) + var/turf/below = current_turf.below() + new below.type(current_turf) + + new /obj/structure/watchtower/fake(above) + + +/obj/structure/watchtower/attack_hand(mob/user) + if(get_turf(user) == locate(x, y-1, z)) + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + var/turf/actual_turf = locate(x, y+1, z) + user.forceMove(actual_turf.above()) + user.client.view += 5 + else if(get_turf(user) == locate(x, y+1, z)) + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + var/turf/actual_turf = locate(x, y-1, z) + user.forceMove(actual_turf.below()) + user.client.view -= 5 + +/obj/structure/watchtower/fake + stage = 7 + icon_state = "stage7" + +/obj/structure/watchtower/fake/Initialize() + update_icon(roof=FALSE) + return + +/obj/structure/watchtower/complete + stage = 7 + icon_state = "stage7" + +/obj/structure/watchtower/complete/Initialize() + . = ..() + update_icon(roof=TRUE) + complete() diff --git a/icons/obj/structures/watchtower.dmi b/icons/obj/structures/watchtower.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e3d62fd08d0052bbe1f7fc6cda96c936afb0c39b GIT binary patch literal 6405 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 literal 0 HcmV?d00001 From 6762e425a39f0bd0f9da150324f23ef2feaf8bef Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 15:57:17 +0200 Subject: [PATCH 02/29] b --- code/__DEFINES/traits.dm | 3 + code/modules/watchtower/watchtower.dm | 91 +++++++++++++++++---------- colonialmarines.dme | 1 + 3 files changed, 62 insertions(+), 33 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 4a3f16858fda..7b5ed3162e5d 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -509,3 +509,6 @@ GLOBAL_LIST(trait_name_map) #define HACKED_TRAIT "hacked" /// traits from chloroform usage #define CHLOROFORM_TRAIT "chloroform" + +// from watchtower.dm +#define TRAIT_ON_WATCHTOWER "on_watchtower" diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 84e0e3bf4f19..8d4424f61161 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -3,35 +3,48 @@ icon = 'icons/obj/structures/watchtower.dmi' icon_state = "stage1" - density = TRUE + density = FALSE bound_width = 64 bound_height = 96 var/stage = 1 + var/image/roof_image /obj/structure/watchtower/Initialize() - var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 2, 0, 1) + var/list/turf/blocked_turfs = CORNER_BLOCK(get_turf(src), 2, 1) + var/list/turf/bottom_turfs = CORNER_OUTLINE(get_turf(src), 2, 3) - for(var/turf/current_turf in turfs) - new /obj/structure/blocker/invisible_wall(current_turf) + for(var/turf/current_turf in top_turfs) + new /obj/structure/blocker/invisible_wall/watchtower(current_turf) + + for(var/turf/current_turf in bottom_turfs) + new /obj/structure/blocker/invisible_wall/watchtower/inverse(current_turf) + + for(var/turf/current_turf in blocked_turfs) + new /obj/structure/blocked_turfs/invisible_wall/throw_pass(current_turf) /obj/structure/watchtower/Destroy() - var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + CORNER_OUTLINE(get_turf(src), 2, 3) for(var/turf/current_turf in turfs) for(var/obj/structure/blocker/invisible_wall in current_turf.contents) qdel(invisible_wall) - new /obj/structure/girder(current_turf) -/obj/structure/watchtower/update_icon(roof=TRUE) +/obj/structure/watchtower/update_icon() . = ..() icon_state = "stage[stage]" + overlays.Cut() + if(stage >= 5) overlays += image(icon=icon, icon_state="railings", layer=ABOVE_MOB_LAYER, pixel_y=25) - if (stage == 7 && roof) - overlays += image(icon=icon, icon_state="roof", layer=ABOVE_MOB_LAYER, pixel_y=51) + if (stage == 7) + roof_image = image(icon=icon, icon_state="roof", layer=ABOVE_MOB_LAYER, pixel_y=51) + roof_image.plane = ROOF_PLANE + roof_image.appearance_flags = KEEP_APART + overlays += roof_image /obj/structure/watchtower/attackby(obj/item/W, mob/user) switch(stage) @@ -166,16 +179,6 @@ return -/obj/structure/watchtower/proc/complete() - var/turf/above = (get_turf(src)).above() - var/list/turf/turfs = CORNER_BLOCK(above, 2, 3) - - for(var/turf/current_turf in turfs) - var/turf/below = current_turf.below() - new below.type(current_turf) - - new /obj/structure/watchtower/fake(above) - /obj/structure/watchtower/attack_hand(mob/user) if(get_turf(user) == locate(x, y-1, z)) @@ -183,23 +186,21 @@ return var/turf/actual_turf = locate(x, y+1, z) - user.forceMove(actual_turf.above()) - user.client.view += 5 + ADD_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") + user.forceMove(actual_turf) + user.client.change_view(user.client.view + 2) + var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = INVISIBILITY_MAXIMUM else if(get_turf(user) == locate(x, y+1, z)) if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return + REMOVE_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") var/turf/actual_turf = locate(x, y-1, z) - user.forceMove(actual_turf.below()) - user.client.view -= 5 - -/obj/structure/watchtower/fake - stage = 7 - icon_state = "stage7" - -/obj/structure/watchtower/fake/Initialize() - update_icon(roof=FALSE) - return + user.forceMove(actual_turf) + user.client.change_view(user.client.view - 2) + var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = 0 /obj/structure/watchtower/complete stage = 7 @@ -207,5 +208,29 @@ /obj/structure/watchtower/complete/Initialize() . = ..() - update_icon(roof=TRUE) - complete() + update_icon() + +/obj/structure/blocked_turfs/invisible_wall/throw_pass + +/obj/structure/blocked_turfs/invisible_wall/throw_pass/initialize_pass_flags(datum/pass_flags_container/PF) + ..() + if (PF) + PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY + +/obj/structure/blocker/invisible_wall/watchtower + throwpass = TRUE + +/obj/structure/blocker/invisible_wall/watchtower/initialize_pass_flags(datum/pass_flags_container/PF) + ..() + if (PF) + PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY + +/obj/structure/blocker/invisible_wall/watchtower/Collided(atom/movable/AM) + if(HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) + AM.forceMove(get_turf(src)) + +/obj/structure/blocker/invisible_wall/watchtower/inverse + +/obj/structure/blocker/invisible_wall/watchtower/inverse/Collided(atom/movable/AM) + if(!HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) + AM.forceMove(get_turf(src)) diff --git a/colonialmarines.dme b/colonialmarines.dme index b38a7460403f..2d166cddbe2b 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -2523,6 +2523,7 @@ #include "code\modules\vox\vox_tgui.dm" #include "code\modules\vox\vox_sounds\vox.dm" #include "code\modules\vox\vox_sounds\vox_military.dm" +#include "code\modules\watchtower\watchtower.dm" #include "interface\fonts.dm" #include "interface\interface.dm" #include "interface\skin.dmf" From ab3244377113205ba30e62d242c8743bec078235 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 17:24:53 +0200 Subject: [PATCH 03/29] c --- code/game/objects/structures/girders.dm | 24 +--------------- code/modules/watchtower/watchtower.dm | 37 ++++++++++++++++++------- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index fc5e7158c81e..c5cbc91ddf25 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -175,29 +175,7 @@ return do_wall(W, user) if(STATE_REINFORCED_WALL) return do_reinforced_wall(W, user) - if(STATE_DISPLACED) - if(HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) - var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) - var/list/obj/structure/girder/girders = list() - - for(var/turf/current_turf in turfs) - var/found_girder = FALSE - for(var/obj/structure/girder/girder in current_turf) - if(girder.state == STATE_DISPLACED) - found_girder = TRUE - girders += girder - if(!found_girder) - return - - - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - new /obj/structure/watchtower(loc) - - for(var/list/obj/structure/girder as anything in girders) - qdel(girder) - + if(STATE_DISPLACED) if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) var/turf/open/floor = loc if(!floor.allow_construction) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 8d4424f61161..253ca27faef4 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -11,8 +11,8 @@ var/image/roof_image /obj/structure/watchtower/Initialize() - var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 2, 0, 1) - var/list/turf/blocked_turfs = CORNER_BLOCK(get_turf(src), 2, 1) + var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) + var/list/turf/blocked_turfs = CORNER_BLOCK(get_turf(src), 2, 1) + CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 2) var/list/turf/bottom_turfs = CORNER_OUTLINE(get_turf(src), 2, 3) for(var/turf/current_turf in top_turfs) @@ -24,6 +24,8 @@ for(var/turf/current_turf in blocked_turfs) new /obj/structure/blocked_turfs/invisible_wall/throw_pass(current_turf) + update_icon() + /obj/structure/watchtower/Destroy() var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + CORNER_OUTLINE(get_turf(src), 2, 3) @@ -202,14 +204,6 @@ var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] roof_plane?.invisibility = 0 -/obj/structure/watchtower/complete - stage = 7 - icon_state = "stage7" - -/obj/structure/watchtower/complete/Initialize() - . = ..() - update_icon() - /obj/structure/blocked_turfs/invisible_wall/throw_pass /obj/structure/blocked_turfs/invisible_wall/throw_pass/initialize_pass_flags(datum/pass_flags_container/PF) @@ -234,3 +228,26 @@ /obj/structure/blocker/invisible_wall/watchtower/inverse/Collided(atom/movable/AM) if(!HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) AM.forceMove(get_turf(src)) + +// For Mappers +/obj/structure/watchtower/stage1 + stage = 1 + icon_state = "stage1" +/obj/structure/watchtower/stage2 + stage = 2 + icon_state = "stage2" +/obj/structure/watchtower/stage3 + stage = 3 + icon_state = "stage3" +/obj/structure/watchtower/stage4 + stage = 4 + icon_state = "stage4" +/obj/structure/watchtower/stage5 + stage = 5 + icon_state = "stage5" +/obj/structure/watchtower/stage6 + stage = 6 + icon_state = "stage6" +/obj/structure/watchtower/complete + stage = 7 + icon_state = "stage7" From 3ad69209c67d2fd0af6b048952f0fffd38ad5a84 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:03:48 +0200 Subject: [PATCH 04/29] d --- .../elements/bullet_trait/direct_only.dm | 24 +++++++ code/game/objects/structures/girders.dm | 31 +++++++- code/modules/watchtower/watchtower.dm | 70 +++++++++++++------ colonialmarines.dme | 1 + 4 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 code/datums/elements/bullet_trait/direct_only.dm diff --git a/code/datums/elements/bullet_trait/direct_only.dm b/code/datums/elements/bullet_trait/direct_only.dm new file mode 100644 index 000000000000..752dd4ef0f7c --- /dev/null +++ b/code/datums/elements/bullet_trait/direct_only.dm @@ -0,0 +1,24 @@ +// This trait makes the projectile only hit targets directly clicked + +/datum/element/bullet_trait_direct_only + // General bullet trait vars + element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE + id_arg_index = 2 + +/datum/element/bullet_trait_direct_only/Attach(datum/target) + . = ..() + if(!istype(target, /obj/projectile)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_BULLET_CHECK_MOB_SKIPPING, PROC_REF(check_distance)) + +/datum/element/bullet_trait_direct_only/Detach(datum/target) + UnregisterSignal(target, COMSIG_BULLET_CHECK_MOB_SKIPPING) + + return ..() + +/datum/element/bullet_trait_direct_only/proc/check_distance(obj/projectile/P, mob/living/carbon/human/projectile_target) + SIGNAL_HANDLER + + if(P.original != projectile_target) + return COMPONENT_SKIP_MOB diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index c5cbc91ddf25..af7163b4ee3c 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -175,7 +175,29 @@ return do_wall(W, user) if(STATE_REINFORCED_WALL) return do_reinforced_wall(W, user) - if(STATE_DISPLACED) + if(STATE_DISPLACED) + if(HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + var/list/obj/structure/girder/girders = list() + + for(var/turf/current_turf in turfs) + var/found_girder = FALSE + for(var/obj/structure/girder/girder in current_turf) + if(girder.state == STATE_DISPLACED) + found_girder = TRUE + girders += girder + if(!found_girder) + return + + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + new /obj/structure/watchtower(loc) + + for(var/list/obj/structure/girder as anything in girders) + qdel(girder) + if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) var/turf/open/floor = loc if(!floor.allow_construction) @@ -393,6 +415,13 @@ anchored = FALSE state = STATE_DISPLACED +/obj/structure/girder/broken + health = 0 + icon_state = "girder_damaged" + anchored = FALSE + density = FALSE + state = STATE_STANDARD + /obj/structure/girder/reinforced icon_state = "reinforced" health = 500 diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 253ca27faef4..f0fa740e1439 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -22,17 +22,38 @@ new /obj/structure/blocker/invisible_wall/watchtower/inverse(current_turf) for(var/turf/current_turf in blocked_turfs) - new /obj/structure/blocked_turfs/invisible_wall/throw_pass(current_turf) + new /obj/structure/blocker/invisible_wall/throwpass(current_turf) update_icon() /obj/structure/watchtower/Destroy() - var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) + CORNER_OUTLINE(get_turf(src), 2, 3) + playsound(src, 'sound/effects/metal_crash.ogg', 50, 1) + var/list/turf/all_turfs = CORNER_BLOCK(get_turf(src), 2, 3) + CORNER_OUTLINE(get_turf(src), 2, 3) - for(var/turf/current_turf in turfs) + for(var/turf/current_turf in all_turfs) for(var/obj/structure/blocker/invisible_wall in current_turf.contents) qdel(invisible_wall) + var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) + + for(var/turf/current_turf in top_turfs) + for(var/mob/falling_mob in current_turf.contents) + if(falling_mob.client) + falling_mob.client.change_view(falling_mob.client.view - 2) + var/atom/movable/screen/plane_master/roof/roof_plane = falling_mob.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = 0 + for(var/obj/item/weapon/gun/gun in falling_mob) + gun.remove_bullet_traits(list("watchtower_arc")) + falling_mob.ex_act(100, 0) + + new /obj/structure/girder(get_turf(src)) + new /obj/structure/girder/broken(locate(x+1, y, z)) + new /obj/structure/girder/broken(locate(x, y+1, z)) + new /obj/item/stack/sheet/metal(locate(x+1, y+1, z), 10) + new /obj/item/stack/rods(locate(x+1, y+1, z), 20) + + return ..() + /obj/structure/watchtower/update_icon() . = ..() icon_state = "stage[stage]" @@ -49,6 +70,10 @@ overlays += roof_image /obj/structure/watchtower/attackby(obj/item/W, mob/user) + if(istool(W) && !skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_ENGI)) + to_chat(user, SPAN_WARNING("You are not trained to configure [src]...")) + return TRUE + switch(stage) if(1) if(!istype(W, /obj/item/stack/rods)) @@ -59,7 +84,7 @@ if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) return - if(rods.use(10)) + if(rods.use(60)) to_chat(user, SPAN_NOTICE("You add connection rods to the watchtower.")) stage = 2 update_icon() @@ -89,7 +114,7 @@ if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - to_chat(user, SPAN_NOTICE("You summon a black hole and somehow produce more matter to elevate the frame.")) + to_chat(user, SPAN_NOTICE("You elevate the the frame and screw it up top.")) stage = 3 update_icon() @@ -106,7 +131,7 @@ if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - if(metal.use(10)) + if(metal.use(50)) to_chat(user, SPAN_NOTICE("You construct the watchtower platform.")) stage = 4 update_icon() @@ -126,7 +151,7 @@ if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - if(plasteel.use(10)) + if(plasteel.use(25)) to_chat(user, SPAN_NOTICE("You construct the watchtower railing.")) stage = 5 update_icon() @@ -146,7 +171,7 @@ if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - if(rods.use(10)) + if(rods.use(60)) to_chat(user, SPAN_NOTICE("You construct the watchtower support rods.")) stage = 6 update_icon() @@ -170,7 +195,7 @@ if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - if(plasteel.use(10)) + if(plasteel.use(25)) to_chat(user, SPAN_NOTICE("You complete the watchtower.")) stage = 7 update_icon() @@ -179,8 +204,7 @@ else to_chat(user, SPAN_NOTICE("You failed to complete the watchtower, you need more plasteel sheets in your offhand.")) - return - + return /obj/structure/watchtower/attack_hand(mob/user) if(get_turf(user) == locate(x, y-1, z)) @@ -193,6 +217,8 @@ user.client.change_view(user.client.view + 2) var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] roof_plane?.invisibility = INVISIBILITY_MAXIMUM + for(var/obj/item/weapon/gun/gun in user) + gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only))) else if(get_turf(user) == locate(x, y+1, z)) if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return @@ -203,21 +229,23 @@ user.client.change_view(user.client.view - 2) var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] roof_plane?.invisibility = 0 + for(var/obj/item/weapon/gun/gun in user) + gun.remove_bullet_traits(list("watchtower_arc")) -/obj/structure/blocked_turfs/invisible_wall/throw_pass +/obj/structure/watchtower/attack_alien(mob/living/carbon/xenomorph/xeno) + if (xeno.mob_size < MOB_SIZE_BIG) + return -/obj/structure/blocked_turfs/invisible_wall/throw_pass/initialize_pass_flags(datum/pass_flags_container/PF) - ..() - if (PF) - PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY + if(!do_after(xeno, 100, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) + return -/obj/structure/blocker/invisible_wall/watchtower + qdel(src) + +/obj/structure/blocker/invisible_wall/throwpass throwpass = TRUE -/obj/structure/blocker/invisible_wall/watchtower/initialize_pass_flags(datum/pass_flags_container/PF) - ..() - if (PF) - PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY +/obj/structure/blocker/invisible_wall/watchtower + throwpass = TRUE /obj/structure/blocker/invisible_wall/watchtower/Collided(atom/movable/AM) if(HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) diff --git a/colonialmarines.dme b/colonialmarines.dme index 2d166cddbe2b..7c3edfd46395 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -503,6 +503,7 @@ #include "code\datums\elements\suturing.dm" #include "code\datums\elements\yautja_tracked_item.dm" #include "code\datums\elements\bullet_trait\damage_boost.dm" +#include "code\datums\elements\bullet_trait\direct_only.dm" #include "code\datums\elements\bullet_trait\iff.dm" #include "code\datums\elements\bullet_trait\ignored_range.dm" #include "code\datums\elements\bullet_trait\incendiary.dm" From b8cdc4e769d49d0a972b1a35a5a5cff45caac8a7 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:24:00 +0200 Subject: [PATCH 05/29] tabs --- code/modules/watchtower/watchtower.dm | 466 +++++++++++++------------- 1 file changed, 233 insertions(+), 233 deletions(-) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index f0fa740e1439..ea0b9197771f 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -1,281 +1,281 @@ /obj/structure/watchtower - name = "watchtower" - icon = 'icons/obj/structures/watchtower.dmi' - icon_state = "stage1" + name = "watchtower" + icon = 'icons/obj/structures/watchtower.dmi' + icon_state = "stage1" - density = FALSE - bound_width = 64 - bound_height = 96 + density = FALSE + bound_width = 64 + bound_height = 96 - var/stage = 1 - var/image/roof_image + var/stage = 1 + var/image/roof_image /obj/structure/watchtower/Initialize() - var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) - var/list/turf/blocked_turfs = CORNER_BLOCK(get_turf(src), 2, 1) + CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 2) - var/list/turf/bottom_turfs = CORNER_OUTLINE(get_turf(src), 2, 3) + var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) + var/list/turf/blocked_turfs = CORNER_BLOCK(get_turf(src), 2, 1) + CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 2) + var/list/turf/bottom_turfs = CORNER_OUTLINE(get_turf(src), 2, 3) - for(var/turf/current_turf in top_turfs) - new /obj/structure/blocker/invisible_wall/watchtower(current_turf) + for(var/turf/current_turf in top_turfs) + new /obj/structure/blocker/invisible_wall/watchtower(current_turf) - for(var/turf/current_turf in bottom_turfs) - new /obj/structure/blocker/invisible_wall/watchtower/inverse(current_turf) + for(var/turf/current_turf in bottom_turfs) + new /obj/structure/blocker/invisible_wall/watchtower/inverse(current_turf) - for(var/turf/current_turf in blocked_turfs) - new /obj/structure/blocker/invisible_wall/throwpass(current_turf) + for(var/turf/current_turf in blocked_turfs) + new /obj/structure/blocker/invisible_wall/throwpass(current_turf) - update_icon() + update_icon() /obj/structure/watchtower/Destroy() - playsound(src, 'sound/effects/metal_crash.ogg', 50, 1) - var/list/turf/all_turfs = CORNER_BLOCK(get_turf(src), 2, 3) + CORNER_OUTLINE(get_turf(src), 2, 3) + playsound(src, 'sound/effects/metal_crash.ogg', 50, 1) + var/list/turf/all_turfs = CORNER_BLOCK(get_turf(src), 2, 3) + CORNER_OUTLINE(get_turf(src), 2, 3) - for(var/turf/current_turf in all_turfs) - for(var/obj/structure/blocker/invisible_wall in current_turf.contents) - qdel(invisible_wall) + for(var/turf/current_turf in all_turfs) + for(var/obj/structure/blocker/invisible_wall in current_turf.contents) + qdel(invisible_wall) - var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) + var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) - for(var/turf/current_turf in top_turfs) - for(var/mob/falling_mob in current_turf.contents) - if(falling_mob.client) - falling_mob.client.change_view(falling_mob.client.view - 2) - var/atom/movable/screen/plane_master/roof/roof_plane = falling_mob.hud_used.plane_masters["[ROOF_PLANE]"] - roof_plane?.invisibility = 0 - for(var/obj/item/weapon/gun/gun in falling_mob) - gun.remove_bullet_traits(list("watchtower_arc")) - falling_mob.ex_act(100, 0) + for(var/turf/current_turf in top_turfs) + for(var/mob/falling_mob in current_turf.contents) + if(falling_mob.client) + falling_mob.client.change_view(falling_mob.client.view - 2) + var/atom/movable/screen/plane_master/roof/roof_plane = falling_mob.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = 0 + for(var/obj/item/weapon/gun/gun in falling_mob) + gun.remove_bullet_traits(list("watchtower_arc")) + falling_mob.ex_act(100, 0) - new /obj/structure/girder(get_turf(src)) - new /obj/structure/girder/broken(locate(x+1, y, z)) - new /obj/structure/girder/broken(locate(x, y+1, z)) - new /obj/item/stack/sheet/metal(locate(x+1, y+1, z), 10) - new /obj/item/stack/rods(locate(x+1, y+1, z), 20) + new /obj/structure/girder(get_turf(src)) + new /obj/structure/girder/broken(locate(x+1, y, z)) + new /obj/structure/girder/broken(locate(x, y+1, z)) + new /obj/item/stack/sheet/metal(locate(x+1, y+1, z), 10) + new /obj/item/stack/rods(locate(x+1, y+1, z), 20) - return ..() + return ..() /obj/structure/watchtower/update_icon() - . = ..() - icon_state = "stage[stage]" + . = ..() + icon_state = "stage[stage]" - overlays.Cut() + overlays.Cut() - if(stage >= 5) - overlays += image(icon=icon, icon_state="railings", layer=ABOVE_MOB_LAYER, pixel_y=25) + if(stage >= 5) + overlays += image(icon=icon, icon_state="railings", layer=ABOVE_MOB_LAYER, pixel_y=25) - if (stage == 7) - roof_image = image(icon=icon, icon_state="roof", layer=ABOVE_MOB_LAYER, pixel_y=51) - roof_image.plane = ROOF_PLANE - roof_image.appearance_flags = KEEP_APART - overlays += roof_image + if (stage == 7) + roof_image = image(icon=icon, icon_state="roof", layer=ABOVE_MOB_LAYER, pixel_y=51) + roof_image.plane = ROOF_PLANE + roof_image.appearance_flags = KEEP_APART + overlays += roof_image /obj/structure/watchtower/attackby(obj/item/W, mob/user) - if(istool(W) && !skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_ENGI)) - to_chat(user, SPAN_WARNING("You are not trained to configure [src]...")) - return TRUE - - switch(stage) - if(1) - if(!istype(W, /obj/item/stack/rods)) - return - - var/obj/item/stack/rods/rods = W - - if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) - return - - if(rods.use(60)) - to_chat(user, SPAN_NOTICE("You add connection rods to the watchtower.")) - stage = 2 - update_icon() - else - to_chat(user, SPAN_NOTICE("You failed to construct the connection rods. You need more rods.")) - - return - if(2) - if(!iswelder(W)) - return - - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) - to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) - return - - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - to_chat(user, SPAN_NOTICE("You weld the connection rods to the frame.")) - stage = 2.5 - - return - if(2.5) - if(!HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) - return - - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - to_chat(user, SPAN_NOTICE("You elevate the the frame and screw it up top.")) - stage = 3 - update_icon() - - return - if(3) - if(!HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) - return - - var/obj/item/stack/sheet/metal/metal = user.get_inactive_hand() - if(!istype(metal)) - to_chat(user, SPAN_BOLDWARNING("You need metal sheets in your offhand to continue construction of the watchtower.")) - return FALSE - - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - if(metal.use(50)) - to_chat(user, SPAN_NOTICE("You construct the watchtower platform.")) - stage = 4 - update_icon() - else - to_chat(user, SPAN_NOTICE("You failed to construct the watchtower platform, you need more metal sheets in your offhand.")) - - return - if(4) - if(!HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) - return - - var/obj/item/stack/sheet/plasteel/plasteel = user.get_inactive_hand() - if(!istype(plasteel)) - to_chat(user, SPAN_BOLDWARNING("You need plasteel sheets in your offhand to continue construction of the watchtower.")) - return FALSE - - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - if(plasteel.use(25)) - to_chat(user, SPAN_NOTICE("You construct the watchtower railing.")) - stage = 5 - update_icon() - else - to_chat(user, SPAN_NOTICE("You failed to construct the watchtower railing, you need more plasteel sheets in your offhand.")) - - return - if(5) - if (!HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) - return - - var/obj/item/stack/rods/rods = user.get_inactive_hand() - if(!istype(rods)) - to_chat(user, SPAN_BOLDWARNING("You need metal rods in your offhand to continue construction of the watchtower.")) - return FALSE - - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - if(rods.use(60)) - to_chat(user, SPAN_NOTICE("You construct the watchtower support rods.")) - stage = 6 - update_icon() - else - to_chat(user, SPAN_NOTICE("You failed to construct the watchtower support rods, you need more metal rods in your offhand.")) - - return - if(6) - if (!iswelder(W)) - return - - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) - to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) - return - - var/obj/item/stack/sheet/plasteel/plasteel = user.get_inactive_hand() - if(!istype(plasteel)) - to_chat(user, SPAN_BOLDWARNING("You need plasteel sheets in your offhand to continue construction of the watchtower.")) - return FALSE - - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - if(plasteel.use(25)) - to_chat(user, SPAN_NOTICE("You complete the watchtower.")) - stage = 7 - update_icon() - - - else - to_chat(user, SPAN_NOTICE("You failed to complete the watchtower, you need more plasteel sheets in your offhand.")) - - return + if(istool(W) && !skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_ENGI)) + to_chat(user, SPAN_WARNING("You are not trained to configure [src]...")) + return TRUE + + switch(stage) + if(1) + if(!istype(W, /obj/item/stack/rods)) + return + + var/obj/item/stack/rods/rods = W + + if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) + return + + if(rods.use(60)) + to_chat(user, SPAN_NOTICE("You add connection rods to the watchtower.")) + stage = 2 + update_icon() + else + to_chat(user, SPAN_NOTICE("You failed to construct the connection rods. You need more rods.")) + + return + if(2) + if(!iswelder(W)) + return + + if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) + return + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + to_chat(user, SPAN_NOTICE("You weld the connection rods to the frame.")) + stage = 2.5 + + return + if(2.5) + if(!HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + return + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + to_chat(user, SPAN_NOTICE("You elevate the the frame and screw it up top.")) + stage = 3 + update_icon() + + return + if(3) + if(!HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + return + + var/obj/item/stack/sheet/metal/metal = user.get_inactive_hand() + if(!istype(metal)) + to_chat(user, SPAN_BOLDWARNING("You need metal sheets in your offhand to continue construction of the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(metal.use(50)) + to_chat(user, SPAN_NOTICE("You construct the watchtower platform.")) + stage = 4 + update_icon() + else + to_chat(user, SPAN_NOTICE("You failed to construct the watchtower platform, you need more metal sheets in your offhand.")) + + return + if(4) + if(!HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) + return + + var/obj/item/stack/sheet/plasteel/plasteel = user.get_inactive_hand() + if(!istype(plasteel)) + to_chat(user, SPAN_BOLDWARNING("You need plasteel sheets in your offhand to continue construction of the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(plasteel.use(25)) + to_chat(user, SPAN_NOTICE("You construct the watchtower railing.")) + stage = 5 + update_icon() + else + to_chat(user, SPAN_NOTICE("You failed to construct the watchtower railing, you need more plasteel sheets in your offhand.")) + + return + if(5) + if (!HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + return + + var/obj/item/stack/rods/rods = user.get_inactive_hand() + if(!istype(rods)) + to_chat(user, SPAN_BOLDWARNING("You need metal rods in your offhand to continue construction of the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(rods.use(60)) + to_chat(user, SPAN_NOTICE("You construct the watchtower support rods.")) + stage = 6 + update_icon() + else + to_chat(user, SPAN_NOTICE("You failed to construct the watchtower support rods, you need more metal rods in your offhand.")) + + return + if(6) + if (!iswelder(W)) + return + + if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) + return + + var/obj/item/stack/sheet/plasteel/plasteel = user.get_inactive_hand() + if(!istype(plasteel)) + to_chat(user, SPAN_BOLDWARNING("You need plasteel sheets in your offhand to continue construction of the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(plasteel.use(25)) + to_chat(user, SPAN_NOTICE("You complete the watchtower.")) + stage = 7 + update_icon() + + + else + to_chat(user, SPAN_NOTICE("You failed to complete the watchtower, you need more plasteel sheets in your offhand.")) + + return /obj/structure/watchtower/attack_hand(mob/user) - if(get_turf(user) == locate(x, y-1, z)) - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - var/turf/actual_turf = locate(x, y+1, z) - ADD_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") - user.forceMove(actual_turf) - user.client.change_view(user.client.view + 2) - var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] - roof_plane?.invisibility = INVISIBILITY_MAXIMUM - for(var/obj/item/weapon/gun/gun in user) - gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only))) - else if(get_turf(user) == locate(x, y+1, z)) - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - return - - REMOVE_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") - var/turf/actual_turf = locate(x, y-1, z) - user.forceMove(actual_turf) - user.client.change_view(user.client.view - 2) - var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] - roof_plane?.invisibility = 0 - for(var/obj/item/weapon/gun/gun in user) - gun.remove_bullet_traits(list("watchtower_arc")) + if(get_turf(user) == locate(x, y-1, z)) + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + var/turf/actual_turf = locate(x, y+1, z) + ADD_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") + user.forceMove(actual_turf) + user.client.change_view(user.client.view + 2) + var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = INVISIBILITY_MAXIMUM + for(var/obj/item/weapon/gun/gun in user) + gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only))) + else if(get_turf(user) == locate(x, y+1, z)) + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + REMOVE_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") + var/turf/actual_turf = locate(x, y-1, z) + user.forceMove(actual_turf) + user.client.change_view(user.client.view - 2) + var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = 0 + for(var/obj/item/weapon/gun/gun in user) + gun.remove_bullet_traits(list("watchtower_arc")) /obj/structure/watchtower/attack_alien(mob/living/carbon/xenomorph/xeno) - if (xeno.mob_size < MOB_SIZE_BIG) - return + if (xeno.mob_size < MOB_SIZE_BIG) + return - if(!do_after(xeno, 100, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) - return + if(!do_after(xeno, 100, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) + return - qdel(src) + qdel(src) /obj/structure/blocker/invisible_wall/throwpass - throwpass = TRUE + throwpass = TRUE /obj/structure/blocker/invisible_wall/watchtower - throwpass = TRUE + throwpass = TRUE /obj/structure/blocker/invisible_wall/watchtower/Collided(atom/movable/AM) - if(HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) - AM.forceMove(get_turf(src)) + if(HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) + AM.forceMove(get_turf(src)) /obj/structure/blocker/invisible_wall/watchtower/inverse /obj/structure/blocker/invisible_wall/watchtower/inverse/Collided(atom/movable/AM) - if(!HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) - AM.forceMove(get_turf(src)) + if(!HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) + AM.forceMove(get_turf(src)) // For Mappers /obj/structure/watchtower/stage1 - stage = 1 - icon_state = "stage1" + stage = 1 + icon_state = "stage1" /obj/structure/watchtower/stage2 - stage = 2 - icon_state = "stage2" + stage = 2 + icon_state = "stage2" /obj/structure/watchtower/stage3 - stage = 3 - icon_state = "stage3" + stage = 3 + icon_state = "stage3" /obj/structure/watchtower/stage4 - stage = 4 - icon_state = "stage4" + stage = 4 + icon_state = "stage4" /obj/structure/watchtower/stage5 - stage = 5 - icon_state = "stage5" + stage = 5 + icon_state = "stage5" /obj/structure/watchtower/stage6 - stage = 6 - icon_state = "stage6" + stage = 6 + icon_state = "stage6" /obj/structure/watchtower/complete - stage = 7 - icon_state = "stage7" + stage = 7 + icon_state = "stage7 From 31d28504522013aa3b2a676317e806db8c779567 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:26:29 +0200 Subject: [PATCH 06/29] call parent --- code/modules/watchtower/watchtower.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index ea0b9197771f..3ce4fa746997 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -26,6 +26,8 @@ update_icon() + return ..() + /obj/structure/watchtower/Destroy() playsound(src, 'sound/effects/metal_crash.ogg', 50, 1) var/list/turf/all_turfs = CORNER_BLOCK(get_turf(src), 2, 3) + CORNER_OUTLINE(get_turf(src), 2, 3) From d533593d6db0bf7f7258c658cdd5dbfe1f849111 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:40:06 +0200 Subject: [PATCH 07/29] Update watchtower.dm --- code/modules/watchtower/watchtower.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 3ce4fa746997..af6177406455 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -280,4 +280,4 @@ icon_state = "stage6" /obj/structure/watchtower/complete stage = 7 - icon_state = "stage7 + icon_state = "stage7" From afa79ec2f85491b203cf008152e9d544f6312b96 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 21:16:22 +0200 Subject: [PATCH 08/29] a --- .../elements/bullet_trait/direct_only.dm | 18 +++++++++++++ code/modules/watchtower/watchtower.dm | 25 ++++++++++++++----- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/code/datums/elements/bullet_trait/direct_only.dm b/code/datums/elements/bullet_trait/direct_only.dm index 752dd4ef0f7c..8e79d6d3cdef 100644 --- a/code/datums/elements/bullet_trait/direct_only.dm +++ b/code/datums/elements/bullet_trait/direct_only.dm @@ -22,3 +22,21 @@ if(P.original != projectile_target) return COMPONENT_SKIP_MOB + +/datum/element/bullet_trait_direct_only/watchtower + +/datum/element/bullet_trait_direct_only/watchtower/check_distance(obj/projectile/P, mob/living/carbon/human/projectile_target) + if(!HAS_TRAIT(P.firer, TRAIT_ON_WATCHTOWER)) + if(!istype(P.firer, /mob)) + return + var/mob/firer = P.firer + var/obj/item/weapon/gun/gun = firer.get_inactive_hand() + if(istype(gun)) + gun.remove_bullet_traits(list("watchtower_arc")) + + gun = firer.get_active_hand() + if(istype(gun)) + gun.remove_bullet_traits(list("watchtower_arc")) + return + + return ..() diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index af6177406455..94554ad8cf76 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -44,9 +44,8 @@ falling_mob.client.change_view(falling_mob.client.view - 2) var/atom/movable/screen/plane_master/roof/roof_plane = falling_mob.hud_used.plane_masters["[ROOF_PLANE]"] roof_plane?.invisibility = 0 - for(var/obj/item/weapon/gun/gun in falling_mob) - gun.remove_bullet_traits(list("watchtower_arc")) falling_mob.ex_act(100, 0) + UnregisterSignal(falling_mob, COMSIG_ITEM_PICKUP) new /obj/structure/girder(get_turf(src)) new /obj/structure/girder/broken(locate(x+1, y, z)) @@ -219,8 +218,8 @@ user.client.change_view(user.client.view + 2) var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] roof_plane?.invisibility = INVISIBILITY_MAXIMUM - for(var/obj/item/weapon/gun/gun in user) - gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only))) + add_trait_to_all_guns(user) + RegisterSignal(user, COMSIG_ITEM_PICKUP, PROC_REF(item_picked_up)) else if(get_turf(user) == locate(x, y+1, z)) if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return @@ -231,9 +230,23 @@ user.client.change_view(user.client.view - 2) var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] roof_plane?.invisibility = 0 - for(var/obj/item/weapon/gun/gun in user) - gun.remove_bullet_traits(list("watchtower_arc")) + UnregisterSignal(user, COMSIG_ITEM_PICKUP) +/obj/structure/watchtower/proc/add_trait_to_all_guns(mob/user) + for(var/obj/item/weapon/gun/gun in user) + gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only/watchtower))) + + for(var/obj/item/storage/storage in user) + for(var/obj/item/weapon/gun/gun in storage.contents) + gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only/watchtower))) + +/obj/structure/watchtower/proc/item_picked_up(obj/item/picked_up_item, mob/living/carbon/human/user) + if(!istype(picked_up_item, /obj/item/weapon/gun)) + return + + var/obj/item/weapon/gun/gun = picked_up_item + gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only/watchtower))) + /obj/structure/watchtower/attack_alien(mob/living/carbon/xenomorph/xeno) if (xeno.mob_size < MOB_SIZE_BIG) return From 8c9754add121a16b59cd34fa062ba86b72c35128 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 21:45:59 +0200 Subject: [PATCH 09/29] fixes --- code/game/objects/effects/effect_system/smoke.dm | 5 +++++ code/game/objects/objs.dm | 2 ++ code/modules/watchtower/watchtower.dm | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index 4e41550617bd..15c08f9a4cff 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -112,6 +112,11 @@ /obj/effect/particle_effect/smoke/proc/check_airblock(turf/start_turf, turf/cur_turf) if(!cur_turf) return FALSE + + for(var/obj/cur_obj in cur_turf.contents) + if(cur_obj.gas_pass) + return FALSE + if(cur_turf.density) return TRUE if(prob(BOILER_GAS_CADE_BLOCK_CHANCE)) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 6e375c327cda..2fa25ad9f8b4 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -8,6 +8,8 @@ /// universal "unacidabliness" var, here so you can use it in any obj. unacidable = FALSE animate_movement = 2 + // Allows gasses to pass (despite being dense for example) + var/gas_pass = FALSE var/throwforce = 1 /// If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! var/in_use = FALSE diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 94554ad8cf76..92f39ee06ca3 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -7,6 +7,8 @@ bound_width = 64 bound_height = 96 + gas_pass = TRUE + var/stage = 1 var/image/roof_image @@ -258,9 +260,11 @@ /obj/structure/blocker/invisible_wall/throwpass throwpass = TRUE + gas_pass = TRUE /obj/structure/blocker/invisible_wall/watchtower throwpass = TRUE + gas_pass = TRUE /obj/structure/blocker/invisible_wall/watchtower/Collided(atom/movable/AM) if(HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) @@ -272,6 +276,11 @@ if(!HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) AM.forceMove(get_turf(src)) +/obj/structure/blocker/invisible_wall/watchtower/inverse/initialize_pass_flags(datum/pass_flags_container/PF) + ..() + if (PF) + PF.flags_can_pass_all = PASS_OVER + // For Mappers /obj/structure/watchtower/stage1 stage = 1 From e66f6712bca36f44b2e9c972c1289d517b6fc97c Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 22:09:41 +0200 Subject: [PATCH 10/29] polish --- code/modules/movement/movement.dm | 11 ++++---- code/modules/watchtower/watchtower.dm | 36 ++++++++++++++------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/code/modules/movement/movement.dm b/code/modules/movement/movement.dm index 8151d2df6707..0a0496c67e1c 100644 --- a/code/modules/movement/movement.dm +++ b/code/modules/movement/movement.dm @@ -56,18 +56,19 @@ return NO_BLOCKED_MOVEMENT /atom/movable/Move(NewLoc, direct) - // If Move is not valid, exit - if (SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, NewLoc) & COMPONENT_CANCEL_MOVE) - return FALSE - var/atom/oldloc = loc var/old_dir = dir - . = ..() if (flags_atom & DIRLOCK) setDir(old_dir) else if(old_dir != direct) setDir(direct) + + // If Move is not valid, exit + if (SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, NewLoc) & COMPONENT_CANCEL_MOVE) + return FALSE + + . = ..() l_move_time = world.time if ((oldloc != loc && oldloc && oldloc.z == z)) last_move_dir = get_dir(oldloc, loc) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 92f39ee06ca3..77f0f8c30e5c 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -15,14 +15,10 @@ /obj/structure/watchtower/Initialize() var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) var/list/turf/blocked_turfs = CORNER_BLOCK(get_turf(src), 2, 1) + CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 2) - var/list/turf/bottom_turfs = CORNER_OUTLINE(get_turf(src), 2, 3) for(var/turf/current_turf in top_turfs) new /obj/structure/blocker/invisible_wall/watchtower(current_turf) - for(var/turf/current_turf in bottom_turfs) - new /obj/structure/blocker/invisible_wall/watchtower/inverse(current_turf) - for(var/turf/current_turf in blocked_turfs) new /obj/structure/blocker/invisible_wall/throwpass(current_turf) @@ -32,7 +28,7 @@ /obj/structure/watchtower/Destroy() playsound(src, 'sound/effects/metal_crash.ogg', 50, 1) - var/list/turf/all_turfs = CORNER_BLOCK(get_turf(src), 2, 3) + CORNER_OUTLINE(get_turf(src), 2, 3) + var/list/turf/all_turfs = CORNER_BLOCK(get_turf(src), 2, 3) for(var/turf/current_turf in all_turfs) for(var/obj/structure/blocker/invisible_wall in current_turf.contents) @@ -48,6 +44,7 @@ roof_plane?.invisibility = 0 falling_mob.ex_act(100, 0) UnregisterSignal(falling_mob, COMSIG_ITEM_PICKUP) + UnregisterSignal(falling_mob, COMSIG_MOVABLE_PRE_MOVE) new /obj/structure/girder(get_turf(src)) new /obj/structure/girder/broken(locate(x+1, y, z)) @@ -222,6 +219,7 @@ roof_plane?.invisibility = INVISIBILITY_MAXIMUM add_trait_to_all_guns(user) RegisterSignal(user, COMSIG_ITEM_PICKUP, PROC_REF(item_picked_up)) + RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_can_move)) else if(get_turf(user) == locate(x, y+1, z)) if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return @@ -233,6 +231,7 @@ var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] roof_plane?.invisibility = 0 UnregisterSignal(user, COMSIG_ITEM_PICKUP) + UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) /obj/structure/watchtower/proc/add_trait_to_all_guns(mob/user) for(var/obj/item/weapon/gun/gun in user) @@ -243,12 +242,26 @@ gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only/watchtower))) /obj/structure/watchtower/proc/item_picked_up(obj/item/picked_up_item, mob/living/carbon/human/user) + SIGNAL_HANDLER if(!istype(picked_up_item, /obj/item/weapon/gun)) return var/obj/item/weapon/gun/gun = picked_up_item gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only/watchtower))) - + +/obj/structure/watchtower/proc/check_can_move(mob/mover, turf/new_loc) + SIGNAL_HANDLER + var/found = FALSE + for(var/turf/current_turf in CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1)) + if (current_turf.x == new_loc.x && current_turf.y == new_loc.y && current_turf.z == new_loc.z) + found = TRUE + break + + if(!found) + return COMPONENT_CANCEL_MOVE + + return + /obj/structure/watchtower/attack_alien(mob/living/carbon/xenomorph/xeno) if (xeno.mob_size < MOB_SIZE_BIG) return @@ -270,17 +283,6 @@ if(HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) AM.forceMove(get_turf(src)) -/obj/structure/blocker/invisible_wall/watchtower/inverse - -/obj/structure/blocker/invisible_wall/watchtower/inverse/Collided(atom/movable/AM) - if(!HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) - AM.forceMove(get_turf(src)) - -/obj/structure/blocker/invisible_wall/watchtower/inverse/initialize_pass_flags(datum/pass_flags_container/PF) - ..() - if (PF) - PF.flags_can_pass_all = PASS_OVER - // For Mappers /obj/structure/watchtower/stage1 stage = 1 From 4c5d444f97b1c8b5ed9c404bcc57d64ccbcdc610 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 22:24:34 +0200 Subject: [PATCH 11/29] can't build under roof --- code/game/objects/structures/girders.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index af7163b4ee3c..a87fbfbde484 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -177,6 +177,10 @@ return do_reinforced_wall(W, user) if(STATE_DISPLACED) if(HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + if(CEILING_IS_PROTECTED(A.ceiling, CEILING_GLASS)) + to_chat(user, SPAN_WARNING("Watchtowers can only be built in the open.")) + return + var/list/turf/turfs = CORNER_BLOCK(get_turf(src), 2, 2) var/list/obj/structure/girder/girders = list() From 0702a871e932486c0f80ef54ab1e514eb9f9203a Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 23:10:06 +0200 Subject: [PATCH 12/29] Update girders.dm --- code/game/objects/structures/girders.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a87fbfbde484..e8dfdbc4f6a6 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -177,7 +177,7 @@ return do_reinforced_wall(W, user) if(STATE_DISPLACED) if(HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) - if(CEILING_IS_PROTECTED(A.ceiling, CEILING_GLASS)) + if(CEILING_IS_PROTECTED(get_area(src).ceiling, CEILING_GLASS)) to_chat(user, SPAN_WARNING("Watchtowers can only be built in the open.")) return From cfa5cb41c8ab6162cbed1385d26f55791bf23a69 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 23:12:04 +0200 Subject: [PATCH 13/29] macros xd --- code/game/objects/structures/girders.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index e8dfdbc4f6a6..a9edb9747c58 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -177,7 +177,7 @@ return do_reinforced_wall(W, user) if(STATE_DISPLACED) if(HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) - if(CEILING_IS_PROTECTED(get_area(src).ceiling, CEILING_GLASS)) + if(CEILING_IS_PROTECTED((get_area(src)).ceiling, CEILING_GLASS)) to_chat(user, SPAN_WARNING("Watchtowers can only be built in the open.")) return From 8bbf8708be2c541f0c74841d455f9076dda27a94 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Sat, 7 Dec 2024 09:21:57 +0200 Subject: [PATCH 14/29] Update girders.dm --- code/game/objects/structures/girders.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a9edb9747c58..690fefee896b 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -177,7 +177,8 @@ return do_reinforced_wall(W, user) if(STATE_DISPLACED) if(HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) - if(CEILING_IS_PROTECTED((get_area(src)).ceiling, CEILING_GLASS)) + var/area/area = get_area(src) + if(CEILING_IS_PROTECTED(area.ceiling, CEILING_GLASS)) to_chat(user, SPAN_WARNING("Watchtowers can only be built in the open.")) return From f1b68007ba6e1911320d80211433708d6ae5276f Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Sat, 7 Dec 2024 09:52:19 +0200 Subject: [PATCH 15/29] replaces shitty blockers with tent blockers --- .../objects/effects/effect_system/smoke.dm | 4 -- code/game/objects/objs.dm | 2 - code/modules/watchtower/blockers.dm | 45 +++++++++++++++++++ code/modules/watchtower/watchtower.dm | 23 +++------- colonialmarines.dme | 1 + 5 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 code/modules/watchtower/blockers.dm diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index 15c08f9a4cff..217bbb604a2a 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -112,10 +112,6 @@ /obj/effect/particle_effect/smoke/proc/check_airblock(turf/start_turf, turf/cur_turf) if(!cur_turf) return FALSE - - for(var/obj/cur_obj in cur_turf.contents) - if(cur_obj.gas_pass) - return FALSE if(cur_turf.density) return TRUE diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 2fa25ad9f8b4..6e375c327cda 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -8,8 +8,6 @@ /// universal "unacidabliness" var, here so you can use it in any obj. unacidable = FALSE animate_movement = 2 - // Allows gasses to pass (despite being dense for example) - var/gas_pass = FALSE var/throwforce = 1 /// If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! var/in_use = FALSE diff --git a/code/modules/watchtower/blockers.dm b/code/modules/watchtower/blockers.dm new file mode 100644 index 000000000000..3802d3abf183 --- /dev/null +++ b/code/modules/watchtower/blockers.dm @@ -0,0 +1,45 @@ +/// Invisible Blocker Walls, they link up with the watchtower and collapse with it +/obj/structure/blocker/watchtower + name = "Watchtower Blocker" + icon = 'icons/obj/structures/barricades.dmi' + icon_state = "folding_0" // for map editing only + flags_atom = ON_BORDER + invisibility = INVISIBILITY_MAXIMUM + density = TRUE + opacity = FALSE // Unfortunately this doesn't behave as we'd want with ON_BORDER so we can't make tent opaque + throwpass = TRUE // Needs this so xenos can attack through the blocker and hit the tents or people inside + /// The watchtower this blocker relates to, will be destroyed along with it + var/obj/structure/watchtower/linked_watchtower + +/obj/structure/blocker/watchtower/Initialize(mapload, ...) + . = ..() + icon_state = null + linked_watchtower = locate(/obj/structure/watchtower) in loc + if(!linked_watchtower) + return INITIALIZE_HINT_QDEL + RegisterSignal(linked_watchtower, COMSIG_PARENT_QDELETING, PROC_REF(collapse)) + +/obj/structure/blocker/watchtower/Destroy(force) + . = ..() + linked_watchtower = null + +/obj/structure/blocker/watchtower/proc/collapse() + SIGNAL_HANDLER + qdel(src) + +/obj/structure/blocker/watchtower/initialize_pass_flags(datum/pass_flags_container/PF) + ..() + if (PF) + PF.flags_can_pass_all = NONE + PF.flags_can_pass_front = NONE + PF.flags_can_pass_behind = NONE + +/obj/structure/blocker/watchtower/get_projectile_hit_boolean(obj/projectile/P) + . = ..() + return FALSE // Always fly through the watchtower + +//Blocks all direction, basically an invisible wall +/obj/structure/blocker/watchtower/full_tile + flags_atom = NO_FLAGS + icon = 'icons/landmarks.dmi' + icon_state = "invisible_wall" diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 77f0f8c30e5c..8f422fd3d431 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -7,20 +7,19 @@ bound_width = 64 bound_height = 96 - gas_pass = TRUE - var/stage = 1 var/image/roof_image /obj/structure/watchtower/Initialize() - var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) var/list/turf/blocked_turfs = CORNER_BLOCK(get_turf(src), 2, 1) + CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 2) - for(var/turf/current_turf in top_turfs) - new /obj/structure/blocker/invisible_wall/watchtower(current_turf) + var/atom/west_blocker = new /obj/structure/blocker/watchtower(locate(x, y+1, z)) + var/atom/east_blocker = new /obj/structure/blocker/watchtower(locate(x+1, y+1, z)) + west_blocker.dir = WEST + east_blocker.dir = EAST for(var/turf/current_turf in blocked_turfs) - new /obj/structure/blocker/invisible_wall/throwpass(current_turf) + new /obj/structure/blocker/watchtower/full_tile(current_turf) update_icon() @@ -271,18 +270,6 @@ qdel(src) -/obj/structure/blocker/invisible_wall/throwpass - throwpass = TRUE - gas_pass = TRUE - -/obj/structure/blocker/invisible_wall/watchtower - throwpass = TRUE - gas_pass = TRUE - -/obj/structure/blocker/invisible_wall/watchtower/Collided(atom/movable/AM) - if(HAS_TRAIT(AM, TRAIT_ON_WATCHTOWER)) - AM.forceMove(get_turf(src)) - // For Mappers /obj/structure/watchtower/stage1 stage = 1 diff --git a/colonialmarines.dme b/colonialmarines.dme index 7c3edfd46395..790877c18af4 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -2524,6 +2524,7 @@ #include "code\modules\vox\vox_tgui.dm" #include "code\modules\vox\vox_sounds\vox.dm" #include "code\modules\vox\vox_sounds\vox_military.dm" +#include "code\modules\watchtower\blockers.dm" #include "code\modules\watchtower\watchtower.dm" #include "interface\fonts.dm" #include "interface\interface.dm" From e1caa54bdce2e7ce6812bc3d620a8f80650dc5f7 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Sat, 7 Dec 2024 09:53:17 +0200 Subject: [PATCH 16/29] removes space --- code/game/objects/effects/effect_system/smoke.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index 217bbb604a2a..4e41550617bd 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -112,7 +112,6 @@ /obj/effect/particle_effect/smoke/proc/check_airblock(turf/start_turf, turf/cur_turf) if(!cur_turf) return FALSE - if(cur_turf.density) return TRUE if(prob(BOILER_GAS_CADE_BLOCK_CHANCE)) From 8ad293d79033d28df5509aeb099139081511a541 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Sat, 7 Dec 2024 10:49:42 +0200 Subject: [PATCH 17/29] remove unnecessary qdels --- code/modules/watchtower/watchtower.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 8f422fd3d431..9331563a18b0 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -27,12 +27,6 @@ /obj/structure/watchtower/Destroy() playsound(src, 'sound/effects/metal_crash.ogg', 50, 1) - var/list/turf/all_turfs = CORNER_BLOCK(get_turf(src), 2, 3) - - for(var/turf/current_turf in all_turfs) - for(var/obj/structure/blocker/invisible_wall in current_turf.contents) - qdel(invisible_wall) - var/list/turf/top_turfs = CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1) for(var/turf/current_turf in top_turfs) From a7bc3465a1046912fe2042d23bbc6b3f18b41265 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Sun, 8 Dec 2024 20:42:35 +0200 Subject: [PATCH 18/29] Update watchtower.dm --- code/modules/watchtower/watchtower.dm | 65 +++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 9331563a18b0..4e70f5c11606 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -6,6 +6,8 @@ density = FALSE bound_width = 64 bound_height = 96 + health = 1000 + var/max_health = 1000 var/stage = 1 var/image/roof_image @@ -192,12 +194,43 @@ to_chat(user, SPAN_NOTICE("You complete the watchtower.")) stage = 7 update_icon() - - else to_chat(user, SPAN_NOTICE("You failed to complete the watchtower, you need more plasteel sheets in your offhand.")) return + if(7) + if (!iswelder(W)) + return + + if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) + return + + var/obj/item/stack/sheet/metal/metal = user.get_inactive_hand() + if(!istype(metal)) + to_chat(user, SPAN_BOLDWARNING("You need metal sheets in your offhand to patch the watchtower.")) + return FALSE + + if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + return + + if(metal.use(5)) + to_chat(user, SPAN_NOTICE("You patch the watchtower with the metal sheets.")) + update_health(-50) + else + to_chat(user, SPAN_NOTICE("You failed to patch the watchtower, you need more metal sheets in your offhand.")) + +/obj/structure/watchtower/get_examine_text(mob/user) + . = ..() + + var/dam = health / max_health + if(dam <= 0.3) + . += SPAN_WARNING("It looks slightly damaged.") + else if(dam <= 0.6) + . += SPAN_WARNING("It looks moderately damaged.") + else + . += SPAN_DANGER("It looks heavily damaged.") + /obj/structure/watchtower/attack_hand(mob/user) if(get_turf(user) == locate(x, y-1, z)) @@ -256,13 +289,29 @@ return /obj/structure/watchtower/attack_alien(mob/living/carbon/xenomorph/xeno) - if (xeno.mob_size < MOB_SIZE_BIG) - return - - if(!do_after(xeno, 100, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) - return + if(get_turf(xeno) == locate(x, y-1, z) && xeno.a_intent != INTENT_HARM && xeno.mob_size < MOB_SIZE_BIG) + if(!do_after(xeno, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) + return + + var/turf/actual_turf = locate(x, y+1, z) + xeno.forceMove(actual_turf) + xeno.client.change_view(xeno.client.view + 2) + var/atom/movable/screen/plane_master/roof/roof_plane = xeno.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = INVISIBILITY_MAXIMUM + else if(get_turf(xeno) == locate(x, y+1, z) && xeno.a_intent != INTENT_HARM && xeno.mob_size < MOB_SIZE_BIG) + if(!do_after(xeno, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) + return - qdel(src) + var/turf/actual_turf = locate(x, y-1, z) + xeno.forceMove(actual_turf) + xeno.client.change_view(xeno.client.view - 2) + var/atom/movable/screen/plane_master/roof/roof_plane = xeno.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = 0 + else + xeno.animation_attack_on(src) + playsound(src, "alien_claw_metal", 25, TRUE) + update_health(rand(xeno.melee_damage_lower, xeno.melee_damage_upper)) + return XENO_ATTACK_ACTION // For Mappers /obj/structure/watchtower/stage1 From 7cc81f96805ad13968769a0f2eb80e6588d13fec Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:49:45 +0200 Subject: [PATCH 19/29] rerun checks --- code/modules/watchtower/watchtower.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 4e70f5c11606..8fe3128af22f 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -224,6 +224,7 @@ . = ..() var/dam = health / max_health + if(dam <= 0.3) . += SPAN_WARNING("It looks slightly damaged.") else if(dam <= 0.6) From 86cf7406a918b4976edb26061a2698d0ca76b376 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Mon, 9 Dec 2024 20:36:29 +0200 Subject: [PATCH 20/29] code review ty kivts --- .../signals/atom/mob/living/signals_xeno.dm | 4 ++ code/modules/cm_aliens/structures/tunnel.dm | 3 + code/modules/watchtower/watchtower.dm | 60 +++++++++++-------- 3 files changed, 42 insertions(+), 25 deletions(-) diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm index 4e044735793c..534ac101986b 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm @@ -95,3 +95,7 @@ /// From /mob/living/carbon/xenomorph/proc/do_evolve() #define COMSIG_XENO_EVOLVE_TO_NEW_CASTE "xeno_evolve_to_new_caste" + +/// From /obj/structure/tunnel/attack_alien() : (mob/living/carbon/xenomorph/xeno) +#define COMSIG_XENO_ENTER_TUNNEL "xeno_enter_tunnel" + #define COMPONENT_CANCEL_TUNNEL (1<<0) diff --git a/code/modules/cm_aliens/structures/tunnel.dm b/code/modules/cm_aliens/structures/tunnel.dm index c7c25bd7ff0e..8e75c491ca2e 100644 --- a/code/modules/cm_aliens/structures/tunnel.dm +++ b/code/modules/cm_aliens/structures/tunnel.dm @@ -211,6 +211,9 @@ . = attack_alien(M) /obj/structure/tunnel/attack_alien(mob/living/carbon/xenomorph/M) + if(SEND_SIGNAL(M, COMSIG_XENO_ENTER_TUNNEL) & COMPONENT_CANCEL_TUNNEL) + return XENO_NO_DELAY_ACTION + if(!istype(M) || M.is_mob_incapacitated(TRUE)) return XENO_NO_DELAY_ACTION diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 8fe3128af22f..607a120a643d 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -33,13 +33,8 @@ for(var/turf/current_turf in top_turfs) for(var/mob/falling_mob in current_turf.contents) - if(falling_mob.client) - falling_mob.client.change_view(falling_mob.client.view - 2) - var/atom/movable/screen/plane_master/roof/roof_plane = falling_mob.hud_used.plane_masters["[ROOF_PLANE]"] - roof_plane?.invisibility = 0 falling_mob.ex_act(100, 0) - UnregisterSignal(falling_mob, COMSIG_ITEM_PICKUP) - UnregisterSignal(falling_mob, COMSIG_MOVABLE_PRE_MOVE) + on_leave(falling_mob) new /obj/structure/girder(get_turf(src)) new /obj/structure/girder/broken(locate(x+1, y, z)) @@ -238,27 +233,46 @@ if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return + on_enter(user) var/turf/actual_turf = locate(x, y+1, z) - ADD_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") user.forceMove(actual_turf) - user.client.change_view(user.client.view + 2) - var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] - roof_plane?.invisibility = INVISIBILITY_MAXIMUM - add_trait_to_all_guns(user) - RegisterSignal(user, COMSIG_ITEM_PICKUP, PROC_REF(item_picked_up)) - RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_can_move)) + else if(get_turf(user) == locate(x, y+1, z)) if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - REMOVE_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") var/turf/actual_turf = locate(x, y-1, z) user.forceMove(actual_turf) - user.client.change_view(user.client.view - 2) - var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] - roof_plane?.invisibility = 0 - UnregisterSignal(user, COMSIG_ITEM_PICKUP) - UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) + on_leave(user) + +/obj/structure/watchtower/proc/on_enter(mob/user) + ADD_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") + if(user.client) + user.client.change_view(user.client.view + 2) + var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = INVISIBILITY_MAXIMUM + add_trait_to_all_guns(user) + RegisterSignal(user, COMSIG_ITEM_PICKUP, PROC_REF(item_picked_up)) + RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_can_move)) + + if(isxeno(user)) + RegisterSignal(user, COMSIG_XENO_ENTER_TUNNEL, PROC_REF(on_tunnel)) + +/obj/structure/watchtower/proc/on_tunnel() + SIGNAL_HANDLER + return COMPONENT_CANCEL_TUNNEL + +/obj/structure/watchtower/proc/on_leave(mob/user) + REMOVE_TRAIT(user, TRAIT_ON_WATCHTOWER, "watchtower") + if(user.client) + user.client.change_view(max(user.client.view - 2, 7)) + var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] + roof_plane?.invisibility = 0 + UnregisterSignal(user, COMSIG_ITEM_PICKUP) + UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) + + if(isxeno(user)) + UnregisterSignal(COMSIG_XENO_ENTER_TUNNEL) /obj/structure/watchtower/proc/add_trait_to_all_guns(mob/user) for(var/obj/item/weapon/gun/gun in user) @@ -296,18 +310,14 @@ var/turf/actual_turf = locate(x, y+1, z) xeno.forceMove(actual_turf) - xeno.client.change_view(xeno.client.view + 2) - var/atom/movable/screen/plane_master/roof/roof_plane = xeno.hud_used.plane_masters["[ROOF_PLANE]"] - roof_plane?.invisibility = INVISIBILITY_MAXIMUM + on_enter(xeno) else if(get_turf(xeno) == locate(x, y+1, z) && xeno.a_intent != INTENT_HARM && xeno.mob_size < MOB_SIZE_BIG) if(!do_after(xeno, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) return var/turf/actual_turf = locate(x, y-1, z) xeno.forceMove(actual_turf) - xeno.client.change_view(xeno.client.view - 2) - var/atom/movable/screen/plane_master/roof/roof_plane = xeno.hud_used.plane_masters["[ROOF_PLANE]"] - roof_plane?.invisibility = 0 + on_leave(xeno) else xeno.animation_attack_on(src) playsound(src, "alien_claw_metal", 25, TRUE) From bc3b88fd99691a8460fe17fb441d672a98c61c7a Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 00:09:38 +0200 Subject: [PATCH 21/29] review2 --- .../elements/bullet_trait/direct_only.dm | 14 +-- code/modules/watchtower/watchtower.dm | 105 ++++++++++-------- 2 files changed, 63 insertions(+), 56 deletions(-) diff --git a/code/datums/elements/bullet_trait/direct_only.dm b/code/datums/elements/bullet_trait/direct_only.dm index 8e79d6d3cdef..b640966cffe2 100644 --- a/code/datums/elements/bullet_trait/direct_only.dm +++ b/code/datums/elements/bullet_trait/direct_only.dm @@ -17,19 +17,17 @@ return ..() -/datum/element/bullet_trait_direct_only/proc/check_distance(obj/projectile/P, mob/living/carbon/human/projectile_target) +/datum/element/bullet_trait_direct_only/proc/check_distance(obj/projectile/projectile, mob/living/carbon/human/projectile_target) SIGNAL_HANDLER - if(P.original != projectile_target) + if(projectile.original != projectile_target) return COMPONENT_SKIP_MOB -/datum/element/bullet_trait_direct_only/watchtower - -/datum/element/bullet_trait_direct_only/watchtower/check_distance(obj/projectile/P, mob/living/carbon/human/projectile_target) - if(!HAS_TRAIT(P.firer, TRAIT_ON_WATCHTOWER)) - if(!istype(P.firer, /mob)) +/datum/element/bullet_trait_direct_only/watchtower/check_distance(obj/projectile/projectile, mob/living/carbon/human/projectile_target) + if(!HAS_TRAIT(projectile.firer, TRAIT_ON_WATCHTOWER)) + if(!istype(projectile.firer, /mob)) return - var/mob/firer = P.firer + var/mob/firer = projectile.firer var/obj/item/weapon/gun/gun = firer.get_inactive_hand() if(istype(gun)) gun.remove_bullet_traits(list("watchtower_arc")) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 607a120a643d..8b4e870cd4f2 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -1,3 +1,12 @@ +#define WATCHTOWER_STAGE_WELDED 1 +#define WATCHTOWER_STAGE_COLUMNS 2 +#define WATCHTOWER_STAGE_HEIGHTNED_WELDER 2.5 +#define WATCHTOWER_STAGE_HEIGHTNED_WRENCH 3 +#define WATCHTOWER_STAGE_FLOOR 4 +#define WATCHTOWER_STAGE_BARRICADED 5 +#define WATCHTOWER_STAGE_ROOF_SUPPORT 6 +#define WATCHTOWER_STAGE_COMPLETE 7 + /obj/structure/watchtower name = "watchtower" icon = 'icons/obj/structures/watchtower.dmi' @@ -50,67 +59,67 @@ overlays.Cut() - if(stage >= 5) + if(stage >= WATCHTOWER_STAGE_BARRICADED) overlays += image(icon=icon, icon_state="railings", layer=ABOVE_MOB_LAYER, pixel_y=25) - if (stage == 7) + if (stage == WATCHTOWER_STAGE_COMPLETE) roof_image = image(icon=icon, icon_state="roof", layer=ABOVE_MOB_LAYER, pixel_y=51) roof_image.plane = ROOF_PLANE roof_image.appearance_flags = KEEP_APART overlays += roof_image -/obj/structure/watchtower/attackby(obj/item/W, mob/user) - if(istool(W) && !skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_ENGI)) +/obj/structure/watchtower/attackby(obj/item/item, mob/user) + if(istool(item) && !skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_ENGI)) to_chat(user, SPAN_WARNING("You are not trained to configure [src]...")) return TRUE switch(stage) - if(1) - if(!istype(W, /obj/item/stack/rods)) + if(WATCHTOWER_STAGE_WELDED) + if(!istype(item, /obj/item/stack/rods)) return - var/obj/item/stack/rods/rods = W + var/obj/item/stack/rods/rods = item - if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) + if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) return if(rods.use(60)) to_chat(user, SPAN_NOTICE("You add connection rods to the watchtower.")) - stage = 2 + stage = WATCHTOWER_STAGE_COLUMNS update_icon() else to_chat(user, SPAN_NOTICE("You failed to construct the connection rods. You need more rods.")) return - if(2) - if(!iswelder(W)) + if(WATCHTOWER_STAGE_COLUMNS) + if(!iswelder(item)) return - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + if(!HAS_TRAIT(item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return to_chat(user, SPAN_NOTICE("You weld the connection rods to the frame.")) - stage = 2.5 + stage = WATCHTOWER_STAGE_HEIGHTNED_WELDER return - if(2.5) - if(!HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + if(WATCHTOWER_STAGE_HEIGHTNED_WELDER) + if(!HAS_TRAIT(item, TRAIT_TOOL_WRENCH)) return - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return to_chat(user, SPAN_NOTICE("You elevate the the frame and screw it up top.")) - stage = 3 + stage = WATCHTOWER_STAGE_HEIGHTNED_WRENCH update_icon() return - if(3) - if(!HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + if(WATCHTOWER_STAGE_HEIGHTNED_WRENCH) + if(!HAS_TRAIT(item, TRAIT_TOOL_SCREWDRIVER)) return var/obj/item/stack/sheet/metal/metal = user.get_inactive_hand() @@ -118,19 +127,19 @@ to_chat(user, SPAN_BOLDWARNING("You need metal sheets in your offhand to continue construction of the watchtower.")) return FALSE - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return if(metal.use(50)) to_chat(user, SPAN_NOTICE("You construct the watchtower platform.")) - stage = 4 + stage = WATCHTOWER_STAGE_FLOOR update_icon() else to_chat(user, SPAN_NOTICE("You failed to construct the watchtower platform, you need more metal sheets in your offhand.")) return - if(4) - if(!HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) + if(WATCHTOWER_STAGE_FLOOR) + if(!HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) return var/obj/item/stack/sheet/plasteel/plasteel = user.get_inactive_hand() @@ -138,19 +147,19 @@ to_chat(user, SPAN_BOLDWARNING("You need plasteel sheets in your offhand to continue construction of the watchtower.")) return FALSE - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return if(plasteel.use(25)) to_chat(user, SPAN_NOTICE("You construct the watchtower railing.")) - stage = 5 + stage = WATCHTOWER_STAGE_BARRICADED update_icon() else to_chat(user, SPAN_NOTICE("You failed to construct the watchtower railing, you need more plasteel sheets in your offhand.")) return - if(5) - if (!HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + if(WATCHTOWER_STAGE_BARRICADED) + if (!HAS_TRAIT(item, TRAIT_TOOL_WRENCH)) return var/obj/item/stack/rods/rods = user.get_inactive_hand() @@ -158,22 +167,22 @@ to_chat(user, SPAN_BOLDWARNING("You need metal rods in your offhand to continue construction of the watchtower.")) return FALSE - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return if(rods.use(60)) to_chat(user, SPAN_NOTICE("You construct the watchtower support rods.")) - stage = 6 + stage = WATCHTOWER_STAGE_ROOF_SUPPORT update_icon() else to_chat(user, SPAN_NOTICE("You failed to construct the watchtower support rods, you need more metal rods in your offhand.")) return - if(6) - if (!iswelder(W)) + if(WATCHTOWER_STAGE_ROOF_SUPPORT) + if (!iswelder(item)) return - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + if(!HAS_TRAIT(item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return @@ -182,22 +191,22 @@ to_chat(user, SPAN_BOLDWARNING("You need plasteel sheets in your offhand to continue construction of the watchtower.")) return FALSE - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return if(plasteel.use(25)) to_chat(user, SPAN_NOTICE("You complete the watchtower.")) - stage = 7 + stage = WATCHTOWER_STAGE_COMPLETE update_icon() else to_chat(user, SPAN_NOTICE("You failed to complete the watchtower, you need more plasteel sheets in your offhand.")) return - if(7) - if (!iswelder(W)) + if(WATCHTOWER_STAGE_COMPLETE) + if (!iswelder(item)) return - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + if(!HAS_TRAIT(item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return @@ -206,7 +215,7 @@ to_chat(user, SPAN_BOLDWARNING("You need metal sheets in your offhand to patch the watchtower.")) return FALSE - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return if(metal.use(5)) @@ -230,7 +239,7 @@ /obj/structure/watchtower/attack_hand(mob/user) if(get_turf(user) == locate(x, y-1, z)) - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return on_enter(user) @@ -238,7 +247,7 @@ user.forceMove(actual_turf) else if(get_turf(user) == locate(x, y+1, z)) - if(!do_after(user,30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return var/turf/actual_turf = locate(x, y-1, z) @@ -326,23 +335,23 @@ // For Mappers /obj/structure/watchtower/stage1 - stage = 1 + stage = WATCHTOWER_STAGE_WELDED icon_state = "stage1" /obj/structure/watchtower/stage2 - stage = 2 + stage = WATCHTOWER_STAGE_COLUMNS icon_state = "stage2" /obj/structure/watchtower/stage3 - stage = 3 + stage = WATCHTOWER_STAGE_HEIGHTNED_WRENCH icon_state = "stage3" /obj/structure/watchtower/stage4 - stage = 4 + stage = WATCHTOWER_STAGE_FLOOR icon_state = "stage4" /obj/structure/watchtower/stage5 - stage = 5 + stage = WATCHTOWER_STAGE_BARRICADED icon_state = "stage5" /obj/structure/watchtower/stage6 - stage = 6 + stage = WATCHTOWER_STAGE_ROOF_SUPPORT icon_state = "stage6" /obj/structure/watchtower/complete - stage = 7 + stage = WATCHTOWER_STAGE_COMPLETE icon_state = "stage7" From bf0ed7913ac2c74e983bb1085f613fc68c90693e Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:50:08 +0200 Subject: [PATCH 22/29] some fixes --- code/modules/watchtower/watchtower.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 8b4e870cd4f2..b7ae6c22f946 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -230,14 +230,17 @@ var/dam = health / max_health if(dam <= 0.3) - . += SPAN_WARNING("It looks slightly damaged.") + . += SPAN_WARNING("It looks heavily damaged.") else if(dam <= 0.6) . += SPAN_WARNING("It looks moderately damaged.") - else - . += SPAN_DANGER("It looks heavily damaged.") + else if (damage < 1) + . += SPAN_DANGER("It looks slightly damaged.") /obj/structure/watchtower/attack_hand(mob/user) + if (stage < WATCHTOWER_STAGE_COMPLETE) + return + if(get_turf(user) == locate(x, y-1, z)) if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return @@ -313,14 +316,14 @@ return /obj/structure/watchtower/attack_alien(mob/living/carbon/xenomorph/xeno) - if(get_turf(xeno) == locate(x, y-1, z) && xeno.a_intent != INTENT_HARM && xeno.mob_size < MOB_SIZE_BIG) + if(get_turf(xeno) == locate(x, y-1, z) && xeno.a_intent != INTENT_HARM && xeno.mob_size < MOB_SIZE_BIG && stage >= WATCHTOWER_STAGE_COMPLETE) if(!do_after(xeno, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) return var/turf/actual_turf = locate(x, y+1, z) xeno.forceMove(actual_turf) on_enter(xeno) - else if(get_turf(xeno) == locate(x, y+1, z) && xeno.a_intent != INTENT_HARM && xeno.mob_size < MOB_SIZE_BIG) + else if(get_turf(xeno) == locate(x, y+1, z) && xeno.a_intent != INTENT_HARM && xeno.mob_size < MOB_SIZE_BIG && stage >= WATCHTOWER_STAGE_COMPLETE) if(!do_after(xeno, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) return From 848bb506fe078a3003bffa1df5413ccdb0235886 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:51:47 +0200 Subject: [PATCH 23/29] and a few more --- code/datums/elements/bullet_trait/direct_only.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/datums/elements/bullet_trait/direct_only.dm b/code/datums/elements/bullet_trait/direct_only.dm index b640966cffe2..4a4ecd87e161 100644 --- a/code/datums/elements/bullet_trait/direct_only.dm +++ b/code/datums/elements/bullet_trait/direct_only.dm @@ -24,6 +24,8 @@ return COMPONENT_SKIP_MOB /datum/element/bullet_trait_direct_only/watchtower/check_distance(obj/projectile/projectile, mob/living/carbon/human/projectile_target) + SIGNAL_HANDLER + if(!HAS_TRAIT(projectile.firer, TRAIT_ON_WATCHTOWER)) if(!istype(projectile.firer, /mob)) return @@ -37,4 +39,7 @@ gun.remove_bullet_traits(list("watchtower_arc")) return + if(HAS_TRAIT(projectile_target, TRAIT_ON_WATCHTOWER)) + return + return ..() From f9b80bd7429dbfd28797377015ffc29e655ea3c6 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:55:24 +0200 Subject: [PATCH 24/29] fixes binocs and linter --- code/modules/watchtower/watchtower.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index b7ae6c22f946..4ff8c6af2af3 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -233,7 +233,7 @@ . += SPAN_WARNING("It looks heavily damaged.") else if(dam <= 0.6) . += SPAN_WARNING("It looks moderately damaged.") - else if (damage < 1) + else if (dam < 1) . += SPAN_DANGER("It looks slightly damaged.") @@ -266,10 +266,16 @@ add_trait_to_all_guns(user) RegisterSignal(user, COMSIG_ITEM_PICKUP, PROC_REF(item_picked_up)) RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_can_move)) + RegisterSignal(user, COMSIG_LIVING_ZOOM_OUT, PROC_REF(on_unzoom)) if(isxeno(user)) RegisterSignal(user, COMSIG_XENO_ENTER_TUNNEL, PROC_REF(on_tunnel)) +/obj/structure/watchtower/proc/on_unzoom(mob/user) + SIGNAL_HANDLER + if(user.client) + user.client.change_view(user.client.view + 2) + /obj/structure/watchtower/proc/on_tunnel() SIGNAL_HANDLER return COMPONENT_CANCEL_TUNNEL From 814050076dc4108e64c4ef2dcb5ab210113159dd Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:56:21 +0200 Subject: [PATCH 25/29] remember to unregister signals --- code/modules/watchtower/watchtower.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 4ff8c6af2af3..27d9dd79e767 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -288,6 +288,7 @@ roof_plane?.invisibility = 0 UnregisterSignal(user, COMSIG_ITEM_PICKUP) UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(user, COMSIG_LIVING_ZOOM_OUT) if(isxeno(user)) UnregisterSignal(COMSIG_XENO_ENTER_TUNNEL) From 58836390ab908366e9ff63ef09f589730a7aa758 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 15:03:40 +0200 Subject: [PATCH 26/29] fixes binoculars --- code/game/objects/items.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4653ad913e33..80f3d714706f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -861,8 +861,6 @@ SPAN_NOTICE("You look up from [zoom_device].")) zoom = !zoom COOLDOWN_START(user, zoom_cooldown, 20) - SEND_SIGNAL(user, COMSIG_LIVING_ZOOM_OUT, src) - SEND_SIGNAL(src, COMSIG_ITEM_UNZOOM, user) UnregisterSignal(src, list( COMSIG_ITEM_DROPPED, COMSIG_ITEM_UNWIELD, @@ -875,6 +873,9 @@ user.client.pixel_x = 0 user.client.pixel_y = 0 + SEND_SIGNAL(user, COMSIG_LIVING_ZOOM_OUT, src) + SEND_SIGNAL(src, COMSIG_ITEM_UNZOOM, user) + /obj/item/proc/zoom_handle_mob_move_or_look(mob/living/mover, actually_moving, direction, specific_direction) SIGNAL_HANDLER From c49bf020485c78fe7eae5d0f0375a1dd9fb60ab7 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 15:04:34 +0200 Subject: [PATCH 27/29] linter moment --- code/datums/elements/bullet_trait/direct_only.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/datums/elements/bullet_trait/direct_only.dm b/code/datums/elements/bullet_trait/direct_only.dm index 4a4ecd87e161..0e3a609d5ecb 100644 --- a/code/datums/elements/bullet_trait/direct_only.dm +++ b/code/datums/elements/bullet_trait/direct_only.dm @@ -23,9 +23,7 @@ if(projectile.original != projectile_target) return COMPONENT_SKIP_MOB -/datum/element/bullet_trait_direct_only/watchtower/check_distance(obj/projectile/projectile, mob/living/carbon/human/projectile_target) - SIGNAL_HANDLER - +/datum/element/bullet_trait_direct_only/watchtower/check_distance(obj/projectile/projectile, mob/living/carbon/human/projectile_target) if(!HAS_TRAIT(projectile.firer, TRAIT_ON_WATCHTOWER)) if(!istype(projectile.firer, /mob)) return From 127fe8c42e611562a458ad8cf2e636830b27ba04 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 15:15:50 +0200 Subject: [PATCH 28/29] fixes layering issues --- code/modules/watchtower/watchtower.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index 27d9dd79e767..c22c471bad5c 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -16,6 +16,7 @@ bound_width = 64 bound_height = 96 health = 1000 + layer = ABOVE_TURF_LAYER var/max_health = 1000 var/stage = 1 From 770a00ff315eeb80185ae79b00494f5c9af98d1e Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Tue, 10 Dec 2024 15:42:29 +0200 Subject: [PATCH 29/29] More changes and fixes --- code/modules/watchtower/watchtower.dm | 44 ++++++++++++++++----------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/code/modules/watchtower/watchtower.dm b/code/modules/watchtower/watchtower.dm index c22c471bad5c..ba387ed12d09 100644 --- a/code/modules/watchtower/watchtower.dm +++ b/code/modules/watchtower/watchtower.dm @@ -214,7 +214,11 @@ var/obj/item/stack/sheet/metal/metal = user.get_inactive_hand() if(!istype(metal)) to_chat(user, SPAN_BOLDWARNING("You need metal sheets in your offhand to patch the watchtower.")) - return FALSE + return + + if(health >= max_health) + to_chat(user, SPAN_NOTICE("The watchtower is in good condition.")) + return if(!do_after(user, 4 SECONDS * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return @@ -243,18 +247,39 @@ return if(get_turf(user) == locate(x, y-1, z)) + var/people_on_watchtower = 0 + + for(var/turf/current_turf in CORNER_BLOCK_OFFSET(src, 2, 1, 0, 1)) + for(var/mob/mob in current_turf.contents) + if(mob.stat != DEAD) + people_on_watchtower++ + + if(people_on_watchtower >= 2) + to_chat(user, SPAN_NOTICE("The watchtower is too crowded!")) + return + if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - on_enter(user) + var/turf/actual_turf = locate(x, y+1, z) + if(people_on_watchtower < 1 && user.pulling) + user.pulling.forceMove(actual_turf) + on_enter(user.pulling) + user.forceMove(actual_turf) + on_enter(user) + else if(get_turf(user) == locate(x, y+1, z)) if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return var/turf/actual_turf = locate(x, y-1, z) + if(user.pulling) + user.pulling.forceMove(actual_turf) + on_leave(user.pulling) + user.forceMove(actual_turf) on_leave(user) @@ -266,7 +291,6 @@ roof_plane?.invisibility = INVISIBILITY_MAXIMUM add_trait_to_all_guns(user) RegisterSignal(user, COMSIG_ITEM_PICKUP, PROC_REF(item_picked_up)) - RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_can_move)) RegisterSignal(user, COMSIG_LIVING_ZOOM_OUT, PROC_REF(on_unzoom)) if(isxeno(user)) @@ -288,7 +312,6 @@ var/atom/movable/screen/plane_master/roof/roof_plane = user.hud_used.plane_masters["[ROOF_PLANE]"] roof_plane?.invisibility = 0 UnregisterSignal(user, COMSIG_ITEM_PICKUP) - UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) UnregisterSignal(user, COMSIG_LIVING_ZOOM_OUT) if(isxeno(user)) @@ -310,19 +333,6 @@ var/obj/item/weapon/gun/gun = picked_up_item gun.add_bullet_traits(list(BULLET_TRAIT_ENTRY_ID("watchtower_arc", /datum/element/bullet_trait_direct_only/watchtower))) -/obj/structure/watchtower/proc/check_can_move(mob/mover, turf/new_loc) - SIGNAL_HANDLER - var/found = FALSE - for(var/turf/current_turf in CORNER_BLOCK_OFFSET(get_turf(src), 2, 1, 0, 1)) - if (current_turf.x == new_loc.x && current_turf.y == new_loc.y && current_turf.z == new_loc.z) - found = TRUE - break - - if(!found) - return COMPONENT_CANCEL_MOVE - - return - /obj/structure/watchtower/attack_alien(mob/living/carbon/xenomorph/xeno) if(get_turf(xeno) == locate(x, y-1, z) && xeno.a_intent != INTENT_HARM && xeno.mob_size < MOB_SIZE_BIG && stage >= WATCHTOWER_STAGE_COMPLETE) if(!do_after(xeno, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE))