From bac0576345e1c0e8226404089a695dd392bd3e9f Mon Sep 17 00:00:00 2001 From: jughu Date: Sat, 14 Oct 2017 11:34:32 +0200 Subject: [PATCH 01/24] Update weaponry.dm --- code/game/objects/items/weaponry.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 446eb6e11a9..be9a7fbe20d 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -201,7 +201,7 @@ slot_flags = SLOT_BELT | SLOT_BACK force = 40 throwforce = 10 - w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_HUGE hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 From ecbaca06268dd240cf42a9e8177803d6f73c3bb0 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 15 Oct 2017 12:46:51 -0400 Subject: [PATCH 02/24] obj_break() will always be called before obj_destruction() --- code/game/objects/obj_defense.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 646548bbcab..ad5f69672bc 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -7,8 +7,12 @@ damage_amount = run_obj_armor(damage_amount, damage_type, damage_flag, attack_dir) if(damage_amount >= 0.1) . = damage_amount - obj_integrity = max(obj_integrity - damage_amount, 0) + var/old_integ = obj_integrity + obj_integrity = max(old_integ - damage_amount, 0) if(obj_integrity <= 0) + var/int_fail = integrity_failure + if(int_fail && old_integ > int_fail) + obj_break(damage_flag) obj_destruction(damage_flag) else if(integrity_failure) if(obj_integrity <= integrity_failure) From b9242d3b44882fd9bc4ae0c3a12b2e53213cca9e Mon Sep 17 00:00:00 2001 From: duncathan Date: Sun, 15 Oct 2017 16:11:06 -0600 Subject: [PATCH 03/24] lowers portable pump max pressure to 25 atm --- code/modules/atmospherics/machinery/portable/pump.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index c833309e2d7..3f2bceaa045 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -1,6 +1,6 @@ #define PUMP_OUT "out" #define PUMP_IN "in" -#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE * 30) +#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE * 25) #define PUMP_MIN_PRESSURE (ONE_ATMOSPHERE / 10) #define PUMP_DEFAULT_PRESSURE (ONE_ATMOSPHERE) From 44b1d3079aef70d781f7bb53449f0992e8462067 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 16 Oct 2017 10:44:03 +0200 Subject: [PATCH 04/24] Bullet hole fixing runtime --- code/game/turfs/simulated/walls.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 8ab9a4e6821..57037de4463 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -174,7 +174,7 @@ return /turf/closed/wall/proc/try_clean(obj/item/W, mob/user, turf/T) - if((user.a_intent != INTENT_HELP) || !damage_decals.len || !istype(W, /obj/item/weldingtool)) + if((user.a_intent != INTENT_HELP) || !LAZYLEN(damage_decals) || !istype(W, /obj/item/weldingtool)) return FALSE var/obj/item/weldingtool/WT = W if(WT.remove_fuel(0, user)) From db3333034c2ce36f7afad68ae73c91b60f2bba6b Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 16 Oct 2017 10:44:13 +0200 Subject: [PATCH 05/24] Glasses offset runtime --- code/modules/mob/living/carbon/human/update_icons.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 16969bfb8d7..0e8b9f4de4c 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -225,10 +225,11 @@ There are several things that need to be remembered: overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi') var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER] - if(OFFSET_GLASSES in dna.species.offset_features) - glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1] - glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2] - overlays_standing[GLASSES_LAYER] = glasses_overlay + if(glasses_overlay) + if(OFFSET_GLASSES in dna.species.offset_features) + glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1] + glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2] + overlays_standing[GLASSES_LAYER] = glasses_overlay apply_overlay(GLASSES_LAYER) From 5f0ef140e8b2824b8122e9d91fbab5d352a716c0 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 16 Oct 2017 10:44:22 +0200 Subject: [PATCH 06/24] Mutadone in monkeys runtime --- code/modules/reagents/chemistry/reagents/medicine_reagents.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index a184434039a..e88b8c454b2 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -814,7 +814,8 @@ M.jitteriness = 0 if(M.has_dna()) M.dna.remove_all_mutations() - ..() + if(!QDELETED(M)) //We were a monkey, now a human + ..() /datum/reagent/medicine/antihol name = "Antihol" From 2ac357a1642a828a40376ef7d33edf7cdc23c598 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 16 Oct 2017 12:36:04 +0200 Subject: [PATCH 07/24] ai lockdown runtime --- code/game/gamemodes/malfunction/Malf_Modules.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index e972eb5bbb6..987913ee188 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -426,7 +426,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( for(var/obj/machinery/door/D in GLOB.airlocks) if(!(D.z in GLOB.station_z_levels)) continue - INVOKE_ASYNC(D, /obj/machinery/door.proc/hostile_lockdown, src) + INVOKE_ASYNC(D, /obj/machinery/door.proc/hostile_lockdown, owner) addtimer(CALLBACK(D, /obj/machinery/door.proc/disable_lockdown), 900) var/obj/machinery/computer/communications/C = locate() in GLOB.machines From ddfb71ac00b48aedcc3ab88a50cc7e557fd5f72f Mon Sep 17 00:00:00 2001 From: Dax Dupont Date: Mon, 16 Oct 2017 13:45:32 +0200 Subject: [PATCH 08/24] Fixes automatic fire on guns tl;dr kevin copypasted stuff --- code/modules/projectiles/gun.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 65b83664879..e694eea11fe 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -212,7 +212,7 @@ firing_burst = FALSE return FALSE if(!issilicon(user)) - if( iteration > 1 && !(user.is_holding(src))) //for burst firing + if(iteration > 1 && !(user.is_holding(src))) //for burst firing firing_burst = FALSE return FALSE if(chambered && chambered.BB) @@ -230,6 +230,8 @@ shoot_live_shot(user, 1, target, message) else shoot_live_shot(user, 0, target, message) + if (iteration >= burst_size) + firing_burst = FALSE else shoot_with_empty_chamber(user) firing_burst = FALSE @@ -254,8 +256,7 @@ if(burst_size > 1) firing_burst = TRUE for(var/i = 1 to burst_size) - addtimer(CALLBACK(src, .proc/process_burst, user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), min(fire_delay * (i - 1), 0)) - firing_burst = FALSE + addtimer(CALLBACK(src, .proc/process_burst, user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1)) else if(chambered) sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) From 7882ccdb2c55bf3523667f148174b4e7c7a147c6 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 16 Oct 2017 17:50:44 -0700 Subject: [PATCH 09/24] Automatic changelog generation for PR #31775 [ci skip] --- html/changelogs/AutoChangeLog-pr-31775.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-31775.yml diff --git a/html/changelogs/AutoChangeLog-pr-31775.yml b/html/changelogs/AutoChangeLog-pr-31775.yml new file mode 100644 index 00000000000..961da1a1cd4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-31775.yml @@ -0,0 +1,4 @@ +author: "duncathan" +delete-after: True +changes: + - tweak: "Portable air pumps can output to a maximum of 25 atmospheres." From 09c4b015bbc14b6123c503bdbad291ca5ddf9818 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 17 Oct 2017 02:33:20 +0000 Subject: [PATCH 10/24] Automatic changelog compile, [ci skip] --- html/changelog.html | 57 +++++++++++++--------- html/changelogs/.all_changelog.yml | 26 ++++++++++ html/changelogs/AutoChangeLog-pr-30599.yml | 5 -- html/changelogs/AutoChangeLog-pr-31673.yml | 4 -- html/changelogs/AutoChangeLog-pr-31691.yml | 4 -- html/changelogs/AutoChangeLog-pr-31741.yml | 4 -- html/changelogs/AutoChangeLog-pr-31742.yml | 4 -- html/changelogs/AutoChangeLog-pr-31747.yml | 4 -- html/changelogs/AutoChangeLog-pr-31749.yml | 4 -- html/changelogs/AutoChangeLog-pr-31757.yml | 4 -- html/changelogs/AutoChangeLog-pr-31765.yml | 4 -- html/changelogs/AutoChangeLog-pr-31775.yml | 4 -- 12 files changed, 60 insertions(+), 64 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-30599.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31673.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31691.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31741.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31742.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31747.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31749.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31757.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31765.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-31775.yml diff --git a/html/changelog.html b/html/changelog.html index 3153ad068f3..a75bd91c3f1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,40 @@ -->
+

17 October 2017

+

DaxDupont updated:

+
    +
  • Fancy boxes(ie: donut boxes) now show the proper content amount in the sprite and no longer go invisible when empty.
  • +
+

Mercenaryblue updated:

+
    +
  • when decapitated, banana-flavored cream no longer hovers where your head used to be.
  • +
+

More Robust Than You updated:

+
    +
  • EI NATH! now causes a flash of light
  • +
+

Naksu updated:

+
    +
  • Pinned notes will now show up on vault, abductor, centcom and large glass airlocks.
  • +
  • Removed a misleading message when handling full stacks of sheets.
  • +
  • Pre-filled glass bottles (uplink, medbay, botany) will now give visual feedback about how much stuff is left inside, and the color of contents will match an empty bottle being filled with the same reagent.
  • +
  • Player-controlled "neutral" mobs such as minebots are now considered valid targets by clock cult's ocular wardens.
  • +
+

Xhuis updated:

+
    +
  • Cogged APCs can now be correctly unlocked with an ID card.
  • +
+

duncathan updated:

+
    +
  • Portable air pumps can output to a maximum of 25 atmospheres.
  • +
+

kevinz000 updated:

+
    +
  • Legacy projectiles have been removed. Instead, all projectiles are now PIXEL PROJECTILES!
  • +
  • Reflectors can now be at any angle you want. Alt click them to set angle!
  • +
+

15 October 2017

Armhulen updated:

    @@ -961,29 +995,6 @@
  • Nanotrasen redesigned the area power controllers!
  • Thanks Xhuis for the contrast tweak on APCs
- -

14 August 2017

-

Joan updated:

-
    -
  • Ported CEV-Eris's APC sprites.
  • -
-

More Robust Than You updated:

-
    -
  • Fixes a typo in the blobbernaut spawn text
  • -
-

WJohnston updated:

-
    -
  • Adds an ore box and shuttle console to aux bases on all stations.
  • -
-

Xhuis updated:

-
    -
  • The Resurrect Cultist rune now works as intended.
  • -
  • Cyborg energy swords now properly have an icon.
  • -
-

kingofkosmos updated:

-
    -
  • Canisters don't flash red lights anymore when empty.
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b07de8b7626..57a53ccbc54 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -13219,3 +13219,29 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - admin: Radiation pulses over 3000 are logged now spessmenart: - imageadd: The captains sabre no longer looks like a rapier. +2017-10-17: + DaxDupont: + - bugfix: 'Fancy boxes(ie: donut boxes) now show the proper content amount in the + sprite and no longer go invisible when empty.' + Mercenaryblue: + - bugfix: when decapitated, banana-flavored cream no longer hovers where your head + used to be. + More Robust Than You: + - rscadd: EI NATH! now causes a flash of light + Naksu: + - bugfix: Pinned notes will now show up on vault, abductor, centcom and large glass + airlocks. + - spellcheck: Removed a misleading message when handling full stacks of sheets. + - bugfix: Pre-filled glass bottles (uplink, medbay, botany) will now give visual + feedback about how much stuff is left inside, and the color of contents will + match an empty bottle being filled with the same reagent. + - bugfix: Player-controlled "neutral" mobs such as minebots are now considered valid + targets by clock cult's ocular wardens. + Xhuis: + - bugfix: Cogged APCs can now be correctly unlocked with an ID card. + duncathan: + - tweak: Portable air pumps can output to a maximum of 25 atmospheres. + kevinz000: + - refactor: Legacy projectiles have been removed. Instead, all projectiles are now + PIXEL PROJECTILES! + - rscadd: Reflectors can now be at any angle you want. Alt click them to set angle! diff --git a/html/changelogs/AutoChangeLog-pr-30599.yml b/html/changelogs/AutoChangeLog-pr-30599.yml deleted file mode 100644 index 8efa7118156..00000000000 --- a/html/changelogs/AutoChangeLog-pr-30599.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - refactor: "Legacy projectiles have been removed. Instead, all projectiles are now PIXEL PROJECTILES!" - - rscadd: "Reflectors can now be at any angle you want. Alt click them to set angle!" diff --git a/html/changelogs/AutoChangeLog-pr-31673.yml b/html/changelogs/AutoChangeLog-pr-31673.yml deleted file mode 100644 index 3d66b596aab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31673.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "Cogged APCs can now be correctly unlocked with an ID card." diff --git a/html/changelogs/AutoChangeLog-pr-31691.yml b/html/changelogs/AutoChangeLog-pr-31691.yml deleted file mode 100644 index f2d49e07844..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31691.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - rscadd: "EI NATH! now causes a flash of light" diff --git a/html/changelogs/AutoChangeLog-pr-31741.yml b/html/changelogs/AutoChangeLog-pr-31741.yml deleted file mode 100644 index d6d85367ea5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31741.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Pinned notes will now show up on vault, abductor, centcom and large glass airlocks." diff --git a/html/changelogs/AutoChangeLog-pr-31742.yml b/html/changelogs/AutoChangeLog-pr-31742.yml deleted file mode 100644 index 0eed3012f9b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31742.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - spellcheck: "Removed a misleading message when handling full stacks of sheets." diff --git a/html/changelogs/AutoChangeLog-pr-31747.yml b/html/changelogs/AutoChangeLog-pr-31747.yml deleted file mode 100644 index 14e5bc93922..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31747.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Pre-filled glass bottles (uplink, medbay, botany) will now give visual feedback about how much stuff is left inside, and the color of contents will match an empty bottle being filled with the same reagent." diff --git a/html/changelogs/AutoChangeLog-pr-31749.yml b/html/changelogs/AutoChangeLog-pr-31749.yml deleted file mode 100644 index 84b20fc00d3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31749.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mercenaryblue" -delete-after: True -changes: - - bugfix: "when decapitated, banana-flavored cream no longer hovers where your head used to be." diff --git a/html/changelogs/AutoChangeLog-pr-31757.yml b/html/changelogs/AutoChangeLog-pr-31757.yml deleted file mode 100644 index 07b022ed296..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31757.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Player-controlled \"neutral\" mobs such as minebots are now considered valid targets by clock cult's ocular wardens." diff --git a/html/changelogs/AutoChangeLog-pr-31765.yml b/html/changelogs/AutoChangeLog-pr-31765.yml deleted file mode 100644 index cd6bfdeea09..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31765.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DaxDupont" -delete-after: True -changes: - - bugfix: "Fancy boxes(ie: donut boxes) now show the proper content amount in the sprite and no longer go invisible when empty." diff --git a/html/changelogs/AutoChangeLog-pr-31775.yml b/html/changelogs/AutoChangeLog-pr-31775.yml deleted file mode 100644 index 961da1a1cd4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-31775.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "duncathan" -delete-after: True -changes: - - tweak: "Portable air pumps can output to a maximum of 25 atmospheres." From 8ac9ff75bcc4657353bad4dc284c200d79f24aa5 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Mon, 16 Oct 2017 20:55:12 -0700 Subject: [PATCH 11/24] Fixes missing semicolon in sargeant araneus vars (#31790) * semicolon * no define --- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 1abcb105e18..92e087ff055 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -3622,7 +3622,7 @@ min_oxy = 5; name = "Sergeant Araneus"; real_name = "Sergeant Araneus"; - movement_type = GROUND + movement_type = 1; response_help = "pets"; turns_per_move = 10; voice_name = "unidentifiable voice" From 41270466f3caec4a08eb678d2b3f1572d7785894 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 16 Oct 2017 23:55:40 -0400 Subject: [PATCH 12/24] Adds a duplicate stack_trace to /datum (#31783) --- code/__HELPERS/unsorted.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index b7b18578d91..c1c7390fd5a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1229,6 +1229,9 @@ proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) /proc/stack_trace(msg) CRASH(msg) +/datum/proc/stack_trace(msg) + CRASH(msg) + //Key thing that stops lag. Cornerstone of performance in ss13, Just sitting here, in unsorted.dm. //Increases delay as the server gets more overloaded, From 8d4a9b832e344366c7102cb2a4aa6a1ac56c829f Mon Sep 17 00:00:00 2001 From: Cruix Date: Mon, 16 Oct 2017 23:01:01 -0500 Subject: [PATCH 13/24] Fixed the shuttle navigation computer allowing you to move docking ports (#31721) * Fixed the shuttle navigation computer allowing you to move stationary docking ports * Moved a var from stationary docking ports to mobile docking ports * Removed a sanity check --- code/modules/shuttle/navigation_computer.dm | 2 +- code/modules/shuttle/on_move.dm | 19 +++++++++---------- code/modules/shuttle/shuttle.dm | 3 ++- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 61bfe3a2b52..d376fda48ad 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -80,7 +80,7 @@ return FALSE var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj if(!my_port) - my_port = new /obj/docking_port/stationary + my_port = new /obj/docking_port/stationary() my_port.name = shuttlePortName my_port.id = shuttlePortId var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 6f3c7c095f2..530e9a3ba4a 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -76,7 +76,7 @@ All ShuttleMove procs go here return move_mode // Called on atoms to move the atom to the new location -/atom/movable/proc/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/atom/movable/proc/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) if(newT == oldT) // In case of in place shuttle rotation shenanigans. return @@ -268,7 +268,7 @@ All ShuttleMove procs go here /************************************Mob move procs************************************/ -/mob/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/mob/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) if(!move_on_shuttle) return . = ..() @@ -293,7 +293,7 @@ All ShuttleMove procs go here if(movement_force["KNOCKDOWN"]) Knockdown(movement_force["KNOCKDOWN"]) -/mob/living/simple_animal/hostile/megafauna/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/mob/living/simple_animal/hostile/megafauna/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) . = ..() message_admins("Megafauna [src] [ADMIN_FLW(src)] moved via shuttle from [ADMIN_COORDJMP(oldT)] to [ADMIN_COORDJMP(loc)]") @@ -324,21 +324,20 @@ All ShuttleMove procs go here /************************************Misc move procs************************************/ -/atom/movable/lighting_object/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/atom/movable/lighting_object/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) return FALSE -/atom/movable/light/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/atom/movable/light/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) return FALSE -/obj/docking_port/stationary/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) - if(old_dock == src) //Don't move the dock we're leaving +/obj/docking_port/stationary/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) + if(!moving_dock.can_move_docking_ports || (old_dock == src)) return FALSE - . = ..() -/obj/docking_port/stationary/public_mining_dock/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/obj/docking_port/stationary/public_mining_dock/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) id = "mining_public" //It will not move with the base, but will become enabled as a docking point. -/obj/effect/abstract/proximity_checker/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/obj/effect/abstract/proximity_checker/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) //timer so it only happens once addtimer(CALLBACK(monitor, /datum/proximity_monitor/proc/SetRange, monitor.current_range, TRUE), 0, TIMER_UNIQUE) \ No newline at end of file diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index d5ad26f57c4..3058e4bbb51 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -284,6 +284,7 @@ var/engine_coeff = 1 //current engine coeff var/current_engines = 0 //current engine power var/initial_engines = 0 //initial engine power + var/can_move_docking_ports = FALSE //if this shuttle can move docking ports other than the one it is docked at /obj/docking_port/mobile/proc/register() SSshuttle.mobile += src @@ -600,7 +601,7 @@ var/atom/movable/moving_atom = thing if(moving_atom.loc != oldT) //fix for multi-tile objects continue - moving_atom.onShuttleMove(newT, oldT, rotation, movement_force, movement_direction, old_dock)//atoms + moving_atom.onShuttleMove(newT, oldT, rotation, movement_force, movement_direction, old_dock, src)//atoms moved_atoms += moving_atom if(move_mode & MOVE_TURF) oldT.onShuttleMove(newT, underlying_turf_type, underlying_baseturf_type, rotation, movement_force, movement_direction)//turfs From cd5f983da48547802a361e124aea028116d9fe83 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Mon, 16 Oct 2017 22:48:48 -0700 Subject: [PATCH 14/24] Atmospherics Multilayer Pipes (#30972) * 1 * rpd * 3 * 4 * 5 * 6 * 7 * 8 * wew * src. and underlays * update * woops * misspelled params * reviews * fixes * fixes * better checks and layer crap * Update RPD.dm * Update pipe_construction.dm * 3 layers, fixes * woops i didn't update defines correctly * dunc * Fixes * Fixes * fixes * fixes some more bullshit * fixes * fixes * not needed * makes attachment sprites prettier or uglier i dunno * Unary flag * sprite fix?? * fixes... * sprite fixes --- code/__DEFINES/atmospherics.dm | 13 ++ code/__DEFINES/pipe_construction.dm | 13 +- code/game/machinery/pipe/construction.dm | 130 ++++++++++++----- code/game/machinery/pipe/pipe_dispenser.dm | 26 ++-- code/game/objects/items/RPD.dm | 89 ++++++++---- .../atmospherics/machinery/atmosmachinery.dm | 92 ++++++++---- .../components/binary_devices/circulator.dm | 1 + .../trinary_devices/trinary_devices.dm | 1 + .../components/unary_devices/cryo.dm | 1 + .../unary_devices/portables_connector.dm | 1 + .../components/unary_devices/tank.dm | 1 + .../components/unary_devices/thermomachine.dm | 1 + .../components/unary_devices/unary_devices.dm | 1 + .../atmospherics/machinery/other/meter.dm | 42 ++++-- .../machinery/pipes/bluespace_pipe.dm | 2 +- .../machinery/pipes/layermanifold.dm | 135 ++++++++++++++++++ .../atmospherics/machinery/pipes/manifold.dm | 2 +- .../atmospherics/machinery/pipes/pipes.dm | 21 +-- .../atmospherics/machinery/pipes/simple.dm | 16 +-- .../portable/portable_atmospherics.dm | 12 +- code/modules/mob/mob_defines.dm | 2 + icons/obj/atmospherics/pipes/manifold.dmi | Bin 5169 -> 15231 bytes icons/obj/atmospherics/pipes/pipe_item.dmi | Bin 23898 -> 26767 bytes tgstation.dme | 1 + 24 files changed, 453 insertions(+), 150 deletions(-) create mode 100644 code/modules/atmospherics/machinery/pipes/layermanifold.dm diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 383e4c8bcc2..1273b5e3de5 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -177,6 +177,19 @@ #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland #define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300" +//IF YOU EVER CHANGE THESE CHANGE SPRITES TO MATCH. +#define PIPING_LAYER_MIN 1 +#define PIPING_LAYER_MAX 3 +#define PIPING_LAYER_DEFAULT 2 +#define PIPING_LAYER_P_X 5 +#define PIPING_LAYER_P_Y 5 +#define PIPING_LAYER_LCHANGE 0.05 + +#define PIPING_ALL_LAYER 1 //intended to connect with all layers, check for all instead of just one. +#define PIPING_ONE_PER_TURF 2 //can only be built if nothing else with this flag is on the tile already. +#define PIPING_DEFAULT_LAYER_ONLY 4 //can only exist at PIPING_LAYER_DEFAULT +#define PIPING_CARDINAL_AUTONORMALIZE 8 //north/south east/west doesn't matter, auto normalize on build. + #define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity()) #define ADD_GAS(gas_id, out_list)\ diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm index 2d15b8aed3e..403c9a061fb 100644 --- a/code/__DEFINES/pipe_construction.dm +++ b/code/__DEFINES/pipe_construction.dm @@ -7,24 +7,25 @@ Construction breaks otherwise //Pipes #define PIPE_SIMPLE /obj/machinery/atmospherics/pipe/simple #define PIPE_MANIFOLD /obj/machinery/atmospherics/pipe/manifold -#define PIPE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/manifold4w +#define PIPE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/manifold4w #define PIPE_HE /obj/machinery/atmospherics/pipe/heat_exchanging/simple #define PIPE_HE_MANIFOLD /obj/machinery/atmospherics/pipe/heat_exchanging/manifold #define PIPE_HE_4WAYMANIFOLD /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w #define PIPE_JUNCTION /obj/machinery/atmospherics/pipe/heat_exchanging/junction -#define PIPE_BLUESPACE /obj/machinery/atmospherics/pipe/bluespace +#define PIPE_LAYER_MANIFOLD /obj/machinery/atmospherics/pipe/layer_manifold +#define PIPE_BLUESPACE /obj/machinery/atmospherics/pipe/bluespace //Unary #define PIPE_CONNECTOR /obj/machinery/atmospherics/components/unary/portables_connector #define PIPE_UVENT /obj/machinery/atmospherics/components/unary/vent_pump #define PIPE_SCRUBBER /obj/machinery/atmospherics/components/unary/vent_scrubber #define PIPE_INJECTOR /obj/machinery/atmospherics/components/unary/outlet_injector -#define PIPE_HEAT_EXCHANGE /obj/machinery/atmospherics/components/unary/heat_exchanger +#define PIPE_HEAT_EXCHANGE /obj/machinery/atmospherics/components/unary/heat_exchanger //Binary #define PIPE_PUMP /obj/machinery/atmospherics/components/binary/pump -#define PIPE_PASSIVE_GATE /obj/machinery/atmospherics/components/binary/passive_gate -#define PIPE_VOLUME_PUMP /obj/machinery/atmospherics/components/binary/volume_pump +#define PIPE_PASSIVE_GATE /obj/machinery/atmospherics/components/binary/passive_gate +#define PIPE_VOLUME_PUMP /obj/machinery/atmospherics/components/binary/volume_pump #define PIPE_MVALVE /obj/machinery/atmospherics/components/binary/valve -#define PIPE_DVALVE /obj/machinery/atmospherics/components/binary/valve/digital +#define PIPE_DVALVE /obj/machinery/atmospherics/components/binary/valve/digital //Trinary #define PIPE_GAS_FILTER /obj/machinery/atmospherics/components/trinary/filter #define PIPE_GAS_MIXER /obj/machinery/atmospherics/components/trinary/mixer diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index e56c8f75192..6c3eaf2c729 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -19,11 +19,13 @@ Buildable meters item_state = "buildpipe" w_class = WEIGHT_CLASS_NORMAL level = 2 - var/flipped = 0 - var/is_bent = 0 + var/flipped = FALSE + var/is_bent = FALSE + var/piping_layer = PIPING_LAYER_DEFAULT var/static/list/pipe_types = list( PIPE_SIMPLE, \ + PIPE_LAYER_MANIFOLD, \ PIPE_MANIFOLD, \ PIPE_4WAYMANIFOLD, \ PIPE_HE, \ @@ -52,40 +54,58 @@ Buildable meters ..() to_chat(user, "Alt-click to rotate it clockwise.") -/obj/item/pipe/New(loc, pipe_type, dir, obj/machinery/atmospherics/make_from) - ..() +/obj/item/pipe/Initialize(mapload, _pipe_type, _dir, obj/machinery/atmospherics/make_from) if(make_from) - src.setDir(make_from.dir) - src.pipename = make_from.name + setDir(make_from.dir) + pipename = make_from.name add_atom_colour(make_from.color, FIXED_COLOUR_PRIORITY) if(make_from.type in pipe_types) - src.pipe_type = make_from.type + pipe_type = make_from.type + setPipingLayer(make_from.piping_layer) else //make pipe_type a value we can work with for(var/P in pipe_types) if(istype(make_from, P)) - src.pipe_type = P + pipe_type = P break var/obj/machinery/atmospherics/components/trinary/triP = make_from if(istype(triP) && triP.flipped) - src.flipped = 1 - src.setDir(turn(src.dir, -45)) + flipped = TRUE + setDir(turn(dir, -45)) else - src.pipe_type = pipe_type - src.setDir(dir) + pipe_type = _pipe_type + setDir(_dir) - if(src.dir in GLOB.diagonals) - is_bent = 1 + if(_dir in GLOB.diagonals) + is_bent = TRUE update() - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + return ..() + +/obj/item/pipe/dropped() + if(loc) + setPipingLayer(piping_layer) + return ..() + +/obj/item/pipe/proc/setPipingLayer(new_layer = PIPING_LAYER_DEFAULT) + var/obj/machinery/atmospherics/fakeA = get_pipe_cache(pipe_type) + var/nolayer = (fakeA.pipe_flags & PIPING_ALL_LAYER) + if(nolayer) + new_layer = PIPING_LAYER_DEFAULT + piping_layer = new_layer + if(pipe_type != PIPE_LAYER_MANIFOLD) + pixel_x = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + pixel_y = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + layer = initial(layer) + ((piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE) //update the name and icon of the pipe item depending on the type GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_SIMPLE]" = "simple", \ "[PIPE_MANIFOLD]" = "manifold", \ + "[PIPE_LAYER_MANIFOLD]" = "layer_manifold", \ "[PIPE_4WAYMANIFOLD]" = "manifold4w", \ "[PIPE_HE]" = "he", \ "[PIPE_HE_MANIFOLD]" = "he_manifold", \ @@ -114,6 +134,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_SIMPLE]" = "pipe", \ "[PIPE_SIMPLE]_b" = "bent pipe", \ "[PIPE_MANIFOLD]" = "manifold", \ + "[PIPE_LAYER_MANIFOLD]" = "layer manifold", \ "[PIPE_4WAYMANIFOLD]" = "4-way manifold", \ "[PIPE_HE]" = "h/e pipe", \ "[PIPE_HE]_b" = "bent h/e pipe", \ @@ -151,7 +172,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( if ( usr.stat || usr.restrained() || !usr.canmove ) return - src.setDir(turn(src.dir, -90)) + setDir(turn(dir, -90)) fixdir() @@ -166,11 +187,11 @@ GLOBAL_LIST_INIT(pipeID2State, list( return if (pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER)) - src.setDir(turn(src.dir, flipped )? 45 : -45) + setDir(turn(dir, flipped )? 45 : -45) flipped = !flipped return - src.setDir(turn(src.dir, -180)) + setDir(turn(dir, -180)) fixdir() @@ -199,7 +220,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( //Helper to clean up dir /obj/item/pipe/proc/fixdir() - if((pipe_type in list (PIPE_SIMPLE, PIPE_HE, PIPE_MVALVE, PIPE_DVALVE)) && !is_bent) + if((pipe_type in list (PIPE_SIMPLE, PIPE_HE, PIPE_MVALVE, PIPE_DVALVE, PIPE_LAYER_MANIFOLD)) && !is_bent) if(dir==SOUTH) setDir(NORTH) else if(dir==WEST) @@ -208,40 +229,54 @@ GLOBAL_LIST_INIT(pipeID2State, list( /obj/item/pipe/attack_self(mob/user) return rotate() +/obj/item/pipe/proc/get_pipe_cache(type, direction) + var/static/list/obj/machinery/atmospherics/check_cache + if(!islist(check_cache)) + check_cache = list() + if(!check_cache[type]) + check_cache[type] = list() + if(!check_cache[type]["[direction]"]) + check_cache[type]["[direction]"] = new type(null, null, direction) + + return check_cache[type]["[direction]"] + /obj/item/pipe/attackby(obj/item/W, mob/user, params) if (!istype(W, /obj/item/wrench)) return ..() - if (!isturf(src.loc)) - return 1 - + if (!isturf(loc)) + return TRUE add_fingerprint(user) fixdir() if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER)) setDir(unflip(dir)) - var/obj/machinery/atmospherics/A = new pipe_type(src.loc) - A.setDir(src.dir) - A.SetInitDirections() + var/obj/machinery/atmospherics/fakeA = get_pipe_cache(pipe_type, dir) - for(var/obj/machinery/atmospherics/M in src.loc) - if(M == A) //we don't want to check to see if it interferes with itself + for(var/obj/machinery/atmospherics/M in loc) + if((M.pipe_flags & PIPING_ONE_PER_TURF) && (fakeA.pipe_flags & PIPING_ONE_PER_TURF)) //Only one dense/requires density object per tile, eg connectors/cryo/heater/coolers. + to_chat(user, "Something is hogging the tile!") + return TRUE + if((M.piping_layer != piping_layer) && !((M.pipe_flags & PIPING_ALL_LAYER) || (pipe_type == PIPE_LAYER_MANIFOLD))) continue - if(M.GetInitDirections() & A.GetInitDirections()) // matches at least one direction on either type of pipe + if(M.GetInitDirections() & fakeA.GetInitDirections()) // matches at least one direction on either type of pipe to_chat(user, "There is already a pipe at that location!") - qdel(A) - return 1 + return TRUE // no conflicts found + var/obj/machinery/atmospherics/A = new pipe_type(loc) + A.setDir(dir) + A.SetInitDirections() + if(pipename) A.name = pipename var/obj/machinery/atmospherics/components/trinary/T = A if(istype(T)) T.flipped = flipped - A.on_construction(pipe_type, color) + A.on_construction(pipe_type, color, piping_layer) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) user.visible_message( \ "[user] fastens \the [src].", \ "You fasten \the [src].", \ @@ -271,16 +306,33 @@ GLOBAL_LIST_INIT(pipeID2State, list( icon_state = "meter" item_state = "buildpipe" w_class = WEIGHT_CLASS_BULKY + var/piping_layer = PIPING_LAYER_DEFAULT -/obj/item/pipe_meter/attackby(obj/item/W, mob/user, params) +/obj/item/pipe_meter/attackby(obj/item/I, mob/user, params) ..() - if (!istype(W, /obj/item/wrench)) + if (!istype(I, /obj/item/wrench)) return ..() - if(!locate(/obj/machinery/atmospherics/pipe, src.loc)) + var/obj/machinery/atmospherics/pipe/pipe + for(var/obj/machinery/atmospherics/pipe/P in loc) + if(P.piping_layer == piping_layer) + pipe = P + break + if(!pipe) to_chat(user, "You need to fasten it to a pipe!") - return 1 - new/obj/machinery/meter( src.loc ) - playsound(src.loc, W.usesound, 50, 1) + return TRUE + new /obj/machinery/meter(loc, piping_layer) + playsound(src, I.usesound, 50, 1) to_chat(user, "You fasten the meter to the pipe.") qdel(src) + +/obj/item/pipe_meter/dropped() + . = ..() + if(loc) + setAttachLayer(piping_layer) + +/obj/item/pipe_meter/proc/setAttachLayer(new_layer = PIPING_LAYER_DEFAULT) + piping_layer = new_layer + pixel_x = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + pixel_y = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 26559c5ef9f..911a81c2fce 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -6,18 +6,21 @@ density = TRUE anchored = TRUE var/wait = 0 + var/piping_layer = PIPING_LAYER_DEFAULT /obj/machinery/pipedispenser/attack_paw(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/pipedispenser/attack_hand(mob/user) if(..()) return 1 var/dat = {" +PIPING LAYER: --[piping_layer]++
Pipes:
Pipe
Bent Pipe
Manifold
+Layer Manifold
4-Way Manifold
Manual Valve
Digital Valve
@@ -53,18 +56,23 @@ usr << browse(null, "window=pipedispenser") return 1 usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(href_list["make"]) if(wait < world.time) var/p_type = text2path(href_list["make"]) var/p_dir = text2num(href_list["dir"]) - var/obj/item/pipe/P = new (src.loc, pipe_type=p_type, dir=p_dir) + var/obj/item/pipe/P = new (loc, p_type, p_dir) + P.setPipingLayer(piping_layer) P.add_fingerprint(usr) wait = world.time + 10 if(href_list["makemeter"]) if(wait < world.time ) - new /obj/item/pipe_meter(src.loc) + new /obj/item/pipe_meter(loc) wait = world.time + 15 + if(href_list["layer_up"]) + piping_layer = Clamp(++piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + if(href_list["layer_down"]) + piping_layer = Clamp(--piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) return /obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, params) @@ -75,7 +83,7 @@ return else if (istype(W, /obj/item/wrench)) if (!anchored && !isinspace()) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to fasten \the [src] to the floor...") if (do_after(user, 40*W.toolspeed, target = src)) add_fingerprint(user) @@ -88,7 +96,7 @@ if (usr.machine==src) usr << browse(null, "window=pipedispenser") else if(anchored) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src] from the floor...") if (do_after(user, 20*W.toolspeed, target = src)) add_fingerprint(user) @@ -160,11 +168,11 @@ Nah if(..()) return 1 usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(href_list["dmake"]) if(wait < world.time) var/p_type = text2num(href_list["dmake"]) - var/obj/structure/disposalconstruct/C = new (src.loc,p_type) + var/obj/structure/disposalconstruct/C = new (loc,p_type) if(!C.can_place()) to_chat(usr, "There's not enough room to build that here!") @@ -211,7 +219,7 @@ Nah if(..()) return 1 usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(wait < world.time) if(href_list["tube"]) var/tube_type = text2num(href_list["tube"]) diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 15abe72a524..0151b0e9e15 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -30,10 +30,10 @@ RPD var/selected=0 /datum/pipe_info/New(pid,direction,dt) - src.id=pid - src.icon_state=GLOB.pipeID2State["[pid]"] - src.dir = direction - src.dirtype=dt + id=pid + icon_state=GLOB.pipeID2State["[pid]"] + dir = direction + dirtype=dt /datum/pipe_info/proc/Render(dispenser,label) return "
  • [label]
  • " @@ -67,10 +67,10 @@ GLOBAL_LIST_INIT(disposalpipeID2State, list( icon_state = "meterX" /datum/pipe_info/disposal/New(var/pid,var/dt) - src.id=pid - src.icon_state=GLOB.disposalpipeID2State[pid+1] - src.dir = SOUTH - src.dirtype=dt + id=pid + icon_state=GLOB.disposalpipeID2State[pid+1] + dir = SOUTH + dirtype=dt if(pidDISP_END_CHUTE) icon_state = "con[icon_state]" @@ -80,13 +80,14 @@ GLOBAL_LIST_INIT(disposalpipeID2State, list( //find these defines in code\game\machinery\pipe\consruction.dm GLOBAL_LIST_INIT(RPD_recipes, list( "Pipes" = list( - "Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 1, PIPE_BENDABLE), - //"Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 5, PIPE_BENT), - "Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY), - "Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY), - "Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY), - "4-Way Manifold" = new /datum/pipe_info(PIPE_4WAYMANIFOLD, 1, PIPE_QUAD), - "Bluespace Pipe" = new /datum/pipe_info(PIPE_BLUESPACE, 1, PIPE_UNARY), + "Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 1, PIPE_BENDABLE), + //"Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 5, PIPE_BENT), + "Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY), + "Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY), + "Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY), + "4-Way Manifold" = new /datum/pipe_info(PIPE_4WAYMANIFOLD, 1, PIPE_QUAD), + "Layer Manifold" = new /datum/pipe_info(PIPE_LAYER_MANIFOLD, 1, PIPE_BINARY), + "Bluespace Pipe" = new /datum/pipe_info(PIPE_BLUESPACE, 1, PIPE_UNARY), ), "Devices"=list( "Connector" = new /datum/pipe_info(PIPE_CONNECTOR, 1, PIPE_UNARY), @@ -153,6 +154,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( ) var/paint_color="grey" var/screen = CATEGORY_ATMOS //Starts on the atmos tab. + var/piping_layer = PIPING_LAYER_DEFAULT /obj/item/pipe_dispenser/New() . = ..() @@ -201,6 +203,14 @@ GLOBAL_LIST_INIT(RPD_recipes, list( dat += "Atmospherics Disposals
    " else if(screen == CATEGORY_DISPOSALS) dat += "Atmospherics Disposals
    " + var/generated_layer_list = "" + var/layers_total = PIPING_LAYER_MAX - PIPING_LAYER_MIN + 1 + for(var/iter = PIPING_LAYER_MIN, iter <= layers_total, iter++) + if(iter == piping_layer) + generated_layer_list += "[iter]" + else + generated_layer_list += "[iter]" + dat += "Atmospherics Piping Layer: [generated_layer_list]
    " dat += "" var/icon/preview=null @@ -459,7 +469,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( usr << browse(null, "window=pipedispenser") return usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(href_list["screen"]) screen = text2num(href_list["screen"]) show_menu(usr) @@ -469,11 +479,18 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_flipped = text2num(href_list["flipped"]) show_menu(usr) + if(href_list["setlayer"]) + if(!isnum(href_list["setlayer"])) + piping_layer = text2num(href_list["setlayer"]) + else + piping_layer = href_list["setlayer"] + show_menu(usr) + if(href_list["eatpipes"]) p_class = EATING_MODE p_conntype=-1 p_dir=1 - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -481,13 +498,13 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_class = PAINT_MODE p_conntype = -1 p_dir = 1 - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) if(href_list["set_color"]) paint_color = href_list["set_color"] - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -496,7 +513,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_dir = text2num(href_list["dir"]) p_conntype = text2num(href_list["type"]) p_class = ATMOS_MODE - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -504,7 +521,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_class = METER_MODE p_conntype = -1 p_dir = 1 - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -513,7 +530,7 @@ GLOBAL_LIST_INIT(RPD_recipes, list( p_conntype = text2num(href_list["type"]) p_dir = 1 p_class = DISPOSALS_MODE - src.spark_system.start() + spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -522,10 +539,18 @@ GLOBAL_LIST_INIT(RPD_recipes, list( if(!user.IsAdvancedToolUser() || istype(A, /turf/open/space/transit)) return ..() + var/atmos_piping_mode = p_class == ATMOS_MODE || p_class == METER_MODE + var/temp_piping_layer + if(atmos_piping_mode) + if(istype(A, /obj/machinery/atmospherics)) + var/obj/machinery/atmospherics/AM = A + temp_piping_layer = AM.piping_layer + A = get_turf(user) + //make sure what we're clicking is valid for the current mode var/is_paintable = (p_class == PAINT_MODE && istype(A, /obj/machinery/atmospherics/pipe)) var/is_consumable = (p_class == EATING_MODE && (istype(A, /obj/item/pipe) || istype(A, /obj/item/pipe_meter) || istype(A, /obj/structure/disposalconstruct))) - var/can_make_pipe = ((p_class == ATMOS_MODE || p_class == METER_MODE || p_class == DISPOSALS_MODE) && isturf(A)) + var/can_make_pipe = ((atmos_piping_mode || p_class == DISPOSALS_MODE) && isturf(A)) if(!is_paintable && !is_consumable && !can_make_pipe) return ..() @@ -540,10 +565,8 @@ GLOBAL_LIST_INIT(RPD_recipes, list( if(PAINT_MODE) //Paint pipes var/obj/machinery/atmospherics/pipe/P = A playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) - P.add_atom_colour(paint_colors[paint_color], FIXED_COLOUR_PRIORITY) - P.pipe_color = paint_colors[paint_color] + P.paint(paint_colors[paint_color]) user.visible_message("[user] paints \the [P] [paint_color].","You paint \the [P] [paint_color].") - P.update_node_icon() return if(EATING_MODE) //Eating pipes @@ -558,21 +581,29 @@ GLOBAL_LIST_INIT(RPD_recipes, list( playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 2, target = A)) activate() - var/obj/item/pipe/P = new (A, pipe_type=queued_p_type, dir=queued_p_dir) + var/obj/item/pipe/P = new(A, queued_p_type, queued_p_dir) P.flipped = queued_p_flipped P.update() P.add_fingerprint(usr) + if(!isnull(temp_piping_layer)) + P.setPipingLayer(temp_piping_layer) + else + P.setPipingLayer(piping_layer) if(METER_MODE) //Making pipe meters to_chat(user, "You start building a meter...") playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 2, target = A)) activate() - new /obj/item/pipe_meter(A) + var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(A) + if(!isnull(temp_piping_layer)) + PM.setAttachLayer(temp_piping_layer) + else + PM.setAttachLayer(piping_layer) if(DISPOSALS_MODE) //Making disposals pipes if(isclosedturf(A)) - to_chat(user, "[src]'s error light flickers; there's something in the way!") + to_chat(user, "\the [src]'s error light flickers; there's something in the way!") return to_chat(user, "You start building a disposals pipe...") playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 6a2df72a485..aa4099caee9 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -25,6 +25,8 @@ Pipelines + Other Objects -> Pipe network var/can_unwrench = 0 var/initialize_directions = 0 var/pipe_color + var/piping_layer = PIPING_LAYER_DEFAULT + var/pipe_flags = NONE var/global/list/iconsetids = list() var/global/list/pipeimages = list() @@ -41,7 +43,11 @@ Pipelines + Other Objects -> Pipe network if(L.ventcrawler) to_chat(L, "Alt-click to crawl through it.") -/obj/machinery/atmospherics/New(loc, process = TRUE) +/obj/machinery/atmospherics/New(loc, process = TRUE, setdir) + if(!isnull(setdir)) + setDir(setdir) + if(pipe_flags & PIPING_CARDINAL_AUTONORMALIZE) + normalize_cardinal_directions() nodes = new(device_type) if (!armor) armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 100, acid = 70) @@ -63,6 +69,13 @@ Pipelines + Other Objects -> Pipe network return ..() //return QDEL_HINT_FINDREFERENCE +/obj/machinery/atmospherics/proc/destroy_network() + return + +/obj/machinery/atmospherics/proc/build_network() + // Called to build a network from this node + return + /obj/machinery/atmospherics/proc/nullifyNode(I) if(NODE_I) var/obj/machinery/atmospherics/N = NODE_I @@ -82,6 +95,11 @@ Pipelines + Other Objects -> Pipe network break return node_connects +/obj/machinery/atmospherics/proc/normalize_cardinal_directions() + if(dir==SOUTH) + setDir(NORTH) + else if(dir==WEST) + setDir(EAST) //this is called just after the air controller sets up turfs /obj/machinery/atmospherics/proc/atmosinit(var/list/node_connects) @@ -93,12 +111,37 @@ Pipelines + Other Objects -> Pipe network if(can_be_node(target, I)) NODE_I = target break - update_icon() +/obj/machinery/atmospherics/proc/setPipingLayer(new_layer) + if(pipe_flags & PIPING_DEFAULT_LAYER_ONLY) + new_layer = PIPING_LAYER_DEFAULT + piping_layer = new_layer + pixel_x = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + pixel_y = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + layer = initial(layer) + ((piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE) + /obj/machinery/atmospherics/proc/can_be_node(obj/machinery/atmospherics/target) - if(target.initialize_directions & get_dir(target,src)) + return connection_check(target, piping_layer) + +//Find a connecting /obj/machinery/atmospherics in specified direction +/obj/machinery/atmospherics/proc/findConnecting(direction, prompted_layer) + for(var/obj/machinery/atmospherics/target in get_step(src, direction)) + if(target.initialize_directions & get_dir(target,src)) + if(connection_check(target, prompted_layer)) + return target + +/obj/machinery/atmospherics/proc/connection_check(obj/machinery/atmospherics/target, given_layer) + if(isConnectable(target, given_layer) && target.isConnectable(src, given_layer) && (target.initialize_directions & get_dir(target,src))) return TRUE + return FALSE + +/obj/machinery/atmospherics/proc/isConnectable(obj/machinery/atmospherics/target, given_layer) + if(isnull(given_layer)) + given_layer = piping_layer + if((target.piping_layer == given_layer) || (target.pipe_flags & PIPING_ALL_LAYER)) + return TRUE + return FALSE /obj/machinery/atmospherics/proc/pipeline_expansion() return nodes @@ -121,14 +164,10 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/replacePipenet() return -/obj/machinery/atmospherics/proc/build_network() - // Called to build a network from this node - return - /obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) if(istype(reference, /obj/machinery/atmospherics/pipe)) var/obj/machinery/atmospherics/pipe/P = reference - qdel(P.parent) + P.destroy_network() var/I = nodes.Find(reference) NODE_I = null update_icon() @@ -137,12 +176,17 @@ Pipelines + Other Objects -> Pipe network return /obj/machinery/atmospherics/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pipe)) //lets you autodrop + var/obj/item/pipe/pipe = W + if(user.dropItemToGround(pipe)) + pipe.setPipingLayer(piping_layer) //align it with us + return TRUE if(istype(W, /obj/item/wrench)) if(can_unwrench(user)) var/turf/T = get_turf(src) if (level==1 && isturf(T) && T.intact) to_chat(user, "You must remove the plating first!") - return 1 + return TRUE var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() add_fingerprint(user) @@ -150,7 +194,7 @@ Pipelines + Other Objects -> Pipe network var/unsafe_wrenching = FALSE var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src]...") if (internal_pressure > 2*ONE_ATMOSPHERE) to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") @@ -195,7 +239,8 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(can_unwrench) - var/obj/item/pipe/stored = new(loc, make_from=src) + var/obj/item/pipe/stored = new(loc, piping_layer, dir, src) + stored.setPipingLayer(piping_layer) if(!disassembled) stored.obj_integrity = stored.max_integrity * 0.5 transfer_fingerprints_to(stored) @@ -226,10 +271,11 @@ Pipelines + Other Objects -> Pipe network if(unconnected & direction) underlays += getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', "pipe_exposed", direction) -/obj/machinery/atmospherics/on_construction(pipe_type, obj_color) +/obj/machinery/atmospherics/on_construction(pipe_type, obj_color, set_layer) if(can_unwrench) add_atom_colour(obj_color, FIXED_COLOUR_PRIORITY) pipe_color = obj_color + setPipingLayer(set_layer) var/turf/T = get_turf(src) level = T.intact ? 2 : 1 atmosinit() @@ -239,18 +285,16 @@ Pipelines + Other Objects -> Pipe network A.addMember(src) build_network() +/obj/machinery/atmospherics/Entered(atom/movable/AM) + if(istype(AM, /mob/living)) + var/mob/living/L = AM + L.ventcrawl_layer = piping_layer + return ..() + /obj/machinery/atmospherics/singularity_pull(S, current_size) - ..() if(current_size >= STAGE_FIVE) deconstruct(FALSE) - - -//Find a connecting /obj/machinery/atmospherics in specified direction -/obj/machinery/atmospherics/proc/findConnecting(direction) - for(var/obj/machinery/atmospherics/target in get_step(src, direction)) - if(target.initialize_directions & get_dir(target,src)) - return target - + return ..() #define VENT_SOUND_DELAY 30 @@ -261,7 +305,7 @@ Pipelines + Other Objects -> Pipe network if(user in buckled_mobs)// fixes buckle ventcrawl edgecase fuck bug return - var/obj/machinery/atmospherics/target_move = findConnecting(direction) + var/obj/machinery/atmospherics/target_move = findConnecting(direction, user.ventcrawl_layer) if(target_move) if(target_move.can_crawl_through()) if(is_type_in_typecache(target_move, GLOB.ventcrawl_machinery)) @@ -271,14 +315,14 @@ Pipelines + Other Objects -> Pipe network var/list/pipenetdiff = returnPipenets() ^ target_move.returnPipenets() if(pipenetdiff.len) user.update_pipe_vision(target_move) - user.loc = target_move + user.forceMove(target_move) user.client.eye = target_move //Byond only updates the eye every tick, This smooths out the movement if(world.time - user.last_played_vent > VENT_SOUND_DELAY) user.last_played_vent = world.time playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3) else if((direction & initialize_directions) || is_type_in_typecache(src, GLOB.ventcrawl_machinery) && can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent - user.forceMove(src.loc) + user.forceMove(loc) user.visible_message("You hear something squeezing through the ducts...","You climb out the ventilation system.") user.canmove = 0 spawn(1) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 45c48726d32..36462a3eb69 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -11,6 +11,7 @@ var/status = 0 var/last_pressure_delta = 0 + pipe_flags = PIPING_ONE_PER_TURF anchored = TRUE density = TRUE diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm index 14495cd237f..8ba105fdb12 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm @@ -5,6 +5,7 @@ use_power = IDLE_POWER_USE device_type = TRINARY layer = GAS_FILTER_LAYER + pipe_flags = PIPING_ONE_PER_TURF var/flipped = FALSE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 9061cce8d9d..9b034b92f84 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -11,6 +11,7 @@ layer = ABOVE_WINDOW_LAYER state_open = FALSE circuit = /obj/item/circuitboard/machine/cryo_tube + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY var/on = FALSE var/autoeject = FALSE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index e17a2f796cc..ee488890416 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -8,6 +8,7 @@ use_power = NO_POWER_USE level = 0 layer = GAS_FILTER_LAYER + pipe_flags = PIPING_ONE_PER_TURF /obj/machinery/atmospherics/components/unary/portables_connector/New() ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index ca60c9bf852..04f1068a000 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -9,6 +9,7 @@ density = TRUE var/gas_type = 0 layer = ABOVE_WINDOW_LAYER + pipe_flags = PIPING_ONE_PER_TURF /obj/machinery/atmospherics/components/unary/tank/New() ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index dc482eda02e..d7bfe1ecb86 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -11,6 +11,7 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 30) layer = OBJ_LAYER circuit = /obj/item/circuitboard/machine/thermomachine + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY var/on = FALSE var/min_temperature = 0 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index a6ac9760e80..f629020d747 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -3,6 +3,7 @@ dir = SOUTH initialize_directions = SOUTH device_type = UNARY + pipe_flags = PIPING_ONE_PER_TURF /obj/machinery/atmospherics/components/unary/SetInitDirections() initialize_directions = dir diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 124caa23bee..72946381626 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -13,19 +13,33 @@ active_power_usage = 4 max_integrity = 150 armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 40, acid = 0) - - -/obj/machinery/meter/Initialize(mapload) - . = ..() - SSair.atmos_machinery += src - if (!target) - target = locate(/obj/machinery/atmospherics/pipe) in loc + var/target_layer = PIPING_LAYER_DEFAULT /obj/machinery/meter/Destroy() SSair.atmos_machinery -= src - src.target = null + target = null return ..() +/obj/machinery/meter/Initialize(mapload, new_piping_layer) + if(!isnull(new_piping_layer)) + target_layer = new_piping_layer + SSair.atmos_machinery += src + if(mapload && !target) + reattach_to_layer() + return ..() + +/obj/machinery/meter/proc/reattach_to_layer() + for(var/obj/machinery/atmospherics/pipe/pipe in loc) + if(pipe.piping_layer == target_layer) + target = pipe + setAttachLayer(pipe.piping_layer) + break + +/obj/machinery/meter/proc/setAttachLayer(var/new_layer) + target_layer = new_layer + pixel_x = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + pixel_y = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + /obj/machinery/meter/process_atmos() if(!target) icon_state = "meterX" @@ -75,7 +89,7 @@ radio_connection.post_signal(src, signal) /obj/machinery/meter/proc/status() - if (src.target) + if (target) var/datum/gas_mixture/environment = target.return_air() if(environment) . = "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)] K ([round(environment.temperature-T0C,0.01)]°C)." @@ -91,23 +105,23 @@ /obj/machinery/meter/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/wrench)) - playsound(src.loc, W.usesound, 50, 1) + playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40*W.toolspeed, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ "You unfasten \the [src].", \ "You hear ratchet.") - new /obj/item/pipe_meter(src.loc) + new /obj/item/pipe_meter(loc) qdel(src) else return ..() /obj/machinery/meter/attack_ai(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/meter/attack_paw(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/meter/attack_hand(mob/user) @@ -129,4 +143,4 @@ /obj/machinery/meter/turf/Initialize() . = ..() - src.target = loc + target = loc diff --git a/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm b/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm index 476235d3d95..51e89950c18 100644 --- a/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm +++ b/code/modules/atmospherics/machinery/pipes/bluespace_pipe.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(bluespace_pipes) /obj/machinery/atmospherics/pipe/bluespace/pipeline_expansion() return ..() + GLOB.bluespace_pipes - src -/obj/machinery/atmospherics/components/pipe/bluespace/hide() +/obj/machinery/atmospherics/pipe/bluespace/hide() update_icon() /obj/machinery/atmospherics/pipe/bluespace/update_icon(showpipe) diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm new file mode 100644 index 00000000000..cc9ef366787 --- /dev/null +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -0,0 +1,135 @@ +/obj/machinery/atmospherics/pipe/layer_manifold + name = "pipe-layer manifold" + icon = 'icons/obj/atmospherics/pipes/manifold.dmi' + icon_state = "manifoldlayer" + desc = "A special pipe to bridge pipe layers with." + dir = SOUTH + initialize_directions = NORTH|SOUTH + pipe_flags = PIPING_ALL_LAYER | PIPING_DEFAULT_LAYER_ONLY | PIPING_CARDINAL_AUTONORMALIZE + piping_layer = PIPING_LAYER_DEFAULT + device_type = 0 + volume = 260 + var/list/front_nodes + var/list/back_nodes + +/obj/machinery/atmospherics/pipe/layer_manifold/Initialize() + front_nodes = list() + back_nodes = list() + return ..() + +/obj/machinery/atmospherics/pipe/layer_manifold/Destroy() + nullifyAllNodes() + return ..() + +/obj/machinery/atmospherics/pipe/layer_manifold/proc/nullifyAllNodes() + var/list/obj/machinery/atmospherics/needs_nullifying = get_all_connected_nodes() + front_nodes = null + back_nodes = null + nodes = list() + for(var/obj/machinery/atmospherics/A in needs_nullifying) + A.disconnect(src) + A.build_network() + +/obj/machinery/atmospherics/pipe/layer_manifold/proc/get_all_connected_nodes() + var/list/obj/machinery/atmospherics/all_connected = list() + for(var/obj/machinery/atmospherics/I in front_nodes) + all_connected[I] = I + for(var/obj/machinery/atmospherics/I in back_nodes) + all_connected[I] = I + for(var/obj/machinery/atmospherics/I in nodes) + all_connected[I] = I + var/list/obj/machinery/atmospherics/returnlist = list() + for(var/obj/machinery/atmospherics/A in all_connected) + returnlist += all_connected[A] + return returnlist + +/obj/machinery/atmospherics/pipe/layer_manifold/update_icon() //HEAVILY WIP FOR UPDATE ICONS!! + layer = (initial(layer) + (PIPING_LAYER_MAX * PIPING_LAYER_LCHANGE)) //This is above everything else. + var/invis = invisibility ? "-f" : "" + icon_state = "[initial(icon_state)][invis]" + cut_overlays() + for(var/obj/machinery/atmospherics/A in front_nodes) + add_attached_image(A) + for(var/obj/machinery/atmospherics/A in back_nodes) + add_attached_image(A) + +/obj/machinery/atmospherics/pipe/layer_manifold/proc/add_attached_image(obj/machinery/atmospherics/A) + var/invis = A.invisibility ? "-f" : "" + if(istype(A, /obj/machinery/atmospherics/pipe/layer_manifold)) + for(var/i = PIPING_LAYER_MIN, i <= PIPING_LAYER_MAX, i++) + var/image/I = getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full_layer_long[invis]", get_dir(src, A), A.pipe_color) + I.pixel_x = (i - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X + I.pixel_y = (i - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y + I.layer = layer - 0.01 + add_overlay(I) + else + var/image/I = getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full_layer_long[invis]", get_dir(src, A), A.pipe_color) + I.pixel_x = A.pixel_x + I.pixel_y = A.pixel_y + I.layer = layer - 0.01 + add_overlay(I) + +/obj/machinery/atmospherics/pipe/layer_manifold/SetInitDirections() + switch(dir) + if(NORTH || SOUTH) + initialize_directions = NORTH|SOUTH + if(EAST || WEST) + initialize_directions = EAST|WEST + +/obj/machinery/atmospherics/pipe/layer_manifold/isConnectable(obj/machinery/atmospherics/target, given_layer) + if(!given_layer) + return TRUE + . = ..() + +/obj/machinery/atmospherics/pipe/layer_manifold/proc/findAllConnections() + front_nodes = list() + back_nodes = list() + var/list/new_nodes = list() + for(var/iter in PIPING_LAYER_MIN to PIPING_LAYER_MAX) + var/obj/machinery/atmospherics/foundfront = findConnecting(dir, iter) + var/obj/machinery/atmospherics/foundback = findConnecting(turn(dir, 180), iter) + front_nodes += foundfront + back_nodes += foundback + if(foundfront && !QDELETED(foundfront)) + new_nodes += foundfront + if(foundback && !QDELETED(foundback)) + new_nodes += foundback + update_icon() + return new_nodes + +/obj/machinery/atmospherics/pipe/layer_manifold/atmosinit() + normalize_cardinal_directions() + findAllConnections() + var/turf/T = loc // hide if turf is not intact + hide(T.intact) + +/obj/machinery/atmospherics/pipe/layer_manifold/setPipingLayer() + piping_layer = PIPING_LAYER_DEFAULT + +/obj/machinery/atmospherics/pipe/layer_manifold/pipeline_expansion() + return get_all_connected_nodes() + +/obj/machinery/atmospherics/pipe/layer_manifold/disconnect(obj/machinery/atmospherics/reference) + if(istype(reference, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/P = reference + P.destroy_network() + while(reference in get_all_connected_nodes()) + if(reference in nodes) + var/I = nodes.Find(reference) + NODE_I = null + if(reference in front_nodes) + var/I = front_nodes.Find(reference) + front_nodes[I] = null + if(reference in back_nodes) + var/I = back_nodes.Find(reference) + back_nodes[I] = null + update_icon() + +/obj/machinery/atmospherics/pipe/layer_manifold/relaymove(mob/living/user, dir) + if(initialize_directions & dir) + return ..() + if((NORTH|EAST) & dir) + user.ventcrawl_layer = Clamp(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + if((SOUTH|WEST) & dir) + user.ventcrawl_layer = Clamp(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + to_chat(user, "You align yourself with the [user.ventcrawl_layer]\th output.") diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm index b5788fa1cc2..5be4b63d885 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold.dm @@ -125,7 +125,7 @@ /obj/machinery/atmospherics/pipe/manifold/orange/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/purple pipe_color=rgb(128,0,182) color=rgb(128,0,182) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 49383a74cbd..cc01e6c4bdb 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -24,6 +24,14 @@ if(oldN) oldN.build_network() +/obj/machinery/atmospherics/pipe/destroy_network() + QDEL_NULL(parent) + +/obj/machinery/atmospherics/pipe/build_network() + if(QDELETED(parent)) + parent = new + parent.build_pipeline(src) + /obj/machinery/atmospherics/pipe/update_icon() //overridden by manifolds if(NODE1&&NODE2) icon_state = "intact[invisibility ? "-f" : "" ]" @@ -51,14 +59,13 @@ /obj/machinery/atmospherics/pipe/return_air() return parent.air -/obj/machinery/atmospherics/pipe/build_network() - if(!parent) - parent = new /datum/pipeline() - parent.build_pipeline(src) - /obj/machinery/atmospherics/pipe/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/device/analyzer)) atmosanalyzer_scan(parent.air, user) + if(istype(W, /obj/item/pipe_meter)) + var/obj/item/pipe_meter/meter = W + user.dropItemToGround(meter) + meter.setAttachLayer(piping_layer) else return ..() @@ -81,9 +88,7 @@ qdel(meter) . = ..() - if(parent && !QDELETED(parent)) - qdel(parent) - parent = null + QDEL_NULL(parent) /obj/machinery/atmospherics/pipe/proc/update_node_icon() for(DEVICE_TYPE_LOOP) diff --git a/code/modules/atmospherics/machinery/pipes/simple.dm b/code/modules/atmospherics/machinery/pipes/simple.dm index 5ac9ac31e6b..e8d82c611c0 100644 --- a/code/modules/atmospherics/machinery/pipes/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/simple.dm @@ -12,10 +12,12 @@ The regular pipe you see everywhere, including bent ones. dir = SOUTH initialize_directions = SOUTH|NORTH + pipe_flags = PIPING_CARDINAL_AUTONORMALIZE device_type = BINARY /obj/machinery/atmospherics/pipe/simple/SetInitDirections() + normalize_cardinal_directions() if(dir in GLOB.diagonals) initialize_directions = dir switch(dir) @@ -24,20 +26,6 @@ The regular pipe you see everywhere, including bent ones. if(EAST,WEST) initialize_directions = EAST|WEST -/obj/machinery/atmospherics/pipe/simple/atmosinit() - normalize_dir() - ..() - -/obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() - if(dir==SOUTH) - setDir(NORTH) - else if(dir==WEST) - setDir(EAST) - -/obj/machinery/atmospherics/pipe/simple/update_icon() - normalize_dir() - ..() - //Colored pipes, use these for mapping /obj/machinery/atmospherics/pipe/simple/general diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 96a5b8e4894..cad15849917 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -45,11 +45,11 @@ /obj/machinery/portable_atmospherics/proc/connect(obj/machinery/atmospherics/components/unary/portables_connector/new_port) //Make sure not already connected to something else if(connected_port || !new_port || new_port.connected_device) - return 0 + return FALSE //Make sure are close enough for a valid connection if(new_port.loc != get_turf(src)) - return 0 + return TRUE //Perform the connection connected_port = new_port @@ -58,7 +58,9 @@ connected_port_parent.reconcile_air() anchored = TRUE //Prevent movement - return 1 + pixel_x = new_port.pixel_x + pixel_y = new_port.pixel_y + return TRUE /obj/machinery/portable_atmospherics/Move() . = ..() @@ -67,11 +69,11 @@ /obj/machinery/portable_atmospherics/proc/disconnect() if(!connected_port) - return 0 + return FALSE anchored = FALSE connected_port.connected_device = null connected_port = null - return 1 + return TRUE /obj/machinery/portable_atmospherics/portableConnectorReturnAir() return air_contents diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2b9cf6b4374..3507063bbe9 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -143,3 +143,5 @@ var/list/can_ride_typecache = list() var/list/mousemove_intercept_objects + + var/ventcrawl_layer = PIPING_LAYER_DEFAULT diff --git a/icons/obj/atmospherics/pipes/manifold.dmi b/icons/obj/atmospherics/pipes/manifold.dmi index 6fe285c74bce33d100731cc7d0015c49577853c1..3e4d218ca6b8b5d228f1f7cf8b3fa9004a9c3be6 100644 GIT binary patch literal 15231 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 literal 23898 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 Date: Mon, 16 Oct 2017 22:48:50 -0700 Subject: [PATCH 15/24] Automatic changelog generation for PR #30972 [ci skip] --- html/changelogs/AutoChangeLog-pr-30972.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-30972.yml diff --git a/html/changelogs/AutoChangeLog-pr-30972.yml b/html/changelogs/AutoChangeLog-pr-30972.yml new file mode 100644 index 00000000000..84bb711df86 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-30972.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - rscadd: "Pipes can now be layered up to 3 layers." From 3772a2cf8e18b79f5bfd62b1538255f146f672de Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 17 Oct 2017 06:58:32 +0000 Subject: [PATCH 16/24] Automatic changelog compile, [ci skip] --- html/changelog.html | 1 + html/changelogs/.all_changelog.yml | 1 + html/changelogs/AutoChangeLog-pr-30972.yml | 4 ---- 3 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-30972.yml diff --git a/html/changelog.html b/html/changelog.html index a75bd91c3f1..0aebb90de35 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -87,6 +87,7 @@
    • Legacy projectiles have been removed. Instead, all projectiles are now PIXEL PROJECTILES!
    • Reflectors can now be at any angle you want. Alt click them to set angle!
    • +
    • Pipes can now be layered up to 3 layers.

    15 October 2017

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 57a53ccbc54..9ad56ea61e4 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -13245,3 +13245,4 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - refactor: Legacy projectiles have been removed. Instead, all projectiles are now PIXEL PROJECTILES! - rscadd: Reflectors can now be at any angle you want. Alt click them to set angle! + - rscadd: Pipes can now be layered up to 3 layers. diff --git a/html/changelogs/AutoChangeLog-pr-30972.yml b/html/changelogs/AutoChangeLog-pr-30972.yml deleted file mode 100644 index 84bb711df86..00000000000 --- a/html/changelogs/AutoChangeLog-pr-30972.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - rscadd: "Pipes can now be layered up to 3 layers." From 4b06c5cd49a279512065a5b9cc185f512dc68a7a Mon Sep 17 00:00:00 2001 From: Mercenaryblue Date: Tue, 17 Oct 2017 04:47:45 -0400 Subject: [PATCH 17/24] Prevent creampie overlays from stacking. (#31750) * creampie fixes prevent stacking creampie overlays. makes cleaning it easier. also fixing the creamy decapitation bug. ( #19701) * optimize * splitting PRs just making sure we have one PR per issue. * Creampie overlay rebalance. make sure we don't get travis on this file. * Prevent creampie stacking newline --- code/modules/food_and_drinks/food/snacks_pie.dm | 6 ++++-- code/modules/mob/living/carbon/human/human.dm | 8 ++++---- code/modules/mob/living/carbon/human/human_defines.dm | 2 ++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index b92c3b38747..977bd60da1e 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -50,7 +50,9 @@ H.adjust_blurriness(1) H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!") playsound(H, "desceration", 50, TRUE) - H.add_overlay(creamoverlay) + if (!H.creamed) // one layer at a time + H.add_overlay(creamoverlay) + H.creamed = TRUE qdel(src) @@ -237,4 +239,4 @@ icon_state = "frostypie" bonus_reagents = list("nutriment" = 4, "vitamin" = 6) tastes = list("mint" = 1, "pie" = 1) - foodtype = GRAIN | FRUIT | SUGAR + foodtype = GRAIN | FRUIT | SUGAR \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 18c431b319c..d76578b4bbd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -691,10 +691,10 @@ /mob/living/carbon/human/wash_cream() - //clean both to prevent a rare bug - cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard")) - cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_human")) - + if(creamed) //clean both to prevent a rare bug + cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard")) + cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_human")) + creamed = FALSE //Turns a mob black, flashes a skeleton overlay //Just like a cartoon! diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 41c5b474e36..bc6890ef3be 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -46,3 +46,5 @@ can_buckle = TRUE buckle_lying = FALSE can_ride_typecache = list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot) + + var/creamed = FALSE //to use with creampie overlays \ No newline at end of file From aac6b076c704ddafa408f4b67edf5d1a6d41be02 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 17 Oct 2017 01:47:48 -0700 Subject: [PATCH 18/24] Automatic changelog generation for PR #31750 [ci skip] --- html/changelogs/AutoChangeLog-pr-31750.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-31750.yml diff --git a/html/changelogs/AutoChangeLog-pr-31750.yml b/html/changelogs/AutoChangeLog-pr-31750.yml new file mode 100644 index 00000000000..0fda2ae9d13 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-31750.yml @@ -0,0 +1,4 @@ +author: "Mercenaryblue" +delete-after: True +changes: + - balance: "it should be far easier to clean out your face from multiple cream pies." From afe2fdfd860f418ab83611fbf49e62e6ce977458 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 17 Oct 2017 01:49:13 -0700 Subject: [PATCH 19/24] Automatic changelog generation for PR #31699 [ci skip] --- html/changelogs/AutoChangeLog-pr-31699.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-31699.yml diff --git a/html/changelogs/AutoChangeLog-pr-31699.yml b/html/changelogs/AutoChangeLog-pr-31699.yml new file mode 100644 index 00000000000..6800b33f5c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-31699.yml @@ -0,0 +1,4 @@ +author: "Improvedname" +delete-after: True +changes: + - tweak: "Reverts katana's to its orginal size being huge" From 51dfbfe03b5dc428094b340266c61b5d3a18a8a3 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Tue, 17 Oct 2017 01:50:17 -0700 Subject: [PATCH 20/24] Fixes vehicles granting projectile immunity and YET AGAIN reworks projectile targetting priorities (#31660) * Update projectile.dm * fixes projectiles --- code/_globalvars/lists/typecache.dm | 2 +- code/modules/mob/mob_helpers.dm | 7 +++- code/modules/projectiles/projectile.dm | 55 +++++++++++++------------- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/code/_globalvars/lists/typecache.dm b/code/_globalvars/lists/typecache.dm index d83c708131e..c6893542a36 100644 --- a/code/_globalvars/lists/typecache.dm +++ b/code/_globalvars/lists/typecache.dm @@ -4,6 +4,6 @@ //Note: typecache can only replace istype if you know for sure the thing is at least a datum. GLOBAL_LIST_INIT(typecache_mob, typecacheof(list(/mob))) - +GLOBAL_LIST_INIT(typecache_machine_or_structure, typecacheof(list(/obj/machinery))|typecacheof(list(/obj/structure))) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index cb086b71156..9447b32daaa 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -6,8 +6,13 @@ /mob/living/carbon/isloyal() for(var/obj/item/implant/mindshield/L in implants) - return 1 + return TRUE +/mob/proc/lowest_buckled_mob() + . = src + if(buckled && ismob(buckled)) + var/mob/Buckled = buckled + . = Buckled.lowest_buckled_mob() /proc/check_zone(zone) if(!zone) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f7357207da5..aaa3a3e6372 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -187,41 +187,42 @@ if(forcedodge) loc = target_turf return FALSE - var/permutation = select_target(A,target_turf) // searches for return value, could be deleted after run so check A isn't null + + var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null if(permutation == -1 || forcedodge)// the bullet passes through a dense object! loc = target_turf if(A) permutated.Add(A) return FALSE + else + var/atom/alt = select_target(A) + if(alt) + if(!prehit(alt)) + return FALSE + alt.bullet_act(src, def_zone) qdel(src) return TRUE -/obj/item/projectile/proc/select_target(atom/A,target_turf) - if((A && A.density && !(A.flags_1 & ON_BORDER_1)) && (istype(A,/obj/machinery) || isturf(A))) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs on that tile. - var/list/mobs_list = list() - var/list/machine_list = list() - for(var/mob/living/L in target_turf) - mobs_list += L - for(var/obj/machinery/m in target_turf) - if(m.density) - machine_list += m - var/permutationbackup - if(isturf(A)) - permutationbackup = A.bullet_act(src, def_zone) // Just in case the turf can deflect bullets - if(mobs_list.len || machine_list.len) - var/atom/movable/selected_target - if(mobs_list.Find(original) || machine_list.Find(original)) - selected_target = original - else if(mobs_list.len) - selected_target = pick(mobs_list) - else - selected_target = pick(machine_list) - if(!prehit(selected_target)) - return FALSE - return selected_target.bullet_act(src, def_zone) - return permutationbackup - else - return A.bullet_act(src, def_zone) + +/obj/item/projectile/proc/select_target(atom/A) //Selects another target from a wall if we hit a wall. + if(!A || !A.density || (A.flags_1 & ON_BORDER_1) || ismob(A)) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs or machines/structures on that tile. + return + if(A == original || original in A) + return original + var/list/mob/possible_mobs = typecache_filter_list(A, GLOB.typecache_mob) + var/list/mob/mobs = list() + for(var/i in possible_mobs) + var/mob/M = i + if(M.lying) + continue + mobs += M + var/mob/M = safepick(mobs) + if(M) + return M.lowest_buckled_mob() + var/obj/O = safepick(typecache_filter_list(A, GLOB.typecache_machine_or_structure)) + if(O) + return O + return A /obj/item/projectile/proc/check_ricochet() if(prob(ricochet_chance)) From 243932d48246c90b8ab1c7963f4b9100adf0d96c Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Tue, 17 Oct 2017 09:21:41 -0400 Subject: [PATCH 21/24] Corrects caravan ambush tool speed (#31792) * Corrects caravan ambush tool speed * subtype --- .../RandomRuins/SpaceRuins/caravanambush.dmm | 28 +++---------------- .../ruins/spaceruin_code/caravanambush.dm | 27 ++++++++++++++++++ tgstation.dme | 1 + 3 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 code/modules/ruins/spaceruin_code/caravanambush.dm diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 2f395e4f1c4..58af9d49196 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -735,30 +735,10 @@ /area/ruin/powered) "cu" = ( /obj/structure/closet/crate/secure/engineering, -/obj/item/wrench{ - color = "#ff0000"; - desc = "A prototype of a new wrench design, allegedly the red color scheme makes it go faster."; - name = "experimental wrench"; - toolspeed = 3 - }, -/obj/item/screwdriver{ - color = "#ff0000"; - desc = "A prototype of a new screwdriver design, allegedly the red color scheme makes it go faster."; - name = "experimental screwdriver"; - toolspeed = 3 - }, -/obj/item/wirecutters{ - color = "#ff0000"; - desc = "A prototype of a new wirecutter design, allegedly the red color scheme makes it go faster."; - name = "experimental wirecutters"; - toolspeed = 3 - }, -/obj/item/crowbar/red{ - color = "#ff0000"; - desc = "A prototype of a new crowbar design, allegedly the red color scheme makes it go faster."; - name = "experimental crowbar"; - toolspeed = 3 - }, +/obj/item/wrench/caravan, +/obj/item/screwdriver/caravan, +/obj/item/wirecutters/caravan, +/obj/item/crowbar/red/caravan, /turf/open/floor/mineral/plastitanium, /area/ruin/powered) "cv" = ( diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm new file mode 100644 index 00000000000..8877a693cda --- /dev/null +++ b/code/modules/ruins/spaceruin_code/caravanambush.dm @@ -0,0 +1,27 @@ +//caravan ambush + +/obj/item/wrench/caravan + color = "#ff0000" + desc = "A prototype of a new wrench design, allegedly the red color scheme makes it go faster." + name = "experimental wrench" + toolspeed = 0.3 + +/obj/item/screwdriver/caravan + color = "#ff0000" + desc = "A prototype of a new screwdriver design, allegedly the red color scheme makes it go faster." + name = "experimental screwdriver" + toolspeed = 0.3 + random_color = FALSE + +/obj/item/wirecutters/caravan + color = "#ff0000" + desc = "A prototype of a new wirecutter design, allegedly the red color scheme makes it go faster." + name = "experimental wirecutters" + toolspeed = 0.3 + random_color = FALSE + +/obj/item/crowbar/red/caravan + color = "#ff0000" + desc = "A prototype of a new crowbar design, allegedly the red color scheme makes it go faster." + name = "experimental crowbar" + toolspeed = 0.3 diff --git a/tgstation.dme b/tgstation.dme index 93f59598ffd..09020db1f27 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2075,6 +2075,7 @@ #include "code\modules\ruins\objects_and_mobs\sin_ruins.dm" #include "code\modules\ruins\spaceruin_code\asteroid4.dm" #include "code\modules\ruins\spaceruin_code\bigderelict1.dm" +#include "code\modules\ruins\spaceruin_code\caravanambush.dm" #include "code\modules\ruins\spaceruin_code\crashedclownship.dm" #include "code\modules\ruins\spaceruin_code\crashedship.dm" #include "code\modules\ruins\spaceruin_code\deepstorage.dm" From d985b1c9de9dff5f7c43a6dae73e457a069dc847 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 17 Oct 2017 06:21:44 -0700 Subject: [PATCH 22/24] Automatic changelog generation for PR #31792 [ci skip] --- html/changelogs/AutoChangeLog-pr-31792.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-31792.yml diff --git a/html/changelogs/AutoChangeLog-pr-31792.yml b/html/changelogs/AutoChangeLog-pr-31792.yml new file mode 100644 index 00000000000..b9d1ba0556b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-31792.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "The tools on the Caravan Ambush space ruin have had their speeds corrected." From 47270fe3bfc9c3293d5e2c39fbcff5fcc894fb54 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sun, 15 Oct 2017 20:36:28 -0400 Subject: [PATCH 23/24] Corrects soil description --- code/modules/hydroponics/hydroponics.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index a0b26718d55..5dd9627c2d1 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -913,6 +913,7 @@ /////////////////////////////////////////////////////////////////////////////// /obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! name = "soil" + desc = "A patch of dirt." icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "soil" circuit = null From 55c8650d4b1d9bfc5b75ea3159e3cf2c8ffb6f8c Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 17 Oct 2017 07:19:08 -0700 Subject: [PATCH 24/24] Automatic changelog generation for PR #31800 [ci skip] --- html/changelogs/AutoChangeLog-pr-31800.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-31800.yml diff --git a/html/changelogs/AutoChangeLog-pr-31800.yml b/html/changelogs/AutoChangeLog-pr-31800.yml new file mode 100644 index 00000000000..fe4674e8bb9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-31800.yml @@ -0,0 +1,4 @@ +author: "DaxDupont" +delete-after: True +changes: + - bugfix: "Fixes automatic fire on guns."