From 2dd35bc894582ae9b5d61d3e118c1e706fb9ed9e Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 8 Aug 2018 10:39:25 -0700 Subject: [PATCH 01/15] Fixes --- code/game/machinery/computer/depot.dm | 10 +++++++++- .../crates_lockers/closets/secure/depot.dm | 16 ++++++++++++---- code/modules/events/grid_check.dm | 8 ++++---- .../living/simple_animal/hostile/syndicate.dm | 8 ++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 6bd5eadc822..9509db6a9e6 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -138,6 +138,7 @@ if(depotarea) depotarea.toggle_door_locks(src) to_chat(user, "Door locks toggled.") + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/doors/secondary(mob/user, subcommand) if(..()) @@ -145,6 +146,7 @@ if(depotarea) depotarea.toggle_falsewalls(src) to_chat(user, "False walls toggled.") + playsound(user, sound_yes, 50, 0) // Engineering AKA self destruct computer, no useful functions, just a trap for the people who can't resist pushing dangerous-sounding buttons. @@ -285,6 +287,7 @@ to_chat(user, "[src] requires authentication with syndicate codewords, which you do not know.") raise_alert("Detected unauthorized access by [user] to [src]!") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/syndiecomms/secondary(mob/user, subcommand) if(..()) @@ -319,6 +322,7 @@ else to_chat(user, "ERROR: [src] is unable to uplink to depot network.") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/syndiecomms/proc/grant_syndie_faction(mob/user) user.faction += "syndicate" @@ -432,6 +436,7 @@ var/bresult = mybeacon.toggle() to_chat(user, "Syndicate Teleporter Beacon: [bresult ? "ON" : "OFF"]") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/teleporter/secondary(mob/user) if(..()) @@ -444,6 +449,7 @@ toggle_portal() to_chat(user, "Outgoing Teleport Portal: [portal_enabled ? "ON" : "OFF"]") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/teleporter/proc/toggle_portal() portal_enabled = !portal_enabled @@ -507,6 +513,7 @@ if(depotarea) depotarea.reset_alert() to_chat(user, "Alert level reset.") + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/aiterminal/secondary(mob/user) if(..()) @@ -516,4 +523,5 @@ new /obj/effect/portal(get_turf(B)) to_chat(user, "[B] has been recalled.") qdel(B) - raise_alert("Sentry bot removed via emergency recall.") \ No newline at end of file + raise_alert("Sentry bot removed via emergency recall.") + playsound(user, sound_yes, 50, 0) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm index 1d52dbcdf1b..f3cf8d67c13 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm @@ -6,6 +6,7 @@ anchored = 1 health = 200 req_access = list() + var/ignore_use = FALSE /obj/structure/closet/secure_closet/syndicate/depot/New() @@ -26,9 +27,10 @@ . = ..() /obj/structure/closet/secure_closet/syndicate/depot/proc/loot_pickup() - var/area/syndicate_depot/core/depotarea = areaMaster - if(depotarea) - depotarea.locker_looted() + if(!ignore_use) + var/area/syndicate_depot/core/depotarea = areaMaster + if(depotarea) + depotarea.locker_looted() /obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M) if(isanimal(M) && "syndicate" in M.faction) @@ -42,4 +44,10 @@ /obj/structure/closet/secure_closet/syndicate/depot/togglelock(mob/user) . = ..() if(!locked) - loot_pickup() \ No newline at end of file + loot_pickup() + +/obj/structure/closet/secure_closet/syndicate/depot/attack_ghost(mob/user) + if(user.can_advanced_admin_interact()) + ignore_use = TRUE + toggle(user) + ignore_use = FALSE \ No newline at end of file diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 9ca4e878050..fab719946d7 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -17,8 +17,8 @@ if(announce) event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg') - var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot) - var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot) + var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot/core, /area/syndicate_depot/outer) + var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot/core, /area/syndicate_depot/outer) for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) @@ -41,8 +41,8 @@ C.cell.charge = 0 /proc/power_restore(var/announce = 1) - var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot) - var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot) + var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot/core, /area/syndicate_depot/outer) + var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot/core, /area/syndicate_depot/outer) if(announce) event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 894c039b3f4..9d728977556 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -134,6 +134,14 @@ if(scan_cycles >= 15 && istype(depotarea)) scan_cycles = 0 if(!atoms_share_level(src, spawn_turf)) + if(istype(loc, /obj/structure/closet)) + var/obj/structure/closet/O = loc + forceMove(get_turf(src)) + visible_message("[src] smashes their way out of [O]!") + qdel(O) + raise_alert("[src] reported being trapped in a locker.") + raised_alert = FALSE + return if(alert_on_spacing) raise_alert("[src] lost in space.") death() From 6c4def96f40eab24b5b5a424bab119f3e34d52d4 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 8 Aug 2018 11:29:39 -0700 Subject: [PATCH 02/15] root cause: || binds too tightly --- code/modules/events/grid_check.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index fab719946d7..c0b16ab43a6 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -17,12 +17,12 @@ if(announce) event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg') - var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot/core, /area/syndicate_depot/outer) - var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot/core, /area/syndicate_depot/outer) + var/list/skipped_areas = list(/area/turret_protected/ai) + var/list/skipped_areas_apc = list(/area/engine/engineering) for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) - if(current_area.type in skipped_areas || !is_station_level(S.z)) + if((current_area.type in skipped_areas) || !is_station_level(S.z)) continue S.last_charge = S.charge S.last_output_attempt = S.output_attempt @@ -35,26 +35,26 @@ for(var/obj/machinery/power/apc/C in apcs) var/area/current_area = get_area(C) - if(current_area.type in skipped_areas_apc || !is_station_level(C.z)) + if((current_area.type in skipped_areas_apc) || !is_station_level(C.z)) continue if(C.cell) C.cell.charge = 0 /proc/power_restore(var/announce = 1) - var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot/core, /area/syndicate_depot/outer) - var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot/core, /area/syndicate_depot/outer) + var/list/skipped_areas = list(/area/turret_protected/ai) + var/list/skipped_areas_apc = list(/area/engine/engineering) if(announce) event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') for(var/obj/machinery/power/apc/C in apcs) var/area/current_area = get_area(C) - if(current_area.type in skipped_areas_apc || !is_station_level(C.z)) + if((current_area.type in skipped_areas_apc) || !is_station_level(C.z)) continue if(C.cell) C.cell.charge = C.cell.maxcharge for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) - if(current_area.type in skipped_areas || !is_station_level(S.z)) + if((current_area.type in skipped_areas) || !is_station_level(S.z)) continue S.charge = S.last_charge S.output_attempt = S.last_output_attempt From 5ba99b8f063a744be113c54c8cb5c0f0e8c41599 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 8 Aug 2018 11:41:49 -0700 Subject: [PATCH 03/15] Mines no longer invincible. --- code/game/machinery/computer/depot.dm | 2 +- code/game/objects/effects/mines.dm | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 9509db6a9e6..32e78f239db 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -169,9 +169,9 @@ if(depotarea.used_self_destruct) playsound(user, sound_no, 50, 0) return - playsound(user, sound_click, 20, 1) if(depotarea) depotarea.activate_self_destruct("Fusion reactor containment field disengaged. All hands, evacuate. All hands, evacuate!", TRUE, user) + playsound(user, sound_click, 20, 1) // Shield computer, used to manipulate base shield, and armory shield diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 18506a5c882..bec27b9bc47 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -34,6 +34,11 @@ triggered = 1 qdel(src) +/obj/effect/mine/ex_act(severity) + // Necessary because, as effects, they have infinite health, and wouldn't be destroyed otherwise. + // Also, they're pressure-sensitive mines, it makes sense that an explosion (wave of pressure) triggers/destroys them. + qdel(src) + /obj/effect/mine/explosive name = "explosive mine" var/range_devastation = 0 From 0fc53de09ccadf7476bfbe37d70375a31b9c1682 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 8 Aug 2018 14:55:52 -0700 Subject: [PATCH 04/15] fixes reactor sometimes not overloading, also an armory bypass --- code/game/area/depot-areas.dm | 4 +++- code/game/objects/structures/depot.dm | 18 ++++++++++++++---- .../living/simple_animal/hostile/syndicate.dm | 7 +++++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/code/game/area/depot-areas.dm b/code/game/area/depot-areas.dm index 9de680da82e..4505b94375f 100644 --- a/code/game/area/depot-areas.dm +++ b/code/game/area/depot-areas.dm @@ -257,8 +257,10 @@ else log_game("Depot self destruct activated.") if(reactor) - reactor.overload(containment_failure) + if(!reactor.has_overloaded) + reactor.overload(containment_failure) else + log_debug("Depot: [src] called activate_self_destruct with no reactor."); message_admins("Syndicate Depot lacks reactor to initiate self-destruct. Must be destroyed manually.") updateicon() diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm index 9dfe256ce38..0d048467c3a 100644 --- a/code/game/objects/structures/depot.dm +++ b/code/game/objects/structures/depot.dm @@ -7,6 +7,7 @@ anchored = 1 max_integrity = 50 var/area/syndicate_depot/core/depotarea + var/has_overloaded = FALSE /obj/structure/fusionreactor/Initialize() . = ..() @@ -15,7 +16,9 @@ depotarea.reactor = src /obj/structure/fusionreactor/Destroy() - if(depotarea) + if(istype(depotarea)) + if(!has_overloaded) + overload(TRUE, TRUE) depotarea.reactor = null ..() @@ -30,7 +33,7 @@ healthcheck() /obj/structure/fusionreactor/proc/healthcheck() - if(obj_integrity <= 0) + if(obj_integrity <= 0 && istype(depotarea)) overload(TRUE) /obj/structure/fusionreactor/attackby(obj/item/I, mob/user, params) @@ -47,13 +50,20 @@ else return ..() -/obj/structure/fusionreactor/proc/overload(containment_failure) +/obj/structure/fusionreactor/proc/overload(containment_failure = FALSE, skip_qdel = FALSE) + if(has_overloaded) + return + has_overloaded = TRUE + if(istype(depotarea) && !depotarea.used_self_destruct) + depotarea.activate_self_destruct("Fusion reactor cracked open. Core loose!", TRUE) var/obj/effect/overload/O = new /obj/effect/overload(get_turf(src)) if(containment_failure) playsound(loc, 'sound/machines/Alarm.ogg', 100, 0, 0) O.deliberate = TRUE O.max_cycles = 6 - qdel(src) + if(!skip_qdel) + qdel(src) + /obj/effect/overload icon = 'icons/obj/tesla_engine/energy_ball.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 9d728977556..4f55094c3f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -205,8 +205,11 @@ alert_on_shield_breach = TRUE /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/death() - if(depotarea) - depotarea.declare_finished() + if(istype(depotarea)) + if(depotarea.shield_list.len) + depotarea.activate_self_destruct("[src] has died while the armory shield is up.", FALSE) + else + depotarea.declare_finished() return ..() From 27473c3e3ecce19d0cf7a4538f28195a7312949b Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 8 Aug 2018 23:02:08 -0700 Subject: [PATCH 05/15] better fix for boss cheese --- code/game/area/depot-areas.dm | 66 ++++++++++++++----- .../effects/spawners/random_spawners.dm | 1 + .../crates_lockers/closets/secure/depot.dm | 11 +++- .../living/simple_animal/hostile/syndicate.dm | 9 --- 4 files changed, 60 insertions(+), 27 deletions(-) diff --git a/code/game/area/depot-areas.dm b/code/game/area/depot-areas.dm index 4505b94375f..af83e031858 100644 --- a/code/game/area/depot-areas.dm +++ b/code/game/area/depot-areas.dm @@ -57,11 +57,26 @@ /area/syndicate_depot/core/proc/reset_alert() if(used_self_destruct) - return + for(var/obj/effect/overload/O in src) + new /obj/structure/fusionreactor(O.loc) + qdel(O) + + if(on_peaceful) + peaceful_mode(FALSE, TRUE) local_alarm = FALSE called_backup = FALSE + unlock_computers() used_self_destruct = FALSE + + run_started = FALSE + run_finished = FALSE + + guard_list = list() + hostile_list = list() + dead_list = list() + peaceful_list = list() + something_looted = FALSE detected_mech = FALSE detected_pod = FALSE @@ -69,11 +84,6 @@ updateicon() despawn_guards() - guard_list = list() - hostile_list = list() - dead_list = list() - peaceful_list = list() - alert_log += "Alert level reset." /area/syndicate_depot/core/proc/increase_alert(reason) @@ -97,6 +107,13 @@ if(on_peaceful) increase_alert("Thieves!") +/area/syndicate_depot/core/proc/armory_locker_looted() + if(!run_finished && !used_self_destruct) + if(shield_list.len) + activate_self_destruct("Armory compromised despite armory shield being online.", FALSE) + return + declare_finished() + /area/syndicate_depot/core/proc/turret_died() something_looted = TRUE if(on_peaceful) @@ -133,19 +150,12 @@ if(L.opened) L.close() if(!L.locked) - L.locked = 1 + L.locked = !L.locked L.req_access = list(access_syndicate_leader) L.update_icon() for(var/obj/machinery/computer/syndicate_depot/teleporter/P in src) if(!P.portal_enabled) P.toggle_portal() - for(var/obj/machinery/door/airlock/hatch/syndicate/vault/V in src) - if(!V.density) - V.close() - V.emergency = 0 - if(!V.locked) - V.locked = !V.locked - V.update_icon() else log_game("Depot visit: ended") alert_log += "Visitor mode ended." @@ -250,7 +260,7 @@ if(user) var/turf/T = get_turf(user) var/area/A = get_area(T) - var/log_msg = "[key_name(user)] has armed the depot self destruct device at [A.name] ([T.x],[T.y],[T.z])" + var/log_msg = "[key_name(user)] has triggered the depot self destruct at [A.name] ([T.x],[T.y],[T.z])" message_admins(log_msg) log_game(log_msg) playsound(user, 'sound/machines/Alarm.ogg', 100, 0, 0) @@ -271,13 +281,17 @@ for(var/obj/machinery/door/airlock/A in src) spawn(0) A.close() - if(A.density) + if(A.density && !A.locked) A.lock() /area/syndicate_depot/core/proc/lockout_computers() for(var/obj/machinery/computer/syndicate_depot/C in src) C.activate_security_lockout() +/area/syndicate_depot/core/proc/unlock_computers() + for(var/obj/machinery/computer/syndicate_depot/C in src) + C.security_lockout = FALSE + /area/syndicate_depot/core/proc/toggle_door_locks() for(var/obj/machinery/door/airlock/A in src) A.emergency = !A.emergency @@ -315,6 +329,18 @@ if(L.name == "syndi_depot_shield") var/obj/machinery/shieldwall/syndicate/S = new /obj/machinery/shieldwall/syndicate(L.loc) shield_list += S.UID() + for(var/obj/structure/closet/secure_closet/syndicate/depot/armory/L in src) + if(L.opened) + L.close() + if(!L.locked) + L.locked = !L.locked + L.update_icon() + for(var/obj/machinery/door/airlock/hatch/syndicate/vault/V in src) + if(!V.density) + V.close() + if(!V.locked) + V.locked = !V.locked + V.update_icon() /area/syndicate_depot/core/proc/shields_key_check() if(!shield_list.len) @@ -329,6 +355,14 @@ if(S) qdel(S) shield_list = list() + for(var/obj/structure/closet/secure_closet/syndicate/depot/armory/L in src) + if(L.locked) + L.locked = !L.locked + L.update_icon() + for(var/obj/machinery/door/airlock/hatch/syndicate/vault/V in src) + if(V.locked) + V.locked = !V.locked + V.update_icon() /area/syndicate_depot/core/proc/despawn_guards() for(var/mob/thismob in list_getmobs(guard_list)) diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 668bb52b467..0ce91ae0860 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -264,6 +264,7 @@ /obj/effect/spawner/random_spawners/syndicate/loot/level4 name = "armory loot" + spawn_inside = /obj/structure/closet/secure_closet/syndicate/depot/armory // Loot schema: high-power weapons (m90, esword, ebow, revolver), devices that negate depot challenges (thermal glasses, chameleon device), explosives result = list(/obj/item/gun/projectile/automatic/c20r = 1, /obj/item/gun/projectile/automatic/m90 = 1, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm index f3cf8d67c13..58eb8de7bde 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm @@ -6,6 +6,7 @@ anchored = 1 health = 200 req_access = list() + var/is_armory = FALSE var/ignore_use = FALSE @@ -29,8 +30,10 @@ /obj/structure/closet/secure_closet/syndicate/depot/proc/loot_pickup() if(!ignore_use) var/area/syndicate_depot/core/depotarea = areaMaster - if(depotarea) + if(istype(depotarea)) depotarea.locker_looted() + if(is_armory) + depotarea.armory_locker_looted() /obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M) if(isanimal(M) && "syndicate" in M.faction) @@ -50,4 +53,8 @@ if(user.can_advanced_admin_interact()) ignore_use = TRUE toggle(user) - ignore_use = FALSE \ No newline at end of file + ignore_use = FALSE + +/obj/structure/closet/secure_closet/syndicate/depot/armory + req_access = list(access_syndicate) + is_armory = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 4f55094c3f6..7159d16bf91 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -204,15 +204,6 @@ alert_on_timeout = TRUE alert_on_shield_breach = TRUE -/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/death() - if(istype(depotarea)) - if(depotarea.shield_list.len) - depotarea.activate_self_destruct("[src] has died while the armory shield is up.", FALSE) - else - depotarea.declare_finished() - return ..() - - /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize() . = ..() if(istype(depotarea)) From 155bd0a67394ccc4d6b805923c14a80895082e29 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 9 Aug 2018 19:46:12 -0700 Subject: [PATCH 06/15] fixes guard despawn --- code/game/area/depot-areas.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/area/depot-areas.dm b/code/game/area/depot-areas.dm index af83e031858..bde31bada03 100644 --- a/code/game/area/depot-areas.dm +++ b/code/game/area/depot-areas.dm @@ -72,7 +72,7 @@ run_started = FALSE run_finished = FALSE - guard_list = list() + despawn_guards() hostile_list = list() dead_list = list() peaceful_list = list() @@ -82,7 +82,7 @@ detected_pod = FALSE detected_double_agent = FALSE updateicon() - despawn_guards() + alert_log += "Alert level reset." From 118fd95bcb12224a4071e36c89a4a4f3fdc25fb8 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 11 Aug 2018 01:47:54 -0700 Subject: [PATCH 07/15] eliminates armory doors bolting --- code/game/area/depot-areas.dm | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/code/game/area/depot-areas.dm b/code/game/area/depot-areas.dm index bde31bada03..69205c3c35f 100644 --- a/code/game/area/depot-areas.dm +++ b/code/game/area/depot-areas.dm @@ -335,12 +335,6 @@ if(!L.locked) L.locked = !L.locked L.update_icon() - for(var/obj/machinery/door/airlock/hatch/syndicate/vault/V in src) - if(!V.density) - V.close() - if(!V.locked) - V.locked = !V.locked - V.update_icon() /area/syndicate_depot/core/proc/shields_key_check() if(!shield_list.len) @@ -359,10 +353,6 @@ if(L.locked) L.locked = !L.locked L.update_icon() - for(var/obj/machinery/door/airlock/hatch/syndicate/vault/V in src) - if(V.locked) - V.locked = !V.locked - V.update_icon() /area/syndicate_depot/core/proc/despawn_guards() for(var/mob/thismob in list_getmobs(guard_list)) From 7cebfc20c4e874897272fbe522996997c0fff771 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 15 Aug 2018 01:48:34 -0700 Subject: [PATCH 08/15] fixes for RPD and RCS exploits --- code/game/objects/items/weapons/rpd.dm | 4 ++++ .../structures/crates_lockers/closets/secure/depot.dm | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index e130c3ed606..ffcb2e06785 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -192,6 +192,10 @@ var/list/pipemenu = list( return if(world.time < lastused + spawndelay) return + var/turf/T = get_turf(target) + for(var/obj/machinery/shieldwall/S in T) + to_chat(user, "[S] blocks access!") + return target.rpd_act(user, src) //Handle RPD effects in separate procs #undef RPD_COOLDOWN_TIME diff --git a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm index 58eb8de7bde..be67d79272f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm @@ -41,6 +41,12 @@ return return ..(M) +/obj/structure/closet/secure_closet/syndicate/depot/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/rcs)) + to_chat(user, "Bluespace interference prevents the [W] from locking onto [src]!") + return + return ..() + /obj/structure/closet/secure_closet/syndicate/depot/emp_act(severity) return From 1e894f11eecd8110e9f7583d34af28743ed3741b Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 15 Aug 2018 22:36:53 -0700 Subject: [PATCH 09/15] CrazyLemon RPD changes --- code/game/atoms.dm | 4 ++++ code/game/machinery/pipe/construction.dm | 3 ++- code/game/machinery/shieldgen.dm | 2 ++ code/game/objects/items/weapons/rpd.dm | 24 +++++++++++++++---- code/game/objects/objs.dm | 4 ---- .../recycling/disposal-construction.dm | 3 ++- 6 files changed, 30 insertions(+), 10 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index ea3b9df4f54..3c541a308ff 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -305,6 +305,10 @@ /atom/proc/rpd_act() return +/atom/proc/rpd_blocksusage() + // Atoms that return TRUE prevent RPDs placing any kind of pipes on their turf. + return FALSE + /atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 270b2a99411..e84d0778ef3 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -140,6 +140,7 @@ //update the name and icon of the pipe item depending on the type /obj/item/pipe/rpd_act(mob/user, obj/item/rpd/our_rpd) + . = TRUE if(our_rpd.mode == RPD_ROTATE_MODE) rotate() else if(our_rpd.mode == RPD_FLIP_MODE) @@ -147,7 +148,7 @@ else if(our_rpd.mode == RPD_DELETE_MODE) our_rpd.delete_single_pipe(user, src) else - ..() + return ..() /obj/item/pipe/proc/update(var/obj/machinery/atmospherics/make_from) name = "[get_pipe_name(pipe_type, PIPETYPE_ATMOS)] fitting" diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 6d79a65dcbd..f1e27be33fa 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -541,6 +541,8 @@ /obj/machinery/shieldwall/attack_hand(mob/user as mob) return +/obj/machinery/shieldwall/rpd_blocksusage() + return TRUE /obj/machinery/shieldwall/process() if(needs_power) diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index ffcb2e06785..c139155b57c 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -192,11 +192,27 @@ var/list/pipemenu = list( return if(world.time < lastused + spawndelay) return + + var/turf/T = get_turf(target) - for(var/obj/machinery/shieldwall/S in T) - to_chat(user, "[S] blocks access!") - return - target.rpd_act(user, src) //Handle RPD effects in separate procs + if(target != T) + // We only check the rpd_act of the target if it isn't the turf, because otherwise + // (A) blocked turfs can be acted on, and (B) unblocked turfs get acted on twice. + if(target.rpd_act(user, src) == TRUE) + // If the object we are clicking on has a valid RPD interaction for just that specific object, do that and nothing else. + // Example: clicking on a pipe with a RPD in rotate mode should rotate that pipe and ignore everything else on the tile. + return + + // If we get this far, we have to check every object in the tile, to make sure that none of them block RPD usage on this tile. + // This is done by calling rpd_blocksusage on every /obj in the tile. If any block usage, fail at this point. + + for(var/obj/O in T) + if(O.rpd_blocksusage() == TRUE) + to_chat(user, "[O] blocks the [src]!") + return + + // If we get here, then we're effectively acting on the turf, probably placing a pipe. + T.rpd_act(user, src) #undef RPD_COOLDOWN_TIME #undef RPD_WALLBUILD_TIME diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index a7e57ce5a52..6c7094fbe9f 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -71,10 +71,6 @@ SSnanoui.close_uis(src) return ..() -/obj/rpd_act(mob/user, obj/item/rpd/our_rpd) - var/turf/T = get_turf(src) //This preserves RPD behaviour on specific turfs - T.rpd_act(user, our_rpd) - /obj/proc/process() set waitfor = 0 processing_objects.Remove(src) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index c7e276cae17..3bb3c237d07 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -258,6 +258,7 @@ return /obj/structure/disposalconstruct/rpd_act(mob/user, obj/item/rpd/our_rpd) + . = TRUE if(our_rpd.mode == RPD_ROTATE_MODE) rotate() else if(our_rpd.mode == RPD_FLIP_MODE) @@ -265,4 +266,4 @@ else if(our_rpd.mode == RPD_DELETE_MODE) our_rpd.delete_single_pipe(user, src) else - ..() + return ..() From 7f3fbcf491a99030dcf078d54640ae325b29f88b Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 18 Aug 2018 17:24:55 -0700 Subject: [PATCH 10/15] fixes shields-under-falsewall bug --- code/game/objects/effects/spawners/random_spawners.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 0ce91ae0860..1619eba14c4 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -300,10 +300,9 @@ /obj/structure/falsewall/reinforced = 1) /obj/effect/spawner/random_spawners/syndicate/layout/door/vault - name = "60pc vaultdoor 20pc falsewall 20pc wall" - result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 6, - /turf/simulated/wall/r_wall = 2, - /obj/structure/falsewall/reinforced = 2) + name = "80pc vaultdoor 20pc wall" + result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4, + /turf/simulated/wall/r_wall = 1) /obj/effect/spawner/random_spawners/syndicate/layout/spacepod From a7c2f854b50a5166e98fe9de95ba00666f5e8519 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 22 Aug 2018 12:08:32 -0700 Subject: [PATCH 11/15] fixes depot syndimobs being immune to melee damage --- code/modules/mob/living/simple_animal/hostile/syndicate.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 7159d16bf91..60d3a1e16fb 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -51,7 +51,10 @@ var/damage = O.force if(O.damtype == STAMINA) damage = 0 - health -= damage + if(force_threshold && damage < force_threshold) + visible_message("[src] is unharmed by [O]!") + return + adjustHealth(damage) visible_message("[src] has been attacked with the [O] by [user]. ") playsound(loc, O.hitsound, 25, 1, -1) else From aad79ee59fadcc5336204468d01f542698a5c4b0 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 22 Aug 2018 13:11:19 -0700 Subject: [PATCH 12/15] fixes depot npc target jam on lockered targets --- code/modules/mob/living/simple_animal/hostile/syndicate.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 60d3a1e16fb..88e1e2aa1e5 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -128,6 +128,9 @@ seen_revived_enemy = TRUE raise_alert("[name] reports intruder [target] has returned from death!") depotarea.list_remove(target, depotarea.dead_list) + if(!atoms_share_level(src, target) && prob(20)) + // This prevents someone from aggroing a depot mob, then hiding in a locker, perfectly safe, while the mob stands there getting killed by their friends. + LoseTarget() /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/handle_automated_action() if(seen_enemy) From 6fe50ae62930796c3b321d218dd08ec6d8356f0c Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 22 Aug 2018 13:52:32 -0700 Subject: [PATCH 13/15] Fixes external turrets being unlinked from AI --- code/game/machinery/portable_turret.dm | 3 +-- code/game/objects/structures/depot.dm | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index a148a3c40f5..9d44ac09231 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -1013,15 +1013,14 @@ var/list/turret_icons check_anomalies = 1 check_synth = 1 ailock = 1 + var/area/syndicate_depot/core/depotarea /obj/machinery/porta_turret/syndicate/die() . = ..() - var/area/syndicate_depot/core/depotarea = areaMaster if(istype(depotarea)) depotarea.turret_died() /obj/machinery/porta_turret/syndicate/shootAt(mob/living/target) - var/area/syndicate_depot/core/depotarea = areaMaster if(istype(depotarea)) depotarea.list_add(target, depotarea.hostile_list) depotarea.declare_started() diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm index 0d048467c3a..061a8647d47 100644 --- a/code/game/objects/structures/depot.dm +++ b/code/game/objects/structures/depot.dm @@ -12,8 +12,12 @@ /obj/structure/fusionreactor/Initialize() . = ..() depotarea = areaMaster - if(depotarea) + if(istype(depotarea)) depotarea.reactor = src + spawn(50) // Necessary since random spawners may take a second to spawn turrets in depot. + for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc)) + if(!istype(T.depotarea)) + T.depotarea = depotarea /obj/structure/fusionreactor/Destroy() if(istype(depotarea)) From 22c26485083ffcecbe5566d1f3fe1cb142912320 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 22 Aug 2018 14:47:53 -0700 Subject: [PATCH 14/15] Fixes mines only checking faction on simple_animals --- code/game/objects/effects/mines.dm | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index bec27b9bc47..4c4cd42682b 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -14,14 +14,12 @@ /obj/effect/mine/Crossed(AM as mob|obj) if(!isliving(AM)) return - if(isanimal(AM)) - var/mob/living/simple_animal/SA = AM - if(faction && (faction in SA.faction)) - return - if(!SA.flying) - triggermine(SA) - else - triggermine(AM) + var/mob/living/M = AM + if(faction && (faction in M.faction)) + return + if(M.flying) + return + triggermine(M) /obj/effect/mine/proc/triggermine(mob/living/victim) if(triggered) From b0505002e28a550f1a529ee369ad64160dcb3cee Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 22 Aug 2018 22:19:11 -0700 Subject: [PATCH 15/15] CL request for LateInitialize() --- code/game/objects/structures/depot.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm index 061a8647d47..b655d010aa7 100644 --- a/code/game/objects/structures/depot.dm +++ b/code/game/objects/structures/depot.dm @@ -10,14 +10,16 @@ var/has_overloaded = FALSE /obj/structure/fusionreactor/Initialize() - . = ..() + ..() depotarea = areaMaster if(istype(depotarea)) depotarea.reactor = src - spawn(50) // Necessary since random spawners may take a second to spawn turrets in depot. - for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc)) - if(!istype(T.depotarea)) - T.depotarea = depotarea + return INITIALIZE_HINT_LATELOAD + +/obj/structure/fusionreactor/LateInitialize() + for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc)) + if(!istype(T.depotarea)) + T.depotarea = depotarea /obj/structure/fusionreactor/Destroy() if(istype(depotarea))