From 9e3925b56b296fc0cfcb6ba9cf3e3bc606222f39 Mon Sep 17 00:00:00 2001 From: Razharas Date: Tue, 4 Mar 2014 06:59:07 +0400 Subject: [PATCH 001/310] Changing plasma back --- code/controllers/supply_shuttle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/supply_shuttle.dm b/code/controllers/supply_shuttle.dm index 2b401a431a3..bd77fd789dd 100644 --- a/code/controllers/supply_shuttle.dm +++ b/code/controllers/supply_shuttle.dm @@ -121,7 +121,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle var/points_per_process = 1 var/points_per_slip = 2 var/points_per_crate = 5 - var/plasma_per_point = 0.2 //5 points per plasma sheet due to increased rarity + var/plasma_per_point = 5 // 2 plasma for 1 point var/centcom_message = "" // Remarks from Centcom on how well you checked the last order. // Unique typepaths for unusual things we've already sent CentComm, associated with their potencies var/list/discoveredPlants = list() From d94808f10948e44fa531c75f53751a3a803f37d5 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 1 Jul 2015 13:57:22 -0400 Subject: [PATCH 002/310] Changes it to Announcement and keeps it ... open ended to clearly define that there is no "X wins by this point". Also had to fix 214 because 'bad name'.... I'm not sure why, Based Byond strikes again. --- code/game/gamemodes/malfunction/malfunction.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 6d0feda4a1e..40bc7104518 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -117,8 +117,7 @@ /datum/game_mode/malfunction/proc/capture_the_station() - world << "The AI has accessed the station's Core Files!" - world << "It has fully taken control of all of [station_name()]'s systems." + minor_announce("The Intelligence Unit has accessed the core files!", null, 'sound/AI/aimalf.ogg', "Priority") to_nuke_or_not_to_nuke = 1 for(var/datum/mind/AI_mind in malf_ai) @@ -212,7 +211,7 @@ /datum/game_mode/malfunction/proc/ai_win() set category = "Malfunction" set name = "Explode" - set desc = "Activates the self-destruct device on [world.name]." + set desc = "Activates the self-destruct device on the station." if (!ticker.mode:to_nuke_or_not_to_nuke) return ticker.mode:to_nuke_or_not_to_nuke = 0 From 5d6cd1b235e14b9f13384fe52f3a504df18405d0 Mon Sep 17 00:00:00 2001 From: Liam Date: Thu, 23 Jul 2015 12:30:36 -0400 Subject: [PATCH 003/310] Revert "Changes it to Announcement and keeps it ..." This reverts commit 786ceee2e4f7dc703f06f63786975d430a77b203. --- code/game/gamemodes/malfunction/malfunction.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 40bc7104518..6d0feda4a1e 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -117,7 +117,8 @@ /datum/game_mode/malfunction/proc/capture_the_station() - minor_announce("The Intelligence Unit has accessed the core files!", null, 'sound/AI/aimalf.ogg', "Priority") + world << "The AI has accessed the station's Core Files!" + world << "It has fully taken control of all of [station_name()]'s systems." to_nuke_or_not_to_nuke = 1 for(var/datum/mind/AI_mind in malf_ai) @@ -211,7 +212,7 @@ /datum/game_mode/malfunction/proc/ai_win() set category = "Malfunction" set name = "Explode" - set desc = "Activates the self-destruct device on the station." + set desc = "Activates the self-destruct device on [world.name]." if (!ticker.mode:to_nuke_or_not_to_nuke) return ticker.mode:to_nuke_or_not_to_nuke = 0 From 407641a2c1a05a62341a74e0a2e06f6b3f67067a Mon Sep 17 00:00:00 2001 From: Steelpoint Date: Fri, 24 Jul 2015 16:09:42 +0800 Subject: [PATCH 004/310] DSProposedChange --- code/modules/admin/verbs/debug.dm | 2 +- code/modules/clothing/spacesuits/miscellaneous.dm | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index d7497060491..c9027b094c5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1113,7 +1113,7 @@ var/global/list/g_fancy_list_of_types = null M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 2f7f85299e6..6011f9cdf97 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -25,7 +25,7 @@ desc = "That's not red paint. That's real blood." icon_state = "deathsquad" item_state = "deathsquad" - armor = list(melee = 50, bullet = 40, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100) + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 @@ -40,7 +40,7 @@ icon_state = "deathsquad" item_state = "swat_suit" allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals) - armor = list(melee = 50, bullet = 40, laser = 30,energy = 50, bomb = 50, bio = 100, rad = 100) + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) slowdown = 1 strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT @@ -53,7 +53,7 @@ icon_state = "beret_badge" flags = STOPSPRESSUREDMAGE flags_inv = 0 - armor = list(melee = 50, bullet = 40, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100) + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 @@ -68,7 +68,7 @@ flags_inv = 0 w_class = 3 allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals) - armor = list(melee = 50, bullet = 40, laser = 30,energy = 50, bomb = 50, bio = 100, rad = 100) + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) slowdown = 1 strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT From 66db30a73c6777415a0a67c20f52fd2ad3c946d8 Mon Sep 17 00:00:00 2001 From: Steelpoint Date: Fri, 24 Jul 2015 16:11:59 +0800 Subject: [PATCH 005/310] RifleBuff --- code/modules/power/cell.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index b99735503ee..fdbf0e55d66 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -167,7 +167,7 @@ /obj/item/weapon/stock_parts/cell/pulse //80 pulse shots name = "pulse rifle power cell" - maxcharge = 16000 + maxcharge = 4000 rating = 3 chargerate = 1500 From 8740dae264d7ae809c3d952ad929fdfd12ca61ae Mon Sep 17 00:00:00 2001 From: Steelpoint Date: Fri, 24 Jul 2015 16:40:27 +0800 Subject: [PATCH 006/310] Fix --- code/modules/power/cell.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index fdbf0e55d66..c782c24f526 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -167,7 +167,7 @@ /obj/item/weapon/stock_parts/cell/pulse //80 pulse shots name = "pulse rifle power cell" - maxcharge = 4000 + maxcharge = 40000 rating = 3 chargerate = 1500 From fa686dbfef5b6577e603ffbea585907f386b566b Mon Sep 17 00:00:00 2001 From: xxalpha Date: Fri, 24 Jul 2015 10:15:00 +0100 Subject: [PATCH 007/310] Made it possible to emag a cyborg more than once. --- code/modules/mob/living/silicon/robot/robot.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b0e916f11a9..f8dec28231e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -569,7 +569,6 @@ user << "The cover is already unlocked!" return if(opened)//Cover is open - if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice if(wiresexposed) user << "You must close the cover first!" return From 2bf89ef4beff6af6caa595acb1d3d3e8acc3e3de Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sun, 26 Jul 2015 13:49:50 -0500 Subject: [PATCH 008/310] Chameleon Eyewear --- code/game/gamemodes/gang/gang.dm | 9 ++++- code/game/gamemodes/revolution/revolution.dm | 7 ++++ code/modules/clothing/glasses/glasses.dm | 32 +++++++++++++++-- code/modules/clothing/glasses/hud.dm | 9 +++++ html/changelogs/KOR-PR-CHAMELEON.yml | 37 ++++++++++++++++++++ 5 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 html/changelogs/KOR-PR-CHAMELEON.yml diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index b9ee7887e88..d0ea6e9996c 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -106,6 +106,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple" var/obj/item/device/gangtool/gangtool = new(mob) var/obj/item/weapon/pen/gang/T = new(mob) var/obj/item/toy/crayon/spraycan/gang/SC = new(mob,gang) + var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob,gang) var/list/slots = list ( "backpack" = slot_in_backpack, @@ -139,8 +140,14 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple" . += 1 else mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster." - mob.update_icons() + var/where4 = mob.equip_in_one_of_slots(C, slots) + if (!where4) + mob << "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD." + . += 1 + else + mob << "The chameleon security HUD in your [where4] will help you keep track of who is loyalty-implanted, and unable to be recruited." + mob.update_icons() return . diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index c198a583328..3a3f84d4d02 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -128,6 +128,7 @@ var/obj/item/device/flash/T = new(mob) var/obj/item/toy/crayon/spraycan/R = new(mob) + var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob) var/list/slots = list ( "backpack" = slot_in_backpack, @@ -137,10 +138,16 @@ "right hand" = slot_r_hand, ) var/where = mob.equip_in_one_of_slots(T, slots) + var/where2 = mob.equip_in_one_of_slots(C, slots) mob.equip_in_one_of_slots(R,slots) mob.update_icons() + if (!where2) + mob << "The Syndicate were unfortunately unable to get you chameleon security HUD." + else + mob << "The chameleon security HUD in your [where] will help you keep track of who is loyalty-implanted, and unable to be recruited." + if (!where) mob << "The Syndicate were unfortunately unable to get you a flash." else diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 48735b7a688..d9048033175 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -188,12 +188,14 @@ ..() /obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete - name = "Optical Meson Scanner" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." - icon_state = "meson" + name = "Chameleon Thermals" + desc = "A pair of thermal optic goggles with an onboard chameleon generator. Toggle to disguise." origin_tech = "magnets=3;syndicate=4" flash_protect = -1 +/obj/item/clothing/glasses/thermal/syndi/attack_self(mob/user) + chameleon(user) + /obj/item/clothing/glasses/thermal/monocle name = "Thermoncle" desc = "A monocle thermal." @@ -230,3 +232,27 @@ icon_state = "redglasses" item_state = "redglasses" + +/obj/item/clothing/glasses/proc/chameleon(var/mob/user) + var/list/glasses_types = typesof(/obj/item/clothing/glasses) - src.type - /obj/item/clothing/glasses/hud - /obj/item/clothing/glasses/night/shadowling - /obj/item/clothing/glasses/hud/toggle - /obj/item/clothing/glasses + var/list/glasses = list() + + // Generate them into a list + for(var/glasses_type in glasses_types) + var/obj/item/clothing/glasses/S = new glasses_type + glasses[capitalize(S.name)] = S + + var/list/show_glasses = list("EXIT" = null) + sortList(glasses) // the list that will be shown to the user to pick from + + var/input_glasses = input(user, "Choose a piece of eyewear to disguise as.", "Choose glasses style.") in show_glasses + + if(user && src in user.contents) + + var/obj/item/clothing/glasses/chosen_glasses = glasses[capitalize(input_glasses)] + + if(chosen_glasses) + name = chosen_glasses.name + icon_state = chosen_glasses.icon_state + item_state = chosen_glasses.item_state + desc = chosen_glasses.desc + diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 0f7365a3417..c6ac3201107 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -46,6 +46,15 @@ icon_state = "securityhud" hud_type = DATA_HUD_SECURITY_ADVANCED +/obj/item/clothing/glasses/hud/security/chameleon + name = "Chamleon Security HUD" + desc = "A stolen security HUD integrated with Syndicate chameleon technology. Toggle to disguise the HUD. Provides flash protection." + flash_protect = 1 + +/obj/item/clothing/glasses/hud/security/chameleon/attack_self(mob/user) + chameleon(user) + + /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch name = "Eyepatch HUD" desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball." diff --git a/html/changelogs/KOR-PR-CHAMELEON.yml b/html/changelogs/KOR-PR-CHAMELEON.yml new file mode 100644 index 00000000000..01af414b942 --- /dev/null +++ b/html/changelogs/KOR-PR-CHAMELEON.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Kor + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Revheads and Gang leaders now spawn with chameleon security HUDs, for keeping track of loyalty implanted crew." + - rscadd: "Syndicate thermals now have a chameleon function as well, allowing you to disguise the goggles to match your job." From 488ecf1a51c5a6b313fb24bc712d637f1c425146 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sun, 26 Jul 2015 13:58:05 -0500 Subject: [PATCH 009/310] Typo --- code/game/gamemodes/revolution/revolution.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 3a3f84d4d02..3877c24af26 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -146,7 +146,7 @@ if (!where2) mob << "The Syndicate were unfortunately unable to get you chameleon security HUD." else - mob << "The chameleon security HUD in your [where] will help you keep track of who is loyalty-implanted, and unable to be recruited." + mob << "The chameleon security HUD in your [where2] will help you keep track of who is loyalty-implanted, and unable to be recruited." if (!where) mob << "The Syndicate were unfortunately unable to get you a flash." From 485203efc53c589e8527b412dcc7f4b06820099c Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sun, 26 Jul 2015 16:14:56 -0500 Subject: [PATCH 010/310] typo --- code/game/gamemodes/revolution/revolution.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 3877c24af26..81434d27969 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -144,7 +144,7 @@ mob.update_icons() if (!where2) - mob << "The Syndicate were unfortunately unable to get you chameleon security HUD." + mob << "The Syndicate were unfortunately unable to get you a chameleon security HUD." else mob << "The chameleon security HUD in your [where2] will help you keep track of who is loyalty-implanted, and unable to be recruited." From ccbb9c1e5207c3547268d15f0b6b0fff55d4c5a8 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sun, 26 Jul 2015 16:38:00 -0500 Subject: [PATCH 011/310] Redid chameleon proc --- code/modules/clothing/glasses/glasses.dm | 68 +++++++++++++++++------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index d9048033175..92645f50a67 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -234,25 +234,53 @@ /obj/item/clothing/glasses/proc/chameleon(var/mob/user) - var/list/glasses_types = typesof(/obj/item/clothing/glasses) - src.type - /obj/item/clothing/glasses/hud - /obj/item/clothing/glasses/night/shadowling - /obj/item/clothing/glasses/hud/toggle - /obj/item/clothing/glasses - var/list/glasses = list() - - // Generate them into a list - for(var/glasses_type in glasses_types) - var/obj/item/clothing/glasses/S = new glasses_type - glasses[capitalize(S.name)] = S - - var/list/show_glasses = list("EXIT" = null) + sortList(glasses) // the list that will be shown to the user to pick from - - var/input_glasses = input(user, "Choose a piece of eyewear to disguise as.", "Choose glasses style.") in show_glasses + var/input_glasses = input(user, "Choose a piece of eyewear to disguise as.", "Choose glasses style.") as null|anything in list("Sunglasses", "Medical HUD", "Mesons", "Science Goggles", "Glasses", "Security Sunglasses","Eyepatch","Welding","Gar") if(user && src in user.contents) - - var/obj/item/clothing/glasses/chosen_glasses = glasses[capitalize(input_glasses)] - - if(chosen_glasses) - name = chosen_glasses.name - icon_state = chosen_glasses.icon_state - item_state = chosen_glasses.item_state - desc = chosen_glasses.desc - + switch(input_glasses) + if("Sunglasses") + desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes." + name = "sunglasses" + icon_state = "sun" + item_state = "sunglasses" + if("Medical HUD") + name = "Health Scanner HUD" + desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." + icon_state = "healthhud" + item_state = "healthhud" + if("Mesons") + name = "Optical Meson Scanner" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + icon_state = "meson" + item_state = "meson" + if("Science Goggles") + name = "Science Goggles" + desc = "A pair of snazzy goggles used to protect against chemical spills." + icon_state = "purple" + item_state = "glasses" + if("Glasses") + name = "Prescription Glasses" + desc = "Made by Nerd. Co." + icon_state = "glasses" + item_state = "glasses" + if("Security Sunglasses") + name = "HUDSunglasses" + desc = "Sunglasses with a HUD." + icon_state = "sunhud" + item_state = "sunglasses" + if("Eyepatch") + name = "eyepatch" + desc = "Yarr." + icon_state = "eyepatch" + item_state = "eyepatch" + if("Welding") + name = "welding goggles" + desc = "Protects the eyes from welders; approved by the mad scientist association." + icon_state = "welding-g" + item_state = "welding-g" + if("Gar") + desc = "Just who the hell do you think I am?!" + name = "gar glasses" + icon_state = "gar" + item_state = "gar" + From 3dca22808842c8e7024c08acbcf4eff2b32a67eb Mon Sep 17 00:00:00 2001 From: Miauw Date: Wed, 29 Jul 2015 18:02:13 +0200 Subject: [PATCH 012/310] i ded pls nerf --- code/datums/spells/touch_attacks.dm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm index cd83738c1f7..dc66755da1b 100644 --- a/code/datums/spells/touch_attacks.dm +++ b/code/datums/spells/touch_attacks.dm @@ -1,6 +1,7 @@ -/obj/effect/proc_holder/spell/targeted/touch/ +/obj/effect/proc_holder/spell/targeted/touch var/hand_path = "/obj/item/weapon/melee/touch_attack" var/obj/item/weapon/melee/touch_attack/attached_hand = null + var/refund_coeff = 1 //how much of their charge they get back. invocation_type = "none" //you scream on connecting, not summoning include_user = 1 range = -1 @@ -8,7 +9,7 @@ /obj/effect/proc_holder/spell/targeted/touch/Click(mob/user = usr) if(attached_hand) qdel(attached_hand) - charge_counter = charge_max + charge_counter = round(charge_max * refund_coeff, 1) attached_hand = null user << "You draw the power out of your hand." return 0 @@ -48,6 +49,7 @@ name = "Disintegrate" desc = "This spell charges your hand with vile energy that can be used to violently explode victims." hand_path = "/obj/item/weapon/melee/touch_attack/disintegrate" + refund_coeff = .66 school = "evocation" charge_max = 600 @@ -56,6 +58,15 @@ action_icon_state = "gib" +/obj/effect/proc_holder/spell/targeted/touch/disintegrate/cast(list/targets) + for(var/mob/living/carbon/user in targets) + visible_message("[user] starts gathering destructive energy...", "You start gathering destructive energy...") + playsound(user.loc, 'sound/magic/Ethereal_Exit.ogg', 50, 1) + if(!do_after(user, 15)) + return 0 + visible_message("[user] channels a large amount of destructive energy to his hand!", "You channel a large amount of destructive energy to his hand!") + ..() + /obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone name = "Flesh to Stone" desc = "This spell charges your hand with the power to turn victims into inert statues for a long period of time." From 8403681d5eaab39cf53040520884d08e51b30ada Mon Sep 17 00:00:00 2001 From: Miauw Date: Wed, 29 Jul 2015 18:20:39 +0200 Subject: [PATCH 013/310] >tfw i cant even make functional nerfs --- code/datums/spells/touch_attacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm index dc66755da1b..9f69c3bd2a4 100644 --- a/code/datums/spells/touch_attacks.dm +++ b/code/datums/spells/touch_attacks.dm @@ -49,7 +49,7 @@ name = "Disintegrate" desc = "This spell charges your hand with vile energy that can be used to violently explode victims." hand_path = "/obj/item/weapon/melee/touch_attack/disintegrate" - refund_coeff = .66 + refund_coeff = 0.66 school = "evocation" charge_max = 600 From f6abc54eb877ee6f5331d6763d2d4901718b963c Mon Sep 17 00:00:00 2001 From: PatchouliKnowledge Date: Fri, 7 Aug 2015 03:28:00 +0300 Subject: [PATCH 014/310] Lockers dump their contents if molten by alien acid --- code/game/objects/effects/aliens.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 1c00feff64c..0965a45e74c 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -476,6 +476,11 @@ if(ticks >= target_strength) target.visible_message("[target] collapses under its own weight into a puddle of goop and undigested debris!") + if(istype(target, /obj/structure/closet)) + var/obj/structure/closet/T = target + T.dump_contents() + qdel(target) + if(istype(target, /turf/simulated/wall)) var/turf/simulated/wall/W = target W.dismantle_wall(1) From 1c51550559b465d1a9dbc1c947662c0ab6ab0965 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sat, 8 Aug 2015 21:43:30 +0200 Subject: [PATCH 015/310] Changes how mulebots handle loading mobs. It now buckles them to the bot. You can no longer load objects containing mobs or with mobs buckled to them. You can no longer pass through plastic flaps by getting on a mulebot. Some simplification in mulebot code (buzzing sound code) Loading is now instantaneous and the mode BOT_LOADING is removed. The mulebot can no longer do certain stuff while off. Removing unneeded comments. Fixes mulebot loading/unloading being possible through border windows. Fixes mulebot not dropping its loaded cargo when qdel'd (wasn't a problem for explosion but for alien acid for example) --- code/game/machinery/bots/bots.dm | 15 +- code/game/machinery/bots/mulebot.dm | 219 ++++++++++++++++------------ code/game/objects/buckling.dm | 2 +- 3 files changed, 135 insertions(+), 101 deletions(-) diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 9c6639c3bd7..c7d00e16013 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -70,17 +70,16 @@ #define BOT_MOVING 9 // for clean/floor/med bots, when moving. #define BOT_HEALING 10 // healing people (medbots) #define BOT_RESPONDING 11 // responding to a call from the AI - #define BOT_LOADING 12 // loading/unloading - #define BOT_DELIVER 13 // moving to deliver - #define BOT_GO_HOME 14 // returning to home - #define BOT_BLOCKED 15 // blocked - #define BOT_NAV 16 // computing navigation - #define BOT_WAIT_FOR_NAV 17 // waiting for nav computation - #define BOT_NO_ROUTE 18 // no destination beacon found (or no route) + #define BOT_DELIVER 12 // moving to deliver + #define BOT_GO_HOME 13 // returning to home + #define BOT_BLOCKED 14 // blocked + #define BOT_NAV 15 // computing navigation + #define BOT_WAIT_FOR_NAV 16 // waiting for nav computation + #define BOT_NO_ROUTE 17 // no destination beacon found (or no route) var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \ "Beginning Patrol", "Patrolling", "Summoned by PDA", \ "Cleaning", "Repairing", "Proceeding to work site", "Healing", \ - "Proceeding to AI waypoint", "Loading/Unloading", "Navigating to Delivery Location", "Navigating to Home", \ + "Proceeding to AI waypoint", "Navigating to Delivery Location", "Navigating to Home", \ "Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination") //This holds text for what the bot is mode doing, reported on the remote bot control interface. diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 68643c28cb6..d7ffb7b8405 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -6,6 +6,11 @@ var/global/mulebot_count = 0 + +#define SIGH 0 +#define ANNOYED 1 +#define DELIGHT 2 + /obj/machinery/bot/mulebot name = "\improper MULEbot" desc = "A Multiple Utility Load Effector bot." @@ -22,13 +27,15 @@ var/global/mulebot_count = 0 bot_type = MULE_BOT model = "MULE" blood_DNA = list() + can_buckle = 1 + buckle_lying = 0 suffix = "" var/turf/target // this is turf to navigate to (location of beacon) var/loaddir = 0 // this the direction to unload onto/load from var/home_destination = "" // tag of home beacon - req_access = list(access_cargo) + req_access = list(access_cargo) mode = BOT_IDLE @@ -77,6 +84,28 @@ obj/machinery/bot/mulebot/bot_reset() reached_target = 0 +obj/machinery/bot/mulebot/Move(atom/newloc, direct) + . = ..() + if(buckled_mob) + buckled_mob.buckled = null + if(!buckled_mob.Move(loc, direct)) + loc = buckled_mob.loc //we gotta go back + last_move = buckled_mob.last_move + inertia_dir = last_move + buckled_mob.inertia_dir = last_move + . = 0 + buckled_mob.buckled = src + +obj/machinery/bot/mulebot/Process_Spacemove(movement_dir = 0) + if(buckled_mob) + return buckled_mob.Process_Spacemove(movement_dir) + return ..() + +obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5) + if(mover == buckled_mob) + return 1 + return ..() + // attack by item // emag : lock/unlock, // screwdriver: open/close hatch @@ -183,8 +212,6 @@ obj/machinery/bot/mulebot/bot_reset() switch(mode) if(BOT_IDLE) dat += "Ready" - if(BOT_LOADING) - dat += "[mode_name[BOT_LOADING]]" if(BOT_DELIVER) dat += "[mode_name[BOT_DELIVER]]" if(BOT_GO_HOME) @@ -358,7 +385,7 @@ obj/machinery/bot/mulebot/bot_reset() updateDialog() if("unload") - if(load && mode !=1) + if(load && mode != BOT_HUNT) if(loc == target) unload(loaddir) else @@ -379,7 +406,6 @@ obj/machinery/bot/mulebot/bot_reset() - // returns true if the bot has power /obj/machinery/bot/mulebot/proc/has_power() return !open && cell && cell.charge > 0 && wires.HasPower() @@ -393,66 +419,93 @@ obj/machinery/bot/mulebot/bot_reset() user << "Access denied." return 0 +/obj/machinery/bot/mulebot/proc/buzz(type) + switch(type) + if(SIGH) + visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") + playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + if(ANNOYED) + visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") + playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) + if(DELIGHT) + visible_message("[src] makes a delighted ping!", "You hear a ping.") + playsound(loc, 'sound/machines/ping.ogg', 50, 0) + + // mousedrop a crate to load the bot // can load anything if emagged +/obj/machinery/bot/mulebot/MouseDrop_T(atom/movable/AM, mob/user) -/obj/machinery/bot/mulebot/MouseDrop_T(atom/movable/C, mob/user) - - if(user.stat) + if(user.incapacitated() || user.lying) return - if (!on || !istype(C)|| C.anchored || get_dist(user, src) > 1 || get_dist(src,C) > 1 ) + if (!istype(AM)) return - if(load) - return - - load(C) - + load(AM) // called to load a crate -/obj/machinery/bot/mulebot/proc/load(atom/movable/C) - if(wires.LoadCheck() && !istype(C,/obj/structure/closet/crate)) - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - return // if not emagged, only allow crates to be loaded - - //I'm sure someone will come along and ask why this is here... well people were dragging screen items onto the mule, and that was not cool. - //So this is a simple fix that only allows a selection of item types to be considered. Further narrowing-down is below. - if(!istype(C,/obj/item) && !istype(C,/obj/machinery) && !istype(C,/obj/structure) && !ismob(C)) - return - if(!isturf(C.loc)) //To prevent the loading from stuff from someone's inventory, which wouldn't get handled properly. +/obj/machinery/bot/mulebot/proc/load(atom/movable/AM) + if(load || AM.anchored) return - if(get_dist(C, src) > 1 || load || !on) + if(!isturf(AM.loc)) //To prevent the loading from stuff from someone's inventory or screen icons. return - mode = BOT_LOADING - // if a create, close before loading - var/obj/structure/closet/crate/crate = C - if(istype(crate)) - crate.close() + var/obj/structure/closet/crate/CRATE + if(istype(AM,/obj/structure/closet/crate)) + CRATE = AM + else + if(wires.LoadCheck()) + buzz(SIGH) + return // if not emagged, only allow crates to be loaded - C.loc = loc - sleep(2) - if(C.loc != loc) //To prevent you from going onto more thano ne bot. - return - C.loc = src - load = C + if(CRATE) // if it's a crate, close before loading + CRATE.close() - C.pixel_y += 9 - if(C.layer < layer) - C.layer = layer + 0.1 - overlays += C + if(isobj(AM)) + var/obj/O = AM + if(O.buckled_mob || (locate(/mob) in AM)) //can't load non crates objects with mobs buckled to it or inside it. + buzz(SIGH) + return - if(ismob(C)) - var/mob/M = C - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src + if(isliving(AM)) + if(!buckle_mob(AM)) + return + else + AM.loc = src + AM.pixel_y += 9 + if(AM.layer < layer) + AM.layer = layer + 0.1 + overlays += AM + load= AM mode = BOT_IDLE +/obj/machinery/bot/mulebot/buckle_mob(mob/living/M) + if(M.buckled) + return 0 + var/turf/T = get_turf(src) + density = 0 + var/can_step = step_towards(M, T) + density = 1 + if(!can_step) + return 0 + return ..() + + +/obj/machinery/bot/mulebot/post_buckle_mob(mob/living/M) + if(M == buckled_mob) //post buckling + M.pixel_y = initial(M.pixel_y) + 9 + if(M.layer < layer) + M.layer = layer + 0.1 + + else //post unbuckling + load = null + M.layer = initial(M.layer) + M.pixel_y = initial(M.pixel_y) + + // called to unload the bot // argument is optional direction to unload // if zero, unload at bot's location @@ -460,18 +513,16 @@ obj/machinery/bot/mulebot/bot_reset() if(!load) return - mode = BOT_LOADING + mode = BOT_IDLE + overlays.Cut() - if(ismob(load)) - var/mob/M = load - if(M.client) - M.client.perspective = MOB_PERSPECTIVE - M.client.eye = src - + if(buckled_mob) + unbuckle_mob() + return load.loc = loc - load.pixel_y -= 9 + load.pixel_y = initial(load.pixel_y) load.layer = initial(load.layer) if(dirn) var/turf/T = loc @@ -481,22 +532,7 @@ obj/machinery/bot/mulebot/bot_reset() load = null - // in case non-load items end up in contents, dump every else too - // this seems to happen sometimes due to race conditions - // with items dropping as mobs are loaded - for(var/atom/movable/AM in src) - if(AM == cell || istype(AM , botcard) || AM == Radio) continue - - AM.loc = loc - AM.layer = initial(AM.layer) - AM.pixel_y = initial(AM.pixel_y) - if(ismob(AM)) - var/mob/M = AM - if(M.client) - M.client.perspective = MOB_PERSPECTIVE - M.client.eye = src - mode = BOT_IDLE /obj/machinery/bot/mulebot/call_bot() ..() @@ -536,14 +572,14 @@ obj/machinery/bot/mulebot/bot_reset() if(refresh) updateDialog() /obj/machinery/bot/mulebot/proc/process_bot() - //if(mode) world << "Mode: [mode]" + + if(!on) + return switch(mode) if(BOT_IDLE) // idle icon_state = "mulebot0" return - if(BOT_LOADING) // loading/unloading - return if(BOT_DELIVER,BOT_GO_HOME,BOT_BLOCKED) // navigating to deliver,home, or blocked if(loc == target) // reached target @@ -603,26 +639,22 @@ obj/machinery/bot/mulebot/bot_reset() blockcount++ mode = BOT_BLOCKED if(blockcount == 3) - visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) + buzz(ANNOYED) if(blockcount > 10) // attempt 10 times before recomputing // find new path excluding blocked turf - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + buzz(SIGH) spawn(2) calc_path(next) if(path.len > 0) - visible_message("[src] makes a delighted ping!", "You hear a ping.") - playsound(loc, 'sound/machines/ping.ogg', 50, 0) + buzz(DELIGHT) mode = BOT_BLOCKED mode = BOT_WAIT_FOR_NAV return return else - visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) + buzz(ANNOYED) //world << "Bad turf." mode = BOT_NAV return @@ -641,20 +673,12 @@ obj/machinery/bot/mulebot/bot_reset() if(path.len > 0) blockcount = 0 mode = BOT_BLOCKED - visible_message("[src] makes a delighted ping!", "You hear a ping.") - playsound(loc, 'sound/machines/ping.ogg', 50, 0) + buzz(DELIGHT) else - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + buzz(SIGH) mode = BOT_NO_ROUTE - //if(6) - //world << "Pending path calc." - //if(7) - //world << "No dest / no route." - - return // calculates a path to the current destination @@ -673,6 +697,8 @@ obj/machinery/bot/mulebot/bot_reset() // starts bot moving to current destination /obj/machinery/bot/mulebot/proc/start() + if(!on) + return if(destination == home_destination) mode = BOT_GO_HOME else @@ -683,6 +709,8 @@ obj/machinery/bot/mulebot/bot_reset() // starts bot moving to home // sends a beacon query to find /obj/machinery/bot/mulebot/proc/start_home() + if(!on) + return spawn(0) set_destination(home_destination) mode = BOT_BLOCKED @@ -719,7 +747,7 @@ obj/machinery/bot/mulebot/bot_reset() break else // otherwise, look for crates only AM = locate(/obj/structure/closet/crate) in get_step(loc,loaddir) - if(AM) + if(AM && AM.Adjacent(src)) load(AM) if(report_delivery) speak("Now loading [load] at [get_area(src)].", radio_frequency) @@ -828,5 +856,12 @@ obj/machinery/bot/mulebot/bot_reset() s.start() new /obj/effect/decal/cleanable/oil(loc) - unload(0) qdel(src) + +/obj/machinery/bot/mulebot/Destroy() + unload(0) + return ..() + +#undef SIGH +#undef ANNOYED +#undef DELIGHT \ No newline at end of file diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 0c781f27f9b..21fca6593d0 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -72,7 +72,7 @@ //Wrapper procs that handle sanity and user feedback /obj/proc/user_buckle_mob(mob/living/M, mob/user) - if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat) + if(!user.Adjacent(M) || user.lying || user.incapacitated()) return add_fingerprint(user) From e16c03f01023a17bda9d166723f473e83ddc0130 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sat, 8 Aug 2015 22:10:25 +0200 Subject: [PATCH 016/310] woops, now buckling succeeds if you are on the mulebot's turf. --- code/game/machinery/bots/mulebot.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index d7ffb7b8405..fca41d8291e 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -486,11 +486,12 @@ obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5) if(M.buckled) return 0 var/turf/T = get_turf(src) - density = 0 - var/can_step = step_towards(M, T) - density = 1 - if(!can_step) - return 0 + if(M.loc != T) + density = 0 + var/can_step = step_towards(M, T) + density = 1 + if(!can_step) + return 0 return ..() @@ -802,11 +803,10 @@ obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5) // player on mulebot attempted to move /obj/machinery/bot/mulebot/relaymove(mob/user) - if(user.stat) + if(user.incapacitated()) return if(load == user) unload(0) - return //Update navigation data. Called when commanded to deliver, return home, or a route update is needed... From 831c069404d16d29ec440418514e2c32fccfd9e3 Mon Sep 17 00:00:00 2001 From: MrPerson Date: Tue, 11 Aug 2015 22:19:07 -0700 Subject: [PATCH 017/310] Smooth out gliding so movement isn't (as) jerky Only applies to non-ghost, non-camera mob movement. Scales automatically to any fps and any move delay. Also took this oppurtunity to remove tickcomp because it was USELESS and shit. All the rounding is because of floating point imprecision. round(2.7, 0.9) != 2.7, for example. 2.7 + world.time would wind up being < than world.time 3 ticks later even though they should be equal. --- code/controllers/configuration.dm | 3 --- code/modules/admin/verbs/fps.dm | 6 +---- code/modules/mob/mob_movement.dm | 42 ++++++++++++++++++------------- config/config.txt | 3 --- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c8670e39a3d..947e157b68d 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -37,7 +37,6 @@ var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. var/fps = 10 - var/Tickcomp = 0 var/allow_holidays = 0 //toggles whether holiday-specific content should be used var/hostedby = null @@ -308,8 +307,6 @@ fps = 10 / ticklag if("fps") fps = text2num(value) - if("tickcomp") - Tickcomp = 1 if("automute_on") automute_on = 1 if("comms_key") diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm index b243d3d2259..7e49860b1c9 100644 --- a/code/modules/admin/verbs/fps.dm +++ b/code/modules/admin/verbs/fps.dm @@ -15,11 +15,7 @@ if(alert(src, "You are setting fps to a high value:\n\t[fps] frames-per-second\n\tconfig.fps = [config.fps]","Warning!","Confirm","ABORT-ABORT-ABORT") != "Confirm") return - switch(alert("Enable Tick Compensation?","Tick Comp is currently: [config.Tickcomp]","Enable","Disable")) - if("Enable") config.Tickcomp = 1 - else config.Tickcomp = 0 - - var/msg = "[key_name(src)] has modified world.fps to [fps] and config.Tickcomp to [config.Tickcomp]" + var/msg = "[key_name(src)] has modified world.fps to [fps]" log_admin(msg, 0) message_admins(msg, 0) feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index d65438f65e7..35b7549a45f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -136,12 +136,6 @@ if(isturf(mob.loc)) - - var/turf/T = mob.loc - move_delay = world.time//set move delay - - move_delay += T.slowdown - if(mob.restrained()) //Why being pulled while cuffed prevents you from moving for(var/mob/M in range(mob, 1)) if(M.pulling == mob) @@ -152,6 +146,13 @@ else M.stop_pulling() + //We are now going to move + moving = 1 + move_delay = 0 + + var/turf/T = mob.loc + move_delay += T.slowdown + switch(mob.m_intent) if("run") if(mob.drowsyness > 0) @@ -159,18 +160,12 @@ move_delay += config.run_speed if("walk") move_delay += config.walk_speed + move_delay += mob.movement_delay() - if(config.Tickcomp) - move_delay -= 1.3 - var/tickcomp = (1 / (world.tick_lag)) * 1.3 - move_delay = move_delay + tickcomp - - //We are now going to move - moving = 1 - //Something with pulling things + //Something with pulling things //This really needs to be redone by someone, NOT ME THOUGH HA HA! if(locate(/obj/item/weapon/grab, mob)) - move_delay = max(move_delay, world.time + 7) + move_delay = max(move_delay, 7) var/list/L = mob.ret_grab() if(istype(L, /list)) if(L.len == 2) @@ -200,6 +195,21 @@ M.animate_movement = 2 return + + var/san_tick_lag = round(world.tick_lag, 0.1) //floating point imprecision means 0.9 != 0.9 + var/rounded = round(move_delay, san_tick_lag) //Round move_delay up to the nearest multiple of tick_lag + if(rounded < move_delay) + rounded += san_tick_lag + move_delay = rounded + + if(move_delay <= 0) + glide_size = 0 + else + glide_size = world.icon_size / move_delay * san_tick_lag //assume icons are square + mob.glide_size = glide_size + + move_delay += (world.time - 0.01) //Floating point imprecision again + if(mob.confused && IsEven(world.time)) step(mob, pick(cardinal)) else @@ -209,8 +219,6 @@ if(mob && .) mob.throwing = 0 - return . - ///Process_Grab() ///Called by client/Move() diff --git a/config/config.txt b/config/config.txt index c40c7cc783f..c9392c7715e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -145,9 +145,6 @@ ALLOW_HOLIDAYS ##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. TICKLAG 0.9 -## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. -TICKCOMP 0 - ## Comment this out to disable automuting #AUTOMUTE_ON From 32294be39cf0cdb4ee8f88e977c810bf8a86f380 Mon Sep 17 00:00:00 2001 From: GunHog Date: Wed, 12 Aug 2015 10:26:09 -0500 Subject: [PATCH 018/310] E.X.P.E.R.I-MENTOR fixes - Removes usage of "busy" var. - Changed message to specify that the machine is already loaded. - Added a check for trying to update tech levels on an item that was deleted. --- code/modules/research/experimentor.dm | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index e57a3762319..28d9d8532b3 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -127,7 +127,9 @@ if(exchange_parts(user, O)) return - default_deconstruction_crowbar(O) + if(panel_open && istype(O, /obj/item/weapon/crowbar)) + default_deconstruction_crowbar(O) + return if(!checkCircumstances(O)) user << "The [O] is not yet valid for the [src] and must be completed!" @@ -138,10 +140,10 @@ if (!linked_console) user << "The [src] must be linked to an R&D console first!" return - if (busy) - user << "The [src] is busy right now." + if (loaded_item) + user << "The [src] is already loaded." return - if (istype(O, /obj/item) && !loaded_item) + if (istype(O, /obj/item)) if(!O.origin_tech) user << "This doesn't seem to have a tech origin!" return @@ -154,7 +156,6 @@ return if(!user.drop_item()) return - busy = 1 loaded_item = O O.loc = src user << "You add the [O.name] to the machine." @@ -544,7 +545,6 @@ spawn(resetTime) icon_state = "h_lathe" - busy = 0 recentlyExperimented = 0 /obj/machinery/r_n_d/experimentor/Topic(href, href_list) @@ -562,7 +562,6 @@ if(D) linked_console = D else if(scantype == "eject") - busy = 0 ejectItem() else if(scantype == "refresh") src.updateUsrDialog() @@ -578,7 +577,7 @@ experiment(dotype,process) use_power(750) if(dotype != FAIL) - if(process.origin_tech) + if(process && process.origin_tech) var/list/temp_tech = ConvertReqString2List(process.origin_tech) for(var/T in temp_tech) linked_console.files.UpdateTech(T, temp_tech[T]) From f598eb63dcebc6ba333a3df081faa42508becb96 Mon Sep 17 00:00:00 2001 From: Dorsisdwarf Date: Thu, 13 Aug 2015 08:59:31 +0100 Subject: [PATCH 019/310] Makes lings undetectable to the AI when using digital camo --- .../gamemodes/changeling/evolution_menu.dm | 1 + .../changeling/powers/digitalcamo.dm | 9 ++-- code/modules/mob/living/life.dm | 49 ++++++++++++------- code/modules/mob/living/living.dm | 5 +- code/modules/mob/mob_defines.dm | 3 ++ html/changelogs/example - Copy.yml | 36 ++++++++++++++ 6 files changed, 79 insertions(+), 24 deletions(-) create mode 100644 html/changelogs/example - Copy.yml diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 9269dc71be1..33de046d3ab 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -388,6 +388,7 @@ var/list/sting_paths if(ishuman(src) || ismonkey(src)) if(mind && mind.changeling) digitalcamo = 0 + digitalinvis = 0 mind.changeling.changeling_speak = 0 mind.changeling.reset() for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index 2404041ae17..13bf62bdbc4 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -1,7 +1,7 @@ /obj/effect/proc_holder/changeling/digitalcamo name = "Digital Camouflage" desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras." - helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny." + helptext = "We cannot be tracked by camera or seen by AI units while using this skill. However, humans looking at us will find us... uncanny." dna_cost = 1 //Prevents AIs tracking you but makes you easily detectable to the human-eye. @@ -9,9 +9,12 @@ if(user.digitalcamo) user << "We return to normal." + user.digitalinvis = 0 else - user << "We distort our form to prevent AI-tracking." - user.digitalcamo = !user.digitalcamo + user << "We distort our form to hide from the AI" + user.digitalcamo = 1 + user.digitalinvis = !user.digitalcamo + feedback_add_details("changeling_powers","CAM") return 1 diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 4d32293c25b..0d5b4cd0444 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -2,6 +2,9 @@ set invisibility = 0 set background = BACKGROUND_ENABLED + if(digitalinvis) + handle_diginvis() //AI becomes unable to see mob + if (notransform) return if(!loc) @@ -66,6 +69,14 @@ /mob/living/proc/handle_chemicals_in_body() return +/mob/living/proc/handle_diginvis() + if(!digitaldisguise) + src.digitaldisguise = image(loc = src) + src.digitaldisguise.override = 1 + for(var/mob/living/silicon/ai/AI in player_list) + AI.client.images |= src.digitaldisguise + + /mob/living/proc/handle_blood() return @@ -138,27 +149,27 @@ if(A.CheckRemoval(src)) A.Remove(src) for(var/obj/item/I in src) - if(I.action_button_name) - if(!I.action) - if(I.action_button_is_hands_free) - I.action = new/datum/action/item_action/hands_free - else - I.action = new/datum/action/item_action - I.action.name = I.action_button_name - I.action.target = I - I.action.Grant(src) - for(var/obj/item/T in I) - if(T.action_button_name && T.action_button_internal) - if(!T.action) - if(T.action_button_is_hands_free) - T.action = new/datum/action/item_action/hands_free - else - T.action = new/datum/action/item_action - T.action.name = T.action_button_name - T.action.target = T - T.action.Grant(src) + give_action_button(I, 1) return +/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0) + if(I.action_button_name) + if(!I.action) + if(istype(I, /obj/item/organ/internal)) + I.action = new/datum/action/organ_action + else if(I.action_button_is_hands_free) + I.action = new/datum/action/item_action/hands_free + else + I.action = new/datum/action/item_action + I.action.name = I.action_button_name + I.action.target = I + I.action.Grant(src) + + if(recursive) + for(var/obj/item/T in I) + give_action_button(I, recursive - 1) + + //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/proc/handle_regular_hud_updates() if(!client) return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 01c4478415b..1df166830e1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -570,7 +570,8 @@ Sorry Giacom. Please don't be mad :( else stop_pulling() . = ..() - if ((s_active && !( s_active in contents ) )) + if (s_active && !(s_active in contents) && !(s_active.loc in contents)) + // It's ugly. But everything related to inventory/storage is. -- c0 s_active.close(src) for(var/mob/living/simple_animal/slime/M in oview(1,src)) @@ -879,7 +880,7 @@ Sorry Giacom. Please don't be mad :( return 0 if(invisibility || alpha == 0)//cloaked return 0 - if(digitalcamo) + if(digitalcamo || digitalinvis) return 0 // Now, are they viewable by a camera? (This is last because it's the most intensive check) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 265a428ba71..a7b680630fd 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -139,6 +139,9 @@ var/area/lastarea = null var/digitalcamo = 0 // Can they be tracked by the AI? + var/digitalinvis = 0 //Are they ivisible to the AI? + var/image/digitaldisguise = null //what does the AI see instead of them? + var/weakeyes = 0 //Are they vulnerable to flashes? var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics diff --git a/html/changelogs/example - Copy.yml b/html/changelogs/example - Copy.yml new file mode 100644 index 00000000000..e689f73183f --- /dev/null +++ b/html/changelogs/example - Copy.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Dorsidwarf + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Changelings' Digital Camoflague ability now renders them totally invisible to the AI" From 98561a60c1d1354576730eef47e7837f5883dd01 Mon Sep 17 00:00:00 2001 From: Liam Date: Sat, 15 Aug 2015 19:05:05 -0400 Subject: [PATCH 020/310] Moves Cloning Machines/Comps to Medical Section --- .../research/designs/comp_board_designs.dm | 29 ---------- .../research/designs/machine_designs.dm | 30 ++++++++++ tgstation.dme | 58 +++++++++++++++++++ 3 files changed, 88 insertions(+), 29 deletions(-) diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 0f657da38b0..5b99724b022 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -160,35 +160,6 @@ build_path = /obj/item/weapon/circuitboard/robotics category = list("Computer Boards") -/datum/design/clonecontrol - name = "Computer Design (Cloning Machine Console)" - desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." - id = "clonecontrol" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/cloning - category = list("Computer Boards") - -/datum/design/clonepod - name = "Machine Design (Clone Pod)" - desc = "Allows for the construction of circuit boards used to build a Cloning Pod." - id = "clonepod" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/clonepod - category = list("Computer Boards") - -/datum/design/clonescanner - name = "Machine Design (Cloning Scanner)" - desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." - id = "clonescanner" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/clonescanner - category = list("Computer Boards") /datum/design/arcadebattle name = "Computer Design (Battle Arcade Machine)" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 75202c87387..c62281d10d7 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -142,6 +142,36 @@ build_path = /obj/item/weapon/circuitboard/chem_heater category = list ("Medical Machinery") +/datum/design/clonecontrol + name = "Computer Design (Cloning Machine Console)" + desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." + id = "clonecontrol" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/cloning + category = list("Medical Machinery") + +/datum/design/clonepod + name = "Machine Design (Clone Pod)" + desc = "Allows for the construction of circuit boards used to build a Cloning Pod." + id = "clonepod" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/clonepod + category = list("Medical Machinery") + +/datum/design/clonescanner + name = "Machine Design (Cloning Scanner)" + desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." + id = "clonescanner" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/clonescanner + category = list("Medical Machinery") + /datum/design/biogenerator name = "Machine Design (Biogenerator Board)" desc = "The circuit board for a biogenerator." diff --git a/tgstation.dme b/tgstation.dme index 7677d19fc8f..52812a0252d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6,6 +6,64 @@ // BEGIN_FILE_DIR #define FILE_DIR . +#define FILE_DIR "code" +#define FILE_DIR "code/modules" +#define FILE_DIR "code/modules/games" +#define FILE_DIR "code/modules/html_interface" +#define FILE_DIR "code/modules/html_interface/cards" +#define FILE_DIR "code/modules/html_interface/nanotrasen" +#define FILE_DIR "html" +#define FILE_DIR "icons" +#define FILE_DIR "icons/ass" +#define FILE_DIR "icons/effects" +#define FILE_DIR "icons/mecha" +#define FILE_DIR "icons/misc" +#define FILE_DIR "icons/mob" +#define FILE_DIR "icons/mob/inhands" +#define FILE_DIR "icons/obj" +#define FILE_DIR "icons/obj/assemblies" +#define FILE_DIR "icons/obj/atmospherics" +#define FILE_DIR "icons/obj/atmospherics/components" +#define FILE_DIR "icons/obj/atmospherics/pipes" +#define FILE_DIR "icons/obj/clothing" +#define FILE_DIR "icons/obj/doors" +#define FILE_DIR "icons/obj/flora" +#define FILE_DIR "icons/obj/food" +#define FILE_DIR "icons/obj/guns" +#define FILE_DIR "icons/obj/hydroponics" +#define FILE_DIR "icons/obj/machines" +#define FILE_DIR "icons/obj/power_cond" +#define FILE_DIR "icons/obj/smooth_structures" +#define FILE_DIR "icons/obj/smooth_structures/alien" +#define FILE_DIR "icons/pda_icons" +#define FILE_DIR "icons/spideros_icons" +#define FILE_DIR "icons/stamp_icons" +#define FILE_DIR "icons/Testing" +#define FILE_DIR "icons/turf" +#define FILE_DIR "icons/turf/floors" +#define FILE_DIR "icons/turf/walls" +#define FILE_DIR "icons/vending_icons" +#define FILE_DIR "nano" +#define FILE_DIR "nano/images" +#define FILE_DIR "sound" +#define FILE_DIR "sound/AI" +#define FILE_DIR "sound/ambience" +#define FILE_DIR "sound/arcade" +#define FILE_DIR "sound/effects" +#define FILE_DIR "sound/guitar" +#define FILE_DIR "sound/hallucinations" +#define FILE_DIR "sound/items" +#define FILE_DIR "sound/machines" +#define FILE_DIR "sound/magic" +#define FILE_DIR "sound/mecha" +#define FILE_DIR "sound/misc" +#define FILE_DIR "sound/piano" +#define FILE_DIR "sound/spookoween" +#define FILE_DIR "sound/violin" +#define FILE_DIR "sound/voice" +#define FILE_DIR "sound/voice/complionator" +#define FILE_DIR "sound/vox_fem" +#define FILE_DIR "sound/weapons" // END_FILE_DIR // BEGIN_PREFERENCES From 1ee8f0ce10535834429b0007b7c5df0e758b913e Mon Sep 17 00:00:00 2001 From: Liam Date: Sat, 15 Aug 2015 19:05:53 -0400 Subject: [PATCH 021/310] Adds Health Analyzer to Protolathe --- code/modules/research/designs/medical_designs.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 1501167a730..d0568f1b491 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -2,6 +2,17 @@ ////////////Medical Tools//////////////// ///////////////////////////////////////// +/datum/design/healthanalyzer + name = "Health Analyzer" + desc = "A hand-held body scanner able to distinguish vital signs of the subject." + id = "healthanalyzer" + req_tech = list("biotech" = 2, "magnets" = 1, "power" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL = 25, MAT_GLASS = 20) + reliability = 76 + build_path = /obj/item/device/healthanalyzer + category = list("Medical Designs") + /datum/design/mass_spectrometer name = "Mass-Spectrometer" desc = "A device for analyzing chemicals in the blood." From 6d6fcddc67ce59e0208eb986a95ce65d5a959ca9 Mon Sep 17 00:00:00 2001 From: Liam Date: Sat, 15 Aug 2015 19:15:32 -0400 Subject: [PATCH 022/310] Edits Required Tech --- code/modules/research/designs/medical_designs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index d0568f1b491..fdad0d5102d 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -6,7 +6,7 @@ name = "Health Analyzer" desc = "A hand-held body scanner able to distinguish vital signs of the subject." id = "healthanalyzer" - req_tech = list("biotech" = 2, "magnets" = 1, "power" = 1) + req_tech = list("biotech" = 1, "magnets" = 1) build_type = PROTOLATHE materials = list(MAT_METAL = 25, MAT_GLASS = 20) reliability = 76 From b130f4958d98a6f37f96d2c21093dc678deccb1d Mon Sep 17 00:00:00 2001 From: MrPerson Date: Sat, 15 Aug 2015 22:28:42 -0700 Subject: [PATCH 023/310] Simplify the math a bit on gliding Rounding now happens after calculations instead of before. The delay is also unrounded. --- code/modules/mob/mob_movement.dm | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 35b7549a45f..e7eee30eb35 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -195,20 +195,13 @@ M.animate_movement = 2 return - - var/san_tick_lag = round(world.tick_lag, 0.1) //floating point imprecision means 0.9 != 0.9 - var/rounded = round(move_delay, san_tick_lag) //Round move_delay up to the nearest multiple of tick_lag - if(rounded < move_delay) - rounded += san_tick_lag - move_delay = rounded - - if(move_delay <= 0) - glide_size = 0 - else - glide_size = world.icon_size / move_delay * san_tick_lag //assume icons are square + var/ticks = Ceiling(move_delay / world.tick_lag) + if(ticks <= 0) + ticks = 1 + glide_size = world.icon_size / ticks //assume icons are square mob.glide_size = glide_size - move_delay += (world.time - 0.01) //Floating point imprecision again + move_delay += world.time - 0.0001 //Ensure we're on the right tick even if there's rounding errors if(mob.confused && IsEven(world.time)) step(mob, pick(cardinal)) From efb5226784967bbc5d64bb12d75398abc216c6cb Mon Sep 17 00:00:00 2001 From: Miauw Date: Sun, 16 Aug 2015 11:45:32 +0200 Subject: [PATCH 024/310] ayy lmao i forgot that pens overwrite attack() --- code/modules/paperwork/pen.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index d62a13018ed..9ba8bec513b 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -48,13 +48,16 @@ if(!istype(M)) return - if(M.can_inject(user, 1)) + if(M.can_inject(user, 1) && force == initial(force)) user << "You stab [M] with the pen." if(!stealth) M << "You feel a tiny prick!" . = 1 - add_logs(user, M, "stabbed", src) + add_logs(user, M, "stabbed", src) + + else + ..() /* * Sleepypens @@ -84,6 +87,7 @@ */ /obj/item/weapon/pen/edagger origin_tech = "combat=3;syndicate=5" + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off var/on = 0 /obj/item/weapon/pen/edagger/attack_self(mob/living/user) @@ -99,7 +103,7 @@ user << "[src] can now be concealed." else on = 1 - force = 15 + force = 20 w_class = 3 name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' From f64f1e296729dd67d82086205121700b222009d3 Mon Sep 17 00:00:00 2001 From: Miauw Date: Sun, 16 Aug 2015 12:55:09 +0200 Subject: [PATCH 025/310] Reverts the revert properly instead of unreverting it unproperly. --- code/datums/uplink_item.dm | 6 ++++++ code/modules/paperwork/pen.dm | 24 +++++++++++++----------- html/changelogs/Miauw-edaggers.yml | 7 +++++++ 3 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 html/changelogs/Miauw-edaggers.yml diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index bf1edc9c372..802ce9a2c2e 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -353,6 +353,12 @@ var/list/uplink_items = list() cost = 6 excludefrom = list(/datum/game_mode/nuclear) +/datum/uplink_item/stealthy_weapons/edagger + name = "Energy Dagger" + desc = "A dagger made of energy that looks and functions as a pen when off." + item = /obj/item/weapon/pen/edagger + cost = 2 + /datum/uplink_item/stealthy_weapons/foampistol name = "Toy Gun (with Stun Darts)" desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade darts, to incapacitate a target." diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index e1e38fc0ecf..219449f1228 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -3,6 +3,7 @@ * Pens * Sleepy Pens * Parapens + * Edaggers */ @@ -48,16 +49,17 @@ if(!istype(M)) return - if(M.can_inject(user, 1) && force == initial(force)) - user << "You stab [M] with the pen." - if(!stealth) - M << "You feel a tiny prick!" - . = 1 + if(!force) + if(M.can_inject(user, 1)) + user << "You stab [M] with the pen." + if(!stealth) + M << "You feel a tiny prick!" + . = 1 add_logs(user, M, "stabbed", src) - + else - ..() + . = ..() /* * Sleepypens @@ -99,17 +101,17 @@ hitsound = initial(hitsound) embed_chance = initial(embed_chance) throwforce = initial(throwforce) - playsound(user, 'sound/weapons/saberoff.ogg', 10, 1) + playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) user << "[src] can now be concealed." else on = 1 - force = 20 + force = 18 w_class = 3 name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' - embed_chance = 90 //rule of cool + embed_chance = 100 //rule of cool throwforce = 35 - playsound(user, 'sound/weapons/saberon.ogg', 10, 1) + playsound(user, 'sound/weapons/saberon.ogg', 5, 1) user << "[src] is now active." update_icon() diff --git a/html/changelogs/Miauw-edaggers.yml b/html/changelogs/Miauw-edaggers.yml new file mode 100644 index 00000000000..2de9a6f5b65 --- /dev/null +++ b/html/changelogs/Miauw-edaggers.yml @@ -0,0 +1,7 @@ +#working traitor items are power creep +author: Miauw + +delete-after: True + +changes: + - tweak: "Edaggers actually work now and have been buffed to 18 brute and 2 TC." From 93f61378c33d870a7b078380066803dfa3ddf9e8 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Mon, 17 Aug 2015 04:22:00 +0100 Subject: [PATCH 026/310] Made an overlay system for airlock icons. --- code/game/machinery/doors/airlock.dm | 198 ++++++++++++------ icons/obj/doors/airlocks/centcom/centcom.dmi | Bin 0 -> 4220 bytes icons/obj/doors/airlocks/centcom/overlays.dmi | Bin 0 -> 4028 bytes .../obj/doors/airlocks/external/external.dmi | Bin 0 -> 6166 bytes .../obj/doors/airlocks/external/overlays.dmi | Bin 0 -> 3121 bytes icons/obj/doors/airlocks/hatch/centcom.dmi | Bin 0 -> 4216 bytes .../obj/doors/airlocks/hatch/maintenance.dmi | Bin 0 -> 4647 bytes icons/obj/doors/airlocks/hatch/overlays.dmi | Bin 0 -> 4287 bytes icons/obj/doors/airlocks/highsec/highsec.dmi | Bin 0 -> 4885 bytes icons/obj/doors/airlocks/highsec/overlays.dmi | Bin 0 -> 4531 bytes icons/obj/doors/airlocks/shuttle/overlays.dmi | Bin 0 -> 4023 bytes icons/obj/doors/airlocks/shuttle/shuttle.dmi | Bin 0 -> 5292 bytes icons/obj/doors/airlocks/station/atmos.dmi | Bin 0 -> 4721 bytes icons/obj/doors/airlocks/station/bananium.dmi | Bin 0 -> 3997 bytes icons/obj/doors/airlocks/station/command.dmi | Bin 0 -> 4312 bytes icons/obj/doors/airlocks/station/diamond.dmi | Bin 0 -> 3960 bytes .../doors/airlocks/station/engineering.dmi | Bin 0 -> 4775 bytes icons/obj/doors/airlocks/station/freezer.dmi | Bin 0 -> 3199 bytes icons/obj/doors/airlocks/station/gold.dmi | Bin 0 -> 4007 bytes .../doors/airlocks/station/maintenance.dmi | Bin 0 -> 4690 bytes icons/obj/doors/airlocks/station/medical.dmi | Bin 0 -> 4593 bytes icons/obj/doors/airlocks/station/mining.dmi | Bin 0 -> 4968 bytes icons/obj/doors/airlocks/station/overlays.dmi | Bin 0 -> 6170 bytes icons/obj/doors/airlocks/station/plasma.dmi | Bin 0 -> 4494 bytes icons/obj/doors/airlocks/station/public.dmi | Bin 0 -> 2273 bytes icons/obj/doors/airlocks/station/research.dmi | Bin 0 -> 4636 bytes .../obj/doors/airlocks/station/sandstone.dmi | Bin 0 -> 4046 bytes icons/obj/doors/airlocks/station/science.dmi | Bin 0 -> 4521 bytes icons/obj/doors/airlocks/station/security.dmi | Bin 0 -> 4740 bytes icons/obj/doors/airlocks/station/silver.dmi | Bin 0 -> 3923 bytes icons/obj/doors/airlocks/station/uranium.dmi | Bin 0 -> 4030 bytes icons/obj/doors/airlocks/station/virology.dmi | Bin 0 -> 4710 bytes icons/obj/doors/airlocks/station/wood.dmi | Bin 0 -> 3884 bytes icons/obj/doors/airlocks/station2/glass.dmi | Bin 0 -> 3576 bytes .../obj/doors/airlocks/station2/overlays.dmi | Bin 0 -> 8196 bytes icons/obj/doors/airlocks/vault/overlays.dmi | Bin 0 -> 3356 bytes icons/obj/doors/airlocks/vault/vault.dmi | Bin 0 -> 3709 bytes 37 files changed, 138 insertions(+), 60 deletions(-) create mode 100644 icons/obj/doors/airlocks/centcom/centcom.dmi create mode 100644 icons/obj/doors/airlocks/centcom/overlays.dmi create mode 100644 icons/obj/doors/airlocks/external/external.dmi create mode 100644 icons/obj/doors/airlocks/external/overlays.dmi create mode 100644 icons/obj/doors/airlocks/hatch/centcom.dmi create mode 100644 icons/obj/doors/airlocks/hatch/maintenance.dmi create mode 100644 icons/obj/doors/airlocks/hatch/overlays.dmi create mode 100644 icons/obj/doors/airlocks/highsec/highsec.dmi create mode 100644 icons/obj/doors/airlocks/highsec/overlays.dmi create mode 100644 icons/obj/doors/airlocks/shuttle/overlays.dmi create mode 100644 icons/obj/doors/airlocks/shuttle/shuttle.dmi create mode 100644 icons/obj/doors/airlocks/station/atmos.dmi create mode 100644 icons/obj/doors/airlocks/station/bananium.dmi create mode 100644 icons/obj/doors/airlocks/station/command.dmi create mode 100644 icons/obj/doors/airlocks/station/diamond.dmi create mode 100644 icons/obj/doors/airlocks/station/engineering.dmi create mode 100644 icons/obj/doors/airlocks/station/freezer.dmi create mode 100644 icons/obj/doors/airlocks/station/gold.dmi create mode 100644 icons/obj/doors/airlocks/station/maintenance.dmi create mode 100644 icons/obj/doors/airlocks/station/medical.dmi create mode 100644 icons/obj/doors/airlocks/station/mining.dmi create mode 100644 icons/obj/doors/airlocks/station/overlays.dmi create mode 100644 icons/obj/doors/airlocks/station/plasma.dmi create mode 100644 icons/obj/doors/airlocks/station/public.dmi create mode 100644 icons/obj/doors/airlocks/station/research.dmi create mode 100644 icons/obj/doors/airlocks/station/sandstone.dmi create mode 100644 icons/obj/doors/airlocks/station/science.dmi create mode 100644 icons/obj/doors/airlocks/station/security.dmi create mode 100644 icons/obj/doors/airlocks/station/silver.dmi create mode 100644 icons/obj/doors/airlocks/station/uranium.dmi create mode 100644 icons/obj/doors/airlocks/station/virology.dmi create mode 100644 icons/obj/doors/airlocks/station/wood.dmi create mode 100644 icons/obj/doors/airlocks/station2/glass.dmi create mode 100644 icons/obj/doors/airlocks/station2/overlays.dmi create mode 100644 icons/obj/doors/airlocks/vault/overlays.dmi create mode 100644 icons/obj/doors/airlocks/vault/vault.dmi diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e023131b2f6..1232533800a 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -17,11 +17,15 @@ // Wires for the airlock are located in the datum folder, inside the wires datum folder. +#define AIRLOCK_CLOSED 1 +#define AIRLOCK_CLOSING 2 +#define AIRLOCK_OPEN 3 +#define AIRLOCK_OPENING 4 /obj/machinery/door/airlock name = "airlock" - icon = 'icons/obj/doors/Doorint.dmi' - icon_state = "door_closed" + icon = 'icons/obj/doors/airlocks/station/public.dmi' + icon_state = "closed" var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. var/hackProof = 0 // if 1, this door can't be hacked by the AI @@ -48,49 +52,69 @@ var/obj/item/device/doorCharge/charge = null //If applied, causes an explosion upon opening the door var/detonated = 0 + var/airlock_material = null //material of inner filling; if its an airlock with glass, this should be set to "glass" + var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' + var/list/airlock_overlays = list() + explosion_block = 1 +/obj/machinery/door/airlock/New() + ..() + wires = new(src) + if(src.closeOtherId != null) + spawn (5) + for (var/obj/machinery/door/airlock/A in world) + if(A.closeOtherId == src.closeOtherId && A != src) + src.closeOther = A + break + update_icon() + /obj/machinery/door/airlock/command - icon = 'icons/obj/doors/Doorcom.dmi' + icon = 'icons/obj/doors/airlocks/station/command.dmi' doortype = /obj/structure/door_assembly/door_assembly_com /obj/machinery/door/airlock/security - icon = 'icons/obj/doors/Doorsec.dmi' + icon = 'icons/obj/doors/airlocks/station/security.dmi' doortype = /obj/structure/door_assembly/door_assembly_sec /obj/machinery/door/airlock/engineering - icon = 'icons/obj/doors/Dooreng.dmi' + icon = 'icons/obj/doors/airlocks/station/engineering.dmi' doortype = /obj/structure/door_assembly/door_assembly_eng /obj/machinery/door/airlock/medical - icon = 'icons/obj/doors/Doormed.dmi' + icon = 'icons/obj/doors/airlocks/station/medical.dmi' doortype = /obj/structure/door_assembly/door_assembly_med /obj/machinery/door/airlock/maintenance name = "maintenance access" - icon = 'icons/obj/doors/Doormaint.dmi' + icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' doortype = /obj/structure/door_assembly/door_assembly_mai /obj/machinery/door/airlock/external name = "external airlock" - icon = 'icons/obj/doors/Doorext.dmi' + icon = 'icons/obj/doors/airlocks/external/external.dmi' + overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' doortype = /obj/structure/door_assembly/door_assembly_ext /obj/machinery/door/airlock/glass name = "glass airlock" - icon = 'icons/obj/doors/Doorglass.dmi' + icon = 'icons/obj/doors/airlocks/station2/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' opacity = 0 doortype = /obj/structure/door_assembly/door_assembly_glass glass = 1 + airlock_material = "glass" /obj/machinery/door/airlock/centcom - icon = 'icons/obj/doors/Doorele.dmi' + icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' opacity = 1 doortype = null //(centcom) there's no door assembly sprites for this one. /obj/machinery/door/airlock/vault name = "vault door" - icon = 'icons/obj/doors/vault.dmi' + icon = 'icons/obj/doors/airlocks/vault/vault.dmi' + overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' opacity = 1 doortype = /obj/structure/door_assembly/door_assembly_vault explosion_block = 2 @@ -105,19 +129,21 @@ /obj/machinery/door/airlock/freezer name = "freezer airlock" - icon = 'icons/obj/doors/Doorfreezer.dmi' + icon = 'icons/obj/doors/airlocks/station/freezer.dmi' opacity = 1 doortype = /obj/structure/door_assembly/door_assembly_fre /obj/machinery/door/airlock/hatch name = "airtight hatch" - icon = 'icons/obj/doors/Doorhatchele.dmi' + icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' opacity = 1 doortype = /obj/structure/door_assembly/door_assembly_hatch /obj/machinery/door/airlock/maintenance_hatch name = "maintenance hatch" - icon = 'icons/obj/doors/Doorhatchmaint2.dmi' + icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' + overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' opacity = 1 doortype = /obj/structure/door_assembly/door_assembly_mhatch @@ -437,47 +463,110 @@ About the new airlock wires panel: else return 0 +/obj/machinery/door/airlock/update_icon(state=0) + switch(state) + if(0) + if(density) + state = AIRLOCK_CLOSED + icon_state = "closed" + else + state = AIRLOCK_OPEN + icon_state = "open" + if(AIRLOCK_CLOSED) + icon_state = "closed" + if(AIRLOCK_OPEN) + icon_state = "open" + if(AIRLOCK_CLOSING) + icon_state = "" + if(AIRLOCK_OPENING) + icon_state = "" + set_airlock_overlays(state) -/obj/machinery/door/airlock/update_icon() - if(overlays) overlays.Cut() - if(density) - if(locked && lights) - icon_state = "door_locked" - else - icon_state = "door_closed" - if(p_open || welded || emergency) - overlays = list() +/obj/machinery/door/airlock/proc/set_airlock_overlays(state) + var/image/frame_overlay + var/image/filling_overlay + var/image/lights_overlay + var/image/panel_overlay + var/image/weld_overlay + + switch(state) + if(AIRLOCK_CLOSED) + world << "AIRLOCK_CLOSED" + if(airlock_material) + filling_overlay = get_airlock_overlay("[airlock_material]_closed") + else + filling_overlay = get_airlock_overlay("fill_closed", icon) if(p_open) - overlays += image(icon, "panel_open") + panel_overlay = get_airlock_overlay("panel_closed") if(welded) - overlays += image(icon, "welded") - if(emergency && !locked) - overlays += image(icon, "elights") - else - icon_state = "door_open" + weld_overlay = get_airlock_overlay("welded") + if(lights) + if(locked) + lights_overlay = get_airlock_overlay("lights_bolted") + else if(emergency) + lights_overlay = get_airlock_overlay("lights_emergency") - return + if(AIRLOCK_CLOSING) + frame_overlay = get_airlock_overlay("closing", icon) + if(airlock_material) + filling_overlay = get_airlock_overlay("[airlock_material]_closing") + else + filling_overlay = get_airlock_overlay("fill_closing", icon) + if(lights) + lights_overlay = get_airlock_overlay("lights_closing") + if(p_open) + panel_overlay = get_airlock_overlay("panel_closing") + + if(AIRLOCK_OPEN) + world << "AIRLOCK OPEN" + if(airlock_material) + filling_overlay = get_airlock_overlay("[airlock_material]_open") + else + filling_overlay = get_airlock_overlay("fill_open", icon) + if(p_open) + panel_overlay = get_airlock_overlay("panel_open") + + if(AIRLOCK_OPENING) + world << "AIRLOCK_OPENING" + frame_overlay = get_airlock_overlay("opening", icon) + + if(airlock_material) + filling_overlay = get_airlock_overlay("[airlock_material]_opening") + else + filling_overlay = get_airlock_overlay("fill_opening", icon) + if(lights) + lights_overlay = get_airlock_overlay("lights_opening") + if(p_open) + panel_overlay = get_airlock_overlay("panel_opening") + + overlays.Cut() + if(frame_overlay) + overlays += frame_overlay + frame_overlay.icon_state = frame_overlay.icon_state + if(filling_overlay) + overlays += filling_overlay + filling_overlay.icon_state = filling_overlay.icon_state + if(lights_overlay) + overlays += lights_overlay + lights_overlay.icon_state = lights_overlay.icon_state + if(panel_overlay) + overlays += panel_overlay + panel_overlay.icon_state = panel_overlay.icon_state + if(weld_overlay) + overlays += weld_overlay + +/obj/machinery/door/airlock/proc/get_airlock_overlay(key, icon_file=overlays_file) + if(src.airlock_overlays[key]) + return src.airlock_overlays[key] + src.airlock_overlays[key] = image(icon_file, key) + return src.airlock_overlays[key] /obj/machinery/door/airlock/do_animate(animation) switch(animation) if("opening") - if(overlays) overlays.Cut() - if(p_open) - spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. - flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking - else - flick("door_opening", src) + update_icon(AIRLOCK_OPENING) if("closing") - if(overlays) overlays.Cut() - if(p_open) - flick("o_door_closing", src) - else - flick("door_closing", src) - if("spark") - flick("door_spark", src) - if("deny") - flick("door_deny", src) - return + update_icon(AIRLOCK_CLOSING) /obj/machinery/door/airlock/examine(mob/user) ..() @@ -1067,7 +1156,7 @@ About the new airlock wires panel: return 0 if(charge && !detonated) p_open = 1 - update_icon() + update_icon(AIRLOCK_OPENING) visible_message("[src]'s panel is blown off in a spray of deadly shrapnel!") charge.ex_act(1) detonated = 1 @@ -1135,7 +1224,7 @@ About the new airlock wires panel: if(density) return 1 operating = 1 - do_animate("closing") + update_icon(AIRLOCK_CLOSING) src.layer = 3.1 sleep(5) src.density = 1 @@ -1153,17 +1242,6 @@ About the new airlock wires panel: open() return 1 -/obj/machinery/door/airlock/New() - ..() - wires = new(src) - if(src.closeOtherId != null) - spawn (5) - for (var/obj/machinery/door/airlock/A in world) - if(A.closeOtherId == src.closeOtherId && A != src) - src.closeOther = A - break - - /obj/machinery/door/airlock/proc/prison_open() if(emagged) return src.locked = 0 @@ -1265,4 +1343,4 @@ About the new airlock wires panel: /obj/machinery/door/airlock/HasProximity(atom/movable/AM as mob|obj) for (var/obj/A in contents) A.HasProximity(AM) - return \ No newline at end of file + return diff --git a/icons/obj/doors/airlocks/centcom/centcom.dmi b/icons/obj/doors/airlocks/centcom/centcom.dmi new file mode 100644 index 0000000000000000000000000000000000000000..010cb237ebdb26525b06451cf46b1ad2c8216477 GIT binary patch literal 4220 zcmYjVc{o&W`#)nQg|S7GC25g0O9mm!kSSvu+gK(BSq9nT8)9r_jf!j;O$-KQq--H; z_DZ%ii9(376T*0p@9+0s*Zapg&vl*WIrq6g%l$m}brMWXu5z*qu>%0WiP6_H2gk^R z>j*1&Z_{$>1&5qaOPfGF*PG4(9)5uyzCHjDOwLWwVQ*F7*BjZU34AGwxAMw;0! zu-#Hy>cTNg+T5YfRTjJgJd(Kpz)i;J=~xDn7wqkCoV|+BG#9ePUpjl~%!Nywixs?I z^d6j6z04B&7%isoOQP*g)Nb0I@D5b>2_lwlOG-dRAT?aUMYJ^)W?W?Ud*L*G5*{NP z1$V7SKDdib^6SVPD!b^u?7i2g1GII5mt0qAtn zU8zR~u0y|qfXG?z=FM;bB@nx-OruG-{@IwNM37wXooF7bzhwx#sIJ!Hvn;cMqK@wm znB%f<`Yt(Pn2g26n0HH=#qE%y7GG~~79i|fXZ=!R(%)p^;&S?`!-*%kPQj!U`KH~Y z3)gCv%YB>Bv_S|Ewzn}-($vLpIj*YGDgfk<$czbm;k>`=uzB6> z%{>`JSQXwld`*rN8aq8gXm?aV@xaKIhnmQgwtXj{Z?t)JRZ+Cpij_y%!OkvHorL>P z3x7&&XN#uUM1;7CZ{f>g4GLSEMDKTM;N)?cikxJn*qc+V<6c%P#{0J`M|~xeR1(k$ z-(a+ijIuK0^O?Q1{DiMdo3pGQDmh2mcnpW7BfO6~4F~{!wk69-dI{)wa4kI}pbFnU zoy0iZSUcv^7Gz&b=K#W3?b(rR02ep+1p&B%0DPkJu* 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 hXg~8tm00wQMN7r?X{tssx1knHh literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/centcom/overlays.dmi b/icons/obj/doors/airlocks/centcom/overlays.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4732a22a6244f2ef54ec2187aa2405258d2ce93c GIT binary patch literal 4028 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 DN2qgC literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/external/overlays.dmi b/icons/obj/doors/airlocks/external/overlays.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8ba24cc636e6e04bb0c4417d6949ba8e1cc5c685 GIT binary patch literal 3121 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 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/hatch/centcom.dmi b/icons/obj/doors/airlocks/hatch/centcom.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ffd09d372ae474be5eb5bdc97f7bf0ad41e7af94 GIT binary patch literal 4216 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 bw-t=0YFCQIGc5&#EV7n>TZfQ0`5>3#$k literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/hatch/maintenance.dmi b/icons/obj/doors/airlocks/hatch/maintenance.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9220d499e59196b3510350f2e4ca30cc05680525 GIT binary patch literal 4647 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 Qe|`WRO?{2h+ty+K10j~^r2qf` literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/hatch/overlays.dmi b/icons/obj/doors/airlocks/hatch/overlays.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8cc720dee58c9d24589699f213f7b728cc351749 GIT binary patch literal 4287 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

-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 Z8)hV}T{CD3{O1B$oX4IkI_vuIzW_4g=(7L- literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/highsec/overlays.dmi b/icons/obj/doors/airlocks/highsec/overlays.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d0101bfd7d599ffa97a444b872011a6fc8ae957d GIT binary patch literal 4531 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 H>&^cH7*dbU literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/shuttle/overlays.dmi b/icons/obj/doors/airlocks/shuttle/overlays.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6308aab1a78d6239a28ccfe38fac807e48a085b6 GIT binary patch literal 4023 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 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/atmos.dmi b/icons/obj/doors/airlocks/station/atmos.dmi new file mode 100644 index 0000000000000000000000000000000000000000..85e5f3c1094c5d227ca0cfb7492af6effc133081 GIT binary patch literal 4721 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 G>Hh(LhG!rE literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/bananium.dmi b/icons/obj/doors/airlocks/station/bananium.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2183a376f60859bf6ee6328b10da5d8639d55120 GIT binary patch literal 3997 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 udxJSP`Z1%d&cwDO1zg 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 a2huf}e`34;TR!Jk8Zbhb>Q`QIj{Fboxyb+k literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/engineering.dmi b/icons/obj/doors/airlocks/station/engineering.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1f77793bce0580cf9e240e139016a29d595bfa2c GIT binary patch literal 4775 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 YPWkfv3-|mff1UtcZ9}axO~;r21Csh}%K!iX literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/freezer.dmi b/icons/obj/doors/airlocks/station/freezer.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5aacef29f717435c308397658cd130e2a3e22852 GIT binary patch literal 3199 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 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/medical.dmi b/icons/obj/doors/airlocks/station/medical.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cb10aca0763303be2b7270a0fb8988dcc85115e1 GIT binary patch literal 4593 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 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/mining.dmi b/icons/obj/doors/airlocks/station/mining.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a46286135683dfc33a78558d5cad5390cbc979bb GIT binary patch literal 4968 zcmZu#c{G&a+kOYxWzQZdOIb$NB)g%-GK{4xGl}d*#2CU%mWU{+FpPa)%bI;lkr2in zvXqP^+sN*F>pSOn&hI;fQ z%b=$PpVpENcHqzuXnxyQ@BTvvAJ+%Iu3l&Wz^0bIXk%=bV}8=#iwIx6l!a)dhzeA6 z>@Yf%Or0s{bt#^ke8kH|({@&0mLcfyaL=dFvbMgnqHwm5C{ZK1(Wr^X#xpA1yv8l! zWHcl=(h;fQ@+yhtNs}cXJ*+SL!}+KIiht7@`#fy&Le$E3N&_A~vF-Kh_R1Vy?n{sV zm%C$L>>VR?e|V`jPRQr^hQ#W5yOU&ZT)&`#l~DdBE!AccXJK=1oU{(9tuAWG{$j`u z030qi^t8>fsjEa!53Wx_AJf%F#>V2_$sqY3-x8XI7Z_)DtC~}>&*OF5BX27fx}JY^ z<@Kgce6(n;nI>#6Tra1Q9 z&m_KFI8OEV>gwc5Umxx{F+E()e>ouSWR1DDLFK^EqcfUY6}WzZgI7rC6kup%9n5B@( zZh$XEf#q!P^z?MnMs-~5s%o$uy2-XVXgskDC2U-eRy@KE;1ApS9p$m;U@_qPkpsUn z`die;C$!SH-@kpkk-OpT2u11RaGEvc#IQ7K&fTr@t=}zv4+b~<>#dyuAh?6?0tZ9R zkn75r?Q?J*>AoF4y|p@7dt>=e)>58qEpl4Za@l6|`EwyP4E?}18RkIOQtU@dspbao zL?LcKgDynxxL@cDB&lz@wJ$C}Oh-+vNE+vCD!3b9U@=?m$vX3)8M;Zl8`A4K0}H(G zY`{(1H)UXr3tn~YCt&>QD57Sg3C|HY&Z6#RSdXLp?a?3>O0{1EkHGTJth}32hX)f2 zGLGej)WBM@%0ayl#`8;gVJnjW-k;U^YqM|MpCTHzH~TP`zzvR^G67*F3+oJmF|w*` zgzt-r;Gu3|j9AOti*>x?QbPsBg%5_`+X(<{)N4V^L#Od_B&g0%abkw=)IPo0P;4SL z*z?pqaW9XPp+}c@=(Ow?_{*gHl=r9Q;(M!Iyfj0# zPIG^4Ur6^(iNcY-*q>sC~yE56S!+a~u4SGl0gG9 zyjExcJ}R7(m%uY#Z$I=*&5J{DrR`fu1{`{S-snGYn`#WA^ zulJq~mcIp9n@4LLeM6pjM*`cFEf446bB!c19jkEG77!R0-7pCV(8J@h>$o6TlcM;N zUp4ZRmE~j4p557Y7G@TwTQ#U=t&S`BQ4~%+(NNrZ@<#51na0C|{hE;X55g*?alFgG zFS4+zW^ZY?O(Kzpy*?z!W4uC4{BJ6=p7M-(5pXkiDfOJ)jvR&NjKJ4#-<~Z?fvLi>27^TrQO-LaWERs;f}{W&5|ZdmvXRA2a& zp^=fcO(o_O{*e0*_D8@F%V@2#{c63K*vuCeTi#EE>fFUvqnM(1CtKq+ArlSPPIPUK z%d4Mjz)2&m5#G;YWA`K@SS>5h7VTF@B-SaFzAftMi=nqeX&hhD2jgv5YW4T?78Gi- z57Y?s#WFMH%g!E1bt3#q`X09w$56j!Vmvt>wnELuM>8^4S3>|=O*JIRlD7;}K-R=K zMcX9Q%Bn#{eUEn8a+ii=##V$xtW zod`|Vm7O#Xs3izo)ZjKb*99=QN}BN=Y|&7@{D{?Wk{qzxQP003aGB>uu9*uOt^e?$ zf}6WL6OX3;ZME0jZLCzv0wj-5aMEv!t#?MNd6n9wr{7OHv=zIDk4DlPX(Aa%0qV#W zZ6Au+5KBUF;v8v@$z|p(hdU6ozA=h*>wy9b`Rus$^exz8JLuSUDAwv;-el?PTZ^8G zo>rf#LnNXzgF8NpvW%P_t_CcQCTf3<0%*mlk^76VoH8EaETw=ZE)7Up;3i~}Hg$S& zd}q8Y(zaGCMsB1(`(gzPdwruPZRV1Gu^h17??#y2ZXWgQ(BWO?8Hh_%4!sg0`llSV zZSAd8tvW$5AYMrc`XEl9Oysd{Q?q$q?U~98Qx#BTrqC5GEx>BfV~W*Ji&acfHjh_c zyL#M|{g_FDZLcl$jjPLll7*Kz=@Qy7?=|=yYpV*pst+kApq<0625kHTBU$y7BMr2=3U>F+3~xNUNm% z<%%5ULca2}YLEaFozZ)WQTHfB@hFhJv}d`4_ZjyECuG%|H)pn4oWBkeT6i4=Zu8xX zP0GYgm9dE6)@`hRhRC^iLpZ6uo(zbJ5BW$2qegVO}Co(z-pKe_v8qX}zY=lDQ ziR?T43eJ9udMEW$Q{0&KJ38`W_60M~^SIGXQ6rQ&-74|tJS<)Qp?ac^n`fB;krWx? z_xlkka7ld!hx7P3?1Qu!o(N=ReLbNnM0p*n2n+0X>Xdkh5JX6&Hhv%w2shD@drj+d z9T$t$>5a|`llHYA&33Qy{OF8zl78cr<`zt~`lnwLdM#m!v9e_6^T~07Z!kW?9W!{+ zJ7kiuhBI}i!Va%2EuFJV*Rt83Z=vdOtj&@vw$tH%+r)YmgE5DY4p8d^ppl>*=v}Gt zn6|6O(JD!|?gXrK2|u?gZ8Dk1mpNU49LEZ&lFV->D+5|ZK_Lo`WhU_Jkt6de;JFP+ z#cJQF7?pr0;JI@44)q<&O)_Zlq0G@rjAQ#W$owKS;Av$LNpQ0+WP0ni?2DPdQG(uszRUmXT`T%4 z=vbt2y~Kp=QBAeDin2G85v4MbI#$Vhn;F@WA4yA<9J@P-dZY1!Gbc|#_|^WagO-EX z=MK2Tsl0FVQpM{>uamVJd6j;b#yB+kK#XU0@7%DhmxN*n9^TEMI673)f+w$7CK0nw zl`buWnWYDwAbxHM)Fw1(JSMOd0a}UuzkdYB6Wjnv0EFyO04gVsABet=kOxQ}aO+n* z52=VOj8Pzabb4v4N9bJsw6G`d9g>zglhSw#$1^r5l&*j2-*1Wi{fN?DsR0?c%@A>T z%iZ_(Xr>O$;HuGLCua#K1eRuT-*e2mdLsSmVCKrAK1M_HV4Rt6ne#(fpJT14AuAHW z@#M%Px!(kgY-cBb^JRR;O97MBu$$?DGEd~(KCZQ#91H%FhU;lVeJMTDpfGGgi^jM9 z`sFgt{z6jO-^r)Px?4y-m^U{*e z9X$c_t|Cn|W_|TnKmgzLFQi$;?Y6e#$77%+O^Na{=XF*+e7hC}B38GWJL*xA!sMjE zOc59mzG6x<-~{g~(LDWLa~JnofkW?0whlxw0d^|iZ$ibMKU7)TUyf#&`ARDGHyte#@0^WY4Tb*44Lq0 zuw$bLu#emK6mBUv4wvWZ_t`ge3m|UcsVEoAVwP`MEhVKX!ibh_rA*Mh!3eWE>vwTRAiU# z`V-DrI5fW0R0!#v7<30DdjEX2WSb#ID5b&m{LQX1l-kv6PJyRa#PW#}iNOV> zrN8`}i(}@0{bE5wokjs;LRh*Gw90Sg3zzE=dSX5Bv~65h+04+z7Z%29CbDW?%8lGy z1TfjNtflqshdOso>NWC%LEYg}@^l_l6sp0-2W`iP{g!(th2}+)iBl`GQC3j(u+g`k z)waDNWI8<4NrNX@;u09itumzB{*&}nj7r^#O)VPsJ8eyH67zjsWqlrollh(#KpvE- z^17Wo1DPS9sJn`0b{kC4$ou26P>G$Empu@e0;(g#-5hgNldlDGdaCA}yu!5Wq;tbr zj={JRm5QnLjQaA7=QR{s8FK!IqQ3;ao;Yt(?chfn0K6sCGYprXJx<9U33PiJW{#bCTQaOX^r)h zOg5zVbTeYo19&^ox7=B>wWS{qA3+%lZK3t3?cZzH+ ztWLa1cJLxyeRuL&aJcr}tBL4q5hg(Lz<8j{=dLxMC?+eKTY?!&^hH}2+wt|Za6Nt{ zfGb{~1%TyTWCoHsYue>a4UNnYT(tNSXSrBJOkrBEOzoE-m>d_8s{0q46Te&c`BU8d zBFbRXFNOwbTzw!4x04WVKux4(f1Wl+g$`sxs*<-!0lTDqMr)Ft2rOp+m@o_^Ukh>z zJ|)Aim2$(2^d?wCLlG-)ws#PHk96^c=%5SWDX#8!R-?K(^b8AIN;f*f!m@$cQ%$&n z5{o32!mV@Cs3Lw`kL-*LP0NC4DXHl9cALUY<+($%6!g`ZP}&B9^nW9ouPY~{WM^co zGl*>6Gc1P%uouW`abMy$Wp^d<*hgQ_{x8g8|2DV(@0F?-hqQgyV!my9>*^zIa`c#n zG@;Sc;FwcHdYKbm+W-B>k|Txt0^o~Vh~>ym>acdE`$uH1>+G&wnvjC6y+TUI++*$8 zh>DO+h!*i*<4mTzBn-szeBK}a3-Jpa)qkyBpvGTKPY(>Hy5oM~c4`0JZ^k)1j7CT( znJWq?(lTS5l8Y!O1ej6-vv<-(q%{D3C>JOUM6NA!hIi6w%}3}USnz7_G848Z6h236 z=2zcMj{p0`X3NwdF&8u;Tm%0YW=gFE<^h1~5l*N%47{C!^ze${uQT8V%vi5X=Wgi# E00Sh#fB*mh literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/overlays.dmi b/icons/obj/doors/airlocks/station/overlays.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0e0b09a6e3ed9230dd5907d55961b673a753b2a3 GIT binary patch literal 6170 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 JrOH+>{|i`{zd`^2 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/plasma.dmi b/icons/obj/doors/airlocks/station/plasma.dmi new file mode 100644 index 0000000000000000000000000000000000000000..20c6a665914d9f71fed6200e664c4405ee63d721 GIT binary patch literal 4494 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 J*0}%re*m#@-QNHJ literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/public.dmi b/icons/obj/doors/airlocks/station/public.dmi new file mode 100644 index 0000000000000000000000000000000000000000..309663224e4ffe4f067374b084b7f6346dda09e2 GIT binary patch literal 2273 zcmYjTdpy%^8{g?QMC7d4W|32-nw-Km%pqr++7q(q@F<7n%rmn^ABRfIAwBOy4cFN_UG8w&67%Nlz{k_RV0078jvZbXZ0)f!i*EcpcrcfwmW@a%lG0cpNqN1V$ zfq~)S;Q^kW9(a6WVq!#aFo8gz#5rYFhO+Nd2>UG1Xte4XMYUUs7!2kp1X2x$2ZR$I zw2&yW7T|jBG^CL!39d)tBjO@y36ZfeAW%vvX&)^vQMgQ^@dXoRUKVCO zFMCOiK|5YyN5{7JdYirg#hpFZYKslT_F?y;O2-O13dksush#m-+ug+6GgzbBwK^u$ z=beA%Y(;Mm~;;$$Rvp4A9=injw-9;FC5;@ot+-S5tmE2n0{}bS02e zO6P;;(uPb_jq;t}WQ7iS_Qmu)lE&8?Ca~`5+fkZ}{FW-UdtL%NAr;WpnwsqPkNl>w zl@wbC2gjgd(oKOgU)R>n2cuDqP%^~S*Nuo{1;Xj+X`Y~^#4L-C8@91XX_B|!)& zYG0hb(x1ud=-e&HezK-ep;-4&4{^!|1&B2CDleU@owy*2>90kv-8j#Q_|R`-U2Z8~ z14V&XxwMF-Nez;QI)T0Ua? z<__7#&0yX+!sqI`!)SkDzQ9WPDv`GN?sz=gJ%HSOJxKrQ37%-sE=f|X#Tr3&9xGQR z23Ry45DX2Se^);v-~>kmiQP#FF$c$|>z|{!dxH78mxx5|yg(H>wUUd#AN!XtTaQXo zoU+Ho4v?dCxuXHEet<~a>M#8!2n)qi&%RS|)jort1IzbEsdDV*LZsg$ZTXo4C{+=) z^8dwi$Ssrn-$IeE!;U)E?nM`(C3_r@aLuPuN8#wnYHcKm>)^uz-`>WIg|J&!z;YNGidN%{GIZh+i9r90{c!Mg} z=1{#0(4!*AfUl@Dk3g@8E|bITa|n!D>7K?6nlw^lM!NAcGJzeE9@aMaDAjTo8#%k~ znRy*tgsia6qy4nsmw{eO^#^biJJukYJCA&yp#+kQuq2t$>-#s(I7=WX2{p)G$;=bW|GcScbKg?DfxcvJ784$cvGM*t-gI$zV-C1(^UQ*oP*030m z(QC7F{qbNFN`7d+(J1sg5`9A{)d>9R5p6SzYu^FGUOo+@GRmculFT<JVBo_hzc_kBl2?p{!cvdc+3LA^ua>y#o z3g{L&Lk(~5LVce@zO_uMoVyDVR^UJP#~X5df62b*8gJ>Mgg1w&cs zIMlV)ziqIHGG4Y2N`~}Fm_&ucTdk~7Jvow9hJ6mU5y4@m;zqB)5AOJR>nuWN0sekr z(`*glgi@mzYzj7DoP^A*54hu{^IHki=$L^g%da{$1xKZ;a78QX?inhjiX+en2m6s; zV%o~K1^CW$j|B%j><}tEct?^V-`oJigUc9UJA$LD%?Y8~Ajzv$u1EoP0iM;y=&xLo zR12Y)$f+8ovR^QN$Nviq__-4Nk3INOTRtQWJu)o}4U6(VZ2_BlFw-mKnuyJUCF z#b`-koERx+n{OV9Sr=)_7)>Csy`oxCY$MklKJ2{3?Tq6cN|m$}Iyl*{46s3zdUH>2 zn%kS)EzD#{TtOKyAxFKF!CXNW8E*3k{j3GinMamO;6}L$J+<~Hp^LLfgQ^ElT<&4> z=l_kV<}fa-D4Zwu+S*3n*FZjS6Adbq*C;vVU=cyK?7ba-{+iV+jqW$~$LQgQ@a^pT x0~WBw*|5WVSl#LrvGL?AZZ>%+x+QT)dM~6aQCxG1EBix$Jc+)p_0H5&{{^D0I>!J2 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/research.dmi b/icons/obj/doors/airlocks/station/research.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d58e46187a8226bd364df55f7e6a42e6961ec2ce GIT binary patch literal 4636 zcmaJ_c|27A*T1qwq*5uqp$I7wrR*NOJv_hWeHh_ zu{R>yFvd2PF=KvLukZ6bujlo=Ue6!*em!gylb;g+0B-HO znug%m3|<+B*}%KGgsmkwR0JA7^wzZZvh_rGcq8210Kh*z=k-_4Z!%obz1>EUB*~9P z4U`K4<=?kBZHq=v=NDI)tdUf?IK!<|{vK2)|9{9t$))d$_eHt3~yBKgHCX`g~L%Mf7?1CR+I!EPIdd-WA0% zH7&gKqnU_$o@XTY?l+YyC%h7hd{8IV5SJXzM8dxsH{qT((I_jj5_@3YVIgJ1P%Cd$^ zlCs}QqgPMud^$mwOlHm@{X}oj_gB*8wtLfeKTLe*flL5M!-B|IKIub%+hiRp;3&^8 zqjeSay~=eQ09tL1SDJGJ9vgGIK=bsp%`YsSMr*kF6rj`TH-V8#=V1md!F{xx6|kh= z*3k0u^;P5xUd}rA&Y!PnyjxjC>@qnQHet<`}w+j ze()*NSds~7Yj00GBzZ+zdSXo*wv zmQV6uBT|&MmPc{xbK9Gn8J|9V+GV_Zcj}6i6ce!0xDCIwR-?!nbx2H1Oh!TBqGg=a zfFYJc_nfq%kA1MWkB`~V@}Jftq3aY-*RY_X(b~m@>;C=w5+^wgZvX}= zSV~uU+lPz{zFkX92;6|)x#Ky_gM9yH$sstnfh1ez`Z@kyPWXopANqX5`SKLkf^ti& zpmM}%z2Wx`_&?N&Chbht{fi5-^UM_mckWCwi>q#AVX?cobwPrV8;0KF(2cEAuLu(@*qE% zmMTIWt*kJ|d2`2}K8vT~^0jl8%yGPohh}CkCSfXMA#_AU1kktTn(y-Ht8X}gZCrf< zF+g$23O(07bv=7p??oXhyY7~Eh$xskIitVz;^eqFM$L`#9sRSsR83Mj+_6ywIlg73f z`AtS0q0<2*Pn-Gpz3&Qu3H^xGC+9-^srlAOw-Z9S@;;5CYOK_S4X-!7u45G(+k`L( zQC~GGta0^_qU+en+T!_uo+lBZRc~oYTGoZ3r`XuoZi~mX4%vUZ|Mp)46dx7>dtI3V@Ata$!}f&!+3E5Ekk#UZHs_>LriW>F zXuZrr)#=V?wNN(rZ_^vWJ04xC6PcOkb@cVG6E82ha%d_W4<9n7KrNYnICdWFHM`^$ z4=%M3o(e^-bz*D<7B(9?tDwIyZ{501A&RWDaCQP>-X`M}nU}JLwt|onN~)#xuI6`b z>0)F3i0^HC4xS9L*3x(L1>K`1kR|yr-Ya5)C_g{*Pyiux@RZxg}@q%OaqfTNpHOWzoVq=&wc;Rz{aCMO(?zY6!UnsJNxTj z{@yRC*WG^=6{W}vPLeMcxETtGf!y0c8ms)|nw8BbsPx3ev2Z5?UroBGU6-ocZQ)iN zP)Olu_-zW8{m>z(_3%N^w(9ol5+3XNIX&v$Hc4cXk&9>P8w#FB``sNDUk%;+Ap#bU zDV6%ysGVjsZee%+hNcTKn z^=;M?&;oFy!_MJj<^*Fp@0sx~?Qx9-MtF1F6lb~~UX$$fD79QIpF*#hU<~fkrrkl` z#@N&cbhad>%g0<1ozx8cwniBv%i~S2exus0aiGS?YYJCHj%kdv?K-kZ1-LYHy?|97 z4M%OJwRm$*oO|J3Sj=PT*o8^}d)FY;J@7X`>nw4-n1uQh~FD$}-FYZ^a5Veg42L zDf8FLgZh81NNhpu)v(;sl1sd+3hJDjbeIM6zxuZpEHkn}KU+XQ2M+us$Jj8SkCicm zXufw84$r-?ZHt+9OjvU%xv8|);P=WofA@XMbV%5*PIn_l--hP+jG}^lFpOxla^Puq zV*`1%tqF>0pG_k?TstusY~2;HQ{utV)z#(tbTPM~1@W?Vw+ifFLbwq=TH@mT<;%=D44kRJQ*nnQPoG36JK8g~3 zsU1gGU0^6GK-%ZA>5Pq=+uZaPS@HW?2sb9CfB4`QsTTzrTluem?_(o+mjVsUFi4lH zue;B<CGD%!ttOsG*VbAC6sSC27 zsY5>~dQ(m=0&M!si*s`j<)P8IxOeR6U#m_;}{KtTSA@}#j|ki|G9@LbT=GGdV? z*3eREAaPPgR`yvz!KJKJCHNV06=5aiNlm?=ys8KcDB$g+A*`n%vE<;`u}8?rzDbg- zU4D0uRaI5>4cZDH`zlw6NX@G8C7El`UQFaOi;ZP`Goc4C(xh>Y#(MQmSCx_P_1mnW z#%mu77s>vJ0zyLk(fT)R&$_4^NLm_CauP!Fyv$*XVay_d zdDWZiP9TttARdZB$q)4=Yk-SIT;jL;sYHjL=M{kR_hDB8UNEq~{{luUqd+yM0>G+Ps z5AL#-5Vs3AOsuo%9O!i4cNSY<;k%vL7pz<6e7&b9EPq)G`emfDez%TTT|r?F*k0|Z zYCnqI8@}6pLvdO~WSA0U5U`x(=!v2vTuEYAXeJgrtH9$DaO{Xxeo%iu&Dy20 zII0w}ghI^pt(l4_kmW6gOMN&`zB`aEN#z!5g<>#XB`LYo6g&U470xgbTEd>!Sd1Vc z_S>YgjEqd*>U>4)qX>gt#*kCxMU?9D)#oLs?Kwhg-%JqNX)Ip|2sN)gO%%UeQ$o1B zU0piJF4~1ab=V8>^M3=6p@vHkSpG%VK7KT_GIPI7+;bXx1C*FiUL@UEjB8F6ii2O4N_trXYsm3_DFk}Va1i;IfmNl2iUBTpMO2#57GW|kZjaa|fc!zFEDcECt0` z!8-~vS!g-1`$&k?U%zc}!xp77)gt>U}Lp_a@Kt3>aiq*=f=iH_SwW+uETk(DnjDp{(!4k2yEQv^nNX` zkiBFW1`(zIELmrUsUl@_Fkokp$|a>&!ZbbR7sCBI_h)d^en!l}`|r%i4tW(IStp5o z0>iu!Af0qN6$+T5ujOmpJmW8X?VtD`cKl6j*4Mas05RMu@c&NYhXZ))v(IBNo*{=u z=Uot~!MX#A62xBGabc+?URZH&MtwZOvXCkV0S44l@eZFCFBZCXQUgGo{u?l{4d(wV zT&~76MCE#%ymcY#zDd{|JMj7gg(DyDaJR0wph|)$&d~lNy-TyhcB^`>cE5k*aS|Rb zm>&!a$SlIp(yWQWp-%J)|6?$JaDA|8jZjWabb>b6oFubL3K_#Cmc${fAA9EW;27bb z%Mu@&D;6^&;LFD^E>A*=RD^=&;8ub^PKy+_o1DQnZVIAM*#p3Fu!K( zz?yqm9eaeEH9{}?da|arcqccQvEOaq=%7egP((NY#1=oxeRcG;GJopGu;cv|g>pwc zT}J%*o2{e1^+b{ChBjx~3WWdYJ)bA@dA%s=!2r#}b6MnlWh#%>$Q1T1IfjQcpfGfi zW``_%Sf!bepR`!MJ0EkvjDvD2F-{G!If_lV~eEZ#bLYiOw) zF@Rh%#7nj4Q4#N~izcA9q`@b+YE? zlhvP%jkQhwl)YDZzhDsuhu*e`@o~>dZ?63O{4k&pjeboc$pGJ$C+h%YOt*k1rvcKT zh7+iEQmCG$07(BBka?b-VS|i%pQQz__7tzlfmlg zJslBqJrn+Zpls9gsBkao6xev+0?mO_JA%2se&vHi+)04CPm%VSZuArd6;Lx9+~1TO zZoCn63sZ|+{j9Z5-+uI+<~nCUr+NXsOwB_TYJ`pSEC*0nQbd@T5MHKhGnr|NR7Txe zb$|8!UptGKq(8E~O;oKtf?h0*4wHQknFmlc=NH0#MM=A(QuXRh0AM4T5Qx~YrRY&U zbB5Mt`7XE$KG-{&$K=*L)y-VkEQ8#TOYiW_cjS?N?T$&H81E~f&7+>t%NIBx^a}fty=@=eb=*IRY-^qt}JJ+V&N>P1MWGl$p5uZVq)&Fh6YJIZD)bBe(Da}6IHlKs?uH%hqyfB zq#opF$|TnM_Kf)s7XwA6f8Q62r>xuwR4J>I6faDlGqG0i{Dd~4VOXSEeYOupwQlqT zN>xVM|V5#^_!@+w0h+0X`V;3De%5@%1a!$*0KjJZ=Fd+Enkwzfr*Jb~>{ z#zIj<Nt!zQ+_XeW`Od!Io zi;CYSnc(qlw~PkOe+O-3yek20CE`FapWeMY65jPgL~$-jPZzN)pOuyMc2!43#o&s# z8VE-ksn~fdR1=W0ym_*!h>)ga?F{NViH(m1=_YNryZs4mNR95wVzri*7Ai@uQL>hZ ztzF7su|*CY#e0!pcemaz8KwD4fx4R5^0=?&NI_=dnIZoE+zot_J+G?yXF8FM40sTF zvz!dc*ljKoBaA&YOQG^(LpB}mxOYUVBuWzGN3J#7cq|J+&F(pGIg6F3WoObTS8cS- z?pg0P6Xk9-u-k@h=_Jm{rw^Es+H!x~y)i|MFJD>unG>y1%||PmkeKi5XbeI3vFf9F z3V+X^e8oc3wmd3`mjxmQZMH!2H`+3ii0ryz*e01l#7?j(va(n}`<>%z?L+cGapVRuaMJLQH~WR>1x%v5vQykL}C#%Ke}<1EU|+slg^ zsBc6+k<-=HJ=XhWeMy)W@fEMt>i>0p={X9Ii$g4p4v}SNI>OvXY~ny*r=h~pAyNu- zt_=m=2(k+1HmHiLrSoQtK=$gl(7&QK>n52#vS&S|dtpNW1_~f zf+8e*=j&#E3v1!K_StE)%LQMAU6U;^DwXslg#FfJg%_rGQ0PWh_viRM$qM>TUxQup z3M)ELKXEI7R0d{RW-hXgPA>B3<8%$&B%!9;1qn0ZuZ=ENs*UerC#t~A36|4KCyEd! zUs7C6oqd$W{;*||MvSJ6HaHA=J6A9mAx0r25mvGAve{DnMrmpEJPvQH9`WMfnBwKq zHTQB)6sipk*@(~xmW)Nw{bnqatm4jjN+WMn^9muQ`OEsAk=OE3%4`WuJGR-DggH47 z7qXFwN5&(7V8k+ctraDM{riu*66Usxg&(abDNxKVg9Aq2f!`gdC2q^iIGJ6GR~w#M zAzYQ7*!BFxo1^E9NEGsV9=PswBsI&Ikkj5OGWfAfzR9+iw>S6P9pfVO`YvZNz%M2o zBAia=bqN5GG5L#HY@&K6C_<6!%3jfHeVLtyILhuE*PweoB&ULi{Y}Rds_ZH=s<3e+ z;pbl!OX6!sE>w7pWT@Gy<)pkX!LYPw&&)Zu+17KeX3JhV?HHpLGV= z+Cf=_Wqsf-_)f%b(fz9ZQ_$2rQ`I%x5e4+~n7M9!u=qqz;&e+GitQxup&ayF6IT?{h1aNxsga+cz-6sVXia?`{WI9L(9w(QeeYOO*q_Mm-$hW2rQ}Dn;PF}G zXZ9HrN>`I9-4{i8Ce?O z4fL7XE7zBwYyKADEDn~kkH@4udBf4faBd22TS$4A@tDSva!@uXYUOQ0fYgAD_$YP6||M@p~19xQX)|hZ8~I1Sx5~-JXJ3sxbP^w+CIR^fZ!*XUwn9 zGw7(!`3L7jd3$~fqp&KEKSxmi_q@}lDr}_Xwt$-VrR^FC^{De}#A(>Y#6P5;2>q|< z4Yi&NX+Jag;|ix~w{Uf9LOmMHV z^~akUQe4=-Z-$@5`5PUzR&U%jhXdEwX zSJD}+$)e7=wARHp<)O0B(dyjGjG}{>nHHTs$)p~m)a4uH!YhwIeB~Xxhvdv8;DX zbFV_!dBzyL@G^VmU_kwH+7qYX^)Wc(14zNxk#*{mpW)MiQ5`r~lC-ff{6rnzKk{QNh*v~Jq#B~kFE-C{gWrf(4j`)+16kAmT#w@i zU?h0I{;se}O;|oIB_ScM!&>8}Ma?jfI|67}2E2zpmhDa}^SJ8!*oNH>#<`l1#X(j7 zR{)_uki)$0jaI^B^I)q&KtWZ?Io;-R$1|OGJY+df@8nQedg2-U{0XB6FG!t@{EQ0% zuZjHyz9f}|6GO2A|Az90bxr;@Y=x)b9O`;7f(nc{AiBPkt#}C*N#HROOyatUPZdJa z&@3nkfVGq|Y=iYB zlqMFdJTPZhH1cuUTX#%UeLp2|NBSYyYw2Q69fFzuM=#p|rz3+9-1)5fB)d(||2r(+ z7I2-C!$L6zetXSr~hxu>F{=weA_6cj;dc1o|t{GmJdlSL!I(7dV^>qNiUd`Ha6drUr zHPP$;&ehB1fv)uV$oIfsf`Tpv8tZNK+jUb0w{DDCmGx0Ll)c^r{68MhhaBk&4FX~C SkPOxb9WXbsF>W;Ux%VG^H~JX> literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/science.dmi b/icons/obj/doors/airlocks/station/science.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5afc2c6838bda1fca72312b3ad62c27db17e6049 GIT binary patch literal 4521 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 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/silver.dmi b/icons/obj/doors/airlocks/station/silver.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c77dc3f220e26228be3df76234bbbf0279492586 GIT binary patch literal 3923 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 NGh+**N<-&|{{t{-$DjZJ literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/uranium.dmi b/icons/obj/doors/airlocks/station/uranium.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5aeb68f4144bf748bc1620cf29b25c943413d90f GIT binary patch literal 4030 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 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/virology.dmi b/icons/obj/doors/airlocks/station/virology.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2c510419ed8cfda83eabff77969c101cbf832e04 GIT binary patch literal 4710 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 literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/station/wood.dmi b/icons/obj/doors/airlocks/station/wood.dmi new file mode 100644 index 0000000000000000000000000000000000000000..46ea9ad74087b73348b23434b1c9a55dd37cc1b6 GIT binary patch literal 3884 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 fS#hzhMMl%1F7w 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 Soy&Xf08l1Y#+63bBmV{0xgi_? literal 0 HcmV?d00001 diff --git a/icons/obj/doors/airlocks/vault/vault.dmi b/icons/obj/doors/airlocks/vault/vault.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5dcc824e690066dc490089398908292f80165ef0 GIT binary patch literal 3709 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 literal 0 HcmV?d00001 From 99234185de8dffc0a18bc834640e0010c3b89396 Mon Sep 17 00:00:00 2001 From: duncathan Date: Sun, 16 Aug 2015 23:10:57 -0600 Subject: [PATCH 027/310] first pass of cleanup makes simple pipes more OOP adjusts defines; puts them in __DEFINES/atmospherics.dm adds DEVICE_TYPE_LOOP define, which is used in a bunch of the for loops --- code/ATMOSPHERICS/atmospherics.dm | 28 +++- .../binary_devices/binary_atmos_base.dm | 4 +- .../components/binary_devices/circulator.dm | 4 +- .../components/binary_devices/dp_vent_pump.dm | 12 +- .../components/binary_devices/passive_gate.dm | 4 +- .../components/binary_devices/pump.dm | 4 +- .../components/binary_devices/valve.dm | 2 +- .../components/binary_devices/volume_pump.dm | 6 +- .../components/components_base.dm | 127 ++++++------------ .../components/trinary_devices/filter.dm | 10 +- .../components/trinary_devices/mixer.dm | 20 +-- .../trinary_devices/trinary_base.dm | 4 +- .../components/unary_devices/Freezer.dm | 4 +- .../components/unary_devices/cold_sink.dm | 4 +- .../components/unary_devices/cryo.dm | 14 +- .../unary_devices/generator_input.dm | 4 +- .../unary_devices/heat_exchanger.dm | 8 +- .../components/unary_devices/heat_source.dm | 4 +- .../unary_devices/outlet_injector.dm | 8 +- .../unary_devices/oxygen_generator.dm | 8 +- .../components/unary_devices/tank.dm | 12 +- .../components/unary_devices/unary_base.dm | 9 +- .../components/unary_devices/vent_pump.dm | 8 +- .../components/unary_devices/vent_scrubber.dm | 6 +- code/ATMOSPHERICS/pipes/he_pipes.dm | 28 ++-- code/ATMOSPHERICS/pipes/manifold.dm | 34 +++-- code/ATMOSPHERICS/pipes/manifold4w.dm | 40 ++---- code/ATMOSPHERICS/pipes/pipes.dm | 35 ++++- code/ATMOSPHERICS/pipes/simple.dm | 60 ++++----- code/__DEFINES/atmospherics.dm | 39 +++++- .../atmoalter/portable_atmospherics.dm | 2 +- code/modules/admin/verbs/atmosdebug.dm | 4 +- code/modules/mob/living/ventcrawling.dm | 4 +- 33 files changed, 279 insertions(+), 281 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 321e172522d..d7f878e06ca 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -9,7 +9,6 @@ Pipes -> Pipelines Pipelines + Other Objects -> Pipe network */ - /obj/machinery/atmospherics anchored = 1 idle_power_usage = 0 @@ -25,6 +24,9 @@ Pipelines + Other Objects -> Pipe network var/image/pipe_vision_img = null + var/device_type = 0 + var/list/obj/machinery/atmospherics/nodes = list() + /obj/machinery/atmospherics/New() ..() SSair.atmos_machinery += src @@ -47,8 +49,19 @@ Pipelines + Other Objects -> Pipe network ..() //this is called just after the air controller sets up turfs -/obj/machinery/atmospherics/proc/atmosinit() - return +/obj/machinery/atmospherics/proc/atmosinit(var/list/node_connects) + for(DEVICE_TYPE_LOOP) + for(var/obj/machinery/atmospherics/target in get_step(src,node_connects[I])) + if(target.initialize_directions & get_dir(target,src)) + NODE_I = target + break + update_icon() + +/obj/machinery/atmospherics/proc/pipeline_expansion() + var/list/return_nodes = list() + for(DEVICE_TYPE_LOOP) + return_nodes |= NODE_I + return return_nodes /obj/machinery/atmospherics/proc/SetInitDirections() return @@ -70,7 +83,14 @@ Pipelines + Other Objects -> Pipe network return /obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) - return + for(DEVICE_TYPE_LOOP) + if(reference == NODE_I) + if(istype(NODE_I, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/P = NODE_I + qdel(P.parent) + NODE_I = null + break + update_icon() /obj/machinery/atmospherics/update_icon() return diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index b78301584cb..df89a24e5ba 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -28,10 +28,8 @@ Housekeeping and pipe network stuff */ /obj/machinery/atmospherics/components/binary/atmosinit() - var/node2_connect = dir var/node1_connect = turn(dir, 180) - var/list/node_connects = new/list() - node_connects.Add(node1_connect, node2_connect) + var/list/node_connects = list(node1_connect, node2_connect) ..(node_connects) \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index f5da3152aae..436725a4baf 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -18,8 +18,8 @@ /obj/machinery/atmospherics/components/binary/circulator/proc/return_transfer_air() - var/datum/gas_mixture/air1 = airs[AIR1] - var/datum/gas_mixture/air2 = airs[AIR2] + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 var/output_starting_pressure = air1.return_pressure() var/input_starting_pressure = air2.return_pressure() diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 9cecf78413f..fb3cbcdf028 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -42,8 +42,8 @@ Acts like a normal vent, but has an input AND output. /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/New() ..() - var/datum/gas_mixture/air1 = airs[AIR1] - var/datum/gas_mixture/air2 = airs[AIR2] + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 air1.volume = 1000 air2.volume = 1000 @@ -66,8 +66,8 @@ Acts like a normal vent, but has an input AND output. if(!on) return 0 - var/datum/gas_mixture/air1 = airs[AIR1] - var/datum/gas_mixture/air2 = airs[AIR2] + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 var/datum/gas_mixture/environment = loc.return_air() var/environment_pressure = environment.return_pressure() @@ -89,7 +89,7 @@ Acts like a normal vent, but has an input AND output. loc.assume_air(removed) air_update_turf() - var/datum/pipeline/parent1 = parents[PARENT1] + var/datum/pipeline/parent1 = PARENT1 parent1.update = 1 else //external -> output @@ -109,7 +109,7 @@ Acts like a normal vent, but has an input AND output. air2.merge(removed) air_update_turf() - var/datum/pipeline/parent2 = parents[PARENT2] + var/datum/pipeline/parent2 = PARENT2 parent2.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index d75d045a636..b522febf58e 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -40,8 +40,8 @@ Passive gate is similar to the regular pump except: if(!on) return 0 - var/datum/gas_mixture/air1 = airs[AIR1] - var/datum/gas_mixture/air2 = airs[AIR2] + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 var/output_starting_pressure = air2.return_pressure() var/input_starting_pressure = air1.return_pressure() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 73482b9c864..c4f3073e767 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -48,8 +48,8 @@ Thus, the two variables affect pump operation are set in New(): if(!on) return 0 - var/datum/gas_mixture/air1 = airs[AIR1] - var/datum/gas_mixture/air2 = airs[AIR2] + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 var/output_starting_pressure = air2.return_pressure() diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm index 3239d3a6ec4..a99fa0df02b 100644 --- a/code/ATMOSPHERICS/components/binary_devices/valve.dm +++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm @@ -28,7 +28,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off. open = 1 update_icon_nopipes() update_parents() - var/datum/pipeline/parent1 = parents[PARENT1] + var/datum/pipeline/parent1 = PARENT1 parent1.reconcile_air() investigate_log("was opened by [usr ? key_name(usr) : "a remote signal"]", "atmos") diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index a87f2964480..1d8253997f5 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -48,8 +48,8 @@ Thus, the two variables affect pump operation are set in New(): if(!on) return 0 - var/datum/gas_mixture/air1 = airs[AIR1] - var/datum/gas_mixture/air2 = airs[AIR2] + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 // Pump mechanism just won't do anything if the pressure is too high/too low @@ -125,7 +125,7 @@ Thus, the two variables affect pump operation are set in New(): on = !on if("set_transfer_rate" in signal.data) - var/datum/gas_mixture/air1 = airs[AIR1] + var/datum/gas_mixture/air1 = AIR1 transfer_rate = Clamp( text2num(signal.data["set_transfer_rate"]), 0, diff --git a/code/ATMOSPHERICS/components/components_base.dm b/code/ATMOSPHERICS/components/components_base.dm index 78bd351c9f4..45b2b548d29 100644 --- a/code/ATMOSPHERICS/components/components_base.dm +++ b/code/ATMOSPHERICS/components/components_base.dm @@ -3,41 +3,19 @@ So much of atmospherics.dm was used solely by components, so separating this mak On top of that, now people can add component-speciic procs/vars if they want! */ -#define UNARY 1 -#define BINARY 2 -#define TRINARY 3 - -#define AIR1 "a1" -#define AIR2 "a2" -#define AIR3 "a3" - -#define PARENT1 "p1" -#define PARENT2 "p2" -#define PARENT3 "p3" - -#define NODE1 "n1" -#define NODE2 "n2" -#define NODE3 "n3" - /obj/machinery/atmospherics/components/ var/welded //Used on pumps and scrubbers var/showpipe = 0 - var/device_type = 0//used for initialization stuff - //UNARY = 1 - //BINARY = 2 - //TRINARY = 3 - - var/list/obj/machinery/atmospherics/nodes = list() var/list/datum/pipeline/parents = list() var/list/datum/gas_mixture/airs = list() /obj/machinery/atmospherics/components/New() ..() - for(var/I = 1; I <= device_type; I++) + for(DEVICE_TYPE_LOOP) var/datum/gas_mixture/A = new A.volume = 200 - airs["a[I]"] = A + AIR_I = A /* Iconnery */ @@ -57,7 +35,7 @@ Iconnery /obj/machinery/atmospherics/components/proc/update_icon_nopipes() return -/obj/machinery/atmospherics/components/update_icon() //not working +/obj/machinery/atmospherics/components/update_icon() update_icon_nopipes() underlays.Cut() @@ -66,9 +44,9 @@ Iconnery var/connected = 0 - for(var/I = 1; I <= device_type; I++) //adds intact pieces - if(nodes["n[I]"]) - connected = icon_addintact(nodes["n[I]"], connected) + for(DEVICE_TYPE_LOOP) //adds intact pieces + if(NODE_I) + connected = icon_addintact(NODE_I, connected) icon_addbroken(connected) //adds broken pieces @@ -77,83 +55,66 @@ Iconnery Pipenet stuff; housekeeping */ /obj/machinery/atmospherics/components/Destroy() - for(var/I = 1; I <= device_type; I++) - var/obj/machinery/atmospherics/N = nodes["n[I]"] + for(DEVICE_TYPE_LOOP) + var/obj/machinery/atmospherics/N = NODE_I if(N) N.disconnect(src) - nodes["n[I]"] = null - nullifyPipenet(parents["p[I]"]) + NODE_I = null + nullifyPipenet(PARENT_I) ..() -/obj/machinery/atmospherics/components/atmosinit(var/list/node_connects) - for(var/I = 1; I <= device_type; I++) - for(var/obj/machinery/atmospherics/target in get_step(src,node_connects[I])) - if(target.initialize_directions & get_dir(target,src)) - nodes["n[I]"] = target - break +/obj/machinery/atmospherics/components/atmosinit() if(level == 2) showpipe = 1 - update_icon() + ..() /obj/machinery/atmospherics/components/construction() ..() update_parents() /obj/machinery/atmospherics/components/build_network() - for(var/I = 1; I <= device_type; I++) - if(!parents["p[I]"]) - parents["p[I]"] = new /datum/pipeline() - var/datum/pipeline/P = parents["p[I]"] + for(DEVICE_TYPE_LOOP) + if(!PARENT_I) + PARENT_I = new /datum/pipeline() + var/datum/pipeline/P = PARENT_I P.build_pipeline(src) -/obj/machinery/atmospherics/components/disconnect(obj/machinery/atmospherics/reference) - for(var/I = 1; I <= device_type; I++) - if(reference == nodes["n[I]"]) - if(istype(nodes["n[I]"], /obj/machinery/atmospherics/pipe)) - qdel(parents["p[I]"]) - nodes["n[I]"] = null - break - update_icon() - /obj/machinery/atmospherics/components/nullifyPipenet(datum/pipeline/reference) ..() - for(var/I = 1; I <= device_type; I++) - if(reference == parents["p[I]"]) - var/datum/pipeline/P = parents["p[I]"] - P.other_airs -= airs["a[I]"] - parents["p[I]"] = null + for(DEVICE_TYPE_LOOP) + if(reference == PARENT_I) + var/datum/pipeline/P = PARENT_I + P.other_airs -= AIR_I + PARENT_I = null /obj/machinery/atmospherics/components/returnPipenetAir(datum/pipeline/reference) - for(var/I = 1; I <= device_type; I++) - if(reference == parents["p[I]"]) - return airs["a[I]"] + for(DEVICE_TYPE_LOOP) + if(reference == PARENT_I) + return AIR_I /obj/machinery/atmospherics/components/pipeline_expansion(datum/pipeline/reference) if(reference) - for(var/I = 1; I <= device_type; I++) - if(parents["p[I]"] == reference) - return list(nodes["n[I]"]) + for(DEVICE_TYPE_LOOP) + if(PARENT_I == reference) + return list(NODE_I) else - var/list/obj/machinery/atmospherics/return_nodes = list() - for(var/I = 1; I <= device_type; I++) - return_nodes += nodes["n[I]"] - return return_nodes + return ..() /obj/machinery/atmospherics/components/setPipenet(datum/pipeline/reference, obj/machinery/atmospherics/A) - for(var/I = 1; I <= device_type; I++) - if(A == nodes["n[I]"]) - parents["p[I]"] = reference + for(DEVICE_TYPE_LOOP) + if(A == NODE_I) + PARENT_I = reference break -/obj/machinery/atmospherics/components/returnPipenet(obj/machinery/atmospherics/A = nodes[NODE1]) //returns PARENT1 if called without argument - for(var/I = 1; I <= device_type; I++) - if(A == nodes["n[I]"]) - return parents["p[I]"] +/obj/machinery/atmospherics/components/returnPipenet(obj/machinery/atmospherics/A = NODE1) //returns PARENT1 if called without argument + for(DEVICE_TYPE_LOOP) + if(A == NODE_I) + return PARENT_I /obj/machinery/atmospherics/components/replacePipenet(datum/pipeline/Old, datum/pipeline/New) - for(var/I = 1; I <= device_type; I++) - if(parents["p[I]"] == Old) - parents["p[I]"] = New + for(DEVICE_TYPE_LOOP) + if(PARENT_I == Old) + PARENT_I = New /obj/machinery/atmospherics/components/unsafe_pressure_release(var/mob/user, var/pressures) ..() @@ -164,15 +125,15 @@ Pipenet stuff; housekeeping var/datum/gas_mixture/environment = T.return_air() var/lost = null var/times_lost = 0 - for(var/I = 1; I <= device_type; I++) - var/datum/gas_mixture/air = airs["a[I]"] + for(DEVICE_TYPE_LOOP) + var/datum/gas_mixture/air = AIR_I lost += pressures*environment.volume/(air.temperature * R_IDEAL_GAS_EQUATION) times_lost++ var/shared_loss = lost/times_lost var/datum/gas_mixture/to_release - for(var/I = 1; I <= device_type; I++) - var/datum/gas_mixture/air = airs["a[I]"] + for(DEVICE_TYPE_LOOP) + var/datum/gas_mixture/air = AIR_I if(!to_release) to_release = air.remove(shared_loss) continue @@ -195,6 +156,6 @@ Helpers */ /obj/machinery/atmospherics/components/proc/update_parents() - for(var/I = 1; I <= device_type; I++) - var/datum/pipeline/parent = parents["p[I]"] + for(DEVICE_TYPE_LOOP) + var/datum/pipeline/parent = PARENT_I parent.update = 1 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index a56bdd14c0c..439311ce86e 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -62,7 +62,7 @@ Filter types: /obj/machinery/atmospherics/components/trinary/filter/update_icon_nopipes() - if(!(stat & NOPOWER) && on && nodes[NODE1] && nodes[NODE2] && nodes[NODE3]) + if(!(stat & NOPOWER) && on && NODE1 && NODE2 && NODE3) icon_state = "filter_on[flipped?"_f":""]" return @@ -80,12 +80,12 @@ Filter types: ..() if(!on) return 0 - if(!(nodes[NODE1] && nodes[NODE2] && nodes[NODE3])) + if(!(NODE1 && NODE2 && NODE3)) return 0 - var/datum/gas_mixture/air1 = airs[AIR1] - var/datum/gas_mixture/air2 = airs[AIR2] - var/datum/gas_mixture/air3 = airs[AIR3] + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 + var/datum/gas_mixture/air3 = AIR3 var/output_starting_pressure = air3.return_pressure() diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 8b8850744ec..818b410626a 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -32,7 +32,7 @@ ..() /obj/machinery/atmospherics/components/trinary/mixer/update_icon_nopipes() - if(!(stat & NOPOWER) && on && nodes[NODE1] && nodes[NODE2] && nodes[NODE3]) + if(!(stat & NOPOWER) && on && NODE1 && NODE2 && NODE3) icon_state = "mixer_on[flipped?"_f":""]" return @@ -48,20 +48,20 @@ /obj/machinery/atmospherics/components/trinary/mixer/New() ..() - var/datum/gas_mixture/air3 = airs[AIR3] + var/datum/gas_mixture/air3 = AIR3 air3.volume = 300 - airs[AIR3] = air3 + AIR3 = air3 /obj/machinery/atmospherics/components/trinary/mixer/process_atmos() ..() if(!on) return 0 - if(!(nodes[NODE1] && nodes[NODE2] && nodes[NODE3])) + if(!(NODE1 && NODE2 && NODE3)) return 0 - var/datum/gas_mixture/air1 = airs[AIR1] - var/datum/gas_mixture/air2 = airs[AIR2] - var/datum/gas_mixture/air3 = airs[AIR3] + var/datum/gas_mixture/air1 = AIR1 + var/datum/gas_mixture/air2 = AIR2 + var/datum/gas_mixture/air3 = AIR3 var/output_starting_pressure = air3.return_pressure() @@ -107,14 +107,14 @@ air3.merge(removed2) if(transfer_moles1) - var/datum/pipeline/parent1 = parents[PARENT1] + var/datum/pipeline/parent1 = PARENT1 parent1.update = 1 if(transfer_moles2) - var/datum/pipeline/parent2 = parents[PARENT2] + var/datum/pipeline/parent2 = PARENT2 parent2.update = 1 - var/datum/pipeline/parent3 = parents[PARENT3] + var/datum/pipeline/parent3 = PARENT3 parent3.update = 1 return 1 diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index cec9c7ed27b..d2c37ec30e0 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -43,7 +43,5 @@ Housekeeping and pipe network stuff node1_connect = turn(node1_connect, 180) node3_connect = turn(node3_connect, 180) - var/list/node_connects = new/list() - - node_connects.Add(node1_connect, node2_connect, node3_connect) + var/list/node_connects = list(node1_connect, node2_connect, node3_connect) ..(node_connects) \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary_devices/Freezer.dm b/code/ATMOSPHERICS/components/unary_devices/Freezer.dm index b91d8a74dbb..83739c0e13b 100644 --- a/code/ATMOSPHERICS/components/unary_devices/Freezer.dm +++ b/code/ATMOSPHERICS/components/unary_devices/Freezer.dm @@ -69,7 +69,7 @@ /obj/machinery/atmospherics/components/unary/cold_sink/freezer/interact(mob/user) if(stat & (NOPOWER|BROKEN)) return - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 user.set_machine(src) var/temp_text = "" if(air_contents.temperature > (T0C - 20)) @@ -194,7 +194,7 @@ return interact(user) /obj/machinery/atmospherics/components/unary/heat_reservoir/heater/interact(mob/user) - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 if(stat & (NOPOWER|BROKEN)) return diff --git a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm index 7750a7c7b14..65419798bfd 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm @@ -16,7 +16,7 @@ if(showpipe) overlays += getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "scrub_cap", initialize_directions) //scrub_cap works for now - if(!nodes[NODE1] || !on || stat & (NOPOWER|BROKEN)) + if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) icon_state = "cold_off" return @@ -27,7 +27,7 @@ ..() if(!on) return 0 - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 var/air_heat_capacity = air_contents.heat_capacity() var/combined_heat_capacity = current_heat_capacity + air_heat_capacity diff --git a/code/ATMOSPHERICS/components/unary_devices/cryo.dm b/code/ATMOSPHERICS/components/unary_devices/cryo.dm index 87eb0e606e8..4565fd97ccc 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cryo.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cryo.dm @@ -47,7 +47,7 @@ ..() /obj/machinery/atmospherics/components/unary/cryo_cell/process_atmos() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 if(air_contents) temperature_archived = air_contents.temperature @@ -62,14 +62,14 @@ on = 0 open_machine() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - if(!nodes[NODE1] || !is_operational()) + if(!NODE1 || !is_operational()) return if(!on) updateDialog() return - if(airs[AIR1]) + if(AIR1) if (occupant) process_occupant() expel_gas() @@ -145,7 +145,7 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/get_ui_data() // this is the data which will be sent to the ui - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 var/data = list() data["isOperating"] = on @@ -289,7 +289,7 @@ update_icon() /obj/machinery/atmospherics/components/unary/cryo_cell/proc/process_occupant() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 if(air_contents.total_moles() < 10) return if(occupant) @@ -321,7 +321,7 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/proc/heat_gas_contents() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 if(air_contents.total_moles() < 1) return @@ -332,7 +332,7 @@ air_contents.temperature = combined_energy/combined_heat_capacity /obj/machinery/atmospherics/components/unary/cryo_cell/proc/expel_gas() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 if(air_contents.total_moles() < 1) return diff --git a/code/ATMOSPHERICS/components/unary_devices/generator_input.dm b/code/ATMOSPHERICS/components/unary_devices/generator_input.dm index 20d1474ffd3..15ae3eb88f9 100644 --- a/code/ATMOSPHERICS/components/unary_devices/generator_input.dm +++ b/code/ATMOSPHERICS/components/unary_devices/generator_input.dm @@ -9,7 +9,7 @@ var/update_cycle /obj/machinery/atmospherics/components/unary/generator_input/update_icon() - if(nodes[NODE1]) + if(NODE1) icon_state = "intact" else icon_state = "exposed" @@ -17,4 +17,4 @@ return /obj/machinery/atmospherics/components/unary/generator_input/proc/return_exchange_air() - return airs[AIR1] + return AIR1 diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm index 21746bc4e97..1b400dad2bb 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm @@ -11,9 +11,9 @@ var/update_cycle /obj/machinery/atmospherics/components/unary/heat_exchanger/update_icon() - if(nodes[NODE1]) + if(NODE1) icon_state = "he_intact" - var/obj/machinery/atmospherics/node = nodes[NODE1] + var/obj/machinery/atmospherics/node = NODE1 color = node.color else icon_state = "he_exposed" @@ -43,8 +43,8 @@ update_cycle = SSair.times_fired partner.update_cycle = SSair.times_fired - var/datum/gas_mixture/air_contents = airs[AIR1] - var/datum/gas_mixture/partner_air_contents = partner.airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 + var/datum/gas_mixture/partner_air_contents = partner.AIR1 var/air_heat_capacity = air_contents.heat_capacity() var/other_air_heat_capacity = partner_air_contents.heat_capacity() diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm index ceba342a5fa..b08a4a214a7 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm @@ -17,7 +17,7 @@ if(showpipe) overlays += getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "scrub_cap", initialize_directions) //scrub_cap works for now - if(!nodes[NODE1] || !on || stat & (NOPOWER|BROKEN)) + if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) icon_state = "cold_off" return @@ -29,7 +29,7 @@ if(!on) return 0 - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 var/air_heat_capacity = air_contents.heat_capacity() var/combined_heat_capacity = current_heat_capacity + air_heat_capacity diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index 10ecdf726d9..3de7973b1f6 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -25,7 +25,7 @@ on = 1 /obj/machinery/atmospherics/components/unary/outlet_injector/update_icon_nopipes() - if(!nodes[NODE1] || !on || stat & (NOPOWER|BROKEN)) + if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) icon_state = "inje_off" return @@ -45,7 +45,7 @@ if(!on || stat & NOPOWER) return 0 - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 if(air_contents.temperature > 0) var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) @@ -63,7 +63,7 @@ if(on || injecting) return 0 - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 injecting = 1 @@ -126,7 +126,7 @@ if("set_volume_rate" in signal.data) var/number = text2num(signal.data["set_volume_rate"]) - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 volume_rate = Clamp(number, 0, air_contents.volume) if("status" in signal.data) diff --git a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm index d8c1d69e200..0c0bee0b275 100644 --- a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm +++ b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm @@ -18,7 +18,7 @@ if(showpipe) overlays += getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "scrub_cap", initialize_directions) //it works for now - if(!nodes[NODE1] || !on || stat & BROKEN) + if(!NODE1 || !on || stat & BROKEN) icon_state = "o2gen_off" return @@ -27,16 +27,16 @@ /obj/machinery/atmospherics/components/unary/oxygen_generator/New() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 air_contents.volume = 50 - airs[AIR1] = air_contents + AIR1 = air_contents /obj/machinery/atmospherics/components/unary/oxygen_generator/process_atmos() ..() if(!on) return 0 - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 var/total_moles = air_contents.total_moles() diff --git a/code/ATMOSPHERICS/components/unary_devices/tank.dm b/code/ATMOSPHERICS/components/unary_devices/tank.dm index 8f8f6b9e831..f5113d05305 100644 --- a/code/ATMOSPHERICS/components/unary_devices/tank.dm +++ b/code/ATMOSPHERICS/components/unary_devices/tank.dm @@ -11,7 +11,7 @@ /obj/machinery/atmospherics/components/unary/tank/carbon_dioxide/New() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 air_contents.volume = volume air_contents.temperature = T20C air_contents.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) @@ -22,7 +22,7 @@ /obj/machinery/atmospherics/components/unary/tank/toxins/New() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 air_contents.volume = volume air_contents.temperature = T20C air_contents.toxins = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) @@ -33,7 +33,7 @@ /obj/machinery/atmospherics/components/unary/tank/oxygen_agent_b/New() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 air_contents.volume = volume air_contents.temperature = T0C var/datum/gas/oxygen_agent_b/trace_gas = new @@ -46,7 +46,7 @@ /obj/machinery/atmospherics/components/unary/tank/oxygen/New() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 air_contents.volume = volume air_contents.temperature = T20C air_contents.oxygen = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) @@ -57,7 +57,7 @@ /obj/machinery/atmospherics/components/unary/tank/nitrogen/New() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 air_contents.volume = volume air_contents.temperature = T20C air_contents.nitrogen = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) @@ -68,7 +68,7 @@ /obj/machinery/atmospherics/components/unary/tank/air/New() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 air_contents.volume = volume air_contents.temperature = T20C air_contents.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm index 96b99f52fd1..1d6a92c7206 100644 --- a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm @@ -23,21 +23,20 @@ Housekeeping and pipe network stuff below */ /obj/machinery/atmospherics/components/unary/atmosinit() - var/list/node_connects = new/list() - node_connects.Add(dir) + var/list/node_connects = list(dir) ..(node_connects) /obj/machinery/atmospherics/components/unary/default_change_direction_wrench(mob/user, obj/item/weapon/wrench/W) if(!..()) return SetInitDirections() - var/obj/machinery/atmospherics/node = nodes[NODE1] + var/obj/machinery/atmospherics/node = NODE1 if(node) node.disconnect(src) node = null - nullifyPipenet(parents[PARENT1]) + nullifyPipenet(PARENT1) atmosinit() - node = nodes[NODE1] + node = NODE1 if(node) node.atmosinit() node.addMember(src) diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 7d574f302d6..94d28113548 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -67,7 +67,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/New() ..() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 air_contents.volume = 1000 /obj/machinery/atmospherics/components/unary/vent_pump/update_icon_nopipes() @@ -79,7 +79,7 @@ icon_state = "vent_welded" return - if(!nodes[NODE1] || !on || stat & (NOPOWER|BROKEN)) + if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) icon_state = "vent_off" return @@ -92,7 +92,7 @@ ..() if(stat & (NOPOWER|BROKEN)) return - if (!nodes[NODE1]) + if (!NODE1) on = 0 //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0 if(!on) @@ -101,7 +101,7 @@ if(welded) return 0 - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 var/datum/gas_mixture/environment = loc.return_air() var/environment_pressure = environment.return_pressure() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 691835ed4cc..e4f6e606364 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -86,7 +86,7 @@ icon_state = "scrub_welded" return - if(!nodes[NODE1] || !on || stat & (NOPOWER|BROKEN)) + if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) icon_state = "scrub_off" return @@ -142,7 +142,7 @@ ..() if(stat & (NOPOWER|BROKEN)) return - if (!nodes[NODE1]) + if (!NODE1) on = 0 //broadcast_status() if(!on || welded) @@ -159,7 +159,7 @@ return 0 var/datum/gas_mixture/environment = tile.return_air() - var/datum/gas_mixture/air_contents = airs[AIR1] + var/datum/gas_mixture/air_contents = AIR1 if(scrubbing) if((environment.toxins>0) || (environment.carbon_dioxide>0) || (environment.trace_gases.len>0)) diff --git a/code/ATMOSPHERICS/pipes/he_pipes.dm b/code/ATMOSPHERICS/pipes/he_pipes.dm index 119b371d59b..10f900ab5d3 100644 --- a/code/ATMOSPHERICS/pipes/he_pipes.dm +++ b/code/ATMOSPHERICS/pipes/he_pipes.dm @@ -18,6 +18,8 @@ color = "#404040" /obj/machinery/atmospherics/pipe/simple/heat_exchanging/SetInitDirections() + if(dir in diagonals) + initialize_directions_he = dir switch(dir) if(SOUTH) initialize_directions_he = SOUTH|NORTH @@ -27,14 +29,6 @@ initialize_directions_he = EAST|WEST if(WEST) initialize_directions_he = WEST|EAST - if(NORTHEAST) - initialize_directions_he = NORTH|EAST - if(NORTHWEST) - initialize_directions_he = NORTH|WEST - if(SOUTHEAST) - initialize_directions_he = SOUTH|EAST - if(SOUTHWEST) - initialize_directions_he = SOUTH|WEST /obj/machinery/atmospherics/pipe/simple/heat_exchanging/atmosinit() normalize_dir() @@ -44,11 +38,11 @@ N-- for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) if(target.initialize_directions_he & get_dir(target,src)) - if(!node1 && N == 1) - node1 = target + if(!NODE1 && N == 1) + NODE1 = target break - if(!node2 && N == 0) - node2 = target + if(!NODE2 && N == 0) + NODE2 = target break update_icon() ..() @@ -131,21 +125,21 @@ initialize_directions_he = WEST /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/update_icon() - if(node1&&node2) + if(NODE1&&NODE2) icon_state = "intact" else - var/have_node1 = node1?1:0 - var/have_node2 = node2?1:0 + var/have_node1 = NODE1?1:0 + var/have_node2 = NODE2?1:0 icon_state = "exposed[have_node1][have_node2]" /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/atmosinit() for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) if(target.initialize_directions & get_dir(target,src)) - node1 = target + NODE1 = target break for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,initialize_directions_he)) if(target.initialize_directions_he & get_dir(target,src)) - node2 = target + NODE2 = target break update_icon() ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 8f6ac175080..2a56452d46f 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -15,18 +15,13 @@ dir = SOUTH initialize_directions = EAST|NORTH|WEST - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - var/obj/machinery/atmospherics/node3 - - level = 1 - layer = 2.4 //under wires with their 2.44 - + device_type = TRINARY +/* /obj/machinery/atmospherics/pipe/manifold/New() color = pipe_color ..() - +*/ /obj/machinery/atmospherics/pipe/manifold/SetInitDirections() switch(dir) if(NORTH) @@ -39,6 +34,12 @@ initialize_directions = NORTH|EAST|SOUTH /obj/machinery/atmospherics/pipe/manifold/atmosinit() + var/node1_connect = turn(dir, 90) + var/node2_connect = turn(dir, 270) + var/node3_connect = turn(dir, 180) + var/list/node_connects = list(node1_connect, node2_connect, node3_connect) + ..(node_connects) +/* for(var/D in cardinal) if(D == dir) continue @@ -90,7 +91,7 @@ node3 = null update_icon() ..() - +*/ /obj/machinery/atmospherics/pipe/manifold/update_icon() var/invis = invisibility ? "-f" : "" @@ -99,15 +100,10 @@ overlays.Cut() //Add non-broken pieces - if(node1) - overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src,node1)) - - if(node2) - overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src,node2)) - - if(node3) - overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src,node3)) - + for(DEVICE_TYPE_LOOP) + if(NODE_I) + overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src, NODE_I)) +/* /obj/machinery/atmospherics/pipe/manifold/hide(i) if(level == 1 && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 @@ -124,7 +120,7 @@ node2.update_icon() if(node3) node3.update_icon() - +*/ //Colored pipes, use these for mapping /obj/machinery/atmospherics/pipe/manifold/general diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 4db873eed76..da510edb363 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -13,22 +13,18 @@ initialize_directions = NORTH|SOUTH|EAST|WEST - var/obj/machinery/atmospherics/node1 // North - var/obj/machinery/atmospherics/node2 // South - var/obj/machinery/atmospherics/node3 // East - var/obj/machinery/atmospherics/node4 // West - - level = 1 - layer = 2.4 //under wires with their 2.44 - + device_type = QUATERNARY +/* /obj/machinery/atmospherics/pipe/manifold4w/New() color = pipe_color ..() - +*/ /obj/machinery/atmospherics/pipe/manifold4w/SetInitDirections() - return + initialize_directions = initial(initialize_directions) /obj/machinery/atmospherics/pipe/manifold4w/atmosinit() + ..(cardinal) +/* for(var/D in cardinal) for(var/obj/machinery/atmospherics/target in get_step(src, D)) if(target.initialize_directions & get_dir(target,src)) @@ -98,12 +94,8 @@ node4 = null update_icon() ..() - +*/ /obj/machinery/atmospherics/pipe/manifold4w/update_icon() - if(!node1 && !node2 && !node3 && !node4) //Remove us if we ain't connected to anything. - qdel(src) - return - var/invis = invisibility ? "-f" : "" icon_state = "manifold4w_center[invis]" @@ -111,18 +103,10 @@ overlays.Cut() //Add non-broken pieces - if(node1) - overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", NORTH) - - if(node2) - overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", SOUTH) - - if(node3) - overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", EAST) - - if(node4) - overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", WEST) - + for(DEVICE_TYPE_LOOP) + if(NODE_I) + overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src, NODE_I)) +/* /obj/machinery/atmospherics/pipe/manifold4w/update_node_icon() ..() if(node1) @@ -133,7 +117,7 @@ node3.update_icon() if(node4) node4.update_icon() - +*/ //Colored pipes, use these for mapping /obj/machinery/atmospherics/pipe/manifold4w/general name="pipe" diff --git a/code/ATMOSPHERICS/pipes/pipes.dm b/code/ATMOSPHERICS/pipes/pipes.dm index f0ca8f8e244..b4b780ae60c 100644 --- a/code/ATMOSPHERICS/pipes/pipes.dm +++ b/code/ATMOSPHERICS/pipes/pipes.dm @@ -1,7 +1,10 @@ /obj/machinery/atmospherics/pipe var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/volume = 0 + + level = 1 layer = 2.4 //under wires with their 2.44 + use_power = 0 can_unwrench = 1 var/datum/pipeline/parent = null @@ -11,8 +14,30 @@ buckle_requires_restraints = 1 buckle_lying = -1 -/obj/machinery/atmospherics/proc/pipeline_expansion() - return null +/obj/machinery/atmospherics/pipe/New() + color = pipe_color + ..() + +/obj/machinery/atmospherics/pipe/Destroy() + for(DEVICE_TYPE_LOOP) + var/obj/machinery/atmospherics/N = NODE_I + if(N) + var/obj/machinery/atmospherics/oldN = N + N.disconnect(src) + NODE_I = null + oldN.build_network() + releaseAirToTurf() + ..() + +/obj/machinery/atmospherics/pipe/atmosinit() + var/turf/T = loc // hide if turf is not intact + hide(T.intact) + ..() + +/obj/machinery/atmospherics/pipe/hide(i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 + update_icon() /obj/machinery/atmospherics/pipe/proc/check_pressure(pressure) //Return 1 if parent should continue checking other pipes @@ -59,5 +84,7 @@ ..() /obj/machinery/atmospherics/pipe/proc/update_node_icon() - //Used for pipe painting. Overriden in the children. - return + for(DEVICE_TYPE_LOOP) + if(NODE_I) + var/obj/machinery/atmospherics/N = NODE_I + N.update_icon() diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm index b4685c44a1d..98b633a10d3 100644 --- a/code/ATMOSPHERICS/pipes/simple.dm +++ b/code/ATMOSPHERICS/pipes/simple.dm @@ -16,18 +16,17 @@ The regular pipe you see everywhere, including bent ones. dir = SOUTH initialize_directions = SOUTH|NORTH - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - - level = 1 - + device_type = BINARY +/* /obj/machinery/atmospherics/pipe/simple/New() color = pipe_color ..() - +*/ /obj/machinery/atmospherics/pipe/simple/SetInitDirections() + if(dir in diagonals) + initialize_directions = dir switch(dir) if(NORTH) initialize_directions = SOUTH|NORTH @@ -37,34 +36,23 @@ The regular pipe you see everywhere, including bent ones. initialize_directions = EAST|WEST if(WEST) initialize_directions = EAST|WEST - if(NORTHEAST) - initialize_directions = NORTH|EAST - if(NORTHWEST) - initialize_directions = NORTH|WEST - if(SOUTHEAST) - initialize_directions = SOUTH|EAST - if(SOUTHWEST) - initialize_directions = SOUTH|WEST /obj/machinery/atmospherics/pipe/simple/atmosinit() normalize_dir() - var/N = 2 - for(var/D in cardinal) - if(D & initialize_directions) - N-- - for(var/obj/machinery/atmospherics/target in get_step(src, D)) - if(target.initialize_directions & get_dir(target,src)) - if(!node1 && N == 1) - node1 = target - break - if(!node2 && N == 0) - node2 = target - break - var/turf/T = loc // hide if turf is not intact - hide(T.intact) - update_icon() - ..() + var/list/node_connects = list() + if(dir in diagonals) //bent pipes + for(var/D in cardinal) + if(D & initialize_directions) + node_connects |= D + else //straight pipes + var/node1_connect = dir + var/node2_connect = turn(dir, 180) + node_connects = list(node1_connect, node2_connect) + + ..(node_connects) + +/* /obj/machinery/atmospherics/pipe/simple/Destroy() if(node1) var/obj/machinery/atmospherics/A = node1 @@ -89,7 +77,7 @@ The regular pipe you see everywhere, including bent ones. qdel(parent) node2 = null update_icon() - +*/ /obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() if(dir==2) dir = 1 @@ -97,13 +85,13 @@ The regular pipe you see everywhere, including bent ones. dir = 4 /obj/machinery/atmospherics/pipe/simple/update_icon() - if(node1&&node2) + if(NODE1&&NODE2) icon_state = "intact[invisibility ? "-f" : "" ]" else - var/have_node1 = node1?1:0 - var/have_node2 = node2?1:0 + var/have_node1 = NODE1?1:0 + var/have_node2 = NODE2?1:0 icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" - +/* /obj/machinery/atmospherics/pipe/simple/hide(i) if(level == 1 && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 @@ -118,7 +106,7 @@ The regular pipe you see everywhere, including bent ones. node1.update_icon() if(node2) node2.update_icon() - +*/ //Colored pipes, use these for mapping /obj/machinery/atmospherics/pipe/simple/general name="pipe" diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 1745c74f2a2..80fd3613796 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -106,9 +106,42 @@ #define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE #define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( #define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). - -#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this + +#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this // Atmos pipe limits #define MAX_OUTPUT_PRESSURE 4500 // (kPa) What pressure pumps and powered equipment max out at. -#define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at. \ No newline at end of file +#define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at. + +//Atmos machinery pipenet stuff + +// used for device_type vars; used by DEVICE_TYPE_LOOP +#define UNARY 1 +#define BINARY 2 +#define TRINARY 3 +#define QUATERNARY 4 + +// this is the standard for loop used by all sorts of atmos machinery procs +#define DEVICE_TYPE_LOOP var/I = 1; I <= device_type; I++ + +// defines for the various machinery lists +// NODE_I, AIR_I, PARENT_I are used within DEVICE_TYPE_LOOP + +// nodes list - all atmos machinery +#define NODE1 nodes["n1"] +#define NODE2 nodes["n2"] +#define NODE3 nodes["n3"] +#define NODE4 nodes["n4"] +#define NODE_I nodes["n[I]"] + +// airs list - components only +#define AIR1 airs["a1"] +#define AIR2 airs["a2"] +#define AIR3 airs["a3"] +#define AIR_I airs["a[I]"] + +// parents list - components only +#define PARENT1 parents["p1"] +#define PARENT2 parents["p2"] +#define PARENT3 parents["p3"] +#define PARENT_I parents["p[I]"] \ No newline at end of file diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index e484b42e4c3..b345ea16cd2 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -47,7 +47,7 @@ //Perform the connection connected_port = new_port connected_port.connected_device = src - var/datum/pipeline/connected_port_parent = connected_port.parents[PARENT1] + var/datum/pipeline/connected_port_parent = connected_port.PARENT1 connected_port_parent.reconcile_air() anchored = 1 //Prevent movement diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index dd5fee98f6c..f6655f193c9 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -13,12 +13,12 @@ //Manifolds for (var/obj/machinery/atmospherics/pipe/manifold/pipe in world) - if (!pipe.node1 || !pipe.node2 || !pipe.node3) + if (!pipe.NODE1 || !pipe.NODE2 || !pipe.NODE3) usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])" //Pipes for (var/obj/machinery/atmospherics/pipe/simple/pipe in world) - if (!pipe.node1 || !pipe.node2) + if (!pipe.NODE1 || !pipe.NODE2) usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])" /client/proc/powerdebug() diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index c0531581a36..a44e4865897 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -37,7 +37,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary if(vent_found) - var/datum/pipeline/vent_found_parent = vent_found.parents[PARENT1] + var/datum/pipeline/vent_found_parent = vent_found.PARENT1 if(vent_found_parent && (vent_found_parent.members.len || vent_found_parent.other_atmosmch)) visible_message("[src] begins climbing into the ventilation system..." ,"You begin climbing into the ventilation system...") @@ -70,7 +70,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary if(!istype(starting_machine) || !starting_machine.returnPipenet()) return var/list/totalMembers = list() - var/datum/pipeline/starting_machine_parent = starting_machine.parents[PARENT1] + var/datum/pipeline/starting_machine_parent = starting_machine.PARENT1 totalMembers += starting_machine_parent.members totalMembers += starting_machine_parent.other_atmosmch From 3a3ce839f998d23563b0e1592ce0810c49d2a573 Mon Sep 17 00:00:00 2001 From: duncathan Date: Mon, 17 Aug 2015 00:08:46 -0600 Subject: [PATCH 028/310] 2nd pass minor change to atmosinit changes heat exchanging pipes to be a subtype of atmospherics/pipe eventually this will allow us to make h/e manifolds (even 4-way) removes a bunch of comments --- code/ATMOSPHERICS/atmospherics.dm | 5 + .../components/unary_devices/unary_base.dm | 8 - code/ATMOSPHERICS/pipes/he_pipes.dm | 145 ------------------ .../pipes/heat_exchange/he_pipes.dm | 70 +++++++++ .../pipes/heat_exchange/junction.dm | 42 +++++ .../pipes/heat_exchange/simple.dm | 35 +++++ code/ATMOSPHERICS/pipes/manifold.dm | 83 ---------- code/ATMOSPHERICS/pipes/manifold4w.dm | 93 +---------- code/ATMOSPHERICS/pipes/pipes.dm | 8 + code/ATMOSPHERICS/pipes/simple.dm | 68 +------- code/game/machinery/pipe/construction.dm | 8 +- tgstation.dme | 4 +- 12 files changed, 176 insertions(+), 393 deletions(-) delete mode 100644 code/ATMOSPHERICS/pipes/he_pipes.dm create mode 100644 code/ATMOSPHERICS/pipes/heat_exchange/he_pipes.dm create mode 100644 code/ATMOSPHERICS/pipes/heat_exchange/junction.dm create mode 100644 code/ATMOSPHERICS/pipes/heat_exchange/simple.dm diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index d7f878e06ca..30184ff24d2 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -50,6 +50,11 @@ Pipelines + Other Objects -> Pipe network //this is called just after the air controller sets up turfs /obj/machinery/atmospherics/proc/atmosinit(var/list/node_connects) + if(!node_connects) //for pipes where order of nodes doesn't matter + node_connects = list() + for(var/D in cardinal) + if(D & GetInitDirections()) + node_connects |= D for(DEVICE_TYPE_LOOP) for(var/obj/machinery/atmospherics/target in get_step(src,node_connects[I])) if(target.initialize_directions & get_dir(target,src)) diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm index 1d6a92c7206..235c8907982 100644 --- a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm @@ -18,14 +18,6 @@ Iconnery ..(intact) -/* -Housekeeping and pipe network stuff below -*/ - -/obj/machinery/atmospherics/components/unary/atmosinit() - var/list/node_connects = list(dir) - ..(node_connects) - /obj/machinery/atmospherics/components/unary/default_change_direction_wrench(mob/user, obj/item/weapon/wrench/W) if(!..()) return diff --git a/code/ATMOSPHERICS/pipes/he_pipes.dm b/code/ATMOSPHERICS/pipes/he_pipes.dm deleted file mode 100644 index 10f900ab5d3..00000000000 --- a/code/ATMOSPHERICS/pipes/he_pipes.dm +++ /dev/null @@ -1,145 +0,0 @@ -//////////// -//HE Pipes -//////////// - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging - icon = 'icons/obj/atmospherics/pipes/heat.dmi' - icon_state = "intact" - level = 2 - var/initialize_directions_he - var/minimum_temperature_difference = 20 - var/thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT - color = "#404040" - buckle_lying = 1 - var/icon_temperature = T20C //stop small changes in temperature causing icon refresh - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/New() - ..() - color = "#404040" - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/SetInitDirections() - if(dir in diagonals) - initialize_directions_he = dir - switch(dir) - if(SOUTH) - initialize_directions_he = SOUTH|NORTH - if(NORTH) - initialize_directions_he = SOUTH|NORTH - if(EAST) - initialize_directions_he = EAST|WEST - if(WEST) - initialize_directions_he = WEST|EAST - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/atmosinit() - normalize_dir() - var/N = 2 - for(var/D in cardinal) - if(D & initialize_directions_he) - N-- - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) - if(target.initialize_directions_he & get_dir(target,src)) - if(!NODE1 && N == 1) - NODE1 = target - break - if(!NODE2 && N == 0) - NODE2 = target - break - update_icon() - ..() - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process_atmos() - var/environment_temperature = 0 - var/datum/gas_mixture/pipe_air = return_air() - - if(istype(loc, /turf/simulated)) - if(loc:blocks_air) - environment_temperature = loc:temperature - else - var/datum/gas_mixture/environment = loc.return_air() - environment_temperature = environment.temperature - else - environment_temperature = loc:temperature - - if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(loc, volume, thermal_conductivity) - - - //heatup/cooldown any mobs buckled to ourselves based on our temperature - if(buckled_mob) - var/hc = pipe_air.heat_capacity() - var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500) - pipe_air.temperature = avg_temp - buckled_mob.bodytemperature = avg_temp - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process() - var/datum/gas_mixture/pipe_air = return_air() - //Burn any mobs buckled to ourselves based on our temperature - if(buckled_mob) - var/heat_limit = 1000 - if(pipe_air.temperature > heat_limit + 1) - buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest") - - //Heat causes pipe to glow - if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //glow starts at 500K - if(abs(pipe_air.temperature - icon_temperature) > 10) - icon_temperature = pipe_air.temperature - - var/h_r = heat2colour_r(icon_temperature) - var/h_g = heat2colour_g(icon_temperature) - var/h_b = heat2colour_b(icon_temperature) - - if(icon_temperature < 2000)//scale glow until 2000K - var/scale = (icon_temperature - 500) / 1500 - h_r = 64 + (h_r - 64) * scale - h_g = 64 + (h_g - 64) * scale - h_b = 64 + (h_b - 64) * scale - - animate(src, color = rgb(h_r, h_g, h_b), time = 20, easing = SINE_EASING) - -//////////////// -//HE Junctions -//////////////// -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction - icon = 'icons/obj/atmospherics/pipes/junction.dmi' - icon_state = "intact" - level = 2 - minimum_temperature_difference = 300 - thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/normalize_dir() - return - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/SetInitDirections() - switch(dir) - if(SOUTH) - initialize_directions = NORTH - initialize_directions_he = SOUTH - if(NORTH) - initialize_directions = SOUTH - initialize_directions_he = NORTH - if(EAST) - initialize_directions = WEST - initialize_directions_he = EAST - if(WEST) - initialize_directions = EAST - initialize_directions_he = WEST - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/update_icon() - if(NODE1&&NODE2) - icon_state = "intact" - else - var/have_node1 = NODE1?1:0 - var/have_node2 = NODE2?1:0 - icon_state = "exposed[have_node1][have_node2]" - -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/atmosinit() - for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) - if(target.initialize_directions & get_dir(target,src)) - NODE1 = target - break - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,initialize_directions_he)) - if(target.initialize_directions_he & get_dir(target,src)) - NODE2 = target - break - update_icon() - ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/heat_exchange/he_pipes.dm b/code/ATMOSPHERICS/pipes/heat_exchange/he_pipes.dm new file mode 100644 index 00000000000..3d605767a78 --- /dev/null +++ b/code/ATMOSPHERICS/pipes/heat_exchange/he_pipes.dm @@ -0,0 +1,70 @@ +//////////// +//HE Pipes +//////////// + +/obj/machinery/atmospherics/pipe/heat_exchanging/ + icon = 'icons/obj/atmospherics/pipes/heat.dmi' + level = 2 + var/initialize_directions_he + var/minimum_temperature_difference = 20 + var/thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT + color = "#404040" + buckle_lying = 1 + var/icon_temperature = T20C //stop small changes in temperature causing icon refresh + +/obj/machinery/atmospherics/pipe/heat_exchanging/New() + ..() + color = "#404040" + +/obj/machinery/atmospherics/pipe/heat_exchanging/hide() + return + +/obj/machinery/atmospherics/pipe/heat_exchanging/process_atmos() + var/environment_temperature = 0 + var/datum/gas_mixture/pipe_air = return_air() + + var/turf/simulated/T = loc + if(istype(T)) + if(T.blocks_air) + environment_temperature = T.temperature + else + var/datum/gas_mixture/environment = T.return_air() + environment_temperature = environment.temperature + else + environment_temperature = T.temperature + + if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) + parent.temperature_interact(T, volume, thermal_conductivity) + + + //heatup/cooldown any mobs buckled to ourselves based on our temperature + if(buckled_mob) + var/hc = pipe_air.heat_capacity() + var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500) + pipe_air.temperature = avg_temp + buckled_mob.bodytemperature = avg_temp + +/obj/machinery/atmospherics/pipe/heat_exchanging/process() + var/datum/gas_mixture/pipe_air = return_air() + //Burn any mobs buckled to ourselves based on our temperature + if(buckled_mob) + var/heat_limit = 1000 + if(pipe_air.temperature > heat_limit + 1) + buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest") + + //Heat causes pipe to glow + if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //glow starts at 500K + if(abs(pipe_air.temperature - icon_temperature) > 10) + icon_temperature = pipe_air.temperature + + var/h_r = heat2colour_r(icon_temperature) + var/h_g = heat2colour_g(icon_temperature) + var/h_b = heat2colour_b(icon_temperature) + + if(icon_temperature < 2000)//scale glow until 2000K + var/scale = (icon_temperature - 500) / 1500 + h_r = 64 + (h_r - 64) * scale + h_g = 64 + (h_g - 64) * scale + h_b = 64 + (h_b - 64) * scale + + animate(src, color = rgb(h_r, h_g, h_b), time = 20, easing = SINE_EASING) \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/heat_exchange/junction.dm b/code/ATMOSPHERICS/pipes/heat_exchange/junction.dm new file mode 100644 index 00000000000..fdc894c6230 --- /dev/null +++ b/code/ATMOSPHERICS/pipes/heat_exchange/junction.dm @@ -0,0 +1,42 @@ +/obj/machinery/atmospherics/pipe/heat_exchanging/junction + icon = 'icons/obj/atmospherics/pipes/junction.dmi' + icon_state = "intact" + + name = "junction" + desc = "A one meter junction that connects regular and heat-exchanging pipe" + + minimum_temperature_difference = 300 + thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT + volume = 70 + + dir = SOUTH + initialize_directions = NORTH + initialize_directions_he = SOUTH + + device_type = BINARY + +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/SetInitDirections() + switch(dir) + if(SOUTH) + initialize_directions = NORTH + initialize_directions_he = SOUTH + if(NORTH) + initialize_directions = SOUTH + initialize_directions_he = NORTH + if(EAST) + initialize_directions = WEST + initialize_directions_he = EAST + if(WEST) + initialize_directions = EAST + initialize_directions_he = WEST + +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/atmosinit() //it pains me that this must be hardcoded, but the alternative is super hacky + for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) + if(target.initialize_directions & get_dir(target,src)) + NODE1 = target + break + for(var/obj/machinery/atmospherics/pipe/heat_exchanging/simple/target in get_step(src,initialize_directions_he)) + if(target.initialize_directions_he & get_dir(target,src)) + NODE2 = target + break + update_icon() \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/heat_exchange/simple.dm b/code/ATMOSPHERICS/pipes/heat_exchange/simple.dm new file mode 100644 index 00000000000..0ea6240c437 --- /dev/null +++ b/code/ATMOSPHERICS/pipes/heat_exchange/simple.dm @@ -0,0 +1,35 @@ +/obj/machinery/atmospherics/pipe/heat_exchanging/simple + icon_state = "intact" + + name = "pipe" + desc = "A one meter section of heat-exchanging pipe" + + volume = 70 + + dir = SOUTH + initialize_directions_he = SOUTH|NORTH + + device_type = BINARY + +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/SetInitDirections() + if(dir in diagonals) + initialize_directions_he = dir + switch(dir) + if(SOUTH) + initialize_directions_he = SOUTH|NORTH + if(NORTH) + initialize_directions_he = SOUTH|NORTH + if(EAST) + initialize_directions_he = EAST|WEST + if(WEST) + initialize_directions_he = WEST|EAST + +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/proc/normalize_dir() + if(dir==SOUTH) + dir = NORTH + else if(dir==WEST) + dir = EAST + +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/atmosinit() + normalize_dir() + ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 2a56452d46f..997f4fdf8d4 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -1,4 +1,3 @@ - /* 3-Way Manifold */ @@ -16,12 +15,7 @@ initialize_directions = EAST|NORTH|WEST device_type = TRINARY -/* -/obj/machinery/atmospherics/pipe/manifold/New() - color = pipe_color - ..() -*/ /obj/machinery/atmospherics/pipe/manifold/SetInitDirections() switch(dir) if(NORTH) @@ -33,65 +27,6 @@ if(WEST) initialize_directions = NORTH|EAST|SOUTH -/obj/machinery/atmospherics/pipe/manifold/atmosinit() - var/node1_connect = turn(dir, 90) - var/node2_connect = turn(dir, 270) - var/node3_connect = turn(dir, 180) - var/list/node_connects = list(node1_connect, node2_connect, node3_connect) - ..(node_connects) -/* - for(var/D in cardinal) - if(D == dir) - continue - for(var/obj/machinery/atmospherics/target in get_step(src, D)) - if(target.initialize_directions & get_dir(target,src)) - if(turn(dir, 90) == D) - node1 = target - if(turn(dir, 270) == D) - node2 = target - if(turn(dir, 180) == D) - node3 = target - break - var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) - update_icon() - ..() - -/obj/machinery/atmospherics/pipe/manifold/Destroy() - if(node1) - var/obj/machinery/atmospherics/A = node1 - node1.disconnect(src) - node1 = null - A.build_network() - if(node2) - var/obj/machinery/atmospherics/A = node2 - node2.disconnect(src) - node2 = null - A.build_network() - if(node3) - var/obj/machinery/atmospherics/A = node3 - node3.disconnect(src) - node3 = null - A.build_network() - releaseAirToTurf() - ..() - -/obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node1 = null - if(reference == node2) - if(istype(node2, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node2 = null - if(reference == node3) - if(istype(node3, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node3 = null - update_icon() - ..() -*/ /obj/machinery/atmospherics/pipe/manifold/update_icon() var/invis = invisibility ? "-f" : "" @@ -103,24 +38,6 @@ for(DEVICE_TYPE_LOOP) if(NODE_I) overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src, NODE_I)) -/* -/obj/machinery/atmospherics/pipe/manifold/hide(i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 - update_icon() - -/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion() - return list(node1, node2, node3) - -/obj/machinery/atmospherics/pipe/manifold/update_node_icon() - ..() - if(node1) - node1.update_icon() - if(node2) - node2.update_icon() - if(node3) - node3.update_icon() -*/ //Colored pipes, use these for mapping /obj/machinery/atmospherics/pipe/manifold/general diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index da510edb363..aeacfcd0b48 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -1,4 +1,3 @@ - /* 4-way manifold */ @@ -14,87 +13,10 @@ initialize_directions = NORTH|SOUTH|EAST|WEST device_type = QUATERNARY -/* -/obj/machinery/atmospherics/pipe/manifold4w/New() - color = pipe_color - ..() -*/ + /obj/machinery/atmospherics/pipe/manifold4w/SetInitDirections() initialize_directions = initial(initialize_directions) -/obj/machinery/atmospherics/pipe/manifold4w/atmosinit() - ..(cardinal) -/* - for(var/D in cardinal) - for(var/obj/machinery/atmospherics/target in get_step(src, D)) - if(target.initialize_directions & get_dir(target,src)) - if(D == NORTH) - node1 = target - else if(D == SOUTH) - node2 = target - else if(D == EAST) - node3 = target - else if(D == WEST) - node4 = target - break - - var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) - update_icon() - ..() - -/obj/machinery/atmospherics/pipe/manifold4w/hide(i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 - update_icon() - -/obj/machinery/atmospherics/pipe/manifold4w/pipeline_expansion() - return list(node1, node2, node3, node4) - -/obj/machinery/atmospherics/pipe/manifold4w/Destroy() - if(node1) - var/obj/machinery/atmospherics/A = node1 - node1.disconnect(src) - node1 = null - A.build_network() - if(node2) - var/obj/machinery/atmospherics/A = node2 - node2.disconnect(src) - node2 = null - A.build_network() - if(node3) - var/obj/machinery/atmospherics/A = node3 - node3.disconnect(src) - node3 = null - A.build_network() - if(node4) - var/obj/machinery/atmospherics/A = node4 - node4.disconnect(src) - node4 = null - A.build_network() - releaseAirToTurf() - ..() - -/obj/machinery/atmospherics/pipe/manifold4w/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node1 = null - if(reference == node2) - if(istype(node2, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node2 = null - if(reference == node3) - if(istype(node3, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node3 = null - if(reference == node4) - if(istype(node4, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node4 = null - update_icon() - ..() -*/ /obj/machinery/atmospherics/pipe/manifold4w/update_icon() var/invis = invisibility ? "-f" : "" @@ -106,18 +28,7 @@ for(DEVICE_TYPE_LOOP) if(NODE_I) overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src, NODE_I)) -/* -/obj/machinery/atmospherics/pipe/manifold4w/update_node_icon() - ..() - if(node1) - node1.update_icon() - if(node2) - node2.update_icon() - if(node3) - node3.update_icon() - if(node4) - node4.update_icon() -*/ + //Colored pipes, use these for mapping /obj/machinery/atmospherics/pipe/manifold4w/general name="pipe" diff --git a/code/ATMOSPHERICS/pipes/pipes.dm b/code/ATMOSPHERICS/pipes/pipes.dm index b4b780ae60c..4d902488520 100644 --- a/code/ATMOSPHERICS/pipes/pipes.dm +++ b/code/ATMOSPHERICS/pipes/pipes.dm @@ -29,6 +29,14 @@ releaseAirToTurf() ..() +/obj/machinery/atmospherics/pipe/update_icon() //overridden by manifolds + if(NODE1&&NODE2) + icon_state = "intact[invisibility ? "-f" : "" ]" + else + var/have_node1 = NODE1?1:0 + var/have_node2 = NODE2?1:0 + icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" + /obj/machinery/atmospherics/pipe/atmosinit() var/turf/T = loc // hide if turf is not intact hide(T.intact) diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm index 98b633a10d3..e1e50f7c752 100644 --- a/code/ATMOSPHERICS/pipes/simple.dm +++ b/code/ATMOSPHERICS/pipes/simple.dm @@ -1,4 +1,3 @@ - /* Simple Pipe The regular pipe you see everywhere, including bent ones. @@ -17,12 +16,6 @@ The regular pipe you see everywhere, including bent ones. initialize_directions = SOUTH|NORTH device_type = BINARY -/* -/obj/machinery/atmospherics/pipe/simple/New() - color = pipe_color - - ..() -*/ /obj/machinery/atmospherics/pipe/simple/SetInitDirections() if(dir in diagonals) @@ -42,9 +35,7 @@ The regular pipe you see everywhere, including bent ones. var/list/node_connects = list() if(dir in diagonals) //bent pipes - for(var/D in cardinal) - if(D & initialize_directions) - node_connects |= D + ..() else //straight pipes var/node1_connect = dir var/node2_connect = turn(dir, 180) @@ -52,61 +43,16 @@ The regular pipe you see everywhere, including bent ones. ..(node_connects) -/* -/obj/machinery/atmospherics/pipe/simple/Destroy() - if(node1) - var/obj/machinery/atmospherics/A = node1 - node1.disconnect(src) - node1 = null - A.build_network() - if(node2) - var/obj/machinery/atmospherics/A = node2 - node2.disconnect(src) - node2 = null - A.build_network() - releaseAirToTurf() - ..() - -/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node1 = null - if(reference == node2) - if(istype(node2, /obj/machinery/atmospherics/pipe)) - qdel(parent) - node2 = null - update_icon() -*/ /obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() - if(dir==2) - dir = 1 - else if(dir==8) - dir = 4 + if(dir==SOUTH) + dir = NORTH + else if(dir==WEST) + dir = EAST /obj/machinery/atmospherics/pipe/simple/update_icon() - if(NODE1&&NODE2) - icon_state = "intact[invisibility ? "-f" : "" ]" - else - var/have_node1 = NODE1?1:0 - var/have_node2 = NODE2?1:0 - icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" -/* -/obj/machinery/atmospherics/pipe/simple/hide(i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 - update_icon() - -/obj/machinery/atmospherics/pipe/simple/pipeline_expansion() - return list(node1, node2) - -/obj/machinery/atmospherics/pipe/simple/update_node_icon() + normalize_dir() ..() - if(node1) - node1.update_icon() - if(node2) - node2.update_icon() -*/ + //Colored pipes, use these for mapping /obj/machinery/atmospherics/pipe/simple/general name="pipe" diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 2d49668927f..186ec5ce45d 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -57,9 +57,9 @@ Buildable meters is_bent = 0 else is_bent = 1 - if (istype(make_from, /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction)) + if (istype(make_from, /obj/machinery/atmospherics/pipe/heat_exchanging/junction)) src.pipe_type = PIPE_JUNCTION - else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/heat_exchanging)) + else if(istype(make_from, /obj/machinery/atmospherics/pipe/heat_exchanging/simple)) src.pipe_type = PIPE_HE_STRAIGHT + is_bent else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple)) src.pipe_type = PIPE_SIMPLE_STRAIGHT + is_bent @@ -311,7 +311,7 @@ var/global/list/pipeID2State = list( P.construction(dir, pipe_dir, pipe_type, color) if(PIPE_HE_STRAIGHT, PIPE_HE_BENT) - var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/P = new ( src.loc ) + var/obj/machinery/atmospherics/pipe/heat_exchanging/simple/P = new ( src.loc ) P.initialize_directions_he = pipe_dir P.construction(dir, pipe_dir, pipe_type, color) @@ -330,7 +330,7 @@ var/global/list/pipeID2State = list( M.construction(dir, pipe_dir, pipe_type, color) if(PIPE_JUNCTION) - var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/P = new ( src.loc ) + var/obj/machinery/atmospherics/pipe/heat_exchanging/junction/P = new ( src.loc ) P.initialize_directions_he = src.get_hdir() P.construction(dir, get_pdir(), pipe_type, color) diff --git a/tgstation.dme b/tgstation.dme index 7677d19fc8f..beaabe5bd84 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -118,11 +118,13 @@ #include "code\ATMOSPHERICS\components\unary_devices\unary_base.dm" #include "code\ATMOSPHERICS\components\unary_devices\vent_pump.dm" #include "code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm" -#include "code\ATMOSPHERICS\pipes\he_pipes.dm" #include "code\ATMOSPHERICS\pipes\manifold.dm" #include "code\ATMOSPHERICS\pipes\manifold4w.dm" #include "code\ATMOSPHERICS\pipes\pipes.dm" #include "code\ATMOSPHERICS\pipes\simple.dm" +#include "code\ATMOSPHERICS\pipes\heat_exchange\he_pipes.dm" +#include "code\ATMOSPHERICS\pipes\heat_exchange\junction.dm" +#include "code\ATMOSPHERICS\pipes\heat_exchange\simple.dm" #include "code\controllers\configuration.dm" #include "code\controllers\failsafe.dm" #include "code\controllers\master_controller.dm" From d3f4d7d06e8bc1547a4c80becc801baac42a9ef7 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Mon, 17 Aug 2015 11:24:34 +0100 Subject: [PATCH 029/310] Access denied lights Emag lights --- code/game/machinery/doors/airlock.dm | 64 +++++++++++------- code/game/machinery/doors/door.dm | 23 ++----- icons/obj/doors/airlocks/station/overlays.dmi | Bin 6170 -> 7637 bytes 3 files changed, 45 insertions(+), 42 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 74a07078dfd..5c15063072e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -21,6 +21,9 @@ #define AIRLOCK_CLOSING 2 #define AIRLOCK_OPEN 3 #define AIRLOCK_OPENING 4 +#define AIRLOCK_DENY 5 +#define AIRLOCK_EMAG 6 +var/list/airlock_overlays = list() /obj/machinery/door/airlock name = "airlock" @@ -54,7 +57,6 @@ var/airlock_material = null //material of inner filling; if its an airlock with glass, this should be set to "glass" var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - var/list/airlock_overlays = list() explosion_block = 1 @@ -476,9 +478,7 @@ About the new airlock wires panel: icon_state = "closed" if(AIRLOCK_OPEN) icon_state = "open" - if(AIRLOCK_CLOSING) - icon_state = "" - if(AIRLOCK_OPENING) + if(AIRLOCK_CLOSING, AIRLOCK_OPENING) icon_state = "" set_airlock_overlays(state) @@ -488,10 +488,10 @@ About the new airlock wires panel: var/image/lights_overlay var/image/panel_overlay var/image/weld_overlay + var/image/sparks_overlay switch(state) - if(AIRLOCK_CLOSED) - world << "AIRLOCK_CLOSED" + if(AIRLOCK_CLOSED, AIRLOCK_DENY, AIRLOCK_EMAG) if(airlock_material) filling_overlay = get_airlock_overlay("[airlock_material]_closed") else @@ -500,11 +500,18 @@ About the new airlock wires panel: panel_overlay = get_airlock_overlay("panel_closed") if(welded) weld_overlay = get_airlock_overlay("welded") - if(lights) - if(locked) - lights_overlay = get_airlock_overlay("lights_bolted") - else if(emergency) - lights_overlay = get_airlock_overlay("lights_emergency") + if(state == AIRLOCK_EMAG) + sparks_overlay = get_airlock_overlay("sparks") + else + if(lights) + if(locked) + lights_overlay = get_airlock_overlay("lights_bolted") + else if(emergency) + lights_overlay = get_airlock_overlay("lights_emergency") + else if(state == AIRLOCK_DENY) + lights_overlay = get_airlock_overlay("lights_denied") + spawn(4) + overlays -= lights_overlay if(AIRLOCK_CLOSING) frame_overlay = get_airlock_overlay("closing", icon) @@ -518,7 +525,6 @@ About the new airlock wires panel: panel_overlay = get_airlock_overlay("panel_closing") if(AIRLOCK_OPEN) - world << "AIRLOCK OPEN" if(airlock_material) filling_overlay = get_airlock_overlay("[airlock_material]_open") else @@ -527,9 +533,7 @@ About the new airlock wires panel: panel_overlay = get_airlock_overlay("panel_open") if(AIRLOCK_OPENING) - world << "AIRLOCK_OPENING" frame_overlay = get_airlock_overlay("opening", icon) - if(airlock_material) filling_overlay = get_airlock_overlay("[airlock_material]_opening") else @@ -542,24 +546,24 @@ About the new airlock wires panel: overlays.Cut() if(frame_overlay) overlays += frame_overlay - frame_overlay.icon_state = frame_overlay.icon_state if(filling_overlay) overlays += filling_overlay - filling_overlay.icon_state = filling_overlay.icon_state if(lights_overlay) overlays += lights_overlay - lights_overlay.icon_state = lights_overlay.icon_state if(panel_overlay) overlays += panel_overlay - panel_overlay.icon_state = panel_overlay.icon_state if(weld_overlay) overlays += weld_overlay + if(sparks_overlay) + overlays += sparks_overlay -/obj/machinery/door/airlock/proc/get_airlock_overlay(key, icon_file=overlays_file) - if(src.airlock_overlays[key]) - return src.airlock_overlays[key] - src.airlock_overlays[key] = image(icon_file, key) - return src.airlock_overlays[key] +/obj/machinery/door/airlock/proc/get_airlock_overlay(iconstate, icon_file=overlays_file) + var/iconkey = "[iconstate][icon_file]" + if(airlock_overlays[iconkey]) + return airlock_overlays[iconkey] + world << "CREATING: [iconkey]" + airlock_overlays[iconkey] = image(icon_file, iconstate) + return airlock_overlays[iconkey] /obj/machinery/door/airlock/do_animate(animation) switch(animation) @@ -567,6 +571,8 @@ About the new airlock wires panel: update_icon(AIRLOCK_OPENING) if("closing") update_icon(AIRLOCK_CLOSING) + if("deny") + update_icon(AIRLOCK_DENY) /obj/machinery/door/airlock/examine(mob/user) ..() @@ -1347,3 +1353,15 @@ About the new airlock wires panel: for (var/obj/A in contents) A.HasProximity(AM) return + +/obj/machinery/door/airlock/emag_act(mob/user) + if(density && hasPower() && !emagged) + update_icon(AIRLOCK_EMAG) + sleep(6) + open() + emagged = 1 + desc = "Its access panel is smoking slightly." + lights = 0 + locked = 1 + loseMainPower() + loseBackupPower() \ No newline at end of file diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 129d03039b9..47bf8b3cec9 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -66,7 +66,7 @@ if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access) || emergency == 1)) open() else - flick("door_deny", src) + do_animate("deny") return return @@ -98,7 +98,7 @@ if(allowed(user) || src.emergency == 1) open() else - flick("door_deny", src) + do_animate("deny") return @@ -136,24 +136,9 @@ close() return if(src.density) - flick("door_deny", src) + do_animate("deny") return -/obj/machinery/door/emag_act(mob/user) - if(density && hasPower() && !emagged) - flick("door_spark", src) - sleep(6) - open() - emagged = 1 - desc = "Its access panel is smoking slightly." - if(istype(src, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = src - A.lights = 0 - A.locked = 1 - A.loseMainPower() - A.loseBackupPower() - A.update_icon() - /obj/machinery/door/blob_act() if(prob(40)) qdel(src) @@ -219,7 +204,7 @@ src.SetOpacity(0) sleep(5) src.density = 0 - sleep(5) + sleep(8) src.layer = 2.7 update_icon() SetOpacity(0) diff --git a/icons/obj/doors/airlocks/station/overlays.dmi b/icons/obj/doors/airlocks/station/overlays.dmi index 0e0b09a6e3ed9230dd5907d55961b673a753b2a3..beacbfe75857c0f9abe2049e16fbaf0dd477a1d6 100644 GIT binary patch literal 7637 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 b#0U795B{WullLD3;7?Ui16K0jS>S&G;5)@# literal 6170 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 JrOH+>{|i`{zd`^2 From f2f97006cd28c09c61e3867ed37aa3e5c54d6288 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Mon, 17 Aug 2015 13:06:04 +0100 Subject: [PATCH 030/310] Adds an animation to being electrocuted, like in cartoons! Adds some arguments to mutant bodypart icon procs to correctly render them in black for the duration of the animation. --- code/modules/mob/living/carbon/human/human.dm | 35 +++++++++- .../mob/living/carbon/human/species.dm | 64 +++++++++++------- icons/mob/human.dmi | Bin 71502 -> 80456 bytes 3 files changed, 72 insertions(+), 27 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 795c7e68da7..5c4bdac893b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -280,7 +280,12 @@ heart_attack = 0 if(stat == CONSCIOUS) src << "You feel your heart beating again!" - return ..(shock_damage,source,siemens_coeff) + + . = ..(shock_damage,source,siemens_coeff) + if(.) + electrocution_animation(40) + + /mob/living/carbon/human/Topic(href, href_list) if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) @@ -801,4 +806,30 @@ H.bloody_hands = 0 H.bloody_hands_mob = null H.update_inv_gloves() - update_icons() //apply the now updated overlays to the mob \ No newline at end of file + update_icons() //apply the now updated overlays to the mob + + + +//Turns a mob black, flashes a skeleton overlay +//Just like a cartoon! +/mob/living/carbon/human/proc/electrocution_animation(anim_duration) + //Handle mutant parts if possible + if(dna && dna.species) + dna.species.handle_mutant_bodyparts(src, "black") + dna.species.update_color(src, "black") + dna.species.handle_hair(src, "black") + overlays += "electrocuted_base" + spawn(anim_duration) + if(src) + if(dna && dna.species) + dna.species.handle_mutant_bodyparts(src) + dna.species.update_color(src) + dna.species.handle_hair(src) + overlays -= "electrocuted_base" + + else //or just do a generic animation + var/list/viewing = list() + for(var/mob/M in viewers(src)) + if(M.client) + viewing += M.client + flick_overlay(image(icon,src,"electrocuted_generic",MOB_LAYER+1), viewing, anim_duration) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index db366b79fb0..cbeb7e2f7ed 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -118,7 +118,7 @@ else return "[id]" -/datum/species/proc/update_color(mob/living/carbon/human/H) +/datum/species/proc/update_color(mob/living/carbon/human/H, forced_colour) H.remove_overlay(SPECIES_LAYER) var/image/standing @@ -135,7 +135,11 @@ spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = icon_state_string, "layer" = -SPECIES_LAYER) - spec_base.color = "#[H.dna.features["mcolor"]]" + if(!forced_colour) + spec_base.color = "#[H.dna.features["mcolor"]]" + else + spec_base.color = forced_colour + standing = spec_base if(standing) @@ -143,7 +147,7 @@ H.apply_overlay(SPECIES_LAYER) -/datum/species/proc/handle_hair(mob/living/carbon/human/H) +/datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour) H.remove_overlay(HAIR_LAYER) var/datum/sprite_accessory/S @@ -156,13 +160,17 @@ img_facial_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) - if(hair_color) - if(hair_color == "mutcolor") - img_facial_s.color = "#" + H.dna.features["mcolor"] + if(!forced_colour) + if(hair_color) + if(hair_color == "mutcolor") + img_facial_s.color = "#" + H.dna.features["mcolor"] + else + img_facial_s.color = "#" + hair_color else - img_facial_s.color = "#" + hair_color + img_facial_s.color = "#" + H.facial_hair_color else - img_facial_s.color = "#" + H.facial_hair_color + img_facial_s.color = forced_colour + img_facial_s.alpha = hair_alpha standing += img_facial_s @@ -184,13 +192,16 @@ img_hair_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER) - if(hair_color) - if(hair_color == "mutcolor") - img_hair_s.color = "#" + H.dna.features["mcolor"] + if(!forced_colour) + if(hair_color) + if(hair_color == "mutcolor") + img_hair_s.color = "#" + H.dna.features["mcolor"] + else + img_hair_s.color = "#" + hair_color else - img_hair_s.color = "#" + hair_color + img_hair_s.color = "#" + H.hair_color else - img_hair_s.color = "#" + H.hair_color + img_hair_s.color = forced_colour img_hair_s.alpha = hair_alpha standing += img_hair_s @@ -246,7 +257,7 @@ return -/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H) +/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) var/list/bodyparts_to_add = mutant_bodyparts.Copy() var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) var/list/standing = list() @@ -359,18 +370,21 @@ I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer) if(!(H.disabilities & HUSK)) - switch(S.color_src) - if(MUTCOLORS) - I.color = "#[H.dna.features["mcolor"]]" - if(HAIR) - if(hair_color == "mutcolor") + if(!forced_colour) + switch(S.color_src) + if(MUTCOLORS) I.color = "#[H.dna.features["mcolor"]]" - else - I.color = "#[H.hair_color]" - if(FACEHAIR) - I.color = "#[H.facial_hair_color]" - if(EYECOLOR) - I.color = "#[H.eye_color]" + if(HAIR) + if(hair_color == "mutcolor") + I.color = "#[H.dna.features["mcolor"]]" + else + I.color = "#[H.hair_color]" + if(FACEHAIR) + I.color = "#[H.facial_hair_color]" + if(EYECOLOR) + I.color = "#[H.eye_color]" + else + I.color = forced_colour standing += I if(S.hasinner) diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index 2156fd46e0a325136f8c7773c42076bdaa67463e..cb72485b1bc42d00de8030da0d20f5fa32053b8f 100644 GIT binary patch literal 80456 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 From 5681bbbd9becd97019a74b32fe8ae24e1f7fc4c9 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Mon, 17 Aug 2015 14:16:05 +0100 Subject: [PATCH 031/310] Updates human species to use update_color(), fixing humans not flashing black for the duration of the electrocution animation. Minor restructuring of redundant lines in update_icons.dm --- code/modules/mob/living/carbon/human/human.dm | 8 ++++---- code/modules/mob/living/carbon/human/species.dm | 17 ++++++++++++----- .../mob/living/carbon/human/update_icons.dm | 12 ++---------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5c4bdac893b..ec19362de9b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -815,16 +815,16 @@ /mob/living/carbon/human/proc/electrocution_animation(anim_duration) //Handle mutant parts if possible if(dna && dna.species) - dna.species.handle_mutant_bodyparts(src, "black") - dna.species.update_color(src, "black") - dna.species.handle_hair(src, "black") + dna.species.handle_mutant_bodyparts(src,"black") + dna.species.handle_hair(src,"black") + dna.species.update_color(src,"black") overlays += "electrocuted_base" spawn(anim_duration) if(src) if(dna && dna.species) dna.species.handle_mutant_bodyparts(src) - dna.species.update_color(src) dna.species.handle_hair(src) + dna.species.update_color(src) overlays -= "electrocuted_base" else //or just do a generic animation diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index cbeb7e2f7ed..bcad1cea1af 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -125,17 +125,24 @@ var/g = (H.gender == FEMALE) ? "f" : "m" - if(MUTCOLORS in specflags) + if((MUTCOLORS in specflags) || use_skintones) var/image/spec_base var/icon_state_string = "[id]_" - if(sexes) - icon_state_string += "[g]_s" + + if(use_skintones) + if(sexes) + icon_state_string = "[H.skin_tone]_[g]_s" + else + icon_state_string = "[H.skin_tone]_s" else - icon_state_string += "_s" + if(sexes) + icon_state_string += "[g]_s" + else + icon_state_string += "_s" spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = icon_state_string, "layer" = -SPECIES_LAYER) - if(!forced_colour) + if(!forced_colour && !use_skintones) spec_base.color = "#[H.dna.features["mcolor"]]" else spec_base.color = forced_colour diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8f8f5829970..69d80ba80ba 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -53,7 +53,6 @@ Please contact me on #coderbus IRC. ~Carnie x */ /mob/living/carbon/human/proc/update_base_icon_state() - //var/race = dna ? dna.mutantrace : null if(dna) base_icon_state = dna.species.update_base_icon_state(src) else @@ -68,7 +67,6 @@ Please contact me on #coderbus IRC. ~Carnie x //UPDATES OVERLAYS FROM OVERLAYS_STANDING //TODO: Remove all instances where this proc is called. It used to be the fastest way to swap between standing/lying. /mob/living/carbon/human/update_icons() - update_hud() //TODO: remove the need for this if(overlays.len != overlays_standing.len) @@ -79,7 +77,6 @@ Please contact me on #coderbus IRC. ~Carnie x update_transform() - //DAMAGE OVERLAYS //constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists /mob/living/carbon/human/update_damage_overlays() @@ -123,14 +120,9 @@ Please contact me on #coderbus IRC. ~Carnie x /mob/living/carbon/human/proc/update_body() remove_overlay(BODY_LAYER) + update_base_icon_state() + if(dna) - base_icon_state = dna.species.update_base_icon_state(src) - else - update_base_icon_state() - - icon_state = "[base_icon_state]_s" - - if(dna) // didn't want to have a duplicate if(dna) here, but due to the ordering of the code this was the only way dna.species.handle_body(src) /mob/living/carbon/human/update_fire() From 8b07203a87385418a6528f7c75f008aaceb3671e Mon Sep 17 00:00:00 2001 From: GunHog Date: Mon, 17 Aug 2015 11:03:53 -0500 Subject: [PATCH 032/310] Buffs RCD disable Malf power - Halfed cost to 25 processing power - Can now be used multiple times - No longer disables Cyborg RCDs - Fixes the feedback message not showing - Fixed mech RCDs not being affected by the power --- code/_globalvars/lists/objects.dm | 1 + .../gamemodes/malfunction/Malf_Modules.dm | 22 +++++++++---------- code/game/mecha/equipment/tools/work_tools.dm | 15 +++++++++---- code/game/objects/items/weapons/RCD.dm | 2 ++ html/changelogs/GunHogMalfRCDPowah.yml | 7 ++++++ 5 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 html/changelogs/GunHogMalfRCDPowah.yml diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index fcb84606da3..aa1082cdf82 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -13,4 +13,5 @@ var/global/list/chemical_reactions_list //list of all /datum/chemical_reactio var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path. var/global/list/table_recipes = list() //list of all table craft recipes +var/global/list/rcd_list = list() //list of Rapid Construction Devices. var/global/list/apcs_list = list() //list of all Area Power Controller machines, seperate from machines for powernet speeeeeeed. \ No newline at end of file diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 8f90c400ae9..439e3a3f746 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -123,27 +123,27 @@ /datum/AI_Module/large/disable_rcd module_name = "RCD disable" mod_pick_name = "rcd" - description = "Send a specialised pulse to break all RCD devices on the station." - cost = 50 + description = "Send a specialised pulse to break all hand-held and exosuit Rapid Cconstruction Devices on the station." + cost = 25 + one_time = 1 power_type = /mob/living/silicon/ai/proc/disable_rcd /mob/living/silicon/ai/proc/disable_rcd() set category = "Malfunction" set name = "Disable RCDs" + set desc = "Disable all RCD devices on the station, while sparing onboard cyborg RCDs." if(!canUseTopic()) return - for(var/datum/AI_Module/large/disable_rcd/rcdmod in current_modules) - if(rcdmod.uses > 0) - rcdmod.uses -- - for(var/obj/item/weapon/rcd/rcd in world) - rcd.disabled = 1 - for(var/obj/item/mecha_parts/mecha_equipment/rcd/rcd in world) - rcd.disabled = 1 - src << "Out of uses." + for(var/obj/item/weapon/rcd/RCD in rcd_list) + if(!istype(/obj/item/weapon/rcd/borg, RCD)) //Ensures that cyborg RCDs are spared. + RCD.disabled = 1 + for(var/obj/item/mecha_parts/mecha_equipment/rcd/MRCD in rcd_list) + MRCD.disabled = 1 + + src << "RCD-disabling pulse emitted." /datum/AI_Module/large/mecha_domination module_name = "Viral Mech Domination" diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 6c7b8006e47..245e0a2536b 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -197,11 +197,18 @@ var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. var/disabled = 0 //malf +/obj/item/mecha_parts/mecha_equipment/rcd/New() + rcd_list += src + ..() + +/obj/item/mecha_parts/mecha_equipment/rcd/Destroy() + rcd_list -= src + ..() + /obj/item/mecha_parts/mecha_equipment/rcd/action(atom/target) - if(istype(target,/area/shuttle)||istype(target, /turf/space/transit))//>implying these are ever made -Sieve - disabled = 1 - else - disabled = 0 + if(istype(target, /turf/space/transit))//>implying these are ever made -Sieve + return + if(!istype(target, /turf) && !istype(target, /obj/machinery/door/airlock)) target = get_turf(target) if(!action_checks(target) || disabled || get_dist(chassis, target)>3) diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index b5ffd7faa7a..fea4a8e83ff 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -230,12 +230,14 @@ RCD src.spark_system = new /datum/effect/effect/system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) + rcd_list += src return /obj/item/weapon/rcd/Destroy() qdel(spark_system) spark_system = null + rcd_list -= src return ..() /obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user, params) diff --git a/html/changelogs/GunHogMalfRCDPowah.yml b/html/changelogs/GunHogMalfRCDPowah.yml new file mode 100644 index 00000000000..a35092d3c2c --- /dev/null +++ b/html/changelogs/GunHogMalfRCDPowah.yml @@ -0,0 +1,7 @@ +author: Gun Hog + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +changes: + - tweak: "The Disable RCD Malfunction power now costs 25 CPU (down from 50), can be used multiple times, and no longer affects cyborgs." From 0d88d0eff66212e0abbdff120cca73a816b559d8 Mon Sep 17 00:00:00 2001 From: duncathan Date: Mon, 17 Aug 2015 16:09:33 -0600 Subject: [PATCH 033/310] 3rd pass adds GetInitDirections() from my other PR redoes atmosinit atmosinit now works if called without an argument (it builds the node_connects list on its own, without care for order) adds can_be_node; this proc is overridden by h/e pipes and junctions --- code/ATMOSPHERICS/atmospherics.dm | 23 ++++++++++++--- .../pipes/heat_exchange/he_pipes.dm | 13 ++++++--- .../pipes/heat_exchange/junction.dm | 29 ++++++++++++------- .../pipes/heat_exchange/simple.dm | 12 ++++---- code/ATMOSPHERICS/pipes/manifold.dm | 1 - code/ATMOSPHERICS/pipes/simple.dm | 19 ++---------- tgstation.dme | 1 - 7 files changed, 56 insertions(+), 42 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 30184ff24d2..159023e857f 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -52,16 +52,28 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/atmosinit(var/list/node_connects) if(!node_connects) //for pipes where order of nodes doesn't matter node_connects = list() - for(var/D in cardinal) - if(D & GetInitDirections()) - node_connects |= D + node_connects.len = device_type + + for(DEVICE_TYPE_LOOP) + for(var/D in cardinal) + if(D & GetInitDirections()) + if(D in node_connects) + continue + node_connects[I] = D + break + for(DEVICE_TYPE_LOOP) for(var/obj/machinery/atmospherics/target in get_step(src,node_connects[I])) - if(target.initialize_directions & get_dir(target,src)) + if(can_be_node(target, I)) NODE_I = target break + update_icon() +/obj/machinery/atmospherics/proc/can_be_node(obj/machinery/atmospherics/target) + if(target.initialize_directions & get_dir(target,src)) + return 1 + /obj/machinery/atmospherics/proc/pipeline_expansion() var/list/return_nodes = list() for(DEVICE_TYPE_LOOP) @@ -71,6 +83,9 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/SetInitDirections() return +/obj/machinery/atmospherics/proc/GetInitDirections() + return initialize_directions + /obj/machinery/atmospherics/proc/returnPipenet() return diff --git a/code/ATMOSPHERICS/pipes/heat_exchange/he_pipes.dm b/code/ATMOSPHERICS/pipes/heat_exchange/he_pipes.dm index 3d605767a78..30c7bf9e630 100644 --- a/code/ATMOSPHERICS/pipes/heat_exchange/he_pipes.dm +++ b/code/ATMOSPHERICS/pipes/heat_exchange/he_pipes.dm @@ -1,7 +1,3 @@ -//////////// -//HE Pipes -//////////// - /obj/machinery/atmospherics/pipe/heat_exchanging/ icon = 'icons/obj/atmospherics/pipes/heat.dmi' level = 2 @@ -16,9 +12,18 @@ ..() color = "#404040" +/obj/machinery/atmospherics/pipe/heat_exchanging/can_be_node(obj/machinery/atmospherics/pipe/heat_exchanging/target) + if(!istype(target)) + return 0 + if(target.initialize_directions_he & get_dir(target,src)) + return 1 + /obj/machinery/atmospherics/pipe/heat_exchanging/hide() return +/obj/machinery/atmospherics/pipe/heat_exchanging/GetInitDirections() + return ..() | initialize_directions_he + /obj/machinery/atmospherics/pipe/heat_exchanging/process_atmos() var/environment_temperature = 0 var/datum/gas_mixture/pipe_air = return_air() diff --git a/code/ATMOSPHERICS/pipes/heat_exchange/junction.dm b/code/ATMOSPHERICS/pipes/heat_exchange/junction.dm index fdc894c6230..b4424371ac0 100644 --- a/code/ATMOSPHERICS/pipes/heat_exchange/junction.dm +++ b/code/ATMOSPHERICS/pipes/heat_exchange/junction.dm @@ -30,13 +30,22 @@ initialize_directions = EAST initialize_directions_he = WEST -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/atmosinit() //it pains me that this must be hardcoded, but the alternative is super hacky - for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) - if(target.initialize_directions & get_dir(target,src)) - NODE1 = target - break - for(var/obj/machinery/atmospherics/pipe/heat_exchanging/simple/target in get_step(src,initialize_directions_he)) - if(target.initialize_directions_he & get_dir(target,src)) - NODE2 = target - break - update_icon() \ No newline at end of file +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/atmosinit() + var/node2_connect = dir + var/node1_connect = turn(dir, 180) + var/list/node_connects = list(node1_connect, node2_connect) + + ..(node_connects) + +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/can_be_node(obj/machinery/atmospherics/target, iteration) + var/init_dir + switch(iteration) + if(1) + init_dir = target.initialize_directions + if(2) + var/obj/machinery/atmospherics/pipe/heat_exchanging/H = target + if(!istype(H)) + return 0 + init_dir = H.initialize_directions_he + if(init_dir & get_dir(target,src)) + return 1 \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/heat_exchange/simple.dm b/code/ATMOSPHERICS/pipes/heat_exchange/simple.dm index 0ea6240c437..71d9b06b647 100644 --- a/code/ATMOSPHERICS/pipes/heat_exchange/simple.dm +++ b/code/ATMOSPHERICS/pipes/heat_exchange/simple.dm @@ -15,13 +15,9 @@ if(dir in diagonals) initialize_directions_he = dir switch(dir) - if(SOUTH) + if(NORTH,SOUTH) initialize_directions_he = SOUTH|NORTH - if(NORTH) - initialize_directions_he = SOUTH|NORTH - if(EAST) - initialize_directions_he = EAST|WEST - if(WEST) + if(EAST,WEST) initialize_directions_he = WEST|EAST /obj/machinery/atmospherics/pipe/heat_exchanging/simple/proc/normalize_dir() @@ -31,5 +27,9 @@ dir = EAST /obj/machinery/atmospherics/pipe/heat_exchanging/simple/atmosinit() + normalize_dir() + ..() + +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/update_icon() normalize_dir() ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 997f4fdf8d4..afee736108c 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -1,7 +1,6 @@ /* 3-Way Manifold */ - /obj/machinery/atmospherics/pipe/manifold icon = 'icons/obj/atmospherics/pipes/manifold.dmi' icon_state = "manifold" diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm index e1e50f7c752..2830f75f804 100644 --- a/code/ATMOSPHERICS/pipes/simple.dm +++ b/code/ATMOSPHERICS/pipes/simple.dm @@ -21,27 +21,14 @@ The regular pipe you see everywhere, including bent ones. if(dir in diagonals) initialize_directions = dir switch(dir) - if(NORTH) + if(NORTH,SOUTH) initialize_directions = SOUTH|NORTH - if(SOUTH) - initialize_directions = SOUTH|NORTH - if(EAST) - initialize_directions = EAST|WEST - if(WEST) + if(EAST,WEST) initialize_directions = EAST|WEST /obj/machinery/atmospherics/pipe/simple/atmosinit() normalize_dir() - var/list/node_connects = list() - - if(dir in diagonals) //bent pipes - ..() - else //straight pipes - var/node1_connect = dir - var/node2_connect = turn(dir, 180) - node_connects = list(node1_connect, node2_connect) - - ..(node_connects) + ..() /obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() if(dir==SOUTH) diff --git a/tgstation.dme b/tgstation.dme index beaabe5bd84..60b36e5e31a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -312,7 +312,6 @@ #include "code\game\gamemodes\changeling\powers\absorb.dm" #include "code\game\gamemodes\changeling\powers\adrenaline.dm" #include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" -#include "code\game\gamemodes\changeling\powers\chameleon_skin.dm" #include "code\game\gamemodes\changeling\powers\digitalcamo.dm" #include "code\game\gamemodes\changeling\powers\fakedeath.dm" #include "code\game\gamemodes\changeling\powers\fleshmend.dm" From e84ca7365a3e58cdddaf81ca37bc62132e159907 Mon Sep 17 00:00:00 2001 From: duncathan Date: Mon, 17 Aug 2015 16:48:34 -0600 Subject: [PATCH 034/310] fixes merge stuff --- code/__DEFINES/pipe_construction.dm | 4 ++-- code/game/machinery/pipe/construction.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm index 0fc337db1d2..f04e8a32ee9 100644 --- a/code/__DEFINES/pipe_construction.dm +++ b/code/__DEFINES/pipe_construction.dm @@ -8,8 +8,8 @@ Construction breaks otherwise #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_HE /obj/machinery/atmospherics/pipe/simple/heat_exchanging -#define PIPE_JUNCTION /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction +#define PIPE_HE /obj/machinery/atmospherics/pipe/heat_exchanging/simple +#define PIPE_JUNCTION /obj/machinery/atmospherics/pipe/heat_exchanging/junction //Unary #define PIPE_CONNECTOR /obj/machinery/atmospherics/components/unary/portables_connector #define PIPE_UVENT /obj/machinery/atmospherics/components/unary/vent_pump diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 21674b02d9f..d6d5034dcad 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -49,7 +49,7 @@ Buildable meters src.dir = make_from.dir src.pipename = make_from.name src.color = make_from.color - src.pipe_type = PIPE_4WAYMANIFOLD + if(make_from.type in pipe_types) src.pipe_type = make_from.type else //make pipe_type a value we can work with From cead1653c08a23363e66ea9ed1c66638bd73de94 Mon Sep 17 00:00:00 2001 From: duncathan Date: Mon, 17 Aug 2015 21:46:39 -0600 Subject: [PATCH 035/310] changes associative lists to standard lists; updates MiniStation.dmm --- _maps/map_files/MiniStation/MiniStation.dmm | 36 +++++++++---------- code/ATMOSPHERICS/atmospherics.dm | 1 + .../components/components_base.dm | 3 ++ code/__DEFINES/atmospherics.dm | 26 +++++++------- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 726e2e7e595..f17efdf2ad7 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -1080,7 +1080,7 @@ "uN" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) "uO" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry) "uP" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) -"uQ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 8},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) +"uQ" = (/obj/machinery/atmospherics/pipe/heat_exchanging/junction{dir = 8},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) "uR" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/tcommsat/computer) "uS" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/closet/secure_closet/hop,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"}) "uT" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/structure/closet/radiation,/turf/simulated/floor/plasteel,/area/engine/engineering) @@ -1470,10 +1470,10 @@ "CI" = (/obj/machinery/atmospherics/components/unary/outlet_injector{dir = 8; frequency = 1443; id = "air_in"; on = 1},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) "CJ" = (/obj/structure/sign/fire,/turf/simulated/wall,/area/engine/engineering) "CK" = (/obj/structure/transit_tube{tag = "icon-N-S-Pass"; icon_state = "N-S-Pass"},/turf/space,/area/space) -"CL" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/obj/structure/lattice,/turf/space,/area/engine/engineering) -"CM" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/structure/lattice,/obj/machinery/light/small{dir = 1},/turf/space,/area/engine/engineering) -"CN" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/structure/lattice,/turf/space,/area/engine/engineering) -"CO" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/obj/structure/lattice,/turf/space,/area/engine/engineering) +"CL" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 6},/obj/structure/lattice,/turf/space,/area/engine/engineering) +"CM" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 4},/obj/structure/lattice,/obj/machinery/light/small{dir = 1},/turf/space,/area/engine/engineering) +"CN" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 4},/obj/structure/lattice,/turf/space,/area/engine/engineering) +"CO" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 10},/obj/structure/lattice,/turf/space,/area/engine/engineering) "CP" = (/obj/machinery/atmospherics/components/binary/valve,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering) "CQ" = (/obj/machinery/atmospherics/components/binary/valve,/turf/simulated/floor/plating,/area/engine/engineering) "CR" = (/obj/machinery/atmospherics/components/binary/pump{target_pressure = 1500},/turf/simulated/floor/plating,/area/engine/engineering) @@ -1481,14 +1481,14 @@ "CT" = (/obj/machinery/atmospherics/components/binary/pump{dir = 1; target_pressure = 2000},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering) "CU" = (/obj/machinery/atmospherics/components/binary/valve,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering) "CV" = (/obj/machinery/door_control{id = "burndoor"; name = "Burn Chamber Vent Control"; pixel_x = 25; pixel_y = 5; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering) -"CW" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/obj/machinery/sparker{id = "burnchamber"; pixel_x = -25},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) -"CX" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/meter/turf{pixel_y = 24},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) -"CY" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) -"CZ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/camera{c_tag = "Burn Chamber"; network = list("burnchamber")},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) -"Da" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"CW" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 6},/obj/machinery/sparker{id = "burnchamber"; pixel_x = -25},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"CX" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 4},/obj/machinery/meter/turf{pixel_y = 24},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"CY" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 4},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"CZ" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 4},/obj/machinery/camera{c_tag = "Burn Chamber"; network = list("burnchamber")},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"Da" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 10},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) "Db" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/space,/area/space) -"Dc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/structure/lattice,/turf/space,/area/engine/engineering) -"Dd" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area/engine/engineering) +"Dc" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple,/obj/structure/lattice,/turf/space,/area/engine/engineering) +"Dd" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 5},/obj/structure/lattice,/turf/space,/area/engine/engineering) "De" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "Df" = (/obj/machinery/light,/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "Dg" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) @@ -1498,22 +1498,22 @@ "Dk" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/tcommsat/computer) "Dl" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/tcommsat/computer) "Dm" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravity_generator) -"Dn" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall,/area/engine/engineering) -"Do" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) -"Dp" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) -"Dq" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"Dn" = (/obj/machinery/atmospherics/pipe/heat_exchanging/junction{dir = 4},/turf/simulated/wall,/area/engine/engineering) +"Do" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 9},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"Dp" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 6},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"Dq" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple,/turf/simulated/floor/engine/vacuum,/area/engine/engineering) "Dr" = (/obj/machinery/door/poddoor{id = "burndoor"; name = "Mixer Room Vent"},/turf/simulated/floor/plating/airless,/area/engine/engineering) "Dt" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/tcommsat/computer) "Du" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/tcommsat/computer) "Dv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/gravity_generator) "Dw" = (/obj/item/device/analyzer,/obj/item/weapon/wrench,/turf/simulated/floor/plasteel,/area/engine/engineering) "DG" = (/obj/machinery/atmospherics/components/binary/volume_pump{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) -"DL" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/obj/structure/lattice,/turf/space,/area/engine/engineering) +"DL" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 9},/obj/structure/lattice,/turf/space,/area/engine/engineering) "DP" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/autoname{dir = 1},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plating,/area/engine/engineering) "DS" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the burn chamber."; dir = 8; layer = 4; name = "Burn Chamber Telescreen"; network = list("burnchamber"); pixel_x = 0; pixel_y = -30},/obj/structure/stool,/turf/simulated/floor/plating,/area/engine/engineering) "DT" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engineering) "DU" = (/obj/machinery/ignition_switch{id = "burnchamber"; pixel_x = 25},/turf/simulated/floor/plating,/area/engine/engineering) -"DW" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) +"DW" = (/obj/machinery/atmospherics/pipe/heat_exchanging/simple{dir = 5},/turf/simulated/floor/engine/vacuum,/area/engine/engineering) "DX" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/lattice,/turf/space,/area/space) "DZ" = (/obj/structure/lattice,/obj/structure/transit_tube{tag = "icon-N-S-Pass"; icon_state = "N-S-Pass"},/turf/space,/area/space) "Ea" = (/turf/simulated/wall,/area/tcommsat/computer) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index aa25c510853..132dc41a595 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -29,6 +29,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/New() ..() + nodes.len = device_type SSair.atmos_machinery += src SetInitDirections() if(can_unwrench) diff --git a/code/ATMOSPHERICS/components/components_base.dm b/code/ATMOSPHERICS/components/components_base.dm index 555018e9440..1414cd8f742 100644 --- a/code/ATMOSPHERICS/components/components_base.dm +++ b/code/ATMOSPHERICS/components/components_base.dm @@ -12,6 +12,9 @@ On top of that, now people can add component-speciic procs/vars if they want! /obj/machinery/atmospherics/components/New() ..() + parents.len = device_type + airs.len = device_type + for(DEVICE_TYPE_LOOP) var/datum/gas_mixture/A = new A.volume = 200 diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 80fd3613796..c09cb0de0f6 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -128,20 +128,20 @@ // NODE_I, AIR_I, PARENT_I are used within DEVICE_TYPE_LOOP // nodes list - all atmos machinery -#define NODE1 nodes["n1"] -#define NODE2 nodes["n2"] -#define NODE3 nodes["n3"] -#define NODE4 nodes["n4"] -#define NODE_I nodes["n[I]"] +#define NODE1 nodes[1] +#define NODE2 nodes[2] +#define NODE3 nodes[3] +#define NODE4 nodes[4] +#define NODE_I nodes[I] // airs list - components only -#define AIR1 airs["a1"] -#define AIR2 airs["a2"] -#define AIR3 airs["a3"] -#define AIR_I airs["a[I]"] +#define AIR1 airs[1] +#define AIR2 airs[2] +#define AIR3 airs[3] +#define AIR_I airs[I] // parents list - components only -#define PARENT1 parents["p1"] -#define PARENT2 parents["p2"] -#define PARENT3 parents["p3"] -#define PARENT_I parents["p[I]"] \ No newline at end of file +#define PARENT1 parents[1] +#define PARENT2 parents[2] +#define PARENT3 parents[3] +#define PARENT_I parents[I] \ No newline at end of file From 182ffef3f0b359d23fc193d7617b994b884e0a65 Mon Sep 17 00:00:00 2001 From: Robustin Date: Tue, 18 Aug 2015 14:01:03 -0400 Subject: [PATCH 036/310] Increases Folder Exchange Trigger The number of traitors required to trigger a folder exchange objective is increased from 5 to 8. The purpose of antagonists is to antagonize. These objectives provide 0 interactivity with the crew and completely dis-incentivize any antagonistic act against the station. Within 5 minutes either two traitors have greentext and the only way they can lose it is by actually conducting antagonistic acts, or one traitor shoots another traitor in the face and spaces the body to secure their own greentext, in which case they still have 0 interactivity with the rest of the crew. With the current minimum of 5 traitors, you see a folder exchange in almost every traitor round and unless these traitors willfully risk their greentext by going off-objective then you've got 40% of traitors neutralized at roundstart, leaving just 3 traitors to be the driving force behind a round. One of those traitors will be AFK at roundstart and won't even know they're a traitor, the other will be the RD who has to "steal" a hand teleporter... you can see where I'm going with this. Exchanges are too often a proximate cause for traitor rounds where absolutely nothing happens. This change preserves the exchange and the hard work someone put into it, but ensures the objective only appears when there's a sufficient number of traitors to antagonize the station if the two folderbuddies decide to peacefully greentext. --- code/game/gamemodes/traitor/traitor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index e45a673a364..7d2d552ebd3 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -108,7 +108,7 @@ var/is_hijacker = prob(10) var/martyr_chance = prob(20) var/objective_count = is_hijacker //Hijacking counts towards number of objectives - if(!exchange_blue && traitors.len >= 5) //Set up an exchange if there are enough traitors + if(!exchange_blue && traitors.len >= 8) //Set up an exchange if there are enough traitors if(!exchange_red) exchange_red = traitor else From 01bf5472ebde5735d0d609169c68b626dd96da8c Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone Date: Tue, 18 Aug 2015 15:45:51 -0400 Subject: [PATCH 037/310] Revert "Moves Cloning Machines/Comps to Medical Section" This reverts commit 98561a60c1d1354576730eef47e7837f5883dd01. --- .../research/designs/comp_board_designs.dm | 29 ++++++++++ .../research/designs/machine_designs.dm | 30 ---------- tgstation.dme | 58 ------------------- 3 files changed, 29 insertions(+), 88 deletions(-) diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 5b99724b022..0f657da38b0 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -160,6 +160,35 @@ build_path = /obj/item/weapon/circuitboard/robotics category = list("Computer Boards") +/datum/design/clonecontrol + name = "Computer Design (Cloning Machine Console)" + desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." + id = "clonecontrol" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/cloning + category = list("Computer Boards") + +/datum/design/clonepod + name = "Machine Design (Clone Pod)" + desc = "Allows for the construction of circuit boards used to build a Cloning Pod." + id = "clonepod" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/clonepod + category = list("Computer Boards") + +/datum/design/clonescanner + name = "Machine Design (Cloning Scanner)" + desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." + id = "clonescanner" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/clonescanner + category = list("Computer Boards") /datum/design/arcadebattle name = "Computer Design (Battle Arcade Machine)" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index c62281d10d7..75202c87387 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -142,36 +142,6 @@ build_path = /obj/item/weapon/circuitboard/chem_heater category = list ("Medical Machinery") -/datum/design/clonecontrol - name = "Computer Design (Cloning Machine Console)" - desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." - id = "clonecontrol" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/cloning - category = list("Medical Machinery") - -/datum/design/clonepod - name = "Machine Design (Clone Pod)" - desc = "Allows for the construction of circuit boards used to build a Cloning Pod." - id = "clonepod" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/clonepod - category = list("Medical Machinery") - -/datum/design/clonescanner - name = "Machine Design (Cloning Scanner)" - desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." - id = "clonescanner" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/clonescanner - category = list("Medical Machinery") - /datum/design/biogenerator name = "Machine Design (Biogenerator Board)" desc = "The circuit board for a biogenerator." diff --git a/tgstation.dme b/tgstation.dme index ae825e3bf2e..a212ac871cd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6,64 +6,6 @@ // BEGIN_FILE_DIR #define FILE_DIR . -#define FILE_DIR "code" -#define FILE_DIR "code/modules" -#define FILE_DIR "code/modules/games" -#define FILE_DIR "code/modules/html_interface" -#define FILE_DIR "code/modules/html_interface/cards" -#define FILE_DIR "code/modules/html_interface/nanotrasen" -#define FILE_DIR "html" -#define FILE_DIR "icons" -#define FILE_DIR "icons/ass" -#define FILE_DIR "icons/effects" -#define FILE_DIR "icons/mecha" -#define FILE_DIR "icons/misc" -#define FILE_DIR "icons/mob" -#define FILE_DIR "icons/mob/inhands" -#define FILE_DIR "icons/obj" -#define FILE_DIR "icons/obj/assemblies" -#define FILE_DIR "icons/obj/atmospherics" -#define FILE_DIR "icons/obj/atmospherics/components" -#define FILE_DIR "icons/obj/atmospherics/pipes" -#define FILE_DIR "icons/obj/clothing" -#define FILE_DIR "icons/obj/doors" -#define FILE_DIR "icons/obj/flora" -#define FILE_DIR "icons/obj/food" -#define FILE_DIR "icons/obj/guns" -#define FILE_DIR "icons/obj/hydroponics" -#define FILE_DIR "icons/obj/machines" -#define FILE_DIR "icons/obj/power_cond" -#define FILE_DIR "icons/obj/smooth_structures" -#define FILE_DIR "icons/obj/smooth_structures/alien" -#define FILE_DIR "icons/pda_icons" -#define FILE_DIR "icons/spideros_icons" -#define FILE_DIR "icons/stamp_icons" -#define FILE_DIR "icons/Testing" -#define FILE_DIR "icons/turf" -#define FILE_DIR "icons/turf/floors" -#define FILE_DIR "icons/turf/walls" -#define FILE_DIR "icons/vending_icons" -#define FILE_DIR "nano" -#define FILE_DIR "nano/images" -#define FILE_DIR "sound" -#define FILE_DIR "sound/AI" -#define FILE_DIR "sound/ambience" -#define FILE_DIR "sound/arcade" -#define FILE_DIR "sound/effects" -#define FILE_DIR "sound/guitar" -#define FILE_DIR "sound/hallucinations" -#define FILE_DIR "sound/items" -#define FILE_DIR "sound/machines" -#define FILE_DIR "sound/magic" -#define FILE_DIR "sound/mecha" -#define FILE_DIR "sound/misc" -#define FILE_DIR "sound/piano" -#define FILE_DIR "sound/spookoween" -#define FILE_DIR "sound/violin" -#define FILE_DIR "sound/voice" -#define FILE_DIR "sound/voice/complionator" -#define FILE_DIR "sound/vox_fem" -#define FILE_DIR "sound/weapons" // END_FILE_DIR // BEGIN_PREFERENCES From e800add01bab401f0878eedc17de725ff6529934 Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone Date: Tue, 18 Aug 2015 15:50:09 -0400 Subject: [PATCH 038/310] OK WE FIXED IT BOYS fuck the DME amirite --- .../research/designs/comp_board_designs.dm | 30 ------------------- .../research/designs/machine_designs.dm | 30 +++++++++++++++++++ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 0f657da38b0..be4b869c5d2 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -160,36 +160,6 @@ build_path = /obj/item/weapon/circuitboard/robotics category = list("Computer Boards") -/datum/design/clonecontrol - name = "Computer Design (Cloning Machine Console)" - desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." - id = "clonecontrol" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/cloning - category = list("Computer Boards") - -/datum/design/clonepod - name = "Machine Design (Clone Pod)" - desc = "Allows for the construction of circuit boards used to build a Cloning Pod." - id = "clonepod" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/clonepod - category = list("Computer Boards") - -/datum/design/clonescanner - name = "Machine Design (Cloning Scanner)" - desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." - id = "clonescanner" - req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/clonescanner - category = list("Computer Boards") - /datum/design/arcadebattle name = "Computer Design (Battle Arcade Machine)" desc = "Allows for the construction of circuit boards used to build a new arcade machine." diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 75202c87387..881c62217e2 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -142,6 +142,36 @@ build_path = /obj/item/weapon/circuitboard/chem_heater category = list ("Medical Machinery") + /datum/design/clonecontrol + name = "Computer Design (Cloning Machine Console)" + desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." + id = "clonecontrol" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/cloning + category = list("Medical Machinery") + +/datum/design/clonepod + name = "Machine Design (Clone Pod)" + desc = "Allows for the construction of circuit boards used to build a Cloning Pod." + id = "clonepod" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/clonepod + category = list("Medical Machinery") + +/datum/design/clonescanner + name = "Machine Design (Cloning Scanner)" + desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." + id = "clonescanner" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/clonescanner + category = list("Medical Machinery") + /datum/design/biogenerator name = "Machine Design (Biogenerator Board)" desc = "The circuit board for a biogenerator." From 928d7e874d78a696d1dcf5319aaffe28b6d95ab1 Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone Date: Tue, 18 Aug 2015 19:28:40 -0400 Subject: [PATCH 039/310] For you Scones [Telesci stuff moved to Tele Sec.] but I still have a crush on pap sooo >.> --- .../research/designs/comp_board_designs.dm | 19 ------------------ .../research/designs/machine_designs.dm | 20 +++++++++++++++++++ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index be4b869c5d2..9748ab6ffbe 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -110,15 +110,6 @@ build_path = /obj/item/weapon/circuitboard/crew category = list("Computer Boards") -/datum/design/teleconsole - name = "Computer Design (Teleporter Console)" - desc = "Allows for the construction of circuit boards used to build a teleporter control console." - id = "teleconsole" - req_tech = list("programming" = 3, "bluespace" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/teleporter - category = list("Computer Boards") /datum/design/secdata name = "Computer Design (Security Records Console)" @@ -320,16 +311,6 @@ build_path = /obj/item/weapon/circuitboard/comm_traffic category = list("Computer Boards") -/datum/design/telesci_console - name = "Computer Design (Telepad Control Console Board)" - desc = "Allows for the construction of circuit boards used to build a telescience console." - id = "telesci_console" - req_tech = list("programming" = 3, "bluespace" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/telesci_console - category = list("Computer Boards") - /datum/design/aifixer name = "Computer Design (AI Integrity Restorer)" desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer." diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 881c62217e2..8b60ab13056 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -92,6 +92,26 @@ build_path = /obj/item/weapon/circuitboard/telesci_pad category = list ("Teleportation Machinery") +/datum/design/teleconsole + name = "Computer Design (Teleporter Console)" + desc = "Allows for the construction of circuit boards used to build a teleporter control console." + id = "teleconsole" + req_tech = list("programming" = 3, "bluespace" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/teleporter + category = list("Teleportation Machinery") + +/datum/design/telesci_console + name = "Computer Design (Telepad Control Console Board)" + desc = "Allows for the construction of circuit boards used to build a telescience console." + id = "telesci_console" + req_tech = list("programming" = 3, "bluespace" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/telesci_console + category = list("Teleportation Machinery") + /datum/design/sleeper name = "Machine Design (Sleeper Board)" desc = "The circuit board for a sleeper." From 51a17eeeac6fbda5022bbfb15b2a11becdc4f726 Mon Sep 17 00:00:00 2001 From: MrPerson Date: Tue, 18 Aug 2015 21:54:53 -0700 Subject: [PATCH 040/310] Per MSO's advice, Ceiling glide_size until BYOND supports floats --- code/modules/mob/mob_movement.dm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index e7eee30eb35..6e2aac8909e 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -198,8 +198,16 @@ var/ticks = Ceiling(move_delay / world.tick_lag) if(ticks <= 0) ticks = 1 - glide_size = world.icon_size / ticks //assume icons are square - mob.glide_size = glide_size + var/target_glide_size = world.icon_size / ticks + + glide_size = target_glide_size + mob.glide_size = target_glide_size + + //byond floor()'s glide_size, we want it to Ceiling(), + //but we don't want it to Ceiling() if they fix it to accept floating point numbers + if(glide_size != target_glide_size) + glide_size = Ceiling(target_glide_size) + mob.glide_size = glide_size move_delay += world.time - 0.0001 //Ensure we're on the right tick even if there's rounding errors From 94344cd4712237ad28fa4c0a8fa643c2a4fc9b29 Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Wed, 19 Aug 2015 21:10:36 +1000 Subject: [PATCH 041/310] changes gold slime core hostile mob list to whitelist --- .../living/simple_animal/hostile/syndicate.dm | 2 +- code/modules/reagents/Chemistry-Recipes.dm | 79 +++++++++---------- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 38987cf6d27..9e6358e8a21 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -132,7 +132,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 mob_size = MOB_SIZE_TINY - flying + flying = 1 speak_emote = list("states") /mob/living/simple_animal/hostile/viscerator/death(gibbed) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index eb27d64550c..610522c91df 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -24,48 +24,45 @@ /datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon") if(holder && holder.my_atom) - var/blocked = list(/mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/pirate/ranged, - /mob/living/simple_animal/hostile/russian, - /mob/living/simple_animal/hostile/russian/ranged, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/syndicate/melee, - /mob/living/simple_animal/hostile/syndicate/melee/space, - /mob/living/simple_animal/hostile/syndicate/ranged, - /mob/living/simple_animal/hostile/syndicate/ranged/space, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/asteroid, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/asteroid/basilisk, - /mob/living/simple_animal/hostile/asteroid/goldgrub, - /mob/living/simple_animal/hostile/asteroid/goliath, - /mob/living/simple_animal/hostile/asteroid/hivelord, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood, - /mob/living/simple_animal/hostile/carp/holocarp, - /mob/living/simple_animal/hostile/mining_drone, - /mob/living/simple_animal/hostile/poison, - /mob/living/simple_animal/hostile/blob, - /mob/living/simple_animal/ascendant_shadowling, - /mob/living/simple_animal/hostile/guardian, - /mob/living/simple_animal/hostile/guardian/fire, - /mob/living/simple_animal/hostile/guardian/punch, - /mob/living/simple_animal/hostile/guardian/fast, - /mob/living/simple_animal/hostile/guardian/healer, - /mob/living/simple_animal/hostile/guardian/ranged, - /mob/living/simple_animal/hostile/guardian/bluespace, - /mob/living/simple_animal/hostile/guardian/bomb, - /mob/living/simple_animal/hostile/guardian/shield - )//exclusion list for things you don't want the reaction to create. - var/list/meancritters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs + var/list/meancritters = list(/mob/living/simple_animal/hostile/blob/blobspore, // list of possible hostile mobs + /mob/living/simple_animal/hostile/blob/blobbernaut, + /mob/living/simple_animal/hostile/carp/ranged/chaos, + /mob/living/simple_animal/hostile/carp/ranged, + /mob/living/simple_animal/hostile/carp/megacarp, + /mob/living/simple_animal/hostile/carp/eyeball, + /mob/living/simple_animal/hostile/carp, + /mob/living/simple_animal/hostile/alien/drone, + /mob/living/simple_animal/hostile/alien/sentinel, + /mob/living/simple_animal/hostile/alien/queen, + /mob/living/simple_animal/hostile/alien, + /mob/living/simple_animal/hostile/bear/Hudson, + /mob/living/simple_animal/hostile/bear, + /mob/living/simple_animal/hostile/poison/bees, + /mob/living/simple_animal/hostile/poison/giant_spider/nurse, + /mob/living/simple_animal/hostile/poison/giant_spider/hunter, + /mob/living/simple_animal/hostile/poison/giant_spider, + /mob/living/simple_animal/hostile/creature, + /mob/living/simple_animal/hostile/faithless, + /mob/living/simple_animal/hostile/headcrab, + /mob/living/simple_animal/hostile/hivebot/range, + /mob/living/simple_animal/hostile/hivebot/rapid, + /mob/living/simple_animal/hostile/hivebot/strong, + /mob/living/simple_animal/hostile/hivebot, + /mob/living/simple_animal/hostile/killertomato, + /mob/living/simple_animal/hostile/mimic/crate, + /mob/living/simple_animal/hostile/mimic, + /mob/living/simple_animal/hostile/statue, + /mob/living/simple_animal/hostile/viscerator, + /mob/living/simple_animal/hostile/tree/festivus, + /mob/living/simple_animal/hostile/tree) + var/list/nicecritters = list(/mob/living/simple_animal/crab, - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/lizard, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/chicken) // and possible friendly mobs + /mob/living/simple_animal/mouse, + /mob/living/simple_animal/lizard, + /mob/living/simple_animal/parrot, + /mob/living/simple_animal/butterfly, + /mob/living/simple_animal/cow, + /mob/living/simple_animal/chicken) // and possible friendly mobs nicecritters += typesof(/mob/living/simple_animal/pet) - /mob/living/simple_animal/pet var/atom/A = holder.my_atom var/turf/T = get_turf(A) From 20e57adf8948c5622e5fb1de6ef3c3b31472eb2c Mon Sep 17 00:00:00 2001 From: erwgd Date: Wed, 19 Aug 2015 15:16:12 +0100 Subject: [PATCH 042/310] Added salt shaker and pepper mill to food crate --- code/datums/supplypacks.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 175ec10a0fd..311699f3819 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -759,6 +759,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/reagent_containers/food/condiment/rice, /obj/item/weapon/reagent_containers/food/condiment/milk, /obj/item/weapon/reagent_containers/food/condiment/soymilk, + /obj/item/weapon/reagent_containers/food/condiment/saltshaker, + /obj/item/weapon/reagent_containers/food/condiment/peppermill, /obj/item/weapon/storage/fancy/egg_box, /obj/item/weapon/reagent_containers/food/condiment/enzyme, /obj/item/weapon/reagent_containers/food/condiment/sugar, From 489be2d3e10c540187a7414c0b28c4f9705a58b5 Mon Sep 17 00:00:00 2001 From: GunHog Date: Wed, 19 Aug 2015 09:47:20 -0500 Subject: [PATCH 043/310] RCDs now EXPLODE! - Made RCDs explode instead of simply disabled! - Minor explosion power. - Adds a five second warning to get rid of the RCD before it blows. - Added a small cooldown. --- .../gamemodes/malfunction/Malf_Modules.dm | 29 +++++++++++-------- code/game/mecha/equipment/tools/work_tools.dm | 6 +--- code/game/objects/items/weapons/RCD.dm | 3 -- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 439e3a3f746..79de293a31e 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -120,10 +120,10 @@ minor_announce("Automatic system reboot complete. Have a secure day.","Network reset:") -/datum/AI_Module/large/disable_rcd - module_name = "RCD disable" +/datum/AI_Module/large/destroy_rcd + module_name = "Destroy RCDs" mod_pick_name = "rcd" - description = "Send a specialised pulse to break all hand-held and exosuit Rapid Cconstruction Devices on the station." + description = "Send a specialised pulse to detonate all hand-held and exosuit Rapid Cconstruction Devices on the station." cost = 25 one_time = 1 @@ -131,19 +131,24 @@ /mob/living/silicon/ai/proc/disable_rcd() set category = "Malfunction" - set name = "Disable RCDs" - set desc = "Disable all RCD devices on the station, while sparing onboard cyborg RCDs." + set name = "Destroy RCDs" + set desc = "Detonate all RCDs on the station, while sparing onboard cyborg RCDs." - if(!canUseTopic()) + if(!canUseTopic() || malf_cooldown) return - for(var/obj/item/weapon/rcd/RCD in rcd_list) - if(!istype(/obj/item/weapon/rcd/borg, RCD)) //Ensures that cyborg RCDs are spared. - RCD.disabled = 1 - for(var/obj/item/mecha_parts/mecha_equipment/rcd/MRCD in rcd_list) - MRCD.disabled = 1 + for(var/obj/item/RCD in rcd_list) + if(!istype(RCD, /obj/item/weapon/rcd/borg)) //Ensures that cyborg RCDs are spared. + RCD.audible_message("[RCD] begins to vibrate and buzz loudly!","[RCD] begins vibrating violently!") + spawn(50) //5 seconds to get rid of it! + if(RCD) //Make sure it still exists (In case of chain-reaction) + explosion(RCD, 0, 0, 3, 1, flame_range = 1) + qdel(RCD) - src << "RCD-disabling pulse emitted." + src << "RCD detonation pulse emitted." + malf_cooldown = 1 + spawn(100) + malf_cooldown = 0 /datum/AI_Module/large/mecha_domination module_name = "Viral Mech Domination" diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 245e0a2536b..052b5a08353 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -195,7 +195,6 @@ energy_drain = 250 range = MELEE|RANGED var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. - var/disabled = 0 //malf /obj/item/mecha_parts/mecha_equipment/rcd/New() rcd_list += src @@ -211,7 +210,7 @@ if(!istype(target, /turf) && !istype(target, /obj/machinery/door/airlock)) target = get_turf(target) - if(!action_checks(target) || disabled || get_dist(chassis, target)>3) + if(!action_checks(target) || get_dist(chassis, target)>3) return playsound(chassis, 'sound/machines/click.ogg', 50, 1) @@ -249,7 +248,6 @@ var/turf/simulated/floor/F = target occupant_message("Building Wall...") if(do_after_cooldown(F)) - if(disabled) return F.ChangeTurf(/turf/simulated/wall) playsound(F, 'sound/items/Deconstruct.ogg', 50, 1) chassis.spark_system.start() @@ -267,8 +265,6 @@ /obj/item/mecha_parts/mecha_equipment/rcd/do_after_cooldown(var/atom/target) . = ..() - if(disabled) - return 0 /obj/item/mecha_parts/mecha_equipment/rcd/Topic(href,href_list) ..() diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index fea4a8e83ff..3eecda5909c 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -27,7 +27,6 @@ RCD var/working = 0 var/mode = 1 var/canRturf = 0 - var/disabled = 0 var/airlock_type = /obj/machinery/door/airlock var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/metal sheet, triple for plasteel @@ -312,8 +311,6 @@ RCD /obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity) if(!proximity) return 0 - if(disabled && !isrobot(user)) - return 0 if(istype(A,/area/shuttle)||istype(A,/turf/space/transit)) return 0 if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window))) From 1de60aa6292cf0d7d21bdb0fedda9f300da35e44 Mon Sep 17 00:00:00 2001 From: GunHog Date: Wed, 19 Aug 2015 10:03:42 -0500 Subject: [PATCH 044/310] Updates blood sacrifice to Dark Lord Jordie Updated changelog to reflect that the power now explodes RCDs. --- html/changelogs/GunHogMalfRCDPowah.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelogs/GunHogMalfRCDPowah.yml b/html/changelogs/GunHogMalfRCDPowah.yml index a35092d3c2c..2e4bfb6ebda 100644 --- a/html/changelogs/GunHogMalfRCDPowah.yml +++ b/html/changelogs/GunHogMalfRCDPowah.yml @@ -4,4 +4,4 @@ author: Gun Hog delete-after: True changes: - - tweak: "The Disable RCD Malfunction power now costs 25 CPU (down from 50), can be used multiple times, and no longer affects cyborgs." + - tweak: "The Disable RCD Malfunction power is now Destroy RCDs! It costs 25 CPU (down from 50), causes RCDs to explode, can be used multiple times, and no longer affects cyborgs." From 0d2e094c76684ae853c80ac9986c3dbbf6023841 Mon Sep 17 00:00:00 2001 From: WJohn Date: Wed, 19 Aug 2015 13:31:40 -0400 Subject: [PATCH 045/310] Minor table sprite change. I've heard complaints of people saying the current table sprites look flat, and I think it's because I removed this little bright line at the bottom and on corners that made em shiny in order to make it consistent with wooden tables. I've brought it back here. ![](http://i.imgur.com/yUTqAqN.png) --- .../obj/smooth_structures/reinforced_table.dmi | Bin 831 -> 842 bytes icons/obj/smooth_structures/table.dmi | Bin 666 -> 670 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/smooth_structures/reinforced_table.dmi b/icons/obj/smooth_structures/reinforced_table.dmi index be12e9f5fb597e431153b8cf4191caee71a3e901..85de93594f947258ac4b1abc95e366f06be01fa1 100644 GIT binary patch delta 597 zcmV-b0;>JL2FeDII1R|i$X;Gvz`(#LiY>~KMa+LBNklT*7zy|6CDh^O-;{Hci30s>w#Bm%`nCAEAtMFh%J{-%tU9KwAw#Jxj4gxH#;JA60 z0xTLUIBs&^7{JO{!EuvYvw+?8ftwcCGkH!d(3RK{$fXoNTFPs79 zt)zb$VBT7PMTB|#dMar=Vbr`ImJ-Jr~aNmWeP4~e8o~)pK zv0?$w;ZOcz0k8EaXjh{S9H975DX?jSg{I zToy)&5UDwAB*MglU4aTr2j)iLjU(TT0`gXpK!ne0eTxyc%L4lzs}K6VKMnxNHH3h? zGlyK|2*^7XhXE@^`Mx&}0<)(L1fEXw^}&!2by@tA>mR{^As?z*JVNnl1GWARtw4VT zDo}yz0;vy>UucLoqa+~Z?zV1(l>6`6z<55G2#n{0iNJW3BNZ4;JyLM!K? j6GDmql){}g`MJ$E&y_ai=6o{!00000NkvXXu0mjfON$qe delta 586 zcmV-Q0=50h2EPW7I1OH2UdYJEz`(%ypmCUyMa+L0NklT-A`vyHgrE!AZ{|+l*Yg30f#xV`k{6AXZ!+|()Ebn%?s%_U{O&2i%^Hb37RMCg#p}S-|&M2JUK!0)rkc> z$EWfB#N!=bqfQ;Jfm{G-mb6FV0 zL!{=g5f2w0>^(}hXtqaVbG60fm2oVKm4!Oz^QE(~_ z16GO(?ZG$*%>ITDcskA32V-`q>*`Z(egp@`>`?XU9*Qp;sPa3s0u`u01(pR;A0U6f z&=PM(i-457TUie&_utY$@hPYC!G*wdm18L|nR+Y*N`J#9nGY79axxz*?xEbW*|Ll$ z30~EDBJ>+3Ra;LoMce)^A)u=nSauIm2o(3Q`}I(?@U1`v76$&qSQg(8rGdRC5uksj zNC1ryKK2fSCr;}c)ZYJwoaVX!IMp%<`Tc|e@cfuDtDi6cPW^@aenKempHlg&CO^0N Y20@i9L>|hXa{vGU07*qoM6N<$f;UYP6#xJL diff --git a/icons/obj/smooth_structures/table.dmi b/icons/obj/smooth_structures/table.dmi index 3037760db9931ecf3a237b2292cc6a09958b50d8..ffd88a84fc7aacfa166c1b32e9415aca155202a4 100644 GIT binary patch delta 446 zcmV;v0YUzn1)c?vBq113OjJd{z`#L4L413Asi~>R$jFe8kX~M1z`(#IFjpv%Ldt)7 zNklUeoOeU|hr7{a@99A+6!DHN2J%>W51O~1EYNB{MEH! zO49d|)U{yF(w#%<009EL1pLhn)-nJA0t9#pc=!dp!6<|K|4OAKf#o`}nVcoiu=ffO zAizVw-cL}p12`bKEYkj9Sufi$P`!sxNipZBcR4Dl&5Gu{IM_WX9PI8x4i10UhhccI z`8=g})Byqn2=MNp_6_O_0vr}>uLpO6?X}EKu)WK%7yR)Cy$59;zYm+wcP|H9p8pT< z6^SGsUPvS!5Aml=;<#xG5FkK+0Nufb#08{tiU$~@^R!3K7uwDf79brI7m)U$3rM@r o1tcSDI#0+$&k&w^o=}-LR&x^Iatf)aaxkwwaXc}YY; zRA_Ex=_BFK<;7D9t$*FiNwc zW?JNV{#2*F@bzs0r9m-)QXiUsK&cN+pfHk?1q{M+M0(9V_FHK*Fv@q%UtJ5PBz-SQ zT?^(c-8rNV5Fo%yz~9_pEdvlBK!B%!hhM-Oj54_YuT)ABSgsSB$yovod#?Zi0z3rl z{RBljfCGZdBJB^B^|BoU)q4n)6myPxm!p!}tZ2?B2fGJ_gWY||!QuLUFboeipQrSW zIzWH`0p1^?Z_j0i1`Tqc4kx1g< zg+$`<5P!-fj+?ds0RjXF&>dVzTtGUfcz`iFPkZEiq3t|j0n$Nn0cjt)fV2x;Kr*tX k^MpL~4B@Hg36*&Rf^XmvKcA`Qm;e9(07*qoM6N<$f)hi=QUCw| From 458db2011debcd96683d8717922a70304ded7ae0 Mon Sep 17 00:00:00 2001 From: Robustin Date: Wed, 19 Aug 2015 15:39:31 -0400 Subject: [PATCH 046/310] Fixes the apostrophe issue Maybe... Doubtfully... But I wanted to give it a try since I'm tired of my glorious pronouncements garbled in &39 If I actually fixed it then I should get a medal for best coding by someone who can't code. My logic was that WHISPER works just fine with apostrophes and ampersands but shuttle call reasons, announcements, etc. would get that garbled text when using apostrophes and ampersands. With whispers trim is on the "inside", with stripped_input that is used for these announcements trim is on the "outside". It makes intuitive sense to me that whoever wrote that stripped_input comment might have gotten things flipped since if trim is on the inside, and it allows single symbols to pass through, then there's nothing to filter html_encode from spewing that garbage out. If this isn't the correct fix then at least I should be close enough that someone can point me in the right direction. --- code/__HELPERS/text.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 264f8cc73f1..27f8526c2e1 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -76,7 +76,7 @@ // Used to get a properly sanitized input, of max_length /proc/stripped_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN) var/name = input(user, message, title, default) as text|null - return html_encode(trim(name, max_length)) //trim is "inside" because html_encode can expand single symbols into multiple symbols (such as turning < into <) + return trim(html_encode(name), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <) // Used to get a properly sanitized multiline input, of max_length /proc/stripped_multiline_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN) @@ -411,4 +411,4 @@ var/list/binary = list("0","1") t = replacetext(t, "\[list\]", "
    ") t = replacetext(t, "\[/list\]", "
") - return t \ No newline at end of file + return t From 61b7c347a1e44263e7288c8bb27fea5da0350064 Mon Sep 17 00:00:00 2001 From: Robustin Date: Wed, 19 Aug 2015 15:43:01 -0400 Subject: [PATCH 047/310] Fixes Announcements Garbling Maybe... Doubtfully... But I wanted to give it a try since I'm tired of my glorious pronouncements garbled in &39 If I actually fixed it then I should get a medal for best coding by someone who can't code. My logic was that WHISPER works just fine with apostrophes and ampersands but shuttle call reasons, announcements, etc. would get that garbled text when using apostrophes and ampersands. With whispers trim is on the "inside", with stripped_input that is used for these announcements trim is on the "outside". It makes intuitive sense to me that whoever wrote that stripped_input comment might have gotten things flipped since if trim is on the inside, and it allows single symbols to pass through, then there's nothing to filter html_encode from spewing that garbage out. If this isn't the correct fix then at least I should be close enough that someone can point me in the right direction. --- code/controllers/subsystem/shuttles.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 71ed49b0394..edeb8493cdb 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -112,7 +112,7 @@ var/datum/subsystem/shuttle/SSshuttle user << "The emergency shuttle has been disabled by Centcom." return - call_reason = html_encode(trim(call_reason)) + call_reason = trim(html_encode(call_reason)) if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH) user << "You must provide a reason." From 2c36fb28cddb32d5b1e77dcdc731a3c2ab0f3d50 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Tue, 18 Aug 2015 23:17:13 +0100 Subject: [PATCH 048/310] MADNESS CONFIRMED MADNESS --- code/game/machinery/doors/airlock.dm | 52 +++++++++++++--------------- code/game/machinery/doors/door.dm | 2 +- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5c15063072e..6d5501b74b4 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -470,16 +470,13 @@ About the new airlock wires panel: if(0) if(density) state = AIRLOCK_CLOSED - icon_state = "closed" else state = AIRLOCK_OPEN - icon_state = "open" - if(AIRLOCK_CLOSED) - icon_state = "closed" - if(AIRLOCK_OPEN) - icon_state = "open" - if(AIRLOCK_CLOSING, AIRLOCK_OPENING) icon_state = "" + if(AIRLOCK_OPENING, AIRLOCK_OPEN, AIRLOCK_CLOSED) + icon_state = "" + if(AIRLOCK_DENY, AIRLOCK_CLOSING) + icon_state = "nonexistenticonstate" //MADNESS set_airlock_overlays(state) /obj/machinery/door/airlock/proc/set_airlock_overlays(state) @@ -491,7 +488,8 @@ About the new airlock wires panel: var/image/sparks_overlay switch(state) - if(AIRLOCK_CLOSED, AIRLOCK_DENY, AIRLOCK_EMAG) + if(AIRLOCK_CLOSED) + frame_overlay = get_airlock_overlay("closed", icon) if(airlock_material) filling_overlay = get_airlock_overlay("[airlock_material]_closed") else @@ -500,18 +498,20 @@ About the new airlock wires panel: panel_overlay = get_airlock_overlay("panel_closed") if(welded) weld_overlay = get_airlock_overlay("welded") - if(state == AIRLOCK_EMAG) - sparks_overlay = get_airlock_overlay("sparks") else if(lights) if(locked) lights_overlay = get_airlock_overlay("lights_bolted") else if(emergency) lights_overlay = get_airlock_overlay("lights_emergency") - else if(state == AIRLOCK_DENY) - lights_overlay = get_airlock_overlay("lights_denied") - spawn(4) - overlays -= lights_overlay + if(AIRLOCK_DENY) + overlays += get_airlock_overlay("lights_denied") + sleep(4) + update_icon(AIRLOCK_CLOSED) + return + if(AIRLOCK_EMAG) + overlays += get_airlock_overlay("sparks") + return if(AIRLOCK_CLOSING) frame_overlay = get_airlock_overlay("closing", icon) @@ -525,6 +525,7 @@ About the new airlock wires panel: panel_overlay = get_airlock_overlay("panel_closing") if(AIRLOCK_OPEN) + frame_overlay = get_airlock_overlay("open", icon) if(airlock_material) filling_overlay = get_airlock_overlay("[airlock_material]_open") else @@ -544,18 +545,12 @@ About the new airlock wires panel: panel_overlay = get_airlock_overlay("panel_opening") overlays.Cut() - if(frame_overlay) - overlays += frame_overlay - if(filling_overlay) - overlays += filling_overlay - if(lights_overlay) - overlays += lights_overlay - if(panel_overlay) - overlays += panel_overlay - if(weld_overlay) - overlays += weld_overlay - if(sparks_overlay) - overlays += sparks_overlay + overlays += frame_overlay + overlays += filling_overlay + overlays += lights_overlay + overlays += panel_overlay + overlays += weld_overlay + overlays += sparks_overlay /obj/machinery/door/airlock/proc/get_airlock_overlay(iconstate, icon_file=overlays_file) var/iconkey = "[iconstate][icon_file]" @@ -573,6 +568,7 @@ About the new airlock wires panel: update_icon(AIRLOCK_CLOSING) if("deny") update_icon(AIRLOCK_DENY) + icon_state = "closed" /obj/machinery/door/airlock/examine(mob/user) ..() @@ -1190,7 +1186,7 @@ About the new airlock wires panel: else playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1) - if(autoclose && normalspeed) + if(autoclose && normalspeed) spawn(150) autoclose() else if(autoclose && !normalspeed) @@ -1239,7 +1235,7 @@ About the new airlock wires panel: src.density = 1 if(!safe) crush() - sleep(5) + sleep(7) update_icon() if(visible && !glass) SetOpacity(1) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 47bf8b3cec9..7eca5ebc4cc 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -204,7 +204,7 @@ src.SetOpacity(0) sleep(5) src.density = 0 - sleep(8) + sleep(5) src.layer = 2.7 update_icon() SetOpacity(0) From 29a3d18cfa3dc341cb878a279b0df4b758ba7bbd Mon Sep 17 00:00:00 2001 From: xxalpha Date: Wed, 19 Aug 2015 23:57:34 +0100 Subject: [PATCH 049/310] Airlock open proc independent --- code/game/machinery/doors/airlock.dm | 21 ++++++++++++++++-- icons/obj/doors/airlocks/station/overlays.dmi | Bin 7637 -> 8285 bytes 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 6d5501b74b4..da3e36d3e1b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1193,7 +1193,24 @@ About the new airlock wires panel: spawn(11) autoclose() - return ..() + if(!density) + return 1 + if(!ticker) + return 0 + operating = 1 + + do_animate("opening") + src.SetOpacity(0) + sleep(5) + src.density = 0 + sleep(9) + src.layer = 2.7 + update_icon() + SetOpacity(0) + operating = 0 + air_update_turf(1) + update_freelook_sight() + return 1 /obj/machinery/door/airlock/close(forced=0) @@ -1235,7 +1252,7 @@ About the new airlock wires panel: src.density = 1 if(!safe) crush() - sleep(7) + sleep(9) update_icon() if(visible && !glass) SetOpacity(1) diff --git a/icons/obj/doors/airlocks/station/overlays.dmi b/icons/obj/doors/airlocks/station/overlays.dmi index beacbfe75857c0f9abe2049e16fbaf0dd477a1d6..782cb0dfd4072f4070616986065dedaaa0b50966 100644 GIT binary patch literal 8285 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 literal 7637 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 b#0U795B{WullLD3;7?Ui16K0jS>S&G;5)@# From 565537986635f27836b44f0c515170ae14b735dd Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Thu, 20 Aug 2015 08:11:48 -0300 Subject: [PATCH 050/310] Fixes the watchlist edit option not working at all --- code/modules/admin/topic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index e611c96300d..3093d959d6d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1157,7 +1157,7 @@ var/DBQuery/query_reason = dbcon.NewQuery("SELECT ckey, reason FROM [format_table_name("watch")] WHERE (ckey = '[sql_ckey]')") query_reason.Execute() if(query_reason.NextRow()) - var/watch_reason = query_reason.item[3] + var/watch_reason = query_reason.item[2] var/new_reason = input("Insert new reason", "New Reason", "[watch_reason]", null) as null|text new_reason = sanitizeSQL(new_reason) if(!new_reason) From 6fe5f23e551823e29e6b481346b8d349b4b57288 Mon Sep 17 00:00:00 2001 From: Supermichael777 Date: Thu, 20 Aug 2015 15:06:42 -0400 Subject: [PATCH 051/310] Updates dank memes. updates Bar memes to reflect recent rule changes/be funny. --- code/game/objects/structures/barsigns.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index 7c4637a2df8..12b74f0efbe 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -246,7 +246,7 @@ /datum/barsign/emergencyrumparty name = "The Emergency Rum Party" icon = "emergencyrumparty" - desc = "Still serving drinks that were banned years ago." + desc = "Recently relicenced after a long closure." /datum/barsign/combocafe name = "The Combo Cafe" @@ -276,7 +276,7 @@ /datum/barsign/thenet name = "The Net" icon = "thenet" - desc = "The sea of drinkformation." //you couldn't come up with something better? + desc = "You just seem to get caught up in it for hours." //you couldn't come up with something better? /datum/barsign/hiddensigns From 2f50fecaa105740eae11dc90ffd2ea307f1328fc Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Thu, 20 Aug 2015 17:32:19 -0400 Subject: [PATCH 052/310] A: Fuck this, it's terrible and B: All supported maps already pixel-shift these, there's no need for this code at all except to confuse and frustrate new mappers trying to place door timers. --- code/game/machinery/doors/brigdoors.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index d6d5f886095..c9a24cb6b5d 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -38,9 +38,6 @@ Radio = new/obj/item/device/radio(src) Radio.listening = 0 - pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32)) - pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0)) - spawn(20) for(var/obj/machinery/door/window/brigdoor/M in range(20, src)) if (M.id == src.id) From 59e75bd625dee3a8c253b50d8638fddb4d47178e Mon Sep 17 00:00:00 2001 From: xxalpha Date: Fri, 21 Aug 2015 00:07:10 +0100 Subject: [PATCH 053/310] Moved airlock types to separate file, implemented airlock types. --- code/game/machinery/doors/airlock.dm | 270 +--------------- code/game/machinery/doors/airlock_types.dm | 299 ++++++++++++++++++ icons/obj/doors/airlocks/centcom/centcom.dmi | Bin 4220 -> 4228 bytes icons/obj/doors/airlocks/centcom/overlays.dmi | Bin 4028 -> 4034 bytes .../obj/doors/airlocks/external/external.dmi | Bin 6166 -> 6174 bytes .../obj/doors/airlocks/external/overlays.dmi | Bin 3121 -> 3131 bytes icons/obj/doors/airlocks/hatch/centcom.dmi | Bin 4216 -> 4224 bytes .../obj/doors/airlocks/hatch/maintenance.dmi | Bin 4647 -> 4655 bytes icons/obj/doors/airlocks/hatch/overlays.dmi | Bin 4287 -> 4295 bytes icons/obj/doors/airlocks/highsec/highsec.dmi | Bin 4885 -> 4892 bytes icons/obj/doors/airlocks/highsec/overlays.dmi | Bin 4531 -> 4537 bytes icons/obj/doors/airlocks/shuttle/overlays.dmi | Bin 4023 -> 4029 bytes icons/obj/doors/airlocks/shuttle/shuttle.dmi | Bin 5292 -> 5300 bytes icons/obj/doors/airlocks/station/overlays.dmi | Bin 8285 -> 8287 bytes icons/obj/doors/airlocks/station/plasma.dmi | Bin 4494 -> 4501 bytes icons/obj/doors/airlocks/station/public.dmi | Bin 2273 -> 2281 bytes icons/obj/doors/airlocks/station/research.dmi | Bin 4636 -> 4643 bytes .../obj/doors/airlocks/station/sandstone.dmi | Bin 4046 -> 4053 bytes icons/obj/doors/airlocks/station/science.dmi | Bin 4521 -> 4528 bytes icons/obj/doors/airlocks/station/security.dmi | Bin 4740 -> 4747 bytes icons/obj/doors/airlocks/station/silver.dmi | Bin 3923 -> 3930 bytes icons/obj/doors/airlocks/station/uranium.dmi | Bin 4030 -> 4037 bytes icons/obj/doors/airlocks/station/virology.dmi | Bin 4710 -> 4717 bytes icons/obj/doors/airlocks/station/wood.dmi | Bin 3884 -> 3891 bytes icons/obj/doors/airlocks/station2/glass.dmi | Bin 3576 -> 3584 bytes .../obj/doors/airlocks/station2/overlays.dmi | Bin 8196 -> 8203 bytes icons/obj/doors/airlocks/vault/overlays.dmi | Bin 3356 -> 3362 bytes icons/obj/doors/airlocks/vault/vault.dmi | Bin 3709 -> 3717 bytes tgstation.dme | 1 + 29 files changed, 309 insertions(+), 261 deletions(-) create mode 100644 code/game/machinery/doors/airlock_types.dm diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index da3e36d3e1b..e6f5d1f9fda 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -69,261 +69,10 @@ var/list/airlock_overlays = list() if(A.closeOtherId == src.closeOtherId && A != src) src.closeOther = A break + if(glass) + airlock_material = "glass" update_icon() -/obj/machinery/door/airlock/command - icon = 'icons/obj/doors/airlocks/station/command.dmi' - doortype = /obj/structure/door_assembly/door_assembly_com - -/obj/machinery/door/airlock/security - icon = 'icons/obj/doors/airlocks/station/security.dmi' - doortype = /obj/structure/door_assembly/door_assembly_sec - -/obj/machinery/door/airlock/engineering - icon = 'icons/obj/doors/airlocks/station/engineering.dmi' - doortype = /obj/structure/door_assembly/door_assembly_eng - -/obj/machinery/door/airlock/medical - icon = 'icons/obj/doors/airlocks/station/medical.dmi' - doortype = /obj/structure/door_assembly/door_assembly_med - -/obj/machinery/door/airlock/maintenance - name = "maintenance access" - icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' - doortype = /obj/structure/door_assembly/door_assembly_mai - -/obj/machinery/door/airlock/external - name = "external airlock" - icon = 'icons/obj/doors/airlocks/external/external.dmi' - overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - doortype = /obj/structure/door_assembly/door_assembly_ext - -/obj/machinery/door/airlock/glass - name = "glass airlock" - icon = 'icons/obj/doors/airlocks/station2/glass.dmi' - overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_glass - glass = 1 - airlock_material = "glass" - -/obj/machinery/door/airlock/centcom - icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' - overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' - opacity = 1 - doortype = /obj/structure/door_assembly/door_assembly_centcom - -/obj/machinery/door/airlock/vault - name = "vault door" - icon = 'icons/obj/doors/airlocks/vault/vault.dmi' - overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' - opacity = 1 - doortype = /obj/structure/door_assembly/door_assembly_vault - explosion_block = 2 - -/obj/machinery/door/airlock/glass_large - name = "glass airlock" - icon = 'icons/obj/doors/Door2x1glassfull.dmi' - opacity = 0 - doortype = null //(double glass door) there's no door assembly sprites for this one. - glass = 1 - bound_width = 64 // 2x1 - -/obj/machinery/door/airlock/freezer - name = "freezer airlock" - icon = 'icons/obj/doors/airlocks/station/freezer.dmi' - opacity = 1 - doortype = /obj/structure/door_assembly/door_assembly_fre - -/obj/machinery/door/airlock/hatch - name = "airtight hatch" - icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi' - overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - opacity = 1 - doortype = /obj/structure/door_assembly/door_assembly_hatch - -/obj/machinery/door/airlock/maintenance_hatch - name = "maintenance hatch" - icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' - overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - opacity = 1 - doortype = /obj/structure/door_assembly/door_assembly_mhatch - -/obj/machinery/door/airlock/glass_command - name = "maintenance hatch" - icon = 'icons/obj/doors/Doorcomglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_com/glass - glass = 1 - -/obj/machinery/door/airlock/glass_engineering - name = "maintenance hatch" - icon = 'icons/obj/doors/Doorengglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_eng/glass - glass = 1 - -/obj/machinery/door/airlock/glass_security - name = "maintenance hatch" - icon = 'icons/obj/doors/Doorsecglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_sec/glass - glass = 1 - -/obj/machinery/door/airlock/glass_medical - name = "maintenance hatch" - icon = 'icons/obj/doors/Doormedglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_med/glass - glass = 1 - -/obj/machinery/door/airlock/mining - name = "mining airlock" - icon = 'icons/obj/doors/Doormining.dmi' - doortype = /obj/structure/door_assembly/door_assembly_min - -/obj/machinery/door/airlock/atmos - name = "atmospherics airlock" - icon = 'icons/obj/doors/Dooratmo.dmi' - doortype = /obj/structure/door_assembly/door_assembly_atmo - -/obj/machinery/door/airlock/research - icon = 'icons/obj/doors/Doorresearch.dmi' - doortype = /obj/structure/door_assembly/door_assembly_research - -/obj/machinery/door/airlock/glass_research - name = "maintenance hatch" - icon = 'icons/obj/doors/Doorresearchglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_research/glass - glass = 1 - -/obj/machinery/door/airlock/glass_mining - name = "maintenance hatch" - icon = 'icons/obj/doors/Doorminingglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_min/glass - glass = 1 - -/obj/machinery/door/airlock/glass_atmos - name = "maintenance hatch" - icon = 'icons/obj/doors/Dooratmoglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_atmo/glass - glass = 1 - -/obj/machinery/door/airlock/gold - name = "gold airlock" - icon = 'icons/obj/doors/Doorgold.dmi' - var/mineral = "gold" - doortype = /obj/structure/door_assembly/door_assembly_gold - -/obj/machinery/door/airlock/silver - name = "silver airlock" - icon = 'icons/obj/doors/Doorsilver.dmi' - var/mineral = "silver" - doortype = /obj/structure/door_assembly/door_assembly_silver - -/obj/machinery/door/airlock/diamond - name = "diamond airlock" - icon = 'icons/obj/doors/Doordiamond.dmi' - var/mineral = "diamond" - doortype = /obj/structure/door_assembly/door_assembly_diamond - -/obj/machinery/door/airlock/uranium - name = "uranium airlock" - desc = "And they said I was crazy." - icon = 'icons/obj/doors/Dooruranium.dmi' - var/mineral = "uranium" - doortype = /obj/structure/door_assembly/door_assembly_uranium - var/last_event = 0 - -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - radiate() - last_event = world.time - ..() - -/obj/machinery/door/airlock/uranium/proc/radiate() - for(var/mob/living/L in range (3,src)) - L.irradiate(15) - return - -/obj/machinery/door/airlock/plasma - name = "plasma airlock" - desc = "No way this can end badly." - icon = 'icons/obj/doors/Doorplasma.dmi' - var/mineral = "plasma" - doortype = /obj/structure/door_assembly/door_assembly_plasma - -/obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - PlasmaBurn(exposed_temperature) - -/obj/machinery/door/airlock/plasma/proc/ignite(exposed_temperature) - if(exposed_temperature > 300) - PlasmaBurn(exposed_temperature) - -/obj/machinery/door/airlock/plasma/proc/PlasmaBurn(temperature) - atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 500) - new/obj/structure/door_assembly/door_assembly_0( src.loc ) - qdel(src) - -/obj/machinery/door/airlock/plasma/BlockSuperconductivity() //we don't stop the heat~ - return 0 - -/obj/machinery/door/airlock/clown - name = "bananium airlock" - desc = "Honkhonkhonk" - icon = 'icons/obj/doors/Doorbananium.dmi' - var/mineral = "bananium" - doortype = /obj/structure/door_assembly/door_assembly_clown - -/obj/machinery/door/airlock/sandstone - name = "sandstone airlock" - icon = 'icons/obj/doors/Doorsand.dmi' - var/mineral = "sandstone" - doortype = /obj/structure/door_assembly/door_assembly_sandstone - -/obj/machinery/door/airlock/science - icon = 'icons/obj/doors/Doorsci.dmi' - doortype = /obj/structure/door_assembly/door_assembly_science - -/obj/machinery/door/airlock/glass_science - name = "glass airlock" - icon = 'icons/obj/doors/Doorsciglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_science/glass - glass = 1 - -/obj/machinery/door/airlock/highsecurity - name = "high tech security airlock" - icon = 'icons/obj/doors/hightechsecurity.dmi' - doortype = /obj/structure/door_assembly/door_assembly_highsecurity - explosion_block = 2 - -/obj/machinery/door/airlock/shuttle - name = "shuttle airlock" - icon = 'icons/obj/doors/doorshuttle.dmi' - doortype = /obj/structure/door_assembly/door_assembly_shuttle - -/obj/machinery/door/airlock/wood - name = "wooden airlock" - icon = 'icons/obj/doors/Doorwood.dmi' - var/mineral = "wood" - doortype = /obj/structure/door_assembly/door_assembly_wood - -/obj/machinery/door/airlock/virology - icon = 'icons/obj/doors/Doorviro.dmi' - doortype = /obj/structure/door_assembly/door_assembly_viro - -/obj/machinery/door/airlock/glass_virology - icon = 'icons/obj/doors/Doorviroglass.dmi' - opacity = 0 - doortype = /obj/structure/door_assembly/door_assembly_viro/glass - glass = 1 - /* About the new airlock wires panel: * An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. @@ -473,9 +222,9 @@ About the new airlock wires panel: else state = AIRLOCK_OPEN icon_state = "" - if(AIRLOCK_OPENING, AIRLOCK_OPEN, AIRLOCK_CLOSED) + if(AIRLOCK_OPEN, AIRLOCK_CLOSED) icon_state = "" - if(AIRLOCK_DENY, AIRLOCK_CLOSING) + if(AIRLOCK_DENY, AIRLOCK_OPENING, AIRLOCK_CLOSING) icon_state = "nonexistenticonstate" //MADNESS set_airlock_overlays(state) @@ -498,12 +247,11 @@ About the new airlock wires panel: panel_overlay = get_airlock_overlay("panel_closed") if(welded) weld_overlay = get_airlock_overlay("welded") - else - if(lights) - if(locked) - lights_overlay = get_airlock_overlay("lights_bolted") - else if(emergency) - lights_overlay = get_airlock_overlay("lights_emergency") + if(lights) + if(locked) + lights_overlay = get_airlock_overlay("lights_bolts") + else if(emergency) + lights_overlay = get_airlock_overlay("lights_emergency") if(AIRLOCK_DENY) overlays += get_airlock_overlay("lights_denied") sleep(4) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm new file mode 100644 index 00000000000..de140976d87 --- /dev/null +++ b/code/game/machinery/doors/airlock_types.dm @@ -0,0 +1,299 @@ +/* + Station Airlocks Regular +*/ +/obj/machinery/door/airlock/command + icon = 'icons/obj/doors/airlocks/station/command.dmi' + doortype = /obj/structure/door_assembly/door_assembly_com + +/obj/machinery/door/airlock/security + icon = 'icons/obj/doors/airlocks/station/security.dmi' + doortype = /obj/structure/door_assembly/door_assembly_sec + +/obj/machinery/door/airlock/engineering + icon = 'icons/obj/doors/airlocks/station/engineering.dmi' + doortype = /obj/structure/door_assembly/door_assembly_eng + +/obj/machinery/door/airlock/medical + icon = 'icons/obj/doors/airlocks/station/medical.dmi' + doortype = /obj/structure/door_assembly/door_assembly_med + +/obj/machinery/door/airlock/maintenance + name = "maintenance access" + icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' + doortype = /obj/structure/door_assembly/door_assembly_mai + +/obj/machinery/door/airlock/mining + name = "mining airlock" + icon = 'icons/obj/doors/Doormining.dmi' + doortype = /obj/structure/door_assembly/door_assembly_min + +/obj/machinery/door/airlock/atmos + name = "atmospherics airlock" + icon = 'icons/obj/doors/airlocks/station/atmos.dmi' + doortype = /obj/structure/door_assembly/door_assembly_atmo + +/obj/machinery/door/airlock/research + icon = 'icons/obj/doors/airlocks/station/research.dmi' + doortype = /obj/structure/door_assembly/door_assembly_research + +/obj/machinery/door/airlock/freezer + name = "freezer airlock" + icon = 'icons/obj/doors/airlocks/station/freezer.dmi' + doortype = /obj/structure/door_assembly/door_assembly_fre + +/obj/machinery/door/airlock/science + icon = 'icons/obj/doors/airlocks/station/science.dmi' + doortype = /obj/structure/door_assembly/door_assembly_science + +/obj/machinery/door/airlock/virology + icon = 'icons/obj/doors/airlocks/station/virology.dmi' + doortype = /obj/structure/door_assembly/door_assembly_viro + +////////////////////////////////// +/* + Station Airlocks Glass +*/ + +/obj/machinery/door/airlock/glass_command + icon = 'icons/obj/doors/airlocks/station/command.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_com/glass + glass = 1 + +/obj/machinery/door/airlock/glass_engineering + icon = 'icons/obj/doors/airlocks/station/engineering.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_eng/glass + glass = 1 + +/obj/machinery/door/airlock/glass_security + icon = 'icons/obj/doors/airlocks/station/security.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_sec/glass + glass = 1 + +/obj/machinery/door/airlock/glass_medical + icon = 'icons/obj/doors/airlocks/station/medical.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_med/glass + glass = 1 + +/obj/machinery/door/airlock/glass_research + icon = 'icons/obj/doors/airlocks/station/research.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_research/glass + glass = 1 + +/obj/machinery/door/airlock/glass_mining + icon = 'icons/obj/doors/airlocks/station/mining.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_min/glass + glass = 1 + +/obj/machinery/door/airlock/glass_atmos + icon = 'icons/obj/doors/airlocks/station/atmos.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_atmo/glass + glass = 1 + +/obj/machinery/door/airlock/glass_science + icon = 'icons/obj/doors/airlocks/station/science.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_science/glass + glass = 1 + +/obj/machinery/door/airlock/glass_virology + icon = 'icons/obj/doors/airlocks/station/virology.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_viro/glass + glass = 1 + +////////////////////////////////// +/* + Station Airlocks Mineral +*/ + +/obj/machinery/door/airlock/gold + name = "gold airlock" + icon = 'icons/obj/doors/airlocks/station/gold.dmi' + var/mineral = "gold" + doortype = /obj/structure/door_assembly/door_assembly_gold + +/obj/machinery/door/airlock/silver + name = "silver airlock" + icon = 'icons/obj/doors/airlocks/station/silver.dmi' + var/mineral = "silver" + doortype = /obj/structure/door_assembly/door_assembly_silver + +/obj/machinery/door/airlock/diamond + name = "diamond airlock" + icon = 'icons/obj/doors/airlocks/station/diamond.dmi' + var/mineral = "diamond" + doortype = /obj/structure/door_assembly/door_assembly_diamond + +/obj/machinery/door/airlock/uranium + name = "uranium airlock" + desc = "And they said I was crazy." + icon = 'icons/obj/doors/airlocks/station/uranium.dmi' + var/mineral = "uranium" + doortype = /obj/structure/door_assembly/door_assembly_uranium + var/last_event = 0 + +/obj/machinery/door/airlock/uranium/process() + if(world.time > last_event+20) + if(prob(50)) + radiate() + last_event = world.time + ..() + +/obj/machinery/door/airlock/uranium/proc/radiate() + for(var/mob/living/L in range (3,src)) + L.irradiate(15) + return + +/obj/machinery/door/airlock/plasma + name = "plasma airlock" + desc = "No way this can end badly." + icon = 'icons/obj/doors/airlocks/station/plasma.dmi' + var/mineral = "plasma" + doortype = /obj/structure/door_assembly/door_assembly_plasma + +/obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + PlasmaBurn(exposed_temperature) + +/obj/machinery/door/airlock/plasma/proc/ignite(exposed_temperature) + if(exposed_temperature > 300) + PlasmaBurn(exposed_temperature) + +/obj/machinery/door/airlock/plasma/proc/PlasmaBurn(temperature) + atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 500) + new/obj/structure/door_assembly/door_assembly_0( src.loc ) + qdel(src) + +/obj/machinery/door/airlock/plasma/BlockSuperconductivity() //we don't stop the heat~ + return 0 + +/obj/machinery/door/airlock/clown + name = "bananium airlock" + desc = "Honkhonkhonk" + icon = 'icons/obj/doors/airlocks/station/bananium.dmi' + var/mineral = "bananium" + doortype = /obj/structure/door_assembly/door_assembly_clown + +/obj/machinery/door/airlock/sandstone + name = "sandstone airlock" + icon = 'icons/obj/doors/airlocks/station/sandstone.dmi' + var/mineral = "sandstone" + doortype = /obj/structure/door_assembly/door_assembly_sandstone + + +/obj/machinery/door/airlock/wood + name = "wooden airlock" + icon = 'icons/obj/doors/airlocks/station/wood.dmi' + var/mineral = "wood" + doortype = /obj/structure/door_assembly/door_assembly_wood + +////////////////////////////////// +/* + Station2 Airlocks +*/ + +/obj/machinery/door/airlock/glass + name = "glass airlock" + icon = 'icons/obj/doors/airlocks/station2/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' + opacity = 0 + doortype = /obj/structure/door_assembly/door_assembly_glass + glass = 1 + +////////////////////////////////// +/* + External Airlocks +*/ + +/obj/machinery/door/airlock/external + name = "external airlock" + icon = 'icons/obj/doors/airlocks/external/external.dmi' + overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' + doortype = /obj/structure/door_assembly/door_assembly_ext + +////////////////////////////////// +/* + Centcom Airlocks +*/ + +/obj/machinery/door/airlock/centcom + icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' + opacity = 1 + doortype = /obj/structure/door_assembly/door_assembly_centcom + +////////////////////////////////// +/* + Vault Airlocks +*/ + +/obj/machinery/door/airlock/vault + name = "vault door" + icon = 'icons/obj/doors/airlocks/vault/vault.dmi' + overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' + opacity = 1 + doortype = /obj/structure/door_assembly/door_assembly_vault + explosion_block = 2 + +////////////////////////////////// +/* + Hatch Airlocks +*/ + +/obj/machinery/door/airlock/hatch + name = "airtight hatch" + icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + opacity = 1 + doortype = /obj/structure/door_assembly/door_assembly_hatch + +/obj/machinery/door/airlock/maintenance_hatch + name = "maintenance hatch" + icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' + overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + opacity = 1 + doortype = /obj/structure/door_assembly/door_assembly_mhatch + +////////////////////////////////// +/* + High Security Airlocks +*/ + +/obj/machinery/door/airlock/highsecurity + name = "high tech security airlock" + icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi' + overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi' + doortype = /obj/structure/door_assembly/door_assembly_highsecurity + explosion_block = 2 + +////////////////////////////////// +/* + Shuttle Airlocks +*/ + +/obj/machinery/door/airlock/shuttle + name = "shuttle airlock" + icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' + overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' + doortype = /obj/structure/door_assembly/door_assembly_shuttle + + +////////////////////////////////// +/* + Misc Airlocks +*/ + +/obj/machinery/door/airlock/glass_large + name = "glass airlock" + icon = 'icons/obj/doors/Door2x1glassfull.dmi' + opacity = 0 + doortype = null //(double glass door) there's no door assembly sprites for this one. + glass = 1 + bound_width = 64 // 2x1 diff --git a/icons/obj/doors/airlocks/centcom/centcom.dmi b/icons/obj/doors/airlocks/centcom/centcom.dmi index 010cb237ebdb26525b06451cf46b1ad2c8216477..41669fe34d4847fe41c4660f5a7361098307f1ed 100644 GIT binary patch delta 184 zcmV;p07w7)AcP^1B!8oNR9JLGWpiV4X>fFDZ*Bkpc$}?{K?=e!6hzngrx@C;NUh>7 z8)=a)+B=ly+XiBONuuKIT@(s}f(x0=3_Ko_<5ZuU4prOGokO(Zp>fz2q#o9!2^#y7 z)Wmk2(lTP|6GI~#oJ2MmDPu!~#*Wk_^jBW`ipk9WC&>EoGc9){W!UvkXq1~Zq@2k7 mt{I%fe`v(V6mCPZ^7VR-x~ovN4ZQ$XaaadT{?|^i$g~e14q6ic delta 176 zcmV;h08jsfA^aeaB!8QFR9JLGWpiV4X>fFDZ*Bkpc$}S%K?=e!6hzngrx@C;h*oiz zjig8x?Hxk%Z2~osBr4wCMWG-lh|FdN-oUGIY)`s}>NMRsWgi11_UjFahquK+V%Lyx z>_=DTk&7t|iE5Z)W?PZ4K4nO3Nt~0p@Z1+HUOD^(`7nOw4kaWkPv!}UX0_y9fFDZ*Bkpc$}?~!HU8#5QfjmQw(|y%O+jC z<+4N*Y)MnP%#BT!_2#`FSLmXgA3h^GwU*e2FclPHh+60(6HdlqBkedpv0{> z^D!pSAYW{)k2IZa8-1Z+*DGu>IJCobbx)Q;3OSTX$>iNg+T!WG7`0r7!9C^QC^9-j09s9G2@E>Q%$f Rf7kQ?XKxL;0J9tcpbp41hROf{ delta 267 zcmV+m0rdXDAG{xsB!BLDR9JLGWpiV4X>fFDZ*Bkpc$}q?!HU8#5QfjmQw(|yV$#K1 zE>e*m^c5uA%(lUpluS^3dk-#asV(cSO* diff --git a/icons/obj/doors/airlocks/external/external.dmi b/icons/obj/doors/airlocks/external/external.dmi index 7a7fe8e507c9d27fe13e70a5d25c775727aea9ae..1130408c810b75d220cf3d9a98285efcefe91b7d 100644 GIT binary patch delta 184 zcmV;p07w6pFrF}wB!8oNR9JLGWpiV4X>fFDZ*Bkpc$}?{K?=e!6hzngrx@C;NUh>7 z8)=a)+B=ly+XiBONuuKIT@(s}f(x0=3_Ko_<5ZuU4prOGokO(Zp>fz2q#o9!2^#y7 z)Wmk2(lTP|6GI~#oJ2MmDPu!~#*Wk_^jBW`ipk9WC&>EoGc9){W!UvkXq1~Zq@2k7 mt{I%fe`v(V6mCPZ^7VR-x~ovN4ZQ$XaaadT{?|^i$W9mia#@G~ delta 176 zcmV;h08js(FqSZoB!8QFR9JLGWpiV4X>fFDZ*Bkpc$}S%K?=e!6hzngrx@C;h*oiz zjig8x?Hxk%Z2~osBr4wCMWG-lh|FdN-oUGIY)`s}>NMRsWgi11_UjFahquK+V%Lyx z>_=DTk&7t|iE5Z)W?PZ4K4nO3Nt~0p@Z1+HUOD^(`7nOw4kaWkPv!}UX0_y9fFDZ*Bkpc$}?}!H&Wp6h+tY6)(CaW}s$v zY)s9h3;hMdls7FAfdJ9?_bxO}ZAzvl6E={XcX;@u zbnZbyB`E39bbY=*QdSv3!or%a&*|U;I^((pCECOU5;!G4QGcEAejnql_2~`#+uNMx z!Wx}HJxy1XXte4I5;)_GQ)0ajubLE8JQjZY9L=+$<*^K&Fm~wL>$Fb{e1h>ouR%Gq zht~R3%EHI659r=Ni~SEm3idoxA%BQC^3R+npD!ggOny=&+V#|`DO R_zP@u000XHNwXLM84J$zf2;ri delta 267 zcmV+m0rdX67_k_TB!A|5R9JLGWpiV4X>fFDZ*Bkpc$}q>!3x4K5Jb<(S1k1!#H8Xa z7pX`O^%o>IYa5J7NrK|vdr+j57AvxsEWDYW%mTK%eR+VQD(MYFG~R)P^>RhY-RRVU zgj`V4qG{UnT4GWOK|*Ft)24Xz9XjKhj1p}^1PPpyb5K`&y?=*zZGHR!KY5$tTv($s zsK@D?5{*_pKmuo+^~AAL;WBY!Gf=UC_I((y7#ei-W86jbTm<924m;)09&794RBk?m zeTVJ`bh7K-*97~_ShRmF_{_Mqm<#4#!8=+#UFiaLhXRVKq)&IP+s16b7@+_F3kFF< RK~#90?cMKh6SFJ<4-1=Qev1GA diff --git a/icons/obj/doors/airlocks/hatch/centcom.dmi b/icons/obj/doors/airlocks/hatch/centcom.dmi index ffd09d372ae474be5eb5bdc97f7bf0ad41e7af94..b83f0e29a6d03c0c0c6650412b1e7135e86269f6 100644 GIT binary patch delta 184 zcmV;p07w7$Ab=r|B!8oNR9JLGWpiV4X>fFDZ*Bkpc$}?{K?=e!6hzngrx@C;NUh>7 z8)=a)+B=ly+XiBONuuKIT@(s}f(x0=3_Ko_<5ZuU4prOGokO(Zp>fz2q#o9!2^#y7 z)Wmk2(lTP|6GI~#oJ2MmDPu!~#*Wk_^jBW`ipk9WC&>EoGc9){W!UvkXq1~Zq@2k7 mt{I%fe`v(V6mCPZ^7VR-x~ovN4ZQ$XaaadT{?|^i$gmF?PFe>5 delta 176 zcmV;h08jsbA^0GWB!8QFR9JLGWpiV4X>fFDZ*Bkpc$}S%K?=e!6hzngrx@C;h*oiz zjig8x?Hxk%Z2~osBr4wCMWG-lh|FdN-oUGIY)`s}>NMRsWgi11_UjFahquK+V%Lyx z>_=DTk&7t|iE5Z)W?PZ4K4nO3Nt~0p@Z1+HUOD^(`7nOw4kaWkPv!}UX0_y9fFDZ*Bkpc$}?{K?=e!6hzngrx@C;NUh>7 z8)=a)+B=ly+XiBONuuKIT@(s}f(x0=3_Ko_<5ZuU4prOGokO(Zp>fz2q#o9!2^#y7 z)Wmk2(lTP|6GI~#oJ2MmDPu!~#*Wk_^jBW`ipk9WC&>EoGc9){W!UvkXq1~Zq@2k7 mt{I%fe`v(V6mCPZ^7VR-x~ovN4ZQ$XaaadT{?|^i$X^iz+gY6e delta 176 zcmV;h08js~B&Q^hB!8QFR9JLGWpiV4X>fFDZ*Bkpc$}S%K?=e!6hzngrx@C;h*oiz zjig8x?Hxk%Z2~osBr4wCMWG-lh|FdN-oUGIY)`s}>NMRsWgi11_UjFahquK+V%Lyx z>_=DTk&7t|iE5Z)W?PZ4K4nO3Nt~0p@Z1+HUOD^(`7nOw4kaWkPv!}UX0_y9fFDZ*Bkpc$}?~&uRiO5QopnQw(|y#bk@O zT*`{`QX1W`UNyvnXZ{I_qF1lMSEOQ$8_AZ!69& z&XyiDREo16UDubNhKeZ&8W!GleW6247+mNUoLQF%G)T@qvwt}wfrd3_7QMNG1|@!r zGaq9D4f4U(`bhKHECz>mTvpv=Qb-~H&>W*LG;SHdluSNNVC%au@hlS0m^%#Zb=;>0 zJ|*PfE6D`(ht@}$T3p`4F=6-zI>UQzLk2gOOuo26t6l}Gr{D#>oj&stHv1atUBkZt RH^B4&RqzKv0J9nar4KeOcz6H+ delta 267 zcmV+m0rdXIA-^GzB!BFBR9JLGWpiV4X>fFDZ*Bkpc$}q?&5FV>5P;9gQw;SQWRou5 za*@i?LwyCwHnVLoCM6RT-`>N*TC_!7nbW{G-~26Lz4@xQP&G9_Vj>pm$AEuoxWLX+?QeNFjy1EB=l?({$|!rop8B47R#yA*LJQ0aJ&eJx^QI$fATCZ8?~L ze%Ja)b4$uwI1U(IK>z)K>uABfr;tyM+p1^5@*#LaZ|6_CfX%jos;T(}gKFg-*pH%m R000k;NklfFDZ*Bkpc$}?|u?oU46h-H}ueh|UNUaVo zS)@fewEs|=XB&ulC5eiE?@$m53J!9Yd*N{4<~Y^orbE>>bmtJQcxW891*wNMX@bVS zBsH-er?iZi`oz%41}BkCM#|U_p|K-%3H_Cq{>Efx{}W{W_$`?`k}~Z2Cp5~fFDZ*Bkpc$}qPT9u*iT!#*;^A#^kk~aO z9Q)CgdE{aWL!ug{nAuh&tWOydTN3AFEfFDZ*Bkpc$}?~!D<3A5QfjmQw(|y#bitA zB^OyKd(c;qbTjS-V-hl<;@f+$pw(Tfu*_-T%lFS@=CE9SH5;hc4gbMRE(Xx>{fG*nDM&@l6^>kDmT!r($T zIP)$a-t&cRV@jLoL!@ft@VsL1O>FSy;g%olqlak5%k+hGy_hQuYI}9E$cNp5! zuut9il#n;qNhYA*wm#C>F7h6Z3BwEML?^lqI;~JXxk{^^1*?C-BYHdj-E&xNYN*!@ TKLZzV_V}x85dkB!9RZdQj=P0$ delta 267 zcmV+m0rdX4BeNrrB!BRFR9JLGWpiV4X>fFDZ*Bkpc$}?~L2AP=5JlJ0DTZV#LM4Zi zjW)rdc#&KosMgdLktL%M4Y_?6EyQ(flG31+;QjY!q$O;3Z`A?HeZ@a9k&6K|tXD6b zot@1sXebnCExM-7-xtazBWPH7*R+|AvB%&-v*66SM4&-(_J5H~hXfinoLThd0veR~ zb#6ShkMs=Bd-R#6E%FAo7#!MZy0~^qA;lm}y-BB;j@MC2jIuw)*kNig)R$?C8d#K& zgDra#&>w3bX>M*ghGUQ659q%>;X2+kH1ff*YxO8t+y&3*?fla&VRtB@+*kYye$wa` RCknOX000nvNwX*ckr1o2e;5D& diff --git a/icons/obj/doors/airlocks/shuttle/overlays.dmi b/icons/obj/doors/airlocks/shuttle/overlays.dmi index 6308aab1a78d6239a28ccfe38fac807e48a085b6..4758186ea99e38794afedc5e8eee75134fe83d6b 100644 GIT binary patch delta 267 zcmV+m0rdX2AH5%tB!BdJR9JLGWpiV4X>fFDZ*Bkpc$}?~!HU8#5QfjmQw(|y%O+jC z<+4N*Y)MnP%#BT!_2#`FSLmXgA3h^GwU*e2FclPHh+60(6HdlqBkedpv0{> z^D!pSAYW{)k2IZa8-1Z+*DGu>IJCobbx)Q;3OSTX$>iNg+T!WG7`0r7!9C^QC^9-j09s9G2@E>Q%$f Rf7kQ?XKxL;0J9tcn-0CkhPwa& delta 267 zcmV+m0rdX8AGaTnB!BLDR9JLGWpiV4X>fFDZ*Bkpc$}q?!HU8#5QfjmQw(|yV$#K1 zE>e*m^c5uA%(lUpluS^3dk-#asV(cSfFDZ*Bkpc$}?{K?=e!6hzngrx@C;NUh>7 z8)=a)+B=ly+XiBONuuKIT@(s}f(x0=3_Ko_<5ZuU4prOGokO(Zp>fz2q#o9!2^#y7 z)Wmk2(lTP|6GI~#oJ2MmDPu!~#*Wk_^jBW`ipk9WC&>EoGc9){W!UvkXq1~Zq@2k7 mt{I%fe`v(V6mCPZ^7VR-x~ovN4ZQ$XaaadT{?|^i$mA0gDOxxH delta 176 zcmV;h08jt4DXb}wB!8QFR9JLGWpiV4X>fFDZ*Bkpc$}S%K?=e!6hzngrx@C;h*oiz zjig8x?Hxk%Z2~osBr4wCMWG-lh|FdN-oUGIY)`s}>NMRsWgi11_UjFahquK+V%Lyx z>_=DTk&7t|iE5Z)W?PZ4K4nO3Nt~0p@Z1+HUOD^(`7nOw4kaWkPv!}UX0_y9 ze9Ko$xWj1BH>Y7=dF3k$ag|P|Ji1Ne0^OTP{Deb?{uikA=D#8JO-?5hnIkl1F1Q#4 zkLYy9nvGLLxtW~dtW0`zf;IL{PA3bVQrtJmhVfy(pOtB^${%fWSgtFmRyF?wIS_UY W==J@~0018YNkl05AWJBb6hNB!9blR9JLGWpiV4X>fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&EWd&D17jU`)0JpWOzxyb>*|SUml?U6-CQbkV delta 79 zcmV-V0I>h*5#bS#lmV}im3clx5=3<@Z7s;pD=sN2O)dcjAwln^W#;6>6B&MBwL}FX lTqR9C3U@mlY#|~{l@(n5T)^oU01CCcL(8#_eX~>nl?Sr29x(s_ diff --git a/icons/obj/doors/airlocks/station/research.dmi b/icons/obj/doors/airlocks/station/research.dmi index d58e46187a8226bd364df55f7e6a42e6961ec2ce..ba483f8d3cf6325cdf47ef1dbde81fd48bae0ce0 100644 GIT binary patch delta 208 zcmV;>05AWXB%>sdB!9blR9JLGWpiV4X>fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(`D delta 201 zcmV;)05<=lB%CCWB!9GeR9JLGWpiV4X>fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&05AW}AJrd_B!9blR9JLGWpiV4X>fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(CAI=|;B!9GeR9JLGWpiV4X>fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&05AWkBd{ZoB!9blR9JLGWpiV4X>fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&05AW9C5t7HB!9blR9JLGWpiV4X>fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&05AX39@-v|B!9blR9JLGWpiV4X>fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(H9@8F>B!9GeR9JLGWpiV4X>fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&05AW(AH^S#B!9blR9JLGWpiV4X>fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&05AXMB<&=SB!9blR9JLGWpiV4X>fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(iE@$ch delta 201 zcmV;)05<>aB<3WLB!9GeR9JLGWpiV4X>fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&n DhzVqv diff --git a/icons/obj/doors/airlocks/station/wood.dmi b/icons/obj/doors/airlocks/station/wood.dmi index 46ea9ad74087b73348b23434b1c9a55dd37cc1b6..ae34e82743c36a9f628547afdffbf2fb00d547fa 100644 GIT binary patch delta 208 zcmV;>05AWn9fFDZ*Bkpc$}?}!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH-4>|LXshDedl(c1!5&5~34Hwg`EtBgx4Ol$so|-eC$=c@ygz_=kqR?P zJQW~jP179K!-qa-l$Z^My;d0rMb4wdBZ$%UcfIZr<3-yfh(+x5o4bHe+VpRfSnT3} zFwDz$%wX7W5yRF8_ZR~4|LP+d(fFDZ*Bkpc$}q>!3x4K42I9mQ-tj*qEo!} zA{(;9_6lRH*%qj+v{mu#Jq!whV438Sz?bm-$?;rW>K4nUh6g#%)}X}Wb_e3gD$FSH zP=J_;r#UQx4}Bn%m<`%`QW*%v&ZERVh|%>|TKb6D8<`}C%|7&fFDZ*Bkpc$}?{K?=e!6hzngrx@C;NUh>7 z8)=a)+B=ly+XiBONuuKIT@(s}f(x0=3_Ko_<5ZuU4prOGokO(Zp>fz2q#o9!2^#y7 z)Wmk2(lTP|6GI~#oJ2MmDPu!~#*Wk_^jBW`ipk9WC&>EoGc9){W!UvkXq1~Zq@2k7 mt{I%fe`v(V6mCPZ^7VR-x~ovN4ZQ$XaaadT{?|^i$S@5NFj;#5 delta 176 zcmV;h08jsb9QYfMB!8QFR9JLGWpiV4X>fFDZ*Bkpc$}S%K?=e!6hzngrx@C;h*oiz zjig8x?Hxk%Z2~osBr4wCMWG-lh|FdN-oUGIY)`s}>NMRsWgi11_UjFahquK+V%Lyx z>_=DTk&7t|iE5Z)W?PZ4K4nO3Nt~0p@Z1+HUOD^(`7nOw4kaWkPv!}UX0_y9fFDZ*Bkpc$}?~O=`n15JuP1DTZWgN@bVq zv?&h7i{uJHwWhL&A_A4{ZLjJLBh&eGh{l1h~9d$;!N8_AVF~Uk$=<)2_$Sd)9BO%B-GXK zfFDZ*Bkpc$}q?L2kn!5JlJK6r*HoRmHBd zV^cY*yhyGPQJC5&1T2Om%I&*IRa=g&(papJ-n{vI*6_alsP|CqYIeau#yb%3_VUWI ztI@Fq0cF9m7ERN}`-P&62m)5tG;O4V@6Z|7tXQT^AP~S=_J0-R2?+#jSfSQ?1?AVN^^3m+iVmx7J(5c(Br5IR> zoDW{vNr(2Jtf#r$d<^>z-9ON$KcJ7cRKXMDsv;FE{{*jSbwZ_$l|-ri-{GYGd-Un@ m`e;iP-cbx^6%>u14Zeo$zJh93vu}cEH7+7rMpd&t0nQ#!9hQLr diff --git a/icons/obj/doors/airlocks/vault/overlays.dmi b/icons/obj/doors/airlocks/vault/overlays.dmi index 747c25760ae35b3289059b3c9dc133f95d22f7f0..559c1e12dfcb50a09ae4d3b294381cd8a1b8a055 100644 GIT binary patch delta 266 zcmV+l0rmcz8loDIB!BdJR9JLGWpiV4X>fFDZ*Bkpc$}?~!HU8#5QfjmQw(|y%O+jC z<+4N*Y)MnP%#BT!_2#`FSLmXgA3h^GwU*e2FclPHh+60(6HdlqBkedpv0{> z^D!pSAYW{)k2IZa8-1Z+*DGu>IJCobbx)Q;3OSTX$>iNg+T!WG7`0r7!9C^QC^9-j09s9G2@E>Q%$f Qf7kQ?XKxL;0HYiM4DfFDZ*Bkpc$}q?!HU8#5QfjmQw(|yV$#K1 zE>e*m^c5uA%(lUpluS^3dk-#asV(cSfFDZ*Bkpc$}?{K?=e!6hzngrx@C;NUh>7 z8)=a)+B=ly+XiBONuuKIT@(s}f(x0=3_Ko_<5ZuU4prOGokO(Zp>fz2q#o9!2^#y7 z)Wmk2(lTP|6GI~#oJ2MmDPu!~#*Wk_^jBW`ipk9WC&>EoGc9){W!UvkXq1~Zq@2k7 mt{I%fe`v(V6mCPZ^7VR-x~ovN4ZQ$XaaadT{?|^i$h8d`%vuZp delta 176 zcmV;h08jsg9sL}TB!8QFR9JLGWpiV4X>fFDZ*Bkpc$}S%K?=e!6hzngrx@C;h*oiz zjig8x?Hxk%Z2~osBr4wCMWG-lh|FdN-oUGIY)`s}>NMRsWgi11_UjFahquK+V%Lyx z>_=DTk&7t|iE5Z)W?PZ4K4nO3Nt~0p@Z1+HUOD^(`7nOw4kaWkPv!}UX0_y9 Date: Thu, 20 Aug 2015 20:08:23 -0400 Subject: [PATCH 054/310] Update barsigns.dm --- code/game/objects/structures/barsigns.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index 12b74f0efbe..f09ec051c67 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -246,7 +246,7 @@ /datum/barsign/emergencyrumparty name = "The Emergency Rum Party" icon = "emergencyrumparty" - desc = "Recently relicenced after a long closure." + desc = "Recently relicensed after a long closure." /datum/barsign/combocafe name = "The Combo Cafe" @@ -276,7 +276,7 @@ /datum/barsign/thenet name = "The Net" icon = "thenet" - desc = "You just seem to get caught up in it for hours." //you couldn't come up with something better? + desc = "You just seem to get caught up in it for hours." /datum/barsign/hiddensigns From 62c9fc636852fe33989791ffe90f36bc055a9dca Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Thu, 20 Aug 2015 21:44:56 -0300 Subject: [PATCH 055/310] Fixes ninja stealth not working at all --- code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm index 107502ce151..c7a1f0f143d 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm @@ -18,7 +18,7 @@ Contents: U << "You don't have enough power to enable Stealth!" return s_active=!s_active - animate(U, U.alpha = 0,time = 15) + animate(U, alpha = 0,time = 15) U.visible_message("[U.name] vanishes into thin air!", \ "You are now invisible to normal detection.") return @@ -30,7 +30,7 @@ Contents: return 0 if(s_active) s_active=!s_active - animate(U, U.alpha = 255, time = 15) + animate(U, alpha = 255, time = 15) U.visible_message("[U.name] appears from thin air!", \ "You are now visible.") return 1 From db57f5834b8dc3fffb87777fe9e5f4d2cfa2a644 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Thu, 20 Aug 2015 22:34:03 -0300 Subject: [PATCH 056/310] Fixes a runtime caused when interacting with a hat-less Ian --- code/modules/mob/living/simple_animal/friendly/dog.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index bc0ebe9883b..83766139bb4 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -275,7 +275,9 @@ return valid /mob/living/simple_animal/pet/dog/corgi/proc/update_corgi_fluff() - switch(src.inventory_head.type) + if(!inventory_head) + return + switch(inventory_head.type) if(/obj/item/clothing/head/helmet) name = "Sergeant [real_name]" desc = "The ever-loyal, the ever-vigilant." From 9f953a2816a63f8a4f22c5bed589c4495dc85d98 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Thu, 20 Aug 2015 23:45:13 -0700 Subject: [PATCH 057/310] Fixes spawn relevant triggering WAY too often. 20, as an event weighting, happens twice as often as rad storm, a 10 weighted event. Its way too much. I put it to 7 weight, halfway between rad storm (10) and meteor storm (5) --- .../mob/living/simple_animal/revenant/revenant_spawn_event.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm index 0db127f03ae..0cb19dab3da 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm @@ -3,7 +3,7 @@ /datum/round_event_control/revenant name = "Spawn Revenant" typepath = /datum/round_event/revenant - weight = 20 + weight = 7 max_occurrences = 3 earliest_start = 6000 //Meant to mix things up early-game. From 6f4c89c5ff4bcb5a7b837fb16b5f6a9ddd8da8a0 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Fri, 21 Aug 2015 05:22:20 -0300 Subject: [PATCH 058/310] Fixes the nuclear disk from not spawning under really specific circumstances --- code/game/objects/items/weapons/storage/storage.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 0a3ce5f865d..f4179092429 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -481,4 +481,5 @@ /obj/item/weapon/storage/handle_atom_del(atom/A) if(A in contents) + usr = null remove_from_storage(A,null) From dd6e735e71395a80ab47f139b7d1793df61ab4f9 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Fri, 21 Aug 2015 07:14:56 -0300 Subject: [PATCH 059/310] The remove_from_storage() call from handle_atom_del() will stop dropping the objects on null, to avoid having other storage objects with items inside in a null location. --- code/game/objects/items/weapons/storage/storage.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index f4179092429..fdd4aea2842 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -482,4 +482,4 @@ /obj/item/weapon/storage/handle_atom_del(atom/A) if(A in contents) usr = null - remove_from_storage(A,null) + remove_from_storage(A, loc) From 4934b9ba5798621488177bd270bf8921e15197a7 Mon Sep 17 00:00:00 2001 From: CorruptComputer Date: Fri, 21 Aug 2015 08:16:01 -0500 Subject: [PATCH 060/310] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5437433fc0c..8f2d270db37 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,9 @@ **Website:** http://www.tgstation13.org
**Code:** https://github.com/tgstation/-tg-station
-**Wiki** http://tgstation13.org/wiki/Main_Page
-**IRC:** irc://irc.rizon.net/coderbus
+**Wiki** http://tgstation13.org/wiki/Main_Page
+**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
+ ##DOWNLOADING From d27a736f7e72506c34b36dc6fcf8b3acb2d4cc57 Mon Sep 17 00:00:00 2001 From: CorruptComputer Date: Fri, 21 Aug 2015 16:57:27 -0500 Subject: [PATCH 061/310] Fixes #11301 --- .../{mapmerge => }/dmm2tgm/Source/dmm2tgm.py | 0 tools/{mapmerge => }/dmm2tgm/_hashlib.pyd | Bin tools/{mapmerge => }/dmm2tgm/bz2.pyd | Bin tools/{mapmerge => }/dmm2tgm/dmm2tgm.exe | Bin tools/{mapmerge => }/dmm2tgm/library.zip | Bin tools/{mapmerge => }/dmm2tgm/python27.dll | Bin tools/{mapmerge => }/dmm2tgm/select.pyd | Bin tools/{mapmerge => }/dmm2tgm/unicodedata.pyd | Bin tools/{mapmerge => }/dmm2tgm/w9xpopen.exe | Bin tools/mapmerge/MapMerge.jar | Bin 20893 -> 20574 bytes tools/mapmerge/Source/bin/MapMerge.class | Bin 4059 -> 3519 bytes tools/mapmerge/Source/src/MapMerge.java | 5 ++++- 12 files changed, 4 insertions(+), 1 deletion(-) rename tools/{mapmerge => }/dmm2tgm/Source/dmm2tgm.py (100%) rename tools/{mapmerge => }/dmm2tgm/_hashlib.pyd (100%) rename tools/{mapmerge => }/dmm2tgm/bz2.pyd (100%) rename tools/{mapmerge => }/dmm2tgm/dmm2tgm.exe (100%) rename tools/{mapmerge => }/dmm2tgm/library.zip (100%) rename tools/{mapmerge => }/dmm2tgm/python27.dll (100%) rename tools/{mapmerge => }/dmm2tgm/select.pyd (100%) rename tools/{mapmerge => }/dmm2tgm/unicodedata.pyd (100%) rename tools/{mapmerge => }/dmm2tgm/w9xpopen.exe (100%) diff --git a/tools/mapmerge/dmm2tgm/Source/dmm2tgm.py b/tools/dmm2tgm/Source/dmm2tgm.py similarity index 100% rename from tools/mapmerge/dmm2tgm/Source/dmm2tgm.py rename to tools/dmm2tgm/Source/dmm2tgm.py diff --git a/tools/mapmerge/dmm2tgm/_hashlib.pyd b/tools/dmm2tgm/_hashlib.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/_hashlib.pyd rename to tools/dmm2tgm/_hashlib.pyd diff --git a/tools/mapmerge/dmm2tgm/bz2.pyd b/tools/dmm2tgm/bz2.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/bz2.pyd rename to tools/dmm2tgm/bz2.pyd diff --git a/tools/mapmerge/dmm2tgm/dmm2tgm.exe b/tools/dmm2tgm/dmm2tgm.exe similarity index 100% rename from tools/mapmerge/dmm2tgm/dmm2tgm.exe rename to tools/dmm2tgm/dmm2tgm.exe diff --git a/tools/mapmerge/dmm2tgm/library.zip b/tools/dmm2tgm/library.zip similarity index 100% rename from tools/mapmerge/dmm2tgm/library.zip rename to tools/dmm2tgm/library.zip diff --git a/tools/mapmerge/dmm2tgm/python27.dll b/tools/dmm2tgm/python27.dll similarity index 100% rename from tools/mapmerge/dmm2tgm/python27.dll rename to tools/dmm2tgm/python27.dll diff --git a/tools/mapmerge/dmm2tgm/select.pyd b/tools/dmm2tgm/select.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/select.pyd rename to tools/dmm2tgm/select.pyd diff --git a/tools/mapmerge/dmm2tgm/unicodedata.pyd b/tools/dmm2tgm/unicodedata.pyd similarity index 100% rename from tools/mapmerge/dmm2tgm/unicodedata.pyd rename to tools/dmm2tgm/unicodedata.pyd diff --git a/tools/mapmerge/dmm2tgm/w9xpopen.exe b/tools/dmm2tgm/w9xpopen.exe similarity index 100% rename from tools/mapmerge/dmm2tgm/w9xpopen.exe rename to tools/dmm2tgm/w9xpopen.exe diff --git a/tools/mapmerge/MapMerge.jar b/tools/mapmerge/MapMerge.jar index c8e4349ba4256824d9c5a6f9cb1ba1029be6cb56..d0f0ce08028cdbb917fe185b48e331f8433d49c5 100644 GIT binary patch delta 2308 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 U1x@$?2ryQ~7e z0(yRcf-k{XgmFSKqch8$xnIe99DMxdZ@?liS>Sqh&F}U;{aq8790wm{+pdILBDNd; zOq`nj^hIAX6*x?3KBHkx)akUO%^|UN&WS1!2drw(V++f%gmrSRI zHVfP;jqu76y#ak|cSu%$RSHLHEOR%YlqUB|t~5#acu*Xbc@iF##$+9rC-(6;QX8Qf n7@9iP>O^CX+IUhjE2UnoA}y#lN@9r$W=f0{?5OHlcMbU;b{0Ix delta 847 zcmZvZT~8B16o%ikZRvJf6>BgeDnkf@!L*7d#9}lWy&=S)B$x(7m+sJ3+g;dhDK#;@ z@s4OrdSmd$cvBOD3MeQDh~MJZ5Ac_W4LDn>!DzCx=bbt4Ip^8g#hUN6%JS;$0)WH# zHleuWoEr}bJ1(okYA~Vd(O{=(M0hH7G96E7+?4T{uuV%QTdZiZw;Tg}gew@wqz~Is zXR9YZJjFD@m9kXRB2+c)>-eW-n~Z0K17Rc0RFgB^u$ZCen94G7T{AK%mQ*9LxX$-8 z%go00D6?Xm1qQP+W(n258M=(L8R36W?DPvlquo_AN=;+xFlU2VD`x1dCD0leVR2n> zB@$c<$XFm8J7r|_grRCF7CEHqte>+1Bdu#J#!Vh#G0PfEg@VCMCL^ZXZ32cF4GP5d zqF{cDd_$J_L4w3vrpDxplH$073U~p!pLclA(E0p1@6X&E#>1|8G=v@gM_plOwX1fiY!%F2&wEa4R-bWjgoi>!pR2;z-U4$R{S-j>u46v`?uV3u;C#7Ucw$GeiM z$2Ghc%0-RH;)75X)QmJf3gxEL=)p1uAPeADe8LrY1a2ih3#A|-(0l@F9W*I+x>yD( zy|qQ`p`sXMulg1E>x!tM%`4d5TNKx{h9o?0oFF1M8a6xz#6kBO_Con@S|rPkt#Fha N5T8x>BIZi?`U~%)*#iIo diff --git a/tools/mapmerge/Source/src/MapMerge.java b/tools/mapmerge/Source/src/MapMerge.java index a2058480a21..552a406b13d 100644 --- a/tools/mapmerge/Source/src/MapMerge.java +++ b/tools/mapmerge/Source/src/MapMerge.java @@ -88,7 +88,9 @@ public class MapMerge { String to_save = selected_map; String[] passInto = { "-clean", backup_map, edited_map, to_save }; MapPatcher.main(passInto); - try{ + + // Will try to fix when I have time ~CorruptComputer + /*try{ Process process = new ProcessBuilder("dmm2tgm\\dmm2tgm.exe", selected_map).start(); }catch(Exception e1){ System.out.println("You are not on a windows machine, trying the .py"); @@ -99,6 +101,7 @@ public class MapMerge { System.out.println("Downloads can be found here: https://www.python.org/downloads/"); } } + */ } } From 43a151ae4e2857b431e257c889d99e163f0661b1 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 21 Aug 2015 18:14:00 -0500 Subject: [PATCH 062/310] Fix --- code/modules/mob/living/bloodcrawl.dm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 3283c0ebb4f..212272026a4 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -35,13 +35,16 @@ sleep(30) playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1) sleep(30) - src << "You devour [kidnapped]. Your health is fully restored." - src.adjustBruteLoss(-1000) - src.adjustFireLoss(-1000) - src.adjustOxyLoss(-1000) - src.adjustToxLoss(-1000) - kidnapped.ghostize() - qdel(kidnapped) + if(kidnapped) + src << "You devour [kidnapped]. Your health is fully restored." + src.adjustBruteLoss(-1000) + src.adjustFireLoss(-1000) + src.adjustOxyLoss(-1000) + src.adjustToxLoss(-1000) + kidnapped.ghostize() + qdel(kidnapped) + else + src << "You happily devour...nothing? Your meal escaped at some point!" src.notransform = 0 /mob/living/proc/phasein(obj/effect/decal/cleanable/B) From 73aac62ce665f2081eb227fce32bfdd0c2474d6b Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 21 Aug 2015 18:14:33 -0500 Subject: [PATCH 063/310] Changed wording --- code/modules/mob/living/bloodcrawl.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 212272026a4..a58fd4401a4 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -44,7 +44,7 @@ kidnapped.ghostize() qdel(kidnapped) else - src << "You happily devour...nothing? Your meal escaped at some point!" + src << "You happily devour...nothing? Your meal vanished at some point!" src.notransform = 0 /mob/living/proc/phasein(obj/effect/decal/cleanable/B) From 2a518c65f91de6346a842a790d6cbcadb31dc899 Mon Sep 17 00:00:00 2001 From: kingofkosmos Date: Sat, 22 Aug 2015 09:35:01 +0300 Subject: [PATCH 064/310] Made cyborg cover unlock upon death. Made AI unanchor upon death. Added checks-if-dead to all AI verbs. Removed "You can't do that because you're dead!" -messages from AI verbs. --- code/game/objects/items/devices/PDA/PDA.dm | 15 ++++-------- code/modules/mob/living/silicon/ai/ai.dm | 23 +++++++++++-------- code/modules/mob/living/silicon/ai/death.dm | 1 + .../mob/living/silicon/ai/freelook/eye.dm | 2 ++ code/modules/mob/living/silicon/ai/laws.dm | 2 ++ code/modules/mob/living/silicon/ai/say.dm | 2 ++ .../modules/mob/living/silicon/robot/death.dm | 1 + 7 files changed, 26 insertions(+), 20 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 0b0080eadcf..da453f2fcc6 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1083,8 +1083,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/list/plist = list() var/list/namecounts = list() - if(user.stat == 2) - user << "You can't send PDA messages because you are dead!" + if(user.stat == 2) //won't work if dead return if(src.aiPDA.toff) @@ -1125,8 +1124,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /mob/living/silicon/ai/verb/cmd_toggle_pda_receiver() set category = "AI Commands" set name = "PDA - Toggle Sender/Receiver" - if(usr.stat == 2) - usr << "You can't do that because you are dead!" + if(usr.stat == 2) //won't work if dead return if(!isnull(aiPDA)) aiPDA.toff = !aiPDA.toff @@ -1137,8 +1135,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /mob/living/silicon/ai/verb/cmd_toggle_pda_silent() set category = "AI Commands" set name = "PDA - Toggle Ringer" - if(usr.stat == 2) - usr << "You can't do that because you are dead!" + if(usr.stat == 2) //won't work if dead return if(!isnull(aiPDA)) //0 @@ -1150,8 +1147,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /mob/living/silicon/ai/verb/cmd_use_chatroom() set category = "AI Commands" set name = "PDA - Chatrooms" - if(usr.stat == 2) - usr << "You can't do that because you are dead!" + if(usr.stat == 2) //won't work if dead return if(!isnull(aiPDA)) aiPDA.mode = 5 @@ -1160,8 +1156,7 @@ var/global/list/obj/item/device/pda/PDAs = list() usr << "You do not have a PDA. You should make an issue report about this." /mob/living/silicon/ai/proc/cmd_show_message_log(mob/user) - if(user.stat == 2) - user << "You can't do that because you are dead!" + if(user.stat == 2) //won't work if dead return if(!isnull(aiPDA)) var/HTML = "AI PDA Message Log[aiPDA.tnote]" diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0bc233bc351..be735a48b08 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -300,8 +300,7 @@ var/list/ai_list = list() onclose(src, "airoster") /mob/living/silicon/ai/proc/ai_call_shuttle() - if(src.stat == DEAD) - src << "You can't call the shuttle because you are dead!" + if(stat == 2) //won't work if dead return if(istype(usr,/mob/living/silicon/ai)) var/mob/living/silicon/ai/AI = src @@ -330,6 +329,8 @@ var/list/ai_list = list() set name = "Toggle Floor Bolts" if(!isturf(loc)) // if their location isn't a turf return // stop + if(stat == 2) //won't work if dead + return anchored = !anchored // Toggles the anchor src << "[anchored ? "You are now anchored." : "You are now unanchored."]" @@ -340,8 +341,7 @@ var/list/ai_list = list() /mob/living/silicon/ai/proc/ai_cancel_call() set category = "Malfunction" - if(src.stat == 2) - src << "You can't send the shuttle back because you are dead!" + if(stat == 2) //won't work if dead return if(istype(usr,/mob/living/silicon/ai)) var/mob/living/silicon/ai/AI = src @@ -506,8 +506,7 @@ var/list/ai_list = list() set category = "AI Commands" set name = "Access Robot Control" set desc = "Wirelessly control various automatic robots." - if(stat == 2) - src << "Critical error. System offline." + if(stat == 2) //won't work if dead return if(control_disabled) @@ -623,8 +622,7 @@ var/list/ai_list = list() cameraFollow = null var/cameralist[0] - if(usr.stat == 2) - usr << "You can't change your camera network because you are dead!" + if(stat == 2) //won't work if dead return var/mob/living/silicon/ai/U = usr @@ -668,8 +666,7 @@ var/list/ai_list = list() set category = "AI Commands" set name = "AI Status" - if(usr.stat == 2) - usr <<"You cannot change your emotional status because you are dead!" + if(stat == 2) //won't work if dead return var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Friend Computer", "Dorfy", "Blue Glow", "Red Glow") var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions @@ -693,6 +690,8 @@ var/list/ai_list = list() set desc = "Change the default hologram available to AI to something else." set category = "AI Commands" + if(stat == 2) //won't work if dead + return var/input if(alert("Would you like to select a hologram based on a crew member or switch to unique avatar?",,"Crew Member","Unique")=="Crew Member") @@ -788,6 +787,8 @@ var/list/ai_list = list() set desc = "Allows you to change settings of your radio." set category = "AI Commands" + if(stat == 2) //won't work if dead + return src << "Accessing Subspace Transceiver control..." if (radio) radio.interact(src) @@ -801,6 +802,8 @@ var/list/ai_list = list() set desc = "Modify the default radio setting for your automatic announcements." set category = "AI Commands" + if(stat == 2) //won't work if dead + return set_autosay() /mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 25b8bd2b310..2bdbcd8c805 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -8,6 +8,7 @@ else icon_state = "ai_dead" + anchored = 0 //unbolt floorbolts update_canmove() if(src.eyeobj) src.eyeobj.setLoc(get_turf(src)) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 30918bbcec3..3dbce30f749 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -100,5 +100,7 @@ set category = "AI Commands" set name = "Toggle Camera Acceleration" + if(usr.stat == 2) //won't work if dead + return acceleration = !acceleration usr << "Camera acceleration has been toggled [acceleration ? "on" : "off"]." diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index 8371f6e3021..c4d87cf87c1 100644 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -2,6 +2,8 @@ /mob/living/silicon/ai/proc/show_laws_verb() set category = "AI Commands" set name = "Show Laws" + if(usr.stat == 2) //won't work if dead + return src.show_laws() /mob/living/silicon/ai/show_laws(everyone = 0) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 86158b3c4f0..053d235fb4d 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -69,6 +69,8 @@ var/const/VOX_DELAY = 600 set desc = "Display a list of vocal words to announce to the crew." set category = "AI Commands" + if(usr.stat == 2) //won't work if dead + return var/dat = "Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.
\