From e2b4e3c567ab63d06146d31fcaf1f455721d1ec1 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 11 Feb 2018 16:34:17 -0500 Subject: [PATCH 001/108] Fixes wrong ID for syndicate ghost roles --- code/game/objects/structures/ghost_role_spawners.dm | 3 +-- code/modules/awaymissions/mission_code/snowdin.dm | 2 +- code/modules/mob/living/simple_animal/corpse.dm | 9 +++------ .../simple_animal/hostile/mining_mobs/hivelord.dm | 1 - code/modules/ruins/lavaland_ruin_code.dm | 13 +++++++++++-- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index fc29206090..fbfc36cd97 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -396,7 +396,6 @@ death = FALSE icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper_s" - id_access_list = list(ACCESS_SYNDICATE) outfit = /datum/outfit/syndicate_empty assignedrole = "Space Syndicate" //I know this is really dumb, but Syndicate operative is nuke ops @@ -408,7 +407,7 @@ ears = /obj/item/device/radio/headset/syndicate/alt back = /obj/item/storage/backpack implants = list(/obj/item/implant/weapons_auth) - id = /obj/item/card/id + id = /obj/item/card/id/syndicate /datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H) H.faction |= ROLE_SYNDICATE diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 75530c5751..707f004eb1 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -603,7 +603,7 @@ shoes = /obj/item/clothing/shoes/combat/coldres ears = /obj/item/device/radio/headset/syndicate/alt r_pocket = /obj/item/gun/ballistic/automatic/pistol - l_pocket = /obj/item/card/id/syndicate + id = /obj/item/card/id/syndicate implants = list(/obj/item/implant/exile) /obj/effect/mob_spawn/human/syndicatesoldier/coldres/alive/female diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 60779aeaac..b6f9e1e9b8 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -11,7 +11,6 @@ /obj/effect/mob_spawn/human/corpse/syndicatesoldier name = "Syndicate Operative" id_job = "Operative" - id_access_list = list(ACCESS_SYNDICATE) hair_style = "Bald" facial_hair_style = "Shaved" outfit = /datum/outfit/syndicatesoldiercorpse @@ -26,13 +25,12 @@ mask = /obj/item/clothing/mask/gas head = /obj/item/clothing/head/helmet/swat back = /obj/item/storage/backpack - id = /obj/item/card/id + id = /obj/item/card/id/syndicate /obj/effect/mob_spawn/human/corpse/syndicatecommando name = "Syndicate Commando" id_job = "Operative" - id_access_list = list(ACCESS_SYNDICATE) hair_style = "Bald" facial_hair_style = "Shaved" outfit = /datum/outfit/syndicatecommandocorpse @@ -47,13 +45,12 @@ mask = /obj/item/clothing/mask/gas/syndicate back = /obj/item/tank/jetpack/oxygen r_pocket = /obj/item/tank/internals/emergency_oxygen - id = /obj/item/card/id + id = /obj/item/card/id/syndicate /obj/effect/mob_spawn/human/corpse/syndicatestormtrooper name = "Syndicate Stormtrooper" id_job = "Operative" - id_access_list = list(ACCESS_SYNDICATE) hair_style = "Bald" facial_hair_style = "Shaved" outfit = /datum/outfit/syndicatestormtroopercorpse @@ -67,7 +64,7 @@ ears = /obj/item/device/radio/headset mask = /obj/item/clothing/mask/gas/syndicate back = /obj/item/tank/jetpack/oxygen/harness - id = /obj/item/card/id + id = /obj/item/card/id/syndicate /obj/effect/mob_spawn/human/clown/corpse diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 57dda3b39c..7d48b5eaac 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -346,7 +346,6 @@ mask = /obj/item/clothing/mask/breath if("Operative") id_job = "Operative" - id_access_list = list(ACCESS_SYNDICATE) outfit = /datum/outfit/syndicatecommandocorpse if("Shadow") mob_species = /datum/species/shadow diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index becb7abf1d..de7dd1d8ee 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -99,7 +99,6 @@ icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper_s" flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. DON'T abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!" - id_access_list = list(ACCESS_SYNDICATE) outfit = /datum/outfit/lavaland_syndicate assignedrole = "Lavaland Syndicate" @@ -116,7 +115,7 @@ ears = /obj/item/device/radio/headset/syndicate/alt back = /obj/item/storage/backpack r_pocket = /obj/item/gun/ballistic/automatic/pistol - id = /obj/item/card/id + id = /obj/item/card/id/syndicate/anyone implants = list(/obj/item/implant/weapons_auth) /datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H) @@ -138,4 +137,14 @@ r_hand = /obj/item/melee/transforming/energy/sword/saber mask = /obj/item/clothing/mask/chameleon suit = /obj/item/clothing/suit/armor/vest +<<<<<<< HEAD l_pocket = /obj/item/card/id/syndicate/anyone +======= + +/obj/item/clothing/mask/chameleon/gps/Initialize() + . = ..() + new /obj/item/device/gps/internal/lavaland_syndicate_base(src) + +/obj/item/device/gps/internal/lavaland_syndicate_base + gpstag = "Encrypted Signal" +>>>>>>> 47ed29c... Merge pull request #35514 from ShizCalev/ghost-role-syndi-access From e69a597fb2cc4721475275b049d4286465e5a83c Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 11 Feb 2018 18:31:57 -0500 Subject: [PATCH 002/108] Update lavaland_ruin_code.dm --- code/modules/ruins/lavaland_ruin_code.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index de7dd1d8ee..3230115eea 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -137,9 +137,6 @@ r_hand = /obj/item/melee/transforming/energy/sword/saber mask = /obj/item/clothing/mask/chameleon suit = /obj/item/clothing/suit/armor/vest -<<<<<<< HEAD - l_pocket = /obj/item/card/id/syndicate/anyone -======= /obj/item/clothing/mask/chameleon/gps/Initialize() . = ..() @@ -147,4 +144,3 @@ /obj/item/device/gps/internal/lavaland_syndicate_base gpstag = "Encrypted Signal" ->>>>>>> 47ed29c... Merge pull request #35514 from ShizCalev/ghost-role-syndi-access From 0af6af731ac12507e0129e2e26aa575fec93e4d0 Mon Sep 17 00:00:00 2001 From: MoreRobustThanYou Date: Mon, 12 Feb 2018 10:01:11 -0500 Subject: [PATCH 003/108] Urinal cakes can now be picked up again (#35566) * Urinal cakes can now be picked up again * Update watercloset.dm * Update watercloset.dm * Update watercloset.dm --- code/game/objects/structures/watercloset.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 1b07062553..d4fbb60b2d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -187,8 +187,8 @@ w_class = WEIGHT_CLASS_TINY list_reagents = list("chlorine" = 3, "ammonia" = 1) -/obj/item/reagent_containers/food/urinalcake/attack_hand(mob/living/user) - user.visible_message("[user] squishes [src]!", "You squish [src].") +/obj/item/reagent_containers/food/urinalcake/attack_self(mob/living/user) + user.visible_message("[user] squishes [src]!", "You squish [src].", "You hear a squish.") icon_state = "urinalcake_squish" addtimer(VARSET_CALLBACK(src, icon_state, "urinalcake"), 8) From 379ff0546a27b50a45eb1f2011bb967621a67d84 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Mon, 12 Feb 2018 17:02:29 +0200 Subject: [PATCH 005/108] Merge pull request #35541 from 81Denton/chem-conflicts Fixes lye/plastic/charcoal conflicts --- code/modules/reagents/chemistry/recipes/others.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 5999911cb1..4261dcc421 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -562,7 +562,7 @@ name = "lye" id = "lye" results = list("lye" = 2) - required_reagents = list("ash" = 1, "water" = 1) + required_reagents = list("ash" = 1, "water" = 1, "carbon" = 1) /datum/chemical_reaction/royal_bee_jelly name = "royal bee jelly" @@ -579,7 +579,7 @@ /datum/chemical_reaction/plastic_polymers name = "plastic polymers" id = "plastic_polymers" - required_reagents = list("oil" = 5, "sodiumchloride" = 2, "ash" = 3) + required_reagents = list("oil" = 5, "sacid" = 2, "ash" = 3) required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat. /datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, created_volume) From 0d40303254ad6e07748de2b31e3f02fea41c9c59 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Mon, 12 Feb 2018 17:06:36 +0200 Subject: [PATCH 007/108] Merge pull request #35558 from praisenarsie/patch-28 fulton pack not allowed on supply shuttle --- code/modules/shuttle/supply.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index a0bc4f0d1f..213e2d8b17 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -21,7 +21,8 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/machinery/autolathe, //same /obj/item/projectile/beam/wormhole, /obj/effect/portal, - /obj/item/device/shared_storage + /obj/item/device/shared_storage, + /obj/structure/extraction_point ))) /obj/docking_port/mobile/supply From 3d5e49f06dc5220e0484ad1886f1e7eda81e4bcc Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Mon, 12 Feb 2018 17:08:18 +0200 Subject: [PATCH 009/108] Merge pull request #35549 from KorPhaeron/golem Removes old golem items --- .../research/xenobiology/xenobiology.dm | 65 ------------------- 1 file changed, 65 deletions(-) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 1497741719..c6b9e4b902 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -825,71 +825,6 @@ L.regenerate_icons() qdel(src) -////////Adamantine Golem stuff I dunno where else to put it - -// This will eventually be removed. - -/obj/item/clothing/under/golem - name = "adamantine skin" - desc = "A golem's skin." - icon_state = "golem" - item_state = "golem" - item_color = "golem" - flags_1 = ABSTRACT_1 | NODROP_1 - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - has_sensor = NO_SENSORS - -/obj/item/clothing/suit/golem - name = "adamantine shell" - desc = "A golem's thick outer shell." - icon_state = "golem" - item_state = "golem" - w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.9 - permeability_coefficient = 0.5 - body_parts_covered = FULL_BODY - flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - flags_1 = ABSTRACT_1 | NODROP_1 - -/obj/item/clothing/shoes/golem - name = "golem's feet" - desc = "Sturdy adamantine feet." - icon_state = "golem" - item_state = null - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - flags_1 = NOSLIP_1 | ABSTRACT_1 | NODROP_1 - - -/obj/item/clothing/mask/breath/golem - name = "golem's face" - desc = "The imposing face of an adamantine golem." - icon_state = "golem" - item_state = "golem" - siemens_coefficient = 0 - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - flags_1 = ABSTRACT_1 | NODROP_1 - - -/obj/item/clothing/gloves/golem - name = "golem's hands" - desc = "Strong adamantine hands." - icon_state = "golem" - item_state = null - siemens_coefficient = 0 - flags_1 = ABSTRACT_1 | NODROP_1 - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - - -/obj/item/clothing/head/space/golem - icon_state = "golem" - item_state = "dermal" - item_color = "dermal" - name = "golem's head" - desc = "A golem's head." - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - flags_1 = ABSTRACT_1 | NODROP_1 - /obj/item/stack/tile/bluespace name = "bluespace floor tile" singular_name = "floor tile" From c40925f5296e4fa7fda68c8b02f6259ae3876973 Mon Sep 17 00:00:00 2001 From: Dax Dupont Date: Mon, 12 Feb 2018 16:19:59 +0100 Subject: [PATCH 011/108] Fatshaming the AI, moving him two tiles upward when mass_recall() happens (#35524) --- .../ark_of_the_clockwork_justicar.dm | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 770d444264..84ad19f6e1 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -100,12 +100,8 @@ R.time *= 2 //Building walls becomes slower when the Ark activates mass_recall() recalls_remaining++ //So it doesn't use up a charge - -/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/open_portal(turf/T) - new/obj/effect/clockwork/city_of_cogs_rift(T) - -/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/spawn_animation() - var/turf/T = get_turf(src) + + var/turf/T = get_turf(src) var/list/open_turfs = list() for(var/turf/open/OT in orange(1, T)) if(!is_blocked_turf(OT, TRUE)) @@ -113,6 +109,11 @@ if(open_turfs.len) for(var/mob/living/L in T) L.forceMove(pick(open_turfs)) + +/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/open_portal(turf/T) + new/obj/effect/clockwork/city_of_cogs_rift(T) + +/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/spawn_animation() hierophant_message("The Ark has activated! [grace_period ? "You have [round(grace_period / 60)] minutes until the crew invades! " : ""]Defend it at all costs!", FALSE, src) sound_to_playing_players(volume = 10, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', TRUE)) seconds_until_activation = 0 @@ -130,7 +131,10 @@ if(!M || !M.current) continue if(isliving(M.current) && M.current.stat != DEAD) - M.current.forceMove(get_turf(src)) + if(isAI(M.current)) + M.current.forceMove(get_step(get_step(src, NORTH),NORTH)) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark. + else + M.current.forceMove(get_turf(src)) M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) M.current.clear_fullscreen("flash", 5) playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, FALSE) From 8c28ac1a1a37cbe555a311a791d1d5d366f55a0d Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 10 Feb 2018 12:15:14 -0500 Subject: [PATCH 013/108] Split up Revert/Removal --- tools/WebhookProcessor/github_webhook_processor.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index f7ea3eecfc..5386eef63b 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -210,8 +210,10 @@ function tag_pr($payload, $opened) { if(strpos(strtolower($title), 'refactor') !== FALSE) $tags[] = 'Refactor'; - if(strpos(strtolower($title), 'revert') !== FALSE || strpos(strtolower($title), 'removes') !== FALSE) - $tags[] = 'Revert/Removal'; + if(strpos(strtolower($title), 'revert') !== FALSE) + $tags[] = 'Revert'; + if(strpos(strtolower($title), 'removes') !== FALSE) + $tags[] = 'Removal'; } $remove = array(); @@ -661,7 +663,7 @@ function checkchangelog($payload, $compile = true) { case 'sounddel': if($item != 'removed an old sound thingy') { $tags[] = 'Sound'; - $tags[] = 'Revert/Removal'; + $tags[] = 'Removal'; $currentchangelogblock[] = array('type' => 'sounddel', 'body' => $item); } break; @@ -677,7 +679,7 @@ function checkchangelog($payload, $compile = true) { case 'dels': case 'rscdel': if($item != 'Removed old things') { - $tags[] = 'Revert/Removal'; + $tags[] = 'Removal'; $currentchangelogblock[] = array('type' => 'rscdel', 'body' => $item); } break; @@ -690,7 +692,7 @@ function checkchangelog($payload, $compile = true) { case 'imagedel': if($item != 'deleted some icons and images') { $tags[] = 'Sprites'; - $tags[] = 'Revert/Removal'; + $tags[] = 'Removal'; $currentchangelogblock[] = array('type' => 'imagedel', 'body' => $item); } break; From c88c4f2d2765e2ef9716ff084d5f57ed69e767c3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 12 Feb 2018 10:03:08 -0600 Subject: [PATCH 015/108] Automatic changelog generation for PR #5433 [ci skip] --- html/changelogs/AutoChangeLog-pr-5433.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5433.yml diff --git a/html/changelogs/AutoChangeLog-pr-5433.yml b/html/changelogs/AutoChangeLog-pr-5433.yml new file mode 100644 index 0000000000..1fe9d351c7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5433.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - bugfix: "Your hand no longer magically squishes urinal cakes when trying to pick them up" From 302c1870189da94647b6f8172141c7d149b790ea Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 12 Feb 2018 10:03:19 -0600 Subject: [PATCH 016/108] Automatic changelog generation for PR #5434 [ci skip] --- html/changelogs/AutoChangeLog-pr-5434.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5434.yml diff --git a/html/changelogs/AutoChangeLog-pr-5434.yml b/html/changelogs/AutoChangeLog-pr-5434.yml new file mode 100644 index 0000000000..7ee8978492 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5434.yml @@ -0,0 +1,5 @@ +author: "Denton" +delete-after: True +changes: + - bugfix: "Fixes lye/plastic/charcoal conflicts when mixing." + - bugfix: "Lye is now made by combining ash with water and carbon. Plastic sheets by heating ash, sulphuric acid and oil." From b6d5173420b5a1b08db9a29b840e75ac11bd853a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 12 Feb 2018 10:05:00 -0600 Subject: [PATCH 017/108] Automatic changelog generation for PR #5438 [ci skip] --- html/changelogs/AutoChangeLog-pr-5438.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5438.yml diff --git a/html/changelogs/AutoChangeLog-pr-5438.yml b/html/changelogs/AutoChangeLog-pr-5438.yml new file mode 100644 index 0000000000..0a4d3390e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5438.yml @@ -0,0 +1,5 @@ +author: "Dax Dupont" +delete-after: True +changes: + - bugfix: "AI no longers block ark after mass_recall" + - bugfix: "Placed the dispersal logic AFTER the mass_recall on ark activation instead of infront(did nothing before basically)." From 079127dd59bef54fc545094bf59c5e1e56d6fef4 Mon Sep 17 00:00:00 2001 From: Cebutris Date: Mon, 12 Feb 2018 11:17:38 -0500 Subject: [PATCH 018/108] Adds in prayer beads! --- .../code/game/objects/items/holy_weapons.dm | 54 ++++++++++++++++++ modular_citadel/icons/obj/weapons.dmi | Bin 0 -> 417 bytes tgstation.dme | 1 + 3 files changed, 55 insertions(+) create mode 100644 modular_citadel/code/game/objects/items/holy_weapons.dm create mode 100644 modular_citadel/icons/obj/weapons.dmi diff --git a/modular_citadel/code/game/objects/items/holy_weapons.dm b/modular_citadel/code/game/objects/items/holy_weapons.dm new file mode 100644 index 0000000000..76fd13416e --- /dev/null +++ b/modular_citadel/code/game/objects/items/holy_weapons.dm @@ -0,0 +1,54 @@ +/obj/item/nullrod/rosary + icon = 'modular_citadel/icons/obj/weapons.dmi' + icon_state = "rosary" + item_state = null + name = "prayer beads" + desc = "A set of prayer beads used by many of the more traditional religions in space" + force = 0 + throwforce = 0 + var/praying = FALSE + var/deity_name = "Coderbus" //This is the default, hopefully won't actually appear if the religion subsystem is running properly + +/obj/item/nullrod/rosary/Initialize() + .=..() + if(SSreligion.religion) + deity_name = SSreligion.deity + +/obj/item/nullrod/rosary/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(!istype(M)) + return ..() + + if(!user.mind || user.mind.assigned_role != "Chaplain") + to_chat(user, "You are not close enough with [deity_name] to use [src].") + return + + if(praying) + to_chat(user, "You are already using [src].") + return + + user.visible_message("[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [deity_name].", \ + "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [deity_name].") + + praying = TRUE + if(do_after(user, 150, target = M)) + if(istype(M, /mob/living/carbon/human)) // This probably should not work on catpeople. They're unholy abominations. + var/mob/living/carbon/human/target = M + + if(iscultist(M) || is_servant_of_ratvar(M)) //ripped from holywater code. + if(iscultist(M)) + SSticker.mode.remove_cultist(M.mind, FALSE, TRUE) + else if(is_servant_of_ratvar(M)) + remove_servant_of_ratvar(M) + + if(prob(25)) + to_chat(target, "[user]'s prayer to [deity_name] has eased your pain!") + target.adjustToxLoss(-5) + target.adjustOxyLoss(-5) + target.adjustBruteLoss(-5) + target.adjustFireLoss(-5) + + praying = FALSE + + else + to_chat(user, "Your prayer to [deity_name] was interrupted.") + praying = TRUE \ No newline at end of file diff --git a/modular_citadel/icons/obj/weapons.dmi b/modular_citadel/icons/obj/weapons.dmi new file mode 100644 index 0000000000000000000000000000000000000000..bf98931e447948293661eac706a16b07fcfca36b GIT binary patch literal 417 zcmV;S0bc%zP)iGwII*ZwiHkEOv#1y-V93RpR+N~V3SlcNxca$(%>@8mgBq(?+`?J_ z006;BL_t(2k&TZ{4uc>NMuEgVv>pIVufS`>`t^qqaMju1JimDi zjQv?$YNbS3Yka0hv-PXC0yr`#6Nz=y1^fPaqpv$0JfqB8XjkmBMcpLM>FyJzLBS2gb zac0R#Kc^$Rloh~|>SvbM`wFg!;xTnO7%>MP(PjXuD!X(gmp-i@!4x8{oLJ Date: Mon, 12 Feb 2018 18:15:18 +0100 Subject: [PATCH 019/108] Cell chargers are now buildable and (upgradable!) machines. --- code/game/machinery/cell_charger.dm | 34 +++++++++++++++---- .../circuitboards/machine_circuitboards.dm | 5 +++ code/modules/power/cell.dm | 7 ++++ .../research/designs/machine_designs.dm | 7 ++++ code/modules/research/techweb/all_nodes.dm | 2 +- 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 21b8f5bb49..edb80a7f11 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -8,8 +8,10 @@ idle_power_usage = 5 active_power_usage = 60 power_channel = EQUIP + circuit = /obj/item/circuitboard/machine/cell_charger var/obj/item/stock_parts/cell/charging = null var/chargelevel = -1 + var/charge_rate = 500 /obj/machinery/cell_charger/proc/updateicon() cut_overlays() @@ -28,7 +30,7 @@ to_chat(user, "Current charge: [round(charging.percent(), 1)]%.") /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stock_parts/cell)) + if(istype(W, /obj/item/stock_parts/cell) && !panel_open) if(stat & BROKEN) to_chat(user, "[src] is broken!") return @@ -52,17 +54,31 @@ user.visible_message("[user] inserts a cell into [src].", "You insert a cell into [src].") chargelevel = -1 updateicon() - else if(istype(W, /obj/item/wrench)) - if(charging) - to_chat(user, "Remove the cell first!") + else + if(!charging && default_deconstruction_screwdriver(user, icon_state, icon_state, W)) return + if(default_deconstruction_crowbar(W)) + return + if(!charging && default_unfasten_wrench(user, W)) + return +<<<<<<< HEAD anchored = !anchored to_chat(user, "You [anchored ? "attach" : "detach"] [src] [anchored ? "to" : "from"] the ground") playsound(src.loc, W.usesound, 75, 1) else +======= +>>>>>>> 0b718fa... Cell chargers are now buildable and (upgradable!) machines. (#35517) return ..() +/obj/machinery/cell_charger/deconstruct() + if(charging) + charging.forceMove(drop_location()) + return ..() + +/obj/machinery/cell_charger/Destroy() + QDEL_NULL(charging) + return ..() /obj/machinery/cell_charger/proc/removecell() charging.update_icon() @@ -102,6 +118,10 @@ ..(severity) +/obj/machinery/cell_charger/RefreshParts() + charge_rate = 500 + for(var/obj/item/stock_parts/capacitor/C in component_parts) + charge_rate *= C.rating /obj/machinery/cell_charger/process() if(!charging || !anchored || (stat & (BROKEN|NOPOWER))) @@ -109,8 +129,8 @@ if(charging.percent() >= 100) return - - use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly! - charging.give(175) //inefficiency. + use_power(charge_rate) + charging.give(charge_rate) //this is 2558, efficient batteries exist updateicon() + \ No newline at end of file diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 7fcc3e3f96..b56b448f0d 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -85,6 +85,11 @@ build_path = /obj/machinery/recharger req_components = list(/obj/item/stock_parts/capacitor = 1) +/obj/item/circuitboard/machine/cell_charger + name = "Cell Charger (Machine Board)" + build_path = /obj/machinery/cell_charger + req_components = list(/obj/item/stock_parts/capacitor = 1) + /obj/item/circuitboard/machine/cyborgrecharger name = "Cyborg Recharger (Machine Board)" build_path = /obj/machinery/recharge_station diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 0a29d54865..c985302509 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -172,6 +172,7 @@ /obj/item/stock_parts/cell/crap/empty/Initialize() . = ..() charge = 0 + update_icon() /obj/item/stock_parts/cell/upgraded name = "upgraded power cell" @@ -195,6 +196,7 @@ /obj/item/stock_parts/cell/secborg/empty/Initialize() . = ..() charge = 0 + update_icon() /obj/item/stock_parts/cell/pulse //200 pulse shots name = "pulse rifle power cell" @@ -228,6 +230,7 @@ /obj/item/stock_parts/cell/high/empty/Initialize() . = ..() charge = 0 + update_icon() /obj/item/stock_parts/cell/super name = "super-capacity power cell" @@ -240,6 +243,7 @@ /obj/item/stock_parts/cell/super/empty/Initialize() . = ..() charge = 0 + update_icon() /obj/item/stock_parts/cell/hyper name = "hyper-capacity power cell" @@ -252,6 +256,7 @@ /obj/item/stock_parts/cell/hyper/empty/Initialize() . = ..() charge = 0 + update_icon() /obj/item/stock_parts/cell/bluespace name = "bluespace power cell" @@ -265,6 +270,7 @@ /obj/item/stock_parts/cell/bluespace/empty/Initialize() . = ..() charge = 0 + update_icon() /obj/item/stock_parts/cell/infinite name = "infinite-capacity power cell!" @@ -318,6 +324,7 @@ /obj/item/stock_parts/cell/emproof/empty/Initialize() . = ..() charge = 0 + update_icon() /obj/item/stock_parts/cell/emproof/emp_act(severity) return diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index d064a3614f..b724c69e3b 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -419,3 +419,10 @@ id = "donksofttoyvendor" build_path = /obj/item/circuitboard/machine/vending/donksofttoyvendor category = list ("Misc. Machinery") + +/datum/design/board/cell_charger + name = "Machine Design (Cell Charger Board)" + desc = "The circuit board for a cell charger." + id = "cell_charger" + build_path = /obj/item/circuitboard/machine/cell_charger + category = list ("Misc. Machinery") diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 067c55662a..479a79e250 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -64,7 +64,7 @@ description = "A refresher course on modern engineering technology." prereq_ids = list("base") design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", - "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "weldingmask", "mesons", "thermomachine", "tesla_coil", "grounding_rod", "apc_control") + "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "weldingmask", "mesons", "thermomachine", "tesla_coil", "grounding_rod", "apc_control", "cell_charger") research_cost = 2500 export_price = 5000 From a47a660b3541ffaf94444af8fa852210ff28c1a8 Mon Sep 17 00:00:00 2001 From: cebutris Date: Mon, 12 Feb 2018 13:29:51 -0500 Subject: [PATCH 020/108] Whoops I missed something --- modular_citadel/code/game/objects/items/holy_weapons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/game/objects/items/holy_weapons.dm b/modular_citadel/code/game/objects/items/holy_weapons.dm index 76fd13416e..7184388475 100644 --- a/modular_citadel/code/game/objects/items/holy_weapons.dm +++ b/modular_citadel/code/game/objects/items/holy_weapons.dm @@ -51,4 +51,4 @@ else to_chat(user, "Your prayer to [deity_name] was interrupted.") - praying = TRUE \ No newline at end of file + praying = FALSE From f5eb7f71017efb60c5a46ca416dba531c3b850cc Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 12 Feb 2018 13:42:51 -0500 Subject: [PATCH 021/108] Update cell_charger.dm --- code/game/machinery/cell_charger.dm | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index edb80a7f11..169d7f822b 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -61,14 +61,6 @@ return if(!charging && default_unfasten_wrench(user, W)) return -<<<<<<< HEAD - - anchored = !anchored - to_chat(user, "You [anchored ? "attach" : "detach"] [src] [anchored ? "to" : "from"] the ground") - playsound(src.loc, W.usesound, 75, 1) - else -======= ->>>>>>> 0b718fa... Cell chargers are now buildable and (upgradable!) machines. (#35517) return ..() /obj/machinery/cell_charger/deconstruct() @@ -133,4 +125,4 @@ charging.give(charge_rate) //this is 2558, efficient batteries exist updateicon() - \ No newline at end of file + From b6ca568ac1f4915a75ec9c75eb59acaa59739331 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 12 Feb 2018 13:47:42 -0500 Subject: [PATCH 022/108] Tests give 3 GBP (#35551) --- tools/WebhookProcessor/github_webhook_processor.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index f7ea3eecfc..c1786286e3 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -454,6 +454,7 @@ function get_pr_code_friendliness($payload, $oldbalance = null){ $label_values = array( 'Fix' => 2, 'Refactor' => 2, + 'CI/Tests' => 3, 'Code Improvement' => 1, 'Grammar and Formatting' => 1, 'Priority: High' => 4, From 16de4e4c90d67f3fc1028051dc5c95ca12808b62 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 12 Feb 2018 13:48:01 -0500 Subject: [PATCH 024/108] Disables max errors on travis compile (#35550) --- tools/travis/dm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/travis/dm.sh b/tools/travis/dm.sh index 924c4515ac..ea432fa5ac 100755 --- a/tools/travis/dm.sh +++ b/tools/travis/dm.sh @@ -71,7 +71,7 @@ then else if hash DreamMaker 2>/dev/null then - DreamMaker $dmepath.mdme 2>&1 | tee result.log + DreamMaker -max_errors 0 $dmepath.mdme 2>&1 | tee result.log retval=$? if ! grep '\- 0 errors, 0 warnings' result.log then From 37a1f6245db7840967f95825d2873b7b28d7b472 Mon Sep 17 00:00:00 2001 From: MoreRobustThanYou Date: Mon, 12 Feb 2018 13:49:51 -0500 Subject: [PATCH 026/108] Fix SCP-294 appearance (#35528) * Add files via upload * Add files via upload --- icons/obj/scp.dmi | Bin 905 -> 1014 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/scp.dmi b/icons/obj/scp.dmi index 4dfc4f162736d82249b70dedefaaf435df323e64..0b525a4332f4fa85d316a83d9604c629cc28fcaf 100644 GIT binary patch delta 832 zcmV-G1Hb%<2lfY$B!8|@OjJd{z`!CRB6D+diHV7qmzT4%v#P49xVX5~)YJd~09smF z3JMAr7Z-$tglK4Jb&Q#XpRJLtyt&EJztP#Dzs_QHf2F0Rld89)z00r5+Sljs-S79m z-Ryvqor-Q{fofu?jDw$ufM8cuXJ1{k#LRwmbA^3-(&Fl^yg0?Jyu-`djNS?fR7ht3-C#3a(g=w)ug+y3Q)wi3Q)zj2~ftL*aN8J+soiWe0zWk@ht+>@vQ-- z)4TioyD3znXfMQ-9RP921%Elj7JxE^s6Bw|at=Soakwa)(}lw=0XU)RCUTDesHx}q zK^R6+7<~=`--{^|fA~ULKS|PAmgRYtf1SNFe|53<5&-(gF$&xQwU0)KS92=k2qbU!@y5&-j!nn-${%H0(6jR2Gl4<-RH-v}_8rz8O8 zzXO13x|QZ4%+~{8wmdHq?TR7IrkHOAkXIxbfcPdg3)`YT>NXd=|t102F!;&Rqs zQR~4+Mtw5?;|}Ss*fId|jR0JXoc@kr*iBL22r$}lNC3>&1ARDQ^7GDc9H71);I=!n z`Xq5qYEpOI6!T3oP>fV~9v#V@eKW zWHC{68DPEvKy1Ft&y#~xyjPM(b=KD&SG_c zGcz;6!NIG-&%4#*$K&$n^ZD-j|JU{Zn5(slZe@XLV!))Cx1g4UgoI#MRcBvaw8YGo zjfl<2c6N5Hyv41&!{hS#+~w=2x4%C>Ki=*0mZPenuOqk2+2GgZ>yDbA#L(4N zR#pH20AOHXmzS5NrKJZ42ie4(Xp!5Ze+)@PK~z|U?Uq?{+aMH1gZ2uerE(maG(lCo zx3--A{~y;2l`232)5H&X(5D$Z@)_6WQ5d8? zMvw*SIU!kI6lGbIU-LX8mCW4)Q5Yx7<^3`dhECuOf;=nA)#_nY3PUCH>jDabe=thE zJwm_`KlK8NdJY39zdu93P`va4>L_4b03&z=MV!?2(~nNTP|ryQBX|ZyQ8vxXYbA3x zK@irlNF9Z15Nwd|%L0-$g-DZUTM$UxNstD?x?c0tP(K(6Dnho+mZyRG@xRU_s(F8XB2?W$sU|3`uzb=5&k}>Lel)(pY z;6^)5ZQMfcUasDDGjbbThR!E}LP4Xpffd0Q;rF7Uyd{)XS(XasCT zyL89-*__`loc~_ni8%l3CAb#EVBV)U(v1XDQ;7OC`U5t7dJpeZv6BD*002ovPDHLk FV1kWTYVrU8 From 7b19f699351c37b4ad51e6445a097ed48444ce6c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 12 Feb 2018 14:04:33 -0600 Subject: [PATCH 028/108] Automatic changelog generation for PR #5445 [ci skip] --- html/changelogs/AutoChangeLog-pr-5445.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5445.yml diff --git a/html/changelogs/AutoChangeLog-pr-5445.yml b/html/changelogs/AutoChangeLog-pr-5445.yml new file mode 100644 index 0000000000..40def083f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5445.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - bugfix: "SCP-294 no longer looks fucked up" From 1825c944b6a44bfe3e73bdab0ece873c1e6d827a Mon Sep 17 00:00:00 2001 From: Robustin Date: Mon, 12 Feb 2018 16:17:58 -0500 Subject: [PATCH 029/108] Cult Update? Cult Update! (#35433) * Cult Fixes and Tweaks * Master prompt and spelling fix * Couple small fixes --- code/controllers/subsystem/shuttle.dm | 11 ++++-- code/game/gamemodes/cult/blood_magic.dm | 28 +++++++------- code/game/machinery/doors/airlock_types.dm | 35 ++++++++++++++---- code/game/objects/structures/girders.dm | 2 +- code/modules/antagonists/cult/cult_comms.dm | 6 ++- code/modules/antagonists/cult/cult_items.dm | 26 ++++++++++--- .../antagonists/cult/cult_structures.dm | 1 + code/modules/antagonists/cult/ritual.dm | 3 ++ code/modules/antagonists/cult/runes.dm | 23 +++++++----- .../mob/living/simple_animal/constructs.dm | 14 +++---- .../spells/spell_types/construct_spells.dm | 6 +-- icons/mob/actions/actions_cult.dmi | Bin 26978 -> 26985 bytes icons/obj/projectiles.dmi | Bin 115040 -> 116179 bytes 13 files changed, 102 insertions(+), 53 deletions(-) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index bff46717b1..e661baacd7 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -197,6 +197,13 @@ SUBSYSTEM_DEF(shuttle) if(emergency.timeLeft(1) > emergencyCallTime * 0.4) emergency.request(null, set_coefficient = 0.4) +/datum/controller/subsystem/shuttle/proc/block_recall(lockout_timer) + emergencyNoRecall = TRUE + addtimer(CALLBACK(src, .proc/unblock_recall), lockout_timer) + +/datum/controller/subsystem/shuttle/proc/unblock_recall() + emergencyNoRecall = FALSE + /datum/controller/subsystem/shuttle/proc/getShuttle(id) for(var/obj/docking_port/mobile/M in mobile) if(M.id == id) @@ -309,9 +316,7 @@ SUBSYSTEM_DEF(shuttle) return 1 /datum/controller/subsystem/shuttle/proc/canRecall() - if(!emergency || emergency.mode != SHUTTLE_CALL) - return - if(SSticker.mode.name == "meteor") + if(!emergency || emergency.mode != SHUTTLE_CALL || emergencyNoRecall || SSticker.mode.name == "meteor") return var/security_num = seclevel2num(get_security_level()) switch(security_num) diff --git a/code/game/gamemodes/cult/blood_magic.dm b/code/game/gamemodes/cult/blood_magic.dm index 04b56c9f7d..dd66edcfb1 100644 --- a/code/game/gamemodes/cult/blood_magic.dm +++ b/code/game/gamemodes/cult/blood_magic.dm @@ -172,7 +172,6 @@ name = "Twisted Construction" desc = "A sinister spell used to convert:
Plasteel into runed metal
25 metal into a construct shell
Cyborgs directly into constructs
Cyborg shells into construct shells
Airlocks into runed airlocks (harm intent)" button_icon_state = "transmute" - charges = 50 magic_path = "/obj/item/melee/blood_magic/construction" /datum/action/innate/cult/blood_spell/equipment @@ -180,7 +179,6 @@ desc = "A crucial spell that enables you to summon either a ritual dagger or combat gear including armored robes, the nar'sien bola, and an eldritch longsword." button_icon_state = "equip" magic_path = "/obj/item/melee/blood_magic/armor" - charges = 1 /datum/action/innate/cult/blood_spell/equipment/Activate() var/choice = alert(owner,"Choose your equipment type",,"Combat Equipment","Ritual Dagger","Cancel") @@ -271,8 +269,8 @@ qdel(src) /datum/action/innate/cult/blood_spell/veiling - name = "Conceal Runes" - desc = "A multi-function spell that alternates between hiding and revealing nearby runes." + name = "Conceal Presence" + desc = "A multi-function spell that alternates between hiding and revealing nearby cult runes, structures, turf, and airlocks." invocation = "Kla'atu barada nikt'o!" button_icon_state = "gone" charges = 10 @@ -291,6 +289,8 @@ S.conceal() for(var/turf/open/floor/engine/cult/T in range(5,owner)) T.realappearance.alpha = 0 + for(var/obj/machinery/door/airlock/cult/AL in range(5, owner)) + AL.conceal() revealing = TRUE name = "Reveal Runes" button_icon_state = "back" @@ -302,10 +302,12 @@ SEND_SOUND(owner, sound('sound/magic/enter_blood.ogg',0,1,25)) for(var/obj/effect/rune/R in range(7,owner)) //More range in case you weren't standing in exactly the same spot R.reveal() - for(var/obj/structure/destructible/cult/S in range(7,owner)) + for(var/obj/structure/destructible/cult/S in range(6,owner)) S.reveal() - for(var/turf/open/floor/engine/cult/T in range(7,owner)) + for(var/turf/open/floor/engine/cult/T in range(6,owner)) T.realappearance.alpha = initial(T.realappearance.alpha) + for(var/obj/machinery/door/airlock/cult/AL in range(6, owner)) + AL.reveal() revealing = FALSE name = "Conceal Runes" button_icon_state = "gone" @@ -529,13 +531,13 @@ var/turf/T = get_turf(target) if(istype(target, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/candidate = target - if(candidate.use(25)) - uses-=25 + if(candidate.use(50)) + uses-- to_chat(user, "A dark cloud eminates from your hand and swirls around the metal, twisting it into a construct shell!") new /obj/structure/constructshell(T) SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) else - to_chat(user, "You need more metal to produce a construct shell!") + to_chat(user, "You need 50 metal to produce a construct shell!") else if(istype(target, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/candidate = target var/quantity = min(candidate.amount, uses) @@ -563,19 +565,19 @@ if("Artificer") makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, candidate, user, 0, T) SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - uses -= 50 + uses-- candidate.mmi = null qdel(candidate) else candidate.color = prev_color else - uses -= 50 + uses-- to_chat(user, "A dark cloud eminates from you hand and swirls around [candidate] - twisting it into a construct shell!") new /obj/structure/constructshell(T) SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) else if(istype(target,/obj/machinery/door/airlock)) target.narsie_act() - uses -= 50 + uses-- user.visible_message("Black ribbons suddenly eminate from [user]'s hand and cling to the airlock - twisting and corrupting it!") SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) else @@ -701,7 +703,7 @@ if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam temp += 30 else - temp += max((B.bloodiness**2)/800,0.5) + temp += max((B.bloodiness**2)/800,1) new /obj/effect/temp_visual/cult/turf/floor(get_turf(B)) qdel(B) for(var/obj/effect/decal/cleanable/trail_holder/TH in view(T, 2)) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 2874e6bf1b..feb1cfc22a 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -409,6 +409,7 @@ damage_deflection = 10 var/openingoverlaytype = /obj/effect/temp_visual/cult/door var/friendly = FALSE + var/stealthy = FALSE /obj/machinery/door/airlock/cult/Initialize() . = ..() @@ -421,18 +422,36 @@ if(!density) return 1 if(friendly || iscultist(L) || istype(L, /mob/living/simple_animal/shade) || isconstruct(L)) - new openingoverlaytype(loc) + if(!stealthy) + new openingoverlaytype(loc) return 1 else - new /obj/effect/temp_visual/cult/sac(loc) - var/atom/throwtarget - throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) - flash_color(L, flash_color="#960000", flash_time=20) - L.Knockdown(40) - L.throw_at(throwtarget, 5, 1,src) + if(!stealthy) + new /obj/effect/temp_visual/cult/sac(loc) + var/atom/throwtarget + throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) + SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) + flash_color(L, flash_color="#960000", flash_time=20) + L.Knockdown(40) + L.throw_at(throwtarget, 5, 1,src) return 0 +/obj/machinery/door/airlock/cult/proc/conceal() + icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' + overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' + name = "airlock" + desc = "It opens and closes." + stealthy = TRUE + update_icon() + +/obj/machinery/door/airlock/cult/proc/reveal() + icon = initial(icon) + overlays_file = initial(overlays_file) + name = initial(name) + desc = initial(desc) + stealthy = initial(stealthy) + update_icon() + /obj/machinery/door/airlock/cult/narsie_act() return diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 84a6cc1b9e..66124f8b6d 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -168,7 +168,7 @@ qdel(src) return - if(S.sheettype) + if(S.sheettype && S.sheettype != "runed") var/M = S.sheettype if(state == GIRDER_DISPLACED) if(S.get_amount() < 2) diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index bedb7dc9bc..68c93fa04c 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -80,8 +80,10 @@ return ..() /datum/action/innate/cult/mastervote/Activate() - var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - pollCultists(owner,C.cult_team) + var/choice = alert(owner, "The mantle of leadership is a heavy. Success in this role requires an expert level of communication and experience. Are you sure?",, "Yes", "No") + if(choice == "Yes" && IsAvailable()) + var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + pollCultists(owner,C.cult_team) /proc/pollCultists(var/mob/living/Nominee,datum/team/cult/team) //Cult Master Poll if(world.time < CULT_POLL_WAIT) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 6bf65fa234..e98f89718b 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -503,7 +503,19 @@ if(SSshuttle.emergency.mode == SHUTTLE_CALL) var/cursetime = 1800 var/timer = SSshuttle.emergency.timeLeft(1) + cursetime + var/security_num = seclevel2num(get_security_level()) + var/set_coefficient = 1 + switch(security_num) + if(SEC_LEVEL_GREEN) + set_coefficient = 2 + if(SEC_LEVEL_BLUE) + set_coefficient = 1 + else + set_coefficient = 0.5 + var/surplus = timer - (SSshuttle.emergencyCallTime * set_coefficient) SSshuttle.emergency.setTimer(timer) + if(surplus > 0) + SSshuttle.block_recall(surplus) to_chat(user, "You shatter the orb! A dark essence spirals into the air, then disappears.") playsound(user.loc, 'sound/effects/glassbr1.ogg', 50, 1) qdel(src) @@ -511,18 +523,20 @@ var/global/list/curses if(!curses) curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by three minutes.", - "The shuttle's navigation programming was replaced by a file containing two words, IT COMES. The shuttle will be delayed by three minutes.", - "The shuttle's custodian tore out his guts and began painting strange shapes on the floor. The shuttle will be delayed by three minutes.", - "A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh. The shuttle will be delayed by three minutes.", - "A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine. The shuttle will be delayed by three minutes.", - "The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by three minutes.") + "The shuttle's navigation programming was replaced by a file containing just two words: IT COMES.", + "The shuttle's custodian was found washing the windows with their own blood.", + "A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh.", + "A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine.", + "The shuttle dispatcher was found dead with bloody symbols carved into their flesh.", + "The shuttle's transponder is emitting the encoded message 'FEAR THE OLD BLOOD' in lieu of its assigned identification signal.") var/message = pick_n_take(curses) + message += "
The shuttle will be delayed by three minutes." priority_announce("[message]", "System Failure", 'sound/misc/notice1.ogg') curselimit++ /obj/item/device/cult_shift name = "veil shifter" - desc = "This relic teleports you forward a medium distance." + desc = "This relic instantly teleports you, and anything you're pulling, forward by a moderate distance." icon = 'icons/obj/cult.dmi' icon_state ="shifter" var/uses = 4 diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index ea8e18d7aa..84cc26d81a 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -57,6 +57,7 @@ /obj/structure/destructible/cult/attackby(obj/I, mob/user, params) if(istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user)) anchored = !anchored + density = !density to_chat(user, "You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.") if(!anchored) icon_state = "[initial(icon_state)]_off" diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm index 20ac8c88cf..8167a1c0d9 100644 --- a/code/modules/antagonists/cult/ritual.dm +++ b/code/modules/antagonists/cult/ritual.dm @@ -68,6 +68,9 @@ This file contains the cult dagger and rune list code A = get_area(src) if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) return + if(ispath(rune_to_scribe, /obj/effect/rune/summon) && (!is_station_level(Turf.z) || A.map_name == "Space")) + to_chat(user, "The veil is not weak enough here to summon a cultist, you must be on station!") + return if(ispath(rune_to_scribe, /obj/effect/rune/apocalypse)) if((world.time - SSticker.round_start_time) <= 6000) var/wait = 6000 - (world.time - SSticker.round_start_time) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index fc7d6ecc64..8e6ae30d28 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -426,22 +426,19 @@ structure_check() searches for nearby cultist structures required for the invoca else var/area/A = get_area(T) if(A.map_name == "Space") - actual_selected_rune.handle_portal("space") + actual_selected_rune.handle_portal("space", T) target.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.") else fail_invoke() -/obj/effect/rune/teleport/proc/handle_portal(portal_type) +/obj/effect/rune/teleport/proc/handle_portal(portal_type, turf/origin) var/turf/T = get_turf(src) - if(inner_portal) - qdel(inner_portal) //We need fresh effects/animations - if(outer_portal) - qdel(outer_portal) + close_portal() // To avoid stacking descriptions/animations playsound(T, pick('sound/effects/sparks1.ogg', 'sound/effects/sparks2.ogg', 'sound/effects/sparks3.ogg', 'sound/effects/sparks4.ogg'), 100, TRUE, 14) inner_portal = new /obj/effect/temp_visual/cult/portal(T) if(portal_type == "space") - light_color = RUNE_COLOR_TELEPORT - desc += "
A tear in reality reveals a black void interspersed with dots of light... something recently teleported here from space!" + light_color = color + desc += "
A tear in reality reveals a black void interspersed with dots of light... something recently teleported here from space.
The void feels like it's trying to pull you to the [dir2text(get_dir(T, origin))]!
" else inner_portal.icon_state = "lava" light_color = LIGHT_COLOR_FIRE @@ -452,6 +449,8 @@ structure_check() searches for nearby cultist structures required for the invoca addtimer(CALLBACK(src, .proc/close_portal), 600, TIMER_UNIQUE) /obj/effect/rune/teleport/proc/close_portal() + qdel(inner_portal) + qdel(outer_portal) desc = initial(desc) light_range = 0 update_light() @@ -842,9 +841,13 @@ structure_check() searches for nearby cultist structures required for the invoca var/turf/T = get_turf(src) var/choice = alert(user,"You tear open a connection to the spirit realm...",,"Summon a Cult Ghost","Ascend as a Dark Spirit","Cancel") if(choice == "Summon a Cult Ghost") + var/area/A = get_area(T) + if(A.map_name == "Space" || is_mining_level(T.z)) + to_chat(user, "The veil is not weak enough here to manifest spirits, you must be on station!") + return notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src) var/list/ghosts_on_rune = list() - for(var/mob/dead/observer/O in get_turf(src)) + for(var/mob/dead/observer/O in T) if(O.client && !jobban_isbanned(O, ROLE_CULTIST)) ghosts_on_rune += O if(!ghosts_on_rune.len) @@ -853,7 +856,7 @@ structure_check() searches for nearby cultist structures required for the invoca log_game("Manifest rune failed - no nearby ghosts") return list() var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune) - var/mob/living/carbon/human/cult_ghost/new_human = new(get_turf(src)) + var/mob/living/carbon/human/cult_ghost/new_human = new(T) new_human.real_name = ghost_to_spawn.real_name new_human.alpha = 150 //Makes them translucent new_human.equipOutfit(/datum/outfit/ghost_cultist) //give them armor diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 6c6f39ffc1..1c12b48919 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -125,19 +125,19 @@ response_harm = "harmlessly punches" harm_intent_damage = 0 obj_damage = 90 - melee_damage_lower = 30 - melee_damage_upper = 30 + melee_damage_lower = 25 + melee_damage_upper = 25 attacktext = "smashes their armored gauntlet into" speed = 2.5 environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch3.ogg' status_flags = 0 mob_size = MOB_SIZE_LARGE - force_threshold = 11 + force_threshold = 10 construct_spells = list(/obj/effect/proc_holder/spell/targeted/forcewall/cult, /obj/effect/proc_holder/spell/dumbfire/juggernaut) runetype = /datum/action/innate/cult/create_rune/wall - playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \ + playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand heavy punishment, \ create shield walls, rip apart enemies and walls alike, and even deflect energy weapons." /mob/living/simple_animal/hostile/construct/armored/hostile //actually hostile, will move around, hit things @@ -146,7 +146,7 @@ /mob/living/simple_animal/hostile/construct/armored/bullet_act(obj/item/projectile/P) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) - var/reflectchance = 80 - round(P.damage/3) + var/reflectchance = 60 - round(P.damage/3) if(prob(reflectchance)) apply_damage(P.damage * 0.5, P.damage_type) visible_message("The [P.name] is reflected by [src]'s armored shell!", \ @@ -184,8 +184,8 @@ icon_living = "floating" maxHealth = 65 health = 65 - melee_damage_lower = 25 - melee_damage_upper = 25 + melee_damage_lower = 20 + melee_damage_upper = 20 retreat_distance = 2 //AI wraiths will move in and out of combat attacktext = "slashes" attack_sound = 'sound/weapons/bladeslice.ogg' diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index 07e75002bc..64605e0587 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -280,9 +280,9 @@ /obj/effect/proc_holder/spell/dumbfire/juggernaut name = "Gauntlet Echo" - desc = "Channels energy into your gauntlet - firing its essence forward in a slow-moving but devastating blow." - proj_icon_state = "cursehand0" - proj_name = "Shadowfist" + desc = "Channels energy into your gauntlet - firing its essence forward in a slow moving, yet devastating, attack." + proj_icon_state = "cultfist" + proj_name = "gauntlet echo" proj_type = "/obj/effect/proc_holder/spell/targeted/inflict_handler/juggernaut" //IMPORTANT use only subtypes of this proj_lifespan = 15 proj_step_delay = 7 diff --git a/icons/mob/actions/actions_cult.dmi b/icons/mob/actions/actions_cult.dmi index 07432d2a279fe0b3733d5ef89676b6e055e03f46..c2e04677810070b41723ab478d01c125aa29cf87 100644 GIT binary patch delta 7860 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 delta 7862 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 Ufb14BNB{r;07*qoM6N<$g76_gmjD0& diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index b2299a75fe0d845a8ade9db0a77123c20eef28fe..34e6a8134bf18f9d841a99fd68c03644437f0862 100644 GIT binary patch delta 28379 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

cp}vH!q2~}=N^#<5@9b*B5H&J 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 p-n*w)@poerzdt!c#Qa|__e$Vd$O{bjaM z6|Aj(VGABX3m!n1T~f%sloo(Jqc+nTu8$vXb*{@WMi}8eXNMtnI&&c8TWq=mE0!gC zB*l0t;x-vX0p@l-G}=}GnHa6DIYH;xp!KjO@n2&4TQr}fxv9P2{LVZjf8BBy0l`P4 zV=6}O%puvP6eD~9{N~T;KQ7$E1Q;FGb_uaiVW$1sHlULp=GGvV;#eS|aCOdK=Ec#H zs+4ETC4qj_Kz3B5n1S#19SXIlTEW`1!Fy3b6fygy0>_KPgX;Fe8y1Ikxxlz|kR{V( z^En*WBO4uE57Bmjp}LR#1qq9Gcjo?HfsX{m{a&dIIKz>w4}fHIN4CwRDtxxxoMf-a z0&^!S0`lvQvYx1n?U-#z3U2RJB<(UQ6pPix6N z6o@xq(qlZwCs>iNvAl%`9X2`tD^@-5IWkN zPZi9l#`0*UUHW!5yhHY(Ydl)2^?Y&;NlsxO(2G!W+qRhrY;sBxB58po<(U{jDVsSt z!5eGIAo>@LxoT#A?{H0rKRyh?%xtPiM8=�ofM&fq)D~|LTTOk>fSr1|UmP|Lja8 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 Date: Mon, 12 Feb 2018 15:21:13 -0600 Subject: [PATCH 031/108] Automatic changelog generation for PR #5442 [ci skip] --- html/changelogs/AutoChangeLog-pr-5442.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5442.yml diff --git a/html/changelogs/AutoChangeLog-pr-5442.yml b/html/changelogs/AutoChangeLog-pr-5442.yml new file mode 100644 index 0000000000..1b4b8dd334 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5442.yml @@ -0,0 +1,5 @@ +author: "Dax Dupont" +delete-after: True +changes: + - rscadd: "Cell chargers can now be built and upgraded with capacitors!" + - bugfix: "Fixed empty subtype batteries not updating icons" From 59f7343c5ea02b4afe8ab4ce36b64ef731a41565 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 12 Feb 2018 17:23:40 -0500 Subject: [PATCH 032/108] Merge pull request #35603 from MrStonedOne/patch-480 blacklists 512.1408 for basically being a wallhack (again) --- code/modules/client/client_procs.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 6a7c12a10c..77c71823f5 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -3,7 +3,11 @@ //////////// #define UPLOAD_LIMIT 1048576 //Restricts client uploads to the server to 1MB //Could probably do with being lower. -GLOBAL_LIST_INIT(blacklisted_builds, list(1407 = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see")) +GLOBAL_LIST_INIT(blacklisted_builds, list( + 1407 = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", + 1408 = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", + + )) #define LIMITER_SIZE 5 #define CURRENT_SECOND 1 From a60410b347ab8adb508393ace60eafeb9e001d79 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 13 Feb 2018 00:31:55 +0200 Subject: [PATCH 034/108] Merge pull request #35557 from ShizCalev/pda-virus-fix Fixes PDA virus runtime --- code/game/objects/items/devices/PDA/virus_cart.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/devices/PDA/virus_cart.dm b/code/game/objects/items/devices/PDA/virus_cart.dm index aede8b108c..57b6316043 100644 --- a/code/game/objects/items/devices/PDA/virus_cart.dm +++ b/code/game/objects/items/devices/PDA/virus_cart.dm @@ -67,10 +67,10 @@ var/difficulty = 0 if(target.cartridge) difficulty += BitCount(target.cartridge.access&(CART_MEDICAL | CART_SECURITY | CART_ENGINE | CART_CLOWN | CART_JANITOR | CART_MANIFEST)) - if(target.cartridge.access & CART_MANIFEST) - difficulty++ //if cartridge has manifest access it has extra snowflake difficulty - else - difficulty += 2 + if(target.cartridge.access & CART_MANIFEST) + difficulty++ //if cartridge has manifest access it has extra snowflake difficulty + else + difficulty += 2 GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, target) if(!target.detonatable || prob(difficulty * 15) || (hidden_uplink)) U.show_message("An error flashes on your [src].", 1) From dcbea24eee68fe1d9b95c958c59be0fc371f899d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 12 Feb 2018 17:29:09 -0600 Subject: [PATCH 036/108] Automatic changelog generation for PR #5447 [ci skip] --- html/changelogs/AutoChangeLog-pr-5447.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5447.yml diff --git a/html/changelogs/AutoChangeLog-pr-5447.yml b/html/changelogs/AutoChangeLog-pr-5447.yml new file mode 100644 index 0000000000..4cd5e4a0e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5447.yml @@ -0,0 +1,16 @@ +author: "Robustin" +delete-after: True +changes: + - balance: "The rift created by teleporting in from space will now include a description indicating the direction of the \"origin\" teleport rune - giving the examiner a fair idea of where the \"space base\" is located." + - balance: "You can no longer manifest spirits or summon cultists while in space or Lavaland. You may still ascend as a spirit (formerly spirit sight, astral jaunt, etc.) in either of these locations." + - balance: "Juggernauts have lost 20% reflect rate on energy projectiles (now around 50% for standard lasers)." + - balance: "Wraiths and Juggernauts have -5 melee damage (20 and 25 now, respectively)." + - balance: "Construct shells now cost 50 metal through the \"twisted construction\" spell. Twisted construction is now a \"single use\" spell." + - balance: "The Concealment spell will now work on cult airlocks (including converted airlocks). The \"concealed\" airlock will appear as a generic airlock but will deny access to any non-cultist." + - balance: "The draw blood effect on blood splatters will now draw more blood from stains with low blood levels." + - tweak: "Unanchored (via ritual dagger) cult structures are no longer \"dense\", meaning you can move them through teleport runes more efficiently." + - tweak: "The button to nominate yourself for cult master now has a confirmation prompt seeking assurance that the user is prepared to be the cult's master." + - tweak: "The reveal aspect of the concealment spell is slightly smaller, albeit still slightly larger (6 range) than the concealment aspect (5 range)." + - imageadd: "Juggernauts \"gauntlet echo\" now has a more cult-themed appearance." + - bugfix: "Using a shuttle curse to push the shuttle timer above its default can no longer be \"reset\" with a recall. This also adds a block_recall(time_in_deciseconds) helper-proc to the shuttle subsystem." + - bugfix: "Using runed metal on a regular girder is no longer an option, preventing runtimes and deletions associated with the (unintended) combination." From e3ad2643b21b4e7d141978f978decbbf0ba60bec Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 12 Feb 2018 20:30:05 -0500 Subject: [PATCH 037/108] maps first --- _maps/RandomRuins/SpaceRuins/caravanambush.dmm | 7 ++++++- _maps/RandomRuins/SpaceRuins/listeningstation.dmm | 2 -- _maps/map_files/BoxStation/BoxStation.dmm | 2 +- _maps/shuttles/whiteship_delta.dmm | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 1081a01b03..8bf0ab8c89 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -70,6 +70,7 @@ name = "Pirate Cutter"; port_direction = 8; preferred_direction = 4; + timid = 0; width = 22 }, /turf/open/floor/plating, @@ -3264,6 +3265,7 @@ name = "Syndicate Drop Ship"; port_direction = 8; preferred_direction = 4; + timid = 0; width = 15 }, /turf/open/floor/plating, @@ -3431,6 +3433,7 @@ name = "Syndicate Fighter"; port_direction = 2; preferred_direction = 4; + timid = 0; width = 9 }, /turf/open/floor/plating, @@ -3577,6 +3580,7 @@ name = "Syndicate Fighter"; port_direction = 2; preferred_direction = 1; + timid = 0; width = 9 }, /turf/open/floor/plating, @@ -3605,6 +3609,7 @@ name = "Small Freighter"; port_direction = 8; preferred_direction = 4; + timid = 0; width = 27 }, /turf/open/floor/plating, @@ -8929,4 +8934,4 @@ aa aa aa aa -"} \ No newline at end of file +"} diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm index b586f7e8f8..8ca1f1529a 100644 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm @@ -179,7 +179,6 @@ pixel_x = 5; pixel_y = 5 }, -/mob/living/simple_animal/hostile/syndicate/ranged, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -651,7 +650,6 @@ pixel_x = 5; pixel_y = 5 }, -/mob/living/simple_animal/hostile/syndicate/ranged, /turf/open/floor/plasteel, /area/ruin/space/has_grav/listeningstation) "bc" = ( diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 035e336660..22e82524cb 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -37500,6 +37500,7 @@ /turf/open/floor/plating, /area/engine/atmos) "bPb" = ( +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/research/glass{ name = "Circuitry Lab"; req_access_txt = "47" @@ -37513,7 +37514,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/science/circuit) "bPc" = ( diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index 57adba831c..2c818c2ece 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -1518,7 +1518,7 @@ name = "White-Ship"; port_direction = 8; preferred_direction = 8; - timid = 1; + timid = 0; width = 32 }, /turf/open/floor/plasteel/neutral, From aa4b92faad547cfb45cc5210d30f9c00f1fc32ac Mon Sep 17 00:00:00 2001 From: oranges Date: Tue, 13 Feb 2018 14:32:58 +1300 Subject: [PATCH 038/108] Merge pull request #35598 from ShizCalev/announcement-exploit-fix [s] fixes announcement system exploit --- code/game/machinery/announcement_system.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 5226084b96..39b2b2d5be 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -101,6 +101,8 @@ GLOBAL_LIST_EMPTY(announcement_systems) //config stuff /obj/machinery/announcement_system/interact(mob/user) + if(!user.canUseTopic(src, !issilicon(user))) + return if(stat & BROKEN) visible_message("[src] buzzes.", "You hear a faint buzz.") playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1) @@ -115,6 +117,8 @@ GLOBAL_LIST_EMPTY(announcement_systems) popup.open() /obj/machinery/announcement_system/Topic(href, href_list) + if(!usr.canUseTopic(src, !issilicon(usr))) + return if(stat & BROKEN) visible_message("[src] buzzes.", "You hear a faint buzz.") playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1) @@ -122,13 +126,13 @@ GLOBAL_LIST_EMPTY(announcement_systems) if(href_list["ArrivalTopic"]) var/NewMessage = stripped_input(usr, "Enter in the arrivals announcement configuration.", "Arrivals Announcement Config", arrival) - if(!in_range(src, usr) && src.loc != usr && (!isAI(usr) && !IsAdminGhost(usr))) + if(!usr.canUseTopic(src, !issilicon(usr))) return if(NewMessage) arrival = NewMessage else if(href_list["NewheadTopic"]) var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Head Departmental Announcement Config", newhead) - if(!in_range(src, usr) && src.loc != usr && (!isAI(usr) && !IsAdminGhost(usr))) + if(!usr.canUseTopic(src, !issilicon(usr))) return if(NewMessage) newhead = NewMessage @@ -147,7 +151,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) . = attack_ai(user) /obj/machinery/announcement_system/attack_ai(mob/user) - if(!issilicon(user) && !IsAdminGhost(user)) + if(!user.canUseTopic(src, !issilicon(user))) return if(stat & BROKEN) to_chat(user, "[src]'s firmware appears to be malfunctioning!") From 72ff7be9bd2b23ea08552b96c424f3bdc7451e83 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 12 Feb 2018 21:03:40 -0500 Subject: [PATCH 040/108] code folder. 221 files changed wew --- code/__DEFINES/maps.dm | 1 + code/__DEFINES/tools.dm | 5 + code/__DEFINES/traits.dm | 1 + code/__HELPERS/game.dm | 3 +- code/__HELPERS/heap.dm | 2 +- code/_globalvars/genetics.dm | 2 +- code/datums/components/decals/blood.dm | 1 + .../helper_datums/construction_datum.dm | 58 +- code/datums/shuttles.dm | 13 - code/datums/wires/wires.dm | 29 +- code/game/atoms.dm | 26 +- code/game/machinery/PDApainter.dm | 26 +- code/game/machinery/_machinery.dm | 35 +- code/game/machinery/announcement_system.dm | 2 +- code/game/machinery/aug_manipulator.dm | 28 +- code/game/machinery/buttons.dm | 4 +- code/game/machinery/camera/camera.dm | 11 +- code/game/machinery/camera/camera_assembly.dm | 31 +- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/computer/_computer.dm | 13 +- code/game/machinery/computer/apc_control.dm | 19 +- code/game/machinery/computer/arcade.dm | 4 +- .../game/machinery/computer/buildandrepair.dm | 74 +- code/game/machinery/constructable_frame.dm | 39 +- code/game/machinery/deployable.dm | 12 +- code/game/machinery/doors/airlock.dm | 99 +-- code/game/machinery/doors/airlock_types.dm | 9 +- code/game/machinery/doors/firedoor.dm | 58 +- code/game/machinery/doors/windowdoor.dm | 5 +- code/game/machinery/doppler_array.dm | 10 +- code/game/machinery/droneDispenser.dm | 23 +- code/game/machinery/firealarm.dm | 24 +- code/game/machinery/flasher.dm | 8 +- code/game/machinery/hologram.dm | 2 +- code/game/machinery/newscaster.dm | 30 +- code/game/machinery/pipe/construction.dm | 4 +- code/game/machinery/pipe/pipe_dispenser.dm | 32 +- .../machinery/porta_turret/portable_turret.dm | 2 +- .../porta_turret/portable_turret_construct.dm | 40 +- code/game/machinery/recharger.dm | 2 +- code/game/machinery/shieldgen.dm | 6 +- code/game/machinery/syndicatebomb.dm | 18 +- code/game/machinery/vending.dm | 2 +- code/game/mecha/mecha_construction_paths.dm | 71 +- code/game/mecha/mecha_defense.dm | 9 +- code/game/mecha/mecha_wreckage.dm | 27 +- code/game/objects/effects/contraband.dm | 2 +- code/game/objects/effects/decals/remains.dm | 2 +- code/game/objects/items.dm | 69 ++ code/game/objects/items/airlock_painter.dm | 3 +- code/game/objects/items/cards_ids.dm | 14 +- code/game/objects/items/cigs_lighters.dm | 2 +- .../circuitboards/machine_circuitboards.dm | 2 +- .../objects/items/devices/geiger_counter.dm | 4 +- code/game/objects/items/devices/multitool.dm | 1 + .../objects/items/devices/radio/intercom.dm | 33 +- .../objects/items/devices/taperecorder.dm | 16 +- .../objects/items/grenades/chem_grenade.dm | 2 +- code/game/objects/items/grenades/plastic.dm | 2 +- code/game/objects/items/hot_potato.dm | 151 ++++ code/game/objects/items/inducer.dm | 2 +- code/game/objects/items/plushes.dm | 2 +- code/game/objects/items/powerfist.dm | 2 +- code/game/objects/items/shooting_range.dm | 13 +- code/game/objects/items/stacks/rods.dm | 10 +- .../game/objects/items/stacks/sheets/glass.dm | 25 +- code/game/objects/items/stacks/stack.dm | 18 +- .../objects/items/stacks/tiles/tile_types.dm | 7 +- code/game/objects/items/storage/secure.dm | 6 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 59 +- code/game/objects/items/trash.dm | 4 +- code/game/objects/structures/ai_core.dm | 25 +- .../objects/structures/beds_chairs/bed.dm | 2 +- .../objects/structures/beds_chairs/chair.dm | 2 +- .../structures/crates_lockers/closets.dm | 38 +- .../crates_lockers/closets/cardboardbox.dm | 2 - .../crates_lockers/closets/job_closets.dm | 5 + .../structures/crates_lockers/crates/bins.dm | 2 +- code/game/objects/structures/displaycase.dm | 18 +- code/game/objects/structures/door_assembly.dm | 89 +- code/game/objects/structures/dresser.dm | 9 +- code/game/objects/structures/electricchair.dm | 2 +- code/game/objects/structures/extinguisher.dm | 4 +- code/game/objects/structures/false_walls.dm | 12 +- code/game/objects/structures/fireaxe.dm | 10 +- code/game/objects/structures/fluff.dm | 13 +- code/game/objects/structures/girders.dm | 94 +-- code/game/objects/structures/grille.dm | 4 +- code/game/objects/structures/janicart.dm | 2 +- code/game/objects/structures/kitchen_spike.dm | 32 +- code/game/objects/structures/mirror.dm | 35 +- code/game/objects/structures/morgue.dm | 2 +- code/game/objects/structures/musician.dm | 25 +- code/game/objects/structures/plasticflaps.dm | 9 +- code/game/objects/structures/reflector.dm | 63 +- code/game/objects/structures/showcase.dm | 9 +- code/game/objects/structures/signs/_signs.dm | 26 +- code/game/objects/structures/statues.dm | 39 +- code/game/objects/structures/table_frames.dm | 4 +- code/game/objects/structures/tables_racks.dm | 42 +- .../structures/transit_tubes/transit_tube.dm | 3 +- .../transit_tube_construction.dm | 25 +- .../transit_tubes/transit_tube_pod.dm | 2 +- code/game/objects/structures/watercloset.dm | 96 +-- .../objects/structures/windoor_assembly.dm | 164 ++-- code/game/objects/structures/window.dm | 34 +- code/game/shuttle_engines.dm | 42 +- code/game/turfs/simulated/floor.dm | 4 +- .../game/turfs/simulated/floor/fancy_floor.dm | 2 +- code/game/turfs/simulated/floor/misc_floor.dm | 15 +- code/game/turfs/simulated/floor/plating.dm | 18 +- .../game/turfs/simulated/floor/reinf_floor.dm | 20 +- code/game/turfs/simulated/lava.dm | 2 +- code/game/turfs/simulated/minerals.dm | 1 - code/game/turfs/simulated/wall/reinf_walls.dm | 143 ++-- code/game/turfs/simulated/walls.dm | 56 +- .../antagonists/_common/antag_datum.dm | 11 +- .../antagonists/_common/antag_spawner.dm | 26 +- .../abductor/equipment/abduction_gear.dm | 4 +- .../antagonists/abductor/equipment/gland.dm | 7 +- code/modules/antagonists/brother/brother.dm | 2 +- .../antagonists/changeling/changeling.dm | 13 +- .../clockcult/clock_items/integration_cog.dm | 2 +- .../clock_structures/_trap_object.dm | 8 +- .../clockcult/clock_structures/wall_gear.dm | 3 +- .../antagonists/clockcult/clockcult.dm | 2 +- code/modules/antagonists/cult/blood_magic.dm | 775 ++++++++++++++++++ .../antagonists/cult/cult_structures.dm | 4 +- code/modules/antagonists/cult/runes.dm | 9 +- code/modules/antagonists/ninja/ninja.dm | 4 +- .../nukeop/equipment/nuclearbomb.dm | 44 +- code/modules/antagonists/nukeop/nukeop.dm | 2 +- code/modules/antagonists/revenant/revenant.dm | 1 - .../antagonists/revolution/revolution.dm | 2 +- .../antagonists/traitor/datum_traitor.dm | 6 +- .../antagonists/wizard/equipment/artefact.dm | 1 + code/modules/antagonists/wizard/wizard.dm | 4 +- .../atmospherics/machinery/airalarm.dm | 10 +- .../atmospherics/machinery/atmosmachinery.dm | 67 +- .../components/unary_devices/vent_pump.dm | 37 +- .../components/unary_devices/vent_scrubber.dm | 37 +- .../atmospherics/machinery/other/meter.dm | 30 +- .../machinery/portable/canister.dm | 27 +- .../portable/portable_atmospherics.dm | 4 +- code/modules/clothing/gloves/color.dm | 8 +- code/modules/crafting/craft.dm | 26 +- code/modules/crafting/recipes.dm | 31 +- .../food_and_drinks/food/snacks_egg.dm | 27 +- .../kitchen_machinery/microwave.dm | 4 +- code/modules/hydroponics/hydroponics.dm | 12 +- .../integrated_electronics/core/assemblies.dm | 4 +- code/modules/jobs/job_exp.dm | 30 +- .../jobs/job_types/civilian_chaplain.dm | 1 - code/modules/jobs/job_types/engineering.dm | 3 - code/modules/jobs/job_types/medical.dm | 1 - code/modules/jobs/job_types/science.dm | 2 - code/modules/keybindings/setup.dm | 3 +- code/modules/library/lib_items.dm | 14 +- code/modules/mining/abandoned_crates.dm | 9 +- .../mining/equipment/kinetic_crusher.dm | 10 +- code/modules/mining/equipment/mining_tools.dm | 14 +- code/modules/mining/equipment/survival_pod.dm | 37 +- code/modules/mining/machine_vending.dm | 6 +- code/modules/mining/minebot.dm | 39 +- code/modules/mining/ores_coins.dm | 50 +- code/modules/mining/satchel_ore_boxdm.dm | 24 +- code/modules/mob/inventory.dm | 15 +- .../modules/mob/living/silicon/robot/robot.dm | 28 +- .../mob/living/simple_animal/bot/bot.dm | 6 +- .../living/simple_animal/bot/construction.dm | 12 +- .../simple_animal/friendly/drone/_drone.dm | 2 +- .../friendly/drone/interaction.dm | 12 +- .../simple_animal/friendly/farm_animals.dm | 4 +- .../computers/item/computer.dm | 11 +- code/modules/paperwork/filingcabinet.dm | 3 +- code/modules/paperwork/paper_cutter.dm | 2 +- code/modules/paperwork/photography.dm | 9 +- code/modules/power/antimatter/control.dm | 4 +- code/modules/power/apc.dm | 32 +- code/modules/power/cable.dm | 1 + code/modules/power/cell.dm | 2 +- code/modules/power/gravitygenerator.dm | 10 +- code/modules/power/lighting.dm | 36 +- code/modules/power/port_gen.dm | 2 +- code/modules/power/singularity/emitter.dm | 102 +-- .../power/singularity/field_generator.dm | 66 +- .../particle_accelerator.dm | 4 +- .../particle_accelerator/particle_control.dm | 4 +- code/modules/power/solar.dm | 25 +- code/modules/power/supermatter/supermatter.dm | 18 +- code/modules/power/terminal.dm | 31 +- code/modules/power/tracker.dm | 19 +- .../projectiles/guns/ballistic/revolver.dm | 51 +- .../guns/energy/kinetic_accelerator.dm | 10 +- .../projectiles/guns/energy/special.dm | 29 +- .../chemistry/reagents/food_reagents.dm | 1 + .../chemistry/reagents/medicine_reagents.dm | 15 +- .../reagents/reagent_containers/glass.dm | 4 +- code/modules/recycling/conveyor2.dm | 6 +- code/modules/recycling/disposal/bin.dm | 18 +- .../recycling/disposal/construction.dm | 21 +- code/modules/recycling/disposal/outlet.dm | 29 +- code/modules/recycling/disposal/pipe.dm | 31 +- code/modules/ruins/lavaland_ruin_code.dm | 2 +- .../surgery/bodyparts/robot_bodyparts.dm | 2 +- code/modules/surgery/brain_surgery.dm | 2 +- code/modules/surgery/core_removal.dm | 2 +- code/modules/surgery/eye_surgery.dm | 2 +- code/modules/surgery/implant_removal.dm | 2 +- code/modules/surgery/limb_augmentation.dm | 2 +- code/modules/surgery/lipoplasty.dm | 2 +- code/modules/surgery/mechanic_steps.dm | 10 +- code/modules/surgery/organ_manipulation.dm | 35 +- code/modules/surgery/organic_steps.dm | 32 +- code/modules/surgery/organs/augments_arms.dm | 10 - code/modules/surgery/organs/autosurgeon.dm | 2 +- code/modules/surgery/plastic_surgery.dm | 2 +- code/modules/surgery/surgery_step.dm | 25 +- code/modules/uplink/uplink_items.dm | 8 + code/modules/vehicles/scooter.dm | 36 +- 221 files changed, 2797 insertions(+), 2172 deletions(-) create mode 100644 code/game/objects/items/hot_potato.dm create mode 100644 code/modules/antagonists/cult/blood_magic.dm diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index d3835631ff..73f6a7b4dd 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -77,6 +77,7 @@ Last space-z level = empty #define CAMERA_LOCK_CENTCOM 4 #define CAMERA_LOCK_REEBE 8 + //Ruin Generation #define PLACEMENT_TRIES 100 //How many times we try to fit the ruin somewhere until giving up (really should just swap to some packing algo) diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index e4eaf09347..b332766517 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -5,3 +5,8 @@ #define TOOL_WIRECUTTER "wirecutter" #define TOOL_WRENCH "wrench" #define TOOL_WELDER "welder" + + +// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, +// tool sound is only played when op is started. If not, it's played twice. +#define MIN_TOOL_SOUND_DELAY 20 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b180a32674..49c2b2f8be 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -21,6 +21,7 @@ #define TRAIT_PUSHIMMUNE "push_immunity" #define TRAIT_SHOCKIMMUNE "shock_immunity" + // common trait sources #define TRAIT_GENERIC "generic" #define EYE_DAMAGE "eye_damage" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index db51e76232..26b5ac65cc 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -319,9 +319,10 @@ break /proc/get_mob_by_key(key) + var/ckey = ckey(key) for(var/i in GLOB.player_list) var/mob/M = i - if(M.ckey == lowertext(key)) + if(M.ckey == ckey) return M return null diff --git a/code/__HELPERS/heap.dm b/code/__HELPERS/heap.dm index c34d5a2b9e..ce03b482e5 100644 --- a/code/__HELPERS/heap.dm +++ b/code/__HELPERS/heap.dm @@ -38,7 +38,6 @@ while(parent > 0 && (call(cmp)(L[index],L[parent]) > 0)) L.Swap(index,parent) - index = parent parent = round(index * 0.5) @@ -68,6 +67,7 @@ //Replaces a given node so it verify the heap condition /datum/Heap/proc/ReSort(atom/A) var/index = L.Find(A) + Swim(index) Sink(index) diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm index 930b5080b7..a0557e8e1b 100644 --- a/code/_globalvars/genetics.dm +++ b/code/_globalvars/genetics.dm @@ -25,4 +25,4 @@ GLOBAL_LIST_EMPTY(global_mutations) // list of hidden mutation things GLOBAL_LIST_EMPTY(bad_mutations) GLOBAL_LIST_EMPTY(good_mutations) -GLOBAL_LIST_EMPTY(not_good_mutations) +GLOBAL_LIST_EMPTY(not_good_mutations) \ No newline at end of file diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm index 760c61f4e1..5a14aecd52 100644 --- a/code/datums/components/decals/blood.dm +++ b/code/datums/components/decals/blood.dm @@ -24,6 +24,7 @@ //try to find a pre-processed blood-splatter. otherwise, make a new one var/index = "[REF(icon)]-[icon_state]" pic = blood_splatter_appearances[index] + if(!pic) var/icon/blood_splatter_icon = icon(initial(I.icon), initial(I.icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 313a93943c..95d2b612d0 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -23,33 +23,46 @@ set_desc(steps.len) return -/datum/construction/proc/action(atom/used_atom,mob/user) +/datum/construction/proc/action(obj/item/I, mob/user) return -/datum/construction/proc/check_step(atom/used_atom,mob/user) //check last step only - var/valid_step = is_right_key(used_atom) +/datum/construction/proc/check_step(obj/item/I, mob/user) //check last step only + var/valid_step = is_right_key(I) if(valid_step) - if(custom_action(valid_step, used_atom, user)) + if(custom_action(valid_step, I, user)) next_step() return 1 return 0 -/datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. +/datum/construction/proc/is_right_key(obj/item/I) // returns current step num if I is of the right type. var/list/L = steps[steps.len] - if(istype(used_atom, L["key"])) + if(check_used_item(I, L["key"])) return steps.len return 0 -/datum/construction/proc/custom_action(step, used_atom, user) +/datum/construction/proc/check_used_item(obj/item/I, key) + if(!key) + return FALSE + + if(ispath(key) && istype(I, key)) + return TRUE + + else if(I.tool_behaviour == key) + return TRUE + + return FALSE + + +/datum/construction/proc/custom_action(step, obj/item/I, user) return 1 -/datum/construction/proc/check_all_steps(atom/used_atom,mob/user) //check all steps, remove matching one. +/datum/construction/proc/check_all_steps(obj/item/I, mob/user) //check all steps, remove matching one. for(var/i=1;i<=steps.len;i++) - var/list/L = steps[i]; - if(istype(used_atom, L["key"])) - if(custom_action(i, used_atom, user)) - steps[i]=null;//stupid byond list from list removal... - listclearnulls(steps); + var/list/L = steps[i] + if(check_used_item(I, L["key"])) + if(custom_action(i, I, user)) + steps[i] = null//stupid byond list from list removal... + listclearnulls(steps) if(!steps.len) spawn_result() return 1 @@ -76,6 +89,9 @@ holder.desc = step["desc"] return +/datum/construction/proc/drop_location() + return holder.drop_location() + /datum/construction/reversible var/index @@ -92,21 +108,21 @@ set_desc(index) return -/datum/construction/reversible/is_right_key(atom/used_atom) // returns index step +/datum/construction/reversible/is_right_key(obj/item/I) // returns index step var/list/L = steps[index] - if(istype(used_atom, L["key"])) + if(check_used_item(I, L["key"])) return FORWARD //to the first step -> forward - else if(L["backkey"] && istype(used_atom, L["backkey"])) + else if(check_used_item(I, L["backkey"])) return BACKWARD //to the last step -> backwards - return 0 + return FALSE -/datum/construction/reversible/check_step(atom/used_atom,mob/user) - var/diff = is_right_key(used_atom) +/datum/construction/reversible/check_step(obj/item/I, mob/user) + var/diff = is_right_key(I) if(diff) - if(custom_action(index, diff, used_atom, user)) + if(custom_action(index, diff, I, user)) update_index(diff) return 1 return 0 -/datum/construction/reversible/custom_action(index, diff, used_atom, user) +/datum/construction/reversible/custom_action(index, diff, obj/item/I, user) return 1 diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index b5775f5874..404c584fd4 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -87,7 +87,6 @@ description = "A respectable mid-sized shuttle that first saw service shuttling Nanotrasen crew to and from their asteroid belt embedded facilities." credit_cost = 3000 - /datum/map_template/shuttle/emergency/bar suffix = "bar" name = "The Emergency Escape Bar" @@ -110,18 +109,6 @@ admin_notes = "This shuttle will likely crush escape, killing anyone there." credit_cost = -5000 -/datum/map_template/shuttle/emergency/saltmine - suffix = "saltmine" - name = "The Saltmine" - description = "Contains everything that upsets you." - admin_notes = "Don't forget: You're here forever." - credit_cost = 5000 - -/datum/map_template/shuttle/emergency/saltmine/prerequisites_met() - if("revenant" in SSshuttle.shuttle_purchase_requirements_met) - return TRUE - return FALSE - /datum/map_template/shuttle/emergency/luxury suffix = "luxury" name = "Luxury Shuttle" diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index fd9c60c013..308f02a27e 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -1,15 +1,15 @@ #define MAXIMUM_EMP_WIRES 3 /proc/is_wire_tool(obj/item/I) - if(istype(I, /obj/item/device/multitool)) - return TRUE - if(istype(I, /obj/item/wirecutters)) + if(!I) + return + + if(I.tool_behaviour == TOOL_WIRECUTTER || I.tool_behaviour == TOOL_MULTITOOL) return TRUE if(istype(I, /obj/item/device/assembly)) var/obj/item/device/assembly/A = I if(A.attachable) return TRUE - return /atom var/datum/wires/wires = null @@ -244,29 +244,34 @@ return var/target_wire = params["wire"] var/mob/living/L = usr - var/obj/item/I = L.get_active_held_item() + var/obj/item/I switch(action) if("cut") - if(istype(I, /obj/item/wirecutters) || IsAdminGhost(usr)) - playsound(holder, I.usesound, 20, 1) + I = L.is_holding_tool_quality(TOOL_WIRECUTTER) + if(I || IsAdminGhost(usr)) + if(I) + I.play_tool_sound(src, 20) cut_color(target_wire) . = TRUE else to_chat(L, "You need wirecutters!") if("pulse") - if(istype(I, /obj/item/device/multitool) || IsAdminGhost(usr)) - playsound(holder, 'sound/weapons/empty.ogg', 20, 1) + I = L.is_holding_tool_quality(TOOL_MULTITOOL) + if(I || IsAdminGhost(usr)) + if(I) + I.play_tool_sound(src, 20) pulse_color(target_wire, L) . = TRUE else to_chat(L, "You need a multitool!") if("attach") if(is_attached(target_wire)) - var/obj/item/O = detach_assembly(target_wire) - if(O) - L.put_in_hands(O) + I = detach_assembly(target_wire) + if(I) + L.put_in_hands(I) . = TRUE else + I = L.get_active_held_item() if(istype(I, /obj/item/device/assembly)) var/obj/item/device/assembly/A = I if(A.attachable) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 217b994c7f..b966fe2905 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -534,38 +534,38 @@ // Tool behavior procedure. Redirects to tool-specific procs by default. // You can override it to catch all tool interactions, for use in complex deconstruction procs. // Just don't forget to return ..() in the end. -/atom/proc/tool_act(mob/living/user, obj/item/tool, tool_type) +/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) switch(tool_type) if(TOOL_CROWBAR) - return crowbar_act(user, tool) + return crowbar_act(user, I) if(TOOL_MULTITOOL) - return multitool_act(user, tool) + return multitool_act(user, I) if(TOOL_SCREWDRIVER) - return screwdriver_act(user, tool) + return screwdriver_act(user, I) if(TOOL_WRENCH) - return wrench_act(user, tool) + return wrench_act(user, I) if(TOOL_WIRECUTTER) - return wirecutter_act(user, tool) + return wirecutter_act(user, I) if(TOOL_WELDER) - return welder_act(user, tool) + return welder_act(user, I) // Tool-specific behavior procs. To be overridden in subtypes. -/atom/proc/crowbar_act(mob/living/user, obj/item/tool) +/atom/proc/crowbar_act(mob/living/user, obj/item/I) return -/atom/proc/multitool_act(mob/living/user, obj/item/tool) +/atom/proc/multitool_act(mob/living/user, obj/item/I) return -/atom/proc/screwdriver_act(mob/living/user, obj/item/tool) +/atom/proc/screwdriver_act(mob/living/user, obj/item/I) return -/atom/proc/wrench_act(mob/living/user, obj/item/tool) +/atom/proc/wrench_act(mob/living/user, obj/item/I) return -/atom/proc/wirecutter_act(mob/living/user, obj/item/tool) +/atom/proc/wirecutter_act(mob/living/user, obj/item/I) return -/atom/proc/welder_act(mob/living/user, obj/item/tool) +/atom/proc/welder_act(mob/living/user, obj/item/I) return /atom/proc/GenerateTag() diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index ba8be95065..a2d2e30bea 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -80,21 +80,19 @@ update_icon() else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) - var/obj/item/weldingtool/WT = O if(stat & BROKEN) - if(WT.remove_fuel(0,user)) - user.visible_message("[user] is repairing [src].", \ - "You begin repairing [src]...", \ - "You hear welding.") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user,40*WT.toolspeed, 1, target = src)) - if(!WT.isOn() || !(stat & BROKEN)) - return - to_chat(user, "You repair [src].") - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - stat &= ~BROKEN - obj_integrity = max_integrity - update_icon() + if(!O.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + if(O.use_tool(src, user, 40, volume=50)) + if(!(stat & BROKEN)) + return + to_chat(user, "You repair [src].") + stat &= ~BROKEN + obj_integrity = max_integrity + update_icon() else to_chat(user, "[src] does not need repairs.") else diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 9517e0bc65..22978e9ea2 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -290,18 +290,17 @@ Class Procs: /obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames. return -/obj/machinery/proc/default_pry_open(obj/item/crowbar/C) - . = !(state_open || panel_open || is_operational() || (flags_1 & NODECONSTRUCT_1)) && istype(C) +/obj/machinery/proc/default_pry_open(obj/item/I) + . = !(state_open || panel_open || is_operational() || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR if(.) - playsound(loc, C.usesound, 50, 1) + I.play_tool_sound(src, 50) visible_message("[usr] pries open \the [src].", "You pry open \the [src].") open_machine() - return 1 -/obj/machinery/proc/default_deconstruction_crowbar(obj/item/crowbar/C, ignore_panel = 0) - . = istype(C) && (panel_open || ignore_panel) && !(flags_1 & NODECONSTRUCT_1) +/obj/machinery/proc/default_deconstruction_crowbar(obj/item/I, ignore_panel = 0) + . = (panel_open || ignore_panel) && !(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_CROWBAR if(.) - playsound(loc, C.usesound, 50, 1) + I.play_tool_sound(src, 50) deconstruct(TRUE) /obj/machinery/deconstruct(disassembled = TRUE) @@ -337,9 +336,9 @@ Class Procs: update_icon() updateUsrDialog() -/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver/S) - if(istype(S) && !(flags_1 & NODECONSTRUCT_1)) - playsound(loc, S.usesound, 50, 1) +/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I) + if(!(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_SCREWDRIVER) + I.play_tool_sound(src, 50) if(!panel_open) panel_open = TRUE icon_state = icon_state_open @@ -351,9 +350,9 @@ Class Procs: return 1 return 0 -/obj/machinery/proc/default_change_direction_wrench(mob/user, obj/item/wrench/W) - if(panel_open && istype(W)) - playsound(loc, W.usesound, 50, 1) +/obj/machinery/proc/default_change_direction_wrench(mob/user, obj/item/I) + if(panel_open && I.tool_behaviour == TOOL_WRENCH) + I.play_tool_sound(src, 50) setDir(turn(dir,-90)) to_chat(user, "You rotate [src].") return 1 @@ -365,20 +364,20 @@ Class Procs: return FAILED_UNFASTEN return SUCCESSFUL_UNFASTEN -/obj/proc/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY - if(istype(W) && !(flags_1 & NODECONSTRUCT_1)) +/obj/proc/default_unfasten_wrench(mob/user, obj/item/I, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY + if(!(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_WRENCH) var/can_be_unfasten = can_be_unfasten_wrench(user) if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN) return can_be_unfasten if(time) to_chat(user, "You begin [anchored ? "un" : ""]securing [src]...") - playsound(loc, W.usesound, 50, 1) + I.play_tool_sound(src, 50) var/prev_anchored = anchored //as long as we're the same anchored state and we're either on a floor or are anchored, toggle our anchored state - if(!time || do_after(user, time*W.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/unfasten_wrench_check, prev_anchored, user))) + if(I.use_tool(src, user, time, extra_checks = CALLBACK(src, .proc/unfasten_wrench_check, prev_anchored, user))) to_chat(user, "You [anchored ? "un" : ""]secure [src].") anchored = !anchored - playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) return SUCCESSFUL_UNFASTEN return FAILED_UNFASTEN return CANT_UNFASTEN diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 5226084b96..102c21904e 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -61,7 +61,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/screwdriver)) - playsound(src.loc, P.usesound, 50, 1) + P.play_tool_sound(src) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance hatch of [src].") update_icon() diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index 299b0500ce..53b5277abd 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -74,21 +74,21 @@ update_icon() else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) - var/obj/item/weldingtool/WT = O if(obj_integrity < max_integrity) - if(WT.remove_fuel(0,user)) - user.visible_message("[user] begins repairing [src].", \ - "You begin repairing [src]...", \ - "You hear welding.") - playsound(src, WT.usesound, 40, 1) - if(do_after(user,40*WT.toolspeed, TRUE, target = src)) - if(!WT.isOn() || !(stat & BROKEN)) - return - to_chat(user, "You repair [src].") - playsound(src, 'sound/items/welder2.ogg', 50, 1) - stat &= ~BROKEN - obj_integrity = max(obj_integrity, max_integrity) - update_icon() + if(!O.tool_start_check(user, amount=0)) + return + + user.visible_message("[user] begins repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + + if(O.use_tool(src, user, 40, volume=50)) + if(!(stat & BROKEN)) + return + to_chat(user, "You repair [src].") + stat &= ~BROKEN + obj_integrity = max(obj_integrity, max_integrity) + update_icon() else to_chat(user, "[src] does not need repairs.") else diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index b98976d83c..7379185505 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -87,8 +87,8 @@ if(!device && !board && istype(W, /obj/item/wrench)) to_chat(user, "You start unsecuring the button frame...") - playsound(loc, W.usesound, 50, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + W.play_tool_sound(src) + if(W.use_tool(src, user, 40)) to_chat(user, "You unsecure the button frame.") transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src))) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 14502b9e46..2127eb095b 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -139,7 +139,7 @@ if(istype(W, /obj/item/screwdriver)) panel_open = !panel_open to_chat(user, "You screw the camera's panel [panel_open ? "open" : "closed"].") - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) return if(panel_open) @@ -367,19 +367,16 @@ return null -/obj/machinery/camera/proc/weld(obj/item/weldingtool/WT, mob/living/user) +/obj/machinery/camera/proc/weld(obj/item/weldingtool/W, mob/living/user) if(busy) return FALSE - if(!WT.remove_fuel(0, user)) + if(!W.tool_start_check(user, amount=0)) return FALSE to_chat(user, "You start to weld [src]...") - playsound(src.loc, WT.usesound, 50, 1) busy = TRUE - if(do_after(user, 100*WT.toolspeed, target = src)) + if(W.use_tool(src, user, 100, volume=50)) busy = FALSE - if(!WT.isOn()) - return FALSE return TRUE busy = FALSE return FALSE diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index b6cec23110..807ffbbe9a 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -81,7 +81,7 @@ var/obj/U = locate(/obj) in upgrades if(U) to_chat(user, "You unattach an upgrade from the assembly.") - playsound(src, tool.usesound, 50, 1) + tool.play_tool_sound(src) U.forceMove(drop_location()) upgrades -= U return TRUE @@ -90,7 +90,7 @@ if(state != 3) return FALSE - playsound(src, tool.usesound, 50, 1) + tool.play_tool_sound(src) var/input = stripped_input(user, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13") if(!input) to_chat(user, "No input found, please hang up and try your call again!") @@ -109,35 +109,32 @@ C.c_tag = "[A.name] ([rand(1, 999)])" return TRUE -/obj/structure/camera_assembly/wirecutter_act(mob/user, obj/item/tool) +/obj/structure/camera_assembly/wirecutter_act(mob/user, obj/item/I) if(state != 3) return FALSE - new /obj/item/stack/cable_coil(get_turf(src), 2) - playsound(src, tool.usesound, 50, 1) + new /obj/item/stack/cable_coil(drop_location(), 2) + I.play_tool_sound(src) to_chat(user, "You cut the wires from the circuits.") state = 2 return TRUE -/obj/structure/camera_assembly/wrench_act(mob/user, obj/item/tool) +/obj/structure/camera_assembly/wrench_act(mob/user, obj/item/I) if(state != 1) return FALSE - playsound(src, tool.usesound, 50, 1) + I.play_tool_sound(src) to_chat(user, "You unattach the assembly from its place.") - new /obj/item/wallframe/camera(get_turf(src)) + new /obj/item/wallframe/camera(drop_location()) qdel(src) return TRUE -/obj/structure/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user) - if(!WT.remove_fuel(0, user)) - return 0 +/obj/structure/camera_assembly/proc/weld(obj/item/weldingtool/W, mob/living/user) + if(!W.tool_start_check(user, amount=0)) + return FALSE to_chat(user, "You start to weld \the [src]...") - playsound(src.loc, WT.usesound, 50, 1) - if(do_after(user, 20*WT.toolspeed, target = src)) - if(WT.isOn()) - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - return 1 - return 0 + if(W.use_tool(src, user, 20, volume=50)) + return TRUE + return FALSE /obj/structure/camera_assembly/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 169d7f822b..6bcbf1e994 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -125,4 +125,4 @@ charging.give(charge_rate) //this is 2558, efficient batteries exist updateicon() - + \ No newline at end of file diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 44c39d8096..2bae3b30bd 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -69,14 +69,13 @@ update_icon() return -/obj/machinery/computer/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver) && circuit && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, " You start to disconnect the monitor...") - if(do_after(user, 20*I.toolspeed, target = src)) +/obj/machinery/computer/screwdriver_act(mob/living/user, obj/item/I) + if(circuit && !(flags_1&NODECONSTRUCT_1)) + to_chat(user, "You start to disconnect the monitor...") + if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE, user) - else - return ..() + return TRUE + /obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 03da8e2891..a5d7296ce6 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -105,12 +105,6 @@ authenticated = TRUE auth_id = "[ID.registered_name] ([ID.assignment])" log_activity("logged in") - if(!authenticated) //Check for emags - var/obj/item/card/emag/E = usr.get_active_held_item() - if(E && istype(E) && usr.Adjacent(src)) - to_chat(usr, "You bypass [src]'s access requirements using your emag.") - authenticated = TRUE - log_activity("logged in") //Auth ID doesn't change, hinting that it was illicit if(href_list["log_out"]) log_activity("logged out") authenticated = FALSE @@ -193,12 +187,15 @@ interact(usr) //Refresh the UI after a filter changes /obj/machinery/computer/apc_control/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - user.visible_message("You emag [src], disabling precise logging and allowing you to clear logs.") - log_game("[key_name(user)] emagged [src] at [get_area(src)], disabling operator tracking.") + if(!authenticated) + to_chat(user, "You bypass [src]'s access requirements using your emag.") + authenticated = TRUE + log_activity("logged in") + else if(!(obj_flags & EMAGGED)) + user.visible_message("You emag [src], disabling precise logging and allowing you to clear logs.") + log_game("[key_name(user)] emagged [src] at [get_area(src)], disabling operator tracking.") + obj_flags |= EMAGGED playsound(src, "sparks", 50, 1) - obj_flags |= EMAGGED /obj/machinery/computer/apc_control/proc/log_activity(log_text) var/op_string = operator && !(obj_flags & EMAGGED) ? operator : "\[NULL OPERATOR\]" diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 33a74256ed..17fea3cbfb 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -47,7 +47,9 @@ /obj/item/toy/windupToolbox = 2, /obj/item/toy/clockwork_watch = 2, /obj/item/toy/toy_dagger = 2, - /obj/item/extendohand/acme = 1) + /obj/item/extendohand/acme = 1, + /obj/item/hot_potato/harmless/toy = 1, + /obj/item/card/emagfake = 1) light_color = LIGHT_COLOR_GREEN diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index e32114340f..5c9cf8b8a4 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -8,24 +8,18 @@ switch(state) if(0) if(istype(P, /obj/item/wrench)) - playsound(src, P.usesound, 50, 1) to_chat(user, "You start wrenching the frame into place...") - if(do_after(user, 20*P.toolspeed, target = src)) + if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") anchored = TRUE state = 1 return if(istype(P, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = P - if(!WT.remove_fuel(0, user)) - if(!WT.isOn()) - to_chat(user, "[WT] must be on to complete this task!") + if(!P.tool_start_check(user, amount=0)) return - playsound(src, P.usesound, 50, 1) + to_chat(user, "You start deconstructing the frame...") - if(do_after(user, 20*P.toolspeed, target = src)) - if(!src || !WT.isOn()) - return + if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You deconstruct the frame.") var/obj/item/stack/sheet/metal/M = new (drop_location(), 5) M.add_fingerprint(user) @@ -33,9 +27,8 @@ return if(1) if(istype(P, /obj/item/wrench)) - playsound(src, P.usesound, 50, 1) to_chat(user, "You start to unfasten the frame...") - if(do_after(user, 20*P.toolspeed, target = src)) + if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You unfasten the frame.") anchored = FALSE state = 0 @@ -54,13 +47,13 @@ to_chat(user, "This frame does not accept circuit boards of this type!") return if(istype(P, /obj/item/screwdriver) && circuit) - playsound(src, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You screw [circuit] into place.") state = 2 icon_state = "2" return if(istype(P, /obj/item/crowbar) && circuit) - playsound(src, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You remove [circuit].") state = 1 icon_state = "0" @@ -70,54 +63,47 @@ return if(2) if(istype(P, /obj/item/screwdriver) && circuit) - playsound(src, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You unfasten the circuit board.") state = 1 icon_state = "1" return if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = P - if(C.get_amount() >= 5) - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) - to_chat(user, "You start adding cables to the frame...") - if(do_after(user, 20*P.toolspeed, target = src)) - if(C.get_amount() >= 5 && state == 2) - C.use(5) - to_chat(user, "You add cables to the frame.") - state = 3 - icon_state = "3" - else - to_chat(user, "You need five lengths of cable to wire the frame!") + if(!P.tool_start_check(user, amount=5)) + return + to_chat(user, "You start adding cables to the frame...") + if(P.use_tool(src, user, 20, volume=50, amount=5)) + if(state != 2) + return + to_chat(user, "You add cables to the frame.") + state = 3 + icon_state = "3" return if(3) if(istype(P, /obj/item/wirecutters)) - playsound(src, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You remove the cables.") state = 2 icon_state = "2" - var/obj/item/stack/cable_coil/A = new (drop_location()) - A.amount = 5 + var/obj/item/stack/cable_coil/A = new (drop_location(), 5) A.add_fingerprint(user) return if(istype(P, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = P - if(G.get_amount() < 2) - to_chat(user, "You need two glass sheets to continue construction!") + if(!P.tool_start_check(user, amount=2)) return - else - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) - to_chat(user, "You start to put in the glass panel...") - if(do_after(user, 20, target = src)) - if(G.get_amount() >= 2 && state == 3) - G.use(2) - to_chat(user, "You put in the glass panel.") - state = 4 - src.icon_state = "4" + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + to_chat(user, "You start to put in the glass panel...") + if(P.use_tool(src, user, 20, amount=2)) + if(state != 3) + return + to_chat(user, "You put in the glass panel.") + state = 4 + src.icon_state = "4" return if(4) if(istype(P, /obj/item/crowbar)) - playsound(src, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You remove the glass panel.") state = 3 icon_state = "3" @@ -125,7 +111,7 @@ G.add_fingerprint(user) return if(istype(P, /obj/item/screwdriver)) - playsound(src, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You connect the monitor.") var/obj/B = new circuit.build_path (loc, circuit) B.dir = dir diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 97830393bd..6c9b8e3a0d 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -81,24 +81,20 @@ to_chat(user, "This frame does not accept circuit boards of this type!") return if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = P - if(C.get_amount() >= 5) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - to_chat(user, "You start to add cables to the frame...") - if(do_after(user, 20*P.toolspeed, target = src)) - if(C.get_amount() >= 5 && state == 1) - C.use(5) - to_chat(user, "You add cables to the frame.") - state = 2 - icon_state = "box_1" - else - to_chat(user, "You need five length of cable to wire the frame!") + if(!P.tool_start_check(user, amount=5)) + return + + to_chat(user, "You start to add cables to the frame...") + if(P.use_tool(src, user, 20, volume=50, amount=5)) + to_chat(user, "You add cables to the frame.") + state = 2 + icon_state = "box_1" + return if(istype(P, /obj/item/screwdriver) && !anchored) - playsound(src.loc, P.usesound, 50, 1) user.visible_message("[user] disassembles the frame.", \ "You start to disassemble the frame...", "You hear banging and clanking.") - if(do_after(user, 40*P.toolspeed, target = src)) + if(P.use_tool(src, user, 40, volume=50)) if(state == 1) to_chat(user, "You disassemble the frame.") var/obj/item/stack/sheet/metal/M = new (loc, 5) @@ -107,8 +103,7 @@ return if(istype(P, /obj/item/wrench)) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") - playsound(src.loc, P.usesound, 75, 1) - if(do_after(user, 40*P.toolspeed, target = src)) + if(P.use_tool(src, user, 40, volume=75)) if(state == 1) to_chat(user, "You [anchored ? "un" : ""]secure [name].") anchored = !anchored @@ -117,8 +112,7 @@ if(2) if(istype(P, /obj/item/wrench)) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") - playsound(src.loc, P.usesound, 75, 1) - if(do_after(user, 40*P.toolspeed, target = src)) + if(P.use_tool(src, user, 40, volume=75)) to_chat(user, "You [anchored ? "un" : ""]secure [name].") anchored = !anchored return @@ -145,17 +139,16 @@ return if(istype(P, /obj/item/wirecutters)) - playsound(src.loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You remove the cables.") state = 1 icon_state = "box_0" - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) - A.amount = 5 + new /obj/item/stack/cable_coil(drop_location(), 5) return if(3) if(istype(P, /obj/item/crowbar)) - playsound(src.loc, P.usesound, 50, 1) + P.play_tool_sound(src) state = 2 circuit.forceMove(drop_location()) components.Remove(circuit) @@ -179,7 +172,7 @@ component_check = 0 break if(component_check) - playsound(src.loc, P.usesound, 50, 1) + P.play_tool_sound(src) var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1) new_machine.on_construction() for(var/obj/O in new_machine.component_parts) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 007ef8e986..130d276184 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -27,13 +27,13 @@ /obj/structure/barricade/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM && material == METAL) - var/obj/item/weldingtool/WT = I if(obj_integrity < max_integrity) - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin repairing [src]...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*I.toolspeed, target = src)) - obj_integrity = CLAMP(obj_integrity + 20, 0, max_integrity) + if(!I.tool_start_check(user, amount=0)) + return + + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 40, volume=40)) + obj_integrity = CLAMP(obj_integrity + 20, 0, max_integrity) else return ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 325adb30b7..6bdca31c68 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -782,15 +782,12 @@ return if(AIRLOCK_SECURITY_METAL) if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) + if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the panel's shielding...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(!panel_open || !WT.isOn()) + if(C.use_tool(src, user, 40, volume=50, amount = 2)) + if(!panel_open) return - playsound(loc, WT.usesound, 50, 1) user.visible_message("[user] cuts through \the [src]'s shielding.", "You cut through \the [src]'s shielding.", "You hear welding.") @@ -802,8 +799,7 @@ if(istype(C, /obj/item/crowbar)) var/obj/item/crowbar/W = C to_chat(user, "You start removing the inner layer of shielding...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, 1, target = src)) + if(W.use_tool(src, user, 40, volume=100)) if(!panel_open) return if(security_level != AIRLOCK_SECURITY_PLASTEEL_I_S) @@ -818,15 +814,12 @@ return if(AIRLOCK_SECURITY_PLASTEEL_I) if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) + if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the inner layer of shielding...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(!panel_open || !WT.isOn()) + if(C.use_tool(src, user, 40, volume=50, amount=2)) + if(!panel_open) return - playsound(loc, WT.usesound, 50, 1) user.visible_message("[user] cuts through \the [src]'s shielding.", "You cut through \the [src]'s shielding.", "You hear welding.") @@ -834,10 +827,8 @@ return if(AIRLOCK_SECURITY_PLASTEEL_O_S) if(istype(C, /obj/item/crowbar)) - var/obj/item/crowbar/W = C to_chat(user, "You start removing outer layer of shielding...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, 1, target = src)) + if(C.use_tool(src, user, 40, volume=100)) if(!panel_open) return if(security_level != AIRLOCK_SECURITY_PLASTEEL_O_S) @@ -849,15 +840,12 @@ return if(AIRLOCK_SECURITY_PLASTEEL_O) if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) + if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the outer layer of shielding...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(!panel_open || !WT.isOn()) + if(C.use_tool(src, user, 40, volume=50, amount=2)) + if(!panel_open) return - playsound(loc, WT.usesound, 50, 1) user.visible_message("[user] cuts through \the [src]'s shielding.", "You cut through \the [src]'s shielding.", "You hear welding.") @@ -865,12 +853,10 @@ return if(AIRLOCK_SECURITY_PLASTEEL) if(istype(C, /obj/item/wirecutters)) - var/obj/item/wirecutters/W = C if(src.hasPower() && src.shock(user, 60)) // Protective grille of wiring is electrified return to_chat(user, "You start cutting through the outer grille.") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 10*W.toolspeed, 1, target = src)) + if(C.use_tool(src, user, 10, volume=100)) if(!panel_open) return user.visible_message("[user] cut through \the [src]'s outer grille.", @@ -883,11 +869,11 @@ return panel_open = !panel_open to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the airlock.") - playsound(src.loc, C.usesound, 50, 1) + C.play_tool_sound(src) src.update_icon() else if(istype(C, /obj/item/wirecutters) && note) user.visible_message("[user] cuts down [note] from [src].", "You remove [note] from [src].") - playsound(src, 'sound/items/Wirecutter.ogg', 50, 1) + C.play_tool_sound(src) note.forceMove(get_turf(user)) note = null update_icon() @@ -932,36 +918,34 @@ /obj/machinery/door/airlock/try_to_weld(obj/item/weldingtool/W, mob/user) if(!operating && density) if(user.a_intent != INTENT_HELP) - if(W.remove_fuel(0,user)) - user.visible_message("[user] is [welded ? "unwelding":"welding"] the airlock.", \ - "You begin [welded ? "unwelding":"welding"] the airlock...", \ - "You hear welding.") - playsound(loc, W.usesound, 40, 1) - if(do_after(user,40*W.toolspeed, 1, target = src, extra_checks = CALLBACK(src, .proc/weld_checks, W, user))) - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - welded = !welded - user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \ - "You [welded ? "weld the airlock shut":"unweld the airlock"].") - update_icon() + if(!W.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is [welded ? "unwelding":"welding"] the airlock.", \ + "You begin [welded ? "unwelding":"welding"] the airlock...", \ + "You hear welding.") + if(W.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, .proc/weld_checks, W, user))) + welded = !welded + user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \ + "You [welded ? "weld the airlock shut":"unweld the airlock"].") + update_icon() else if(obj_integrity < max_integrity) - if(W.remove_fuel(0,user)) - user.visible_message("[user] is welding the airlock.", \ - "You begin repairing the airlock...", \ - "You hear welding.") - playsound(loc, W.usesound, 40, 1) - if(do_after(user,40*W.toolspeed, 1, target = src, extra_checks = CALLBACK(src, .proc/weld_checks, W, user))) - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - obj_integrity = max_integrity - stat &= ~BROKEN - user.visible_message("[user.name] has repaired [src].", \ - "You finish repairing the airlock.") - update_icon() + if(!W.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is welding the airlock.", \ + "You begin repairing the airlock...", \ + "You hear welding.") + if(W.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, .proc/weld_checks, W, user))) + obj_integrity = max_integrity + stat &= ~BROKEN + user.visible_message("[user.name] has repaired [src].", \ + "You finish repairing the airlock.") + update_icon() else to_chat(user, "The airlock doesn't need repairing.") /obj/machinery/door/airlock/proc/weld_checks(obj/item/weldingtool/W, mob/user) - return !operating && density && user && W && W.isOn() && user.loc + return !operating && density /obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user) var/beingcrowbarred = null @@ -971,8 +955,7 @@ beingcrowbarred = 0 if(panel_open && charge) to_chat(user, "You carefully start removing [charge] from [src]...") - playsound(get_turf(src), I.usesound, 50, 1) - if(!do_after(user, 150*I.toolspeed, target = src)) + if(!I.use_tool(src, user, 150, volume=50)) to_chat(user, "You slip and [charge] detonates!") charge.ex_act(EXPLODE_DEVASTATE) user.Knockdown(60) @@ -983,13 +966,11 @@ charge = null return if(beingcrowbarred && panel_open && ((obj_flags & EMAGGED) || (density && welded && !operating && !hasPower() && !locked))) - playsound(src.loc, I.usesound, 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", \ "You start to remove electronics from the airlock assembly...") - if(do_after(user,40*I.toolspeed, target = src)) - if(src.loc) - deconstruct(TRUE, user) - return + if(I.use_tool(src, user, 40, volume=100)) + deconstruct(TRUE, user) + return else if(hasPower()) to_chat(user, "The airlock's motors resist your efforts to force it!") else if(locked) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index feb1cfc22a..dc734b387d 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -576,16 +576,14 @@ else if(istype(I, /obj/item/wrench)) if(construction_state == GEAR_SECURE) user.visible_message("[user] begins loosening [src]'s cogwheel...", "You begin loosening [src]'s cogwheel...") - playsound(src, I.usesound, 50, 1) - if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_SECURE) + if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_SECURE) return 1 user.visible_message("[user] loosens [src]'s cogwheel!", "[src]'s cogwheel pops off and dangles loosely.") playsound(src, 'sound/items/deconstruct.ogg', 50, 1) construction_state = GEAR_LOOSE else if(construction_state == GEAR_LOOSE) user.visible_message("[user] begins tightening [src]'s cogwheel...", "You begin tightening [src]'s cogwheel into place...") - playsound(src, I.usesound, 50, 1) - if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_LOOSE) + if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_LOOSE) return 1 user.visible_message("[user] tightens [src]'s cogwheel!", "You firmly tighten [src]'s cogwheel into place.") playsound(src, 'sound/items/deconstruct.ogg', 50, 1) @@ -597,8 +595,7 @@ return 1 else if(construction_state == GEAR_LOOSE) user.visible_message("[user] begins slowly lifting off [src]'s cogwheel...", "You slowly begin lifting off [src]'s cogwheel...") - playsound(src, I.usesound, 50, 1) - if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_LOOSE) + if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_LOOSE) return 1 user.visible_message("[user] lifts off [src]'s cogwheel, causing it to fall apart!", \ "You lift off [src]'s cogwheel, causing it to fall apart!") diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index c2ce9d5ee5..4b7d86443b 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -100,10 +100,10 @@ if(boltslocked) to_chat(user, "There are screws locking the bolts in place!") return - playsound(get_turf(src), C.usesound, 50, 1) + C.play_tool_sound(src) user.visible_message("[user] starts undoing [src]'s bolts...", \ "You start unfastening [src]'s floor bolts...") - if(!do_after(user, 50*C.toolspeed, target = src)) + if(!C.use_tool(src, user, 50)) return playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) user.visible_message("[user] unfastens [src]'s bolts.", \ @@ -113,7 +113,7 @@ if(istype(C, /obj/item/screwdriver)) user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts.", \ "You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts.") - playsound(get_turf(src), C.usesound, 50, 1) + C.play_tool_sound(src) boltslocked = !boltslocked return @@ -123,14 +123,13 @@ return /obj/machinery/door/firedoor/try_to_weld(obj/item/weldingtool/W, mob/user) - if(W.remove_fuel(0, user)) - playsound(get_turf(src), W.usesound, 50, 1) - user.visible_message("[user] starts [welded ? "unwelding" : "welding"] [src].", "You start welding [src].") - if(do_after(user, 40*W.toolspeed, 1, target=src)) - playsound(get_turf(src), W.usesound, 50, 1) - welded = !welded - to_chat(user, "[user] [welded?"welds":"unwelds"] [src].", "You [welded ? "weld" : "unweld"] [src].") - update_icon() + if(!W.tool_start_check(user, amount=0)) + return + user.visible_message("[user] starts [welded ? "unwelding" : "welding"] [src].", "You start welding [src].") + if(W.use_tool(src, user, 40, volume=50)) + welded = !welded + to_chat(user, "[user] [welded?"welds":"unwelds"] [src].", "You [welded ? "weld" : "unweld"] [src].") + update_icon() /obj/machinery/door/firedoor/try_to_crowbar(obj/item/I, mob/user) if(welded || operating) @@ -284,10 +283,10 @@ switch(constructionStep) if(CONSTRUCTION_PANEL_OPEN) if(istype(C, /obj/item/crowbar)) - playsound(get_turf(src), C.usesound, 50, 1) + C.play_tool_sound(src) user.visible_message("[user] starts prying something out from [src]...", \ "You begin prying out the wire cover...") - if(!do_after(user, 50*C.toolspeed, target = src)) + if(!C.use_tool(src, user, 50)) return if(constructionStep != CONSTRUCTION_PANEL_OPEN) return @@ -301,10 +300,10 @@ if(locate(/obj/machinery/door/firedoor) in get_turf(src)) to_chat(user, "There's already a firelock there.") return - playsound(get_turf(src), C.usesound, 50, 1) + C.play_tool_sound(src) user.visible_message("[user] starts bolting down [src]...", \ "You begin bolting [src]...") - if(!do_after(user, 30*C.toolspeed, target = src)) + if(!C.use_tool(src, user, 30)) return if(locate(/obj/machinery/door/firedoor) in get_turf(src)) return @@ -340,10 +339,10 @@ if(CONSTRUCTION_WIRES_EXPOSED) if(istype(C, /obj/item/wirecutters)) - playsound(get_turf(src), C.usesound, 50, 1) + C.play_tool_sound(src) user.visible_message("[user] starts cutting the wires from [src]...", \ "You begin removing [src]'s wires...") - if(!do_after(user, 60*C.toolspeed, target = src)) + if(!C.use_tool(src, user, 60)) return if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) return @@ -355,10 +354,10 @@ update_icon() return if(istype(C, /obj/item/crowbar)) - playsound(get_turf(src), C.usesound, 50, 1) + C.play_tool_sound(src) user.visible_message("[user] starts prying a metal plate into [src]...", \ "You begin prying the cover plate back onto [src]...") - if(!do_after(user, 80*C.toolspeed, target = src)) + if(!C.use_tool(src, user, 80)) return if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) return @@ -372,15 +371,13 @@ if(istype(C, /obj/item/crowbar)) user.visible_message("[user] begins removing the circuit board from [src]...", \ "You begin prying out the circuit board from [src]...") - playsound(get_turf(src), C.usesound, 50, 1) - if(!do_after(user, 50*C.toolspeed, target = src)) + if(!C.use_tool(src, user, 50, volume=50)) return if(constructionStep != CONSTRUCTION_GUTTED) return user.visible_message("[user] removes [src]'s circuit board.", \ "You remove the circuit board from [src].") - new /obj/item/electronics/firelock(get_turf(src)) - playsound(get_turf(src), C.usesound, 50, 1) + new /obj/item/electronics/firelock(drop_location()) constructionStep = CONSTRUCTION_NOCIRCUIT update_icon() return @@ -404,18 +401,17 @@ return if(CONSTRUCTION_NOCIRCUIT) if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = C - if(W.remove_fuel(1,user)) - playsound(get_turf(src), W.usesound, 50, 1) - user.visible_message("[user] begins cutting apart [src]'s frame...", \ - "You begin slicing [src] apart...") - if(!do_after(user, 80*C.toolspeed, target = src)) - return + if(!C.tool_start_check(user, amount=1)) + return + user.visible_message("[user] begins cutting apart [src]'s frame...", \ + "You begin slicing [src] apart...") + + if(C.use_tool(src, user, 40, volume=50, amount=1)) + return if(constructionStep != CONSTRUCTION_NOCIRCUIT) return user.visible_message("[user] cuts apart [src]!", \ "You cut [src] into metal.") - playsound(get_turf(src), 'sound/items/welder2.ogg', 50, 1) var/turf/T = get_turf(src) new /obj/item/stack/sheet/metal(T, 3) if(reinforced) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 1969b1cb16..3c646265f7 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -227,17 +227,16 @@ if(density || operating) to_chat(user, "You need to open the door to access the maintenance panel!") return - playsound(src.loc, I.usesound, 50, 1) + I.play_tool_sound(src) panel_open = !panel_open to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the [src.name].") return if(istype(I, /obj/item/crowbar)) if(panel_open && !density && !operating) - playsound(src.loc, I.usesound, 100, 1) user.visible_message("[user] removes the electronics from the [src.name].", \ "You start to remove electronics from the [src.name]...") - if(do_after(user,40*I.toolspeed, target = src)) + if(I.use_tool(src, user, 40, volume=50)) if(panel_open && !density && !operating && src.loc) var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(src.loc) switch(base_state) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 084bb29591..1b4d495f88 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -29,8 +29,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays) /obj/machinery/doppler_array/process() return PROCESS_KILL -/obj/machinery/doppler_array/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/wrench)) +/obj/machinery/doppler_array/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wrench)) if(!anchored && !isinspace()) anchored = TRUE power_change() @@ -39,7 +39,7 @@ GLOBAL_LIST_EMPTY(doppler_arrays) anchored = FALSE power_change() to_chat(user, "You unfasten [src].") - playsound(loc, O.usesound, 50, 1) + I.play_tool_sound(src) else return ..() @@ -109,14 +109,14 @@ GLOBAL_LIST_EMPTY(doppler_arrays) . = ..() if(!istype(linked_techweb)) say("Warning: No linked research system!") - return + return var/adjusted = orig_light - 10 - linked_techweb.max_bomb_value if(adjusted <= 0) say("Explosion not large enough for research calculations.") return var/point_gain = techweb_scale_bomb(adjusted) if(point_gain <= 0) - say("Explosion not large enough for research calculations.") + say("Explosion not large enough for research calculations.") return linked_techweb.max_bomb_value = orig_light - 10 linked_techweb.research_points += point_gain diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 54183c155e..cf2eed6f53 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -210,35 +210,26 @@ else icon_state = icon_on -/obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user) - if(istype(O, /obj/item/crowbar)) +/obj/machinery/droneDispenser/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/crowbar)) GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() - playsound(loc, O.usesound, 50, 1) + I.play_tool_sound(src) to_chat(user, "You retrieve the materials from [src].") - else if(istype(O, /obj/item/weldingtool)) + else if(istype(I, /obj/item/weldingtool)) if(!(stat & BROKEN)) to_chat(user, "[src] doesn't need repairs.") return - var/obj/item/weldingtool/WT = O - - if(!WT.isOn()) + if(!I.tool_start_check(user, amount=1)) return - if(WT.get_fuel() < 1) - to_chat(user, "You need more fuel to complete this task!") - return - - playsound(src, WT.usesound, 50, 1) user.visible_message( - "[user] begins patching up [src] with [WT].", + "[user] begins patching up [src] with [I].", "You begin restoring the damage to [src]...") - if(!do_after(user, 40*O.toolspeed, target = src)) - return - if(!src || !WT.remove_fuel(1, user)) + if(!I.use_tool(src, user, 40, volume=50, amount=1)) return user.visible_message( diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 583a229937..bf3255385c 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -149,7 +149,7 @@ add_fingerprint(user) if(istype(W, /obj/item/screwdriver) && buildstage == 2) - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].") update_icon() @@ -158,15 +158,14 @@ if(panel_open) if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) - var/obj/item/weldingtool/WT = W if(obj_integrity < max_integrity) - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin repairing [src]...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*WT.toolspeed, target = src)) - obj_integrity = max_integrity - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - to_chat(user, "You repair [src].") + if(!W.tool_start_check(user, amount=0)) + return + + to_chat(user, "You begin repairing [src]...") + if(W.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + to_chat(user, "You repair [src].") else to_chat(user, "[src] is already in good condition!") return @@ -183,7 +182,7 @@ else if (istype(W, /obj/item/wirecutters)) buildstage = 1 - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) new /obj/item/stack/cable_coil(user.loc, 5) to_chat(user, "You cut the wires from \the [src].") update_icon() @@ -201,10 +200,9 @@ return else if(istype(W, /obj/item/crowbar)) - playsound(src.loc, W.usesound, 50, 1) user.visible_message("[user.name] removes the electronics from [src.name].", \ "You start prying out the circuit...") - if(do_after(user, 20*W.toolspeed, target = src)) + if(W.use_tool(src, user, 20, volume=50)) if(buildstage == 1) if(stat & BROKEN) to_chat(user, "You remove the destroyed circuit.") @@ -238,7 +236,7 @@ "You remove the fire alarm assembly from the wall.") var/obj/item/wallframe/firealarm/frame = new /obj/item/wallframe/firealarm() frame.forceMove(user.drop_location()) - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) qdel(src) return return ..() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 9bf40542a7..9bed526992 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -54,8 +54,7 @@ if (istype(W, /obj/item/wirecutters)) if (bulb) user.visible_message("[user] begins to disconnect [src]'s flashbulb.", "You begin to disconnect [src]'s flashbulb...") - playsound(src.loc, W.usesound, 100, 1) - if(do_after(user, 30*W.toolspeed, target = src) && bulb) + if(W.use_tool(src, user, 30, volume=50) && bulb) user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb.") bulb.forceMove(loc) bulb = null @@ -74,8 +73,7 @@ else if (istype(W, /obj/item/wrench)) if(!bulb) to_chat(user, "You start unsecuring the flasher frame...") - playsound(loc, W.usesound, 50, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=50)) to_chat(user, "You unsecure the flasher frame.") deconstruct(TRUE) else @@ -165,7 +163,7 @@ /obj/machinery/flasher/portable/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/wrench)) - playsound(src.loc, W.usesound, 100, 1) + W.play_tool_sound(src, 100) if (!anchored && !isinspace()) to_chat(user, "[src] is now secured.") diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 594394ea8a..d1f1774c8b 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -630,4 +630,4 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ alpha = 100 #undef HOLOPAD_PASSIVE_POWER_USAGE -#undef HOLOGRAM_POWER_USAGE \ No newline at end of file +#undef HOLOGRAM_POWER_USAGE diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 08ace17373..c15e26a5cf 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -724,8 +724,8 @@ GLOBAL_LIST_EMPTY(allCasters) /obj/machinery/newscaster/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/wrench)) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") - playsound(loc, I.usesound, 50, 1) - if(do_after(user, 60*I.toolspeed, target = src)) + I.play_tool_sound(src) + if(I.use_tool(src, user, 60)) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) if(stat & BROKEN) to_chat(user, "The broken remains of [src] fall on the ground.") @@ -737,21 +737,19 @@ GLOBAL_LIST_EMPTY(allCasters) new /obj/item/wallframe/newscaster(loc) qdel(src) else if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) - var/obj/item/weldingtool/WT = I if(stat & BROKEN) - if(WT.remove_fuel(0,user)) - user.visible_message("[user] is repairing [src].", \ - "You begin repairing [src]...", \ - "You hear welding.") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user,40*WT.toolspeed, 1, target = src)) - if(!WT.isOn() || !(stat & BROKEN)) - return - to_chat(user, "You repair [src].") - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - obj_integrity = max_integrity - stat &= ~BROKEN - update_icon() + if(!I.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + if(I.use_tool(src, user, 40, volume=50)) + if(!(stat & BROKEN)) + return + to_chat(user, "You repair [src].") + obj_integrity = max_integrity + stat &= ~BROKEN + update_icon() else to_chat(user, "[src] does not need repairs.") else diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 63189ddfbc..bc192a05de 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -151,7 +151,7 @@ Buildable meters A.on_construction(color, piping_layer) transfer_fingerprints_to(A) - playsound(src, W.usesound, 50, 1) + W.play_tool_sound(src) user.visible_message( \ "[user] fastens \the [src].", \ "You fasten \the [src].", \ @@ -205,7 +205,7 @@ Buildable meters to_chat(user, "You need to fasten it to a pipe!") return TRUE new /obj/machinery/meter(loc, piping_layer) - playsound(src, I.usesound, 50, 1) + I.play_tool_sound(src) to_chat(user, "You fasten the meter to the pipe.") qdel(src) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index f3d3933428..f6e1e2549d 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -64,35 +64,15 @@ to_chat(usr, "You put [W] back into [src].") qdel(W) return - else if (istype(W, /obj/item/wrench)) - if (!anchored && !isinspace()) - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to fasten \the [src] to the floor...") - if (do_after(user, 40*W.toolspeed, target = src)) - add_fingerprint(user) - user.visible_message( \ - "[user] fastens \the [src].", \ - "You fasten \the [src]. Now it can dispense pipes.", \ - "You hear ratchet.") - anchored = TRUE - stat &= MAINT - if (usr.machine==src) - usr << browse(null, "window=pipedispenser") - else if(anchored) - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src] from the floor...") - if (do_after(user, 20*W.toolspeed, target = src)) - add_fingerprint(user) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") - anchored = FALSE - stat |= ~MAINT - power_change() else return ..() +/obj/machinery/pipedispenser/wrench_act(mob/living/user, obj/item/I) + if(default_unfasten_wrench(user, I, 40)) + user << browse(null, "window=pipedispenser") + + return TRUE + /obj/machinery/pipedispenser/disposal name = "disposal pipe dispenser" diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 2a483cdf6e..aa54ae0b4d 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -232,7 +232,7 @@ //If the turret is destroyed, you can remove it with a crowbar to //try and salvage its components to_chat(user, "You begin prying the metal coverings off...") - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20)) if(prob(70)) if(stored_gun) stored_gun.forceMove(loc) diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index ab16ee67ed..66e441825b 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -23,14 +23,14 @@ switch(build_step) if(PTURRET_UNSECURED) //first step if(istype(I, /obj/item/wrench) && !anchored) - playsound(loc, I.usesound, 100, 1) + I.play_tool_sound(src, 100) to_chat(user, "You secure the external bolts.") anchored = TRUE build_step = PTURRET_BOLTED return else if(istype(I, /obj/item/crowbar) && !anchored) - playsound(loc, I.usesound, 75, 1) + I.play_tool_sound(src, 75) to_chat(user, "You dismantle the turret construction.") new /obj/item/stack/sheet/metal( loc, 5) qdel(src) @@ -48,7 +48,7 @@ return else if(istype(I, /obj/item/wrench)) - playsound(loc, I.usesound, 75, 1) + I.play_tool_sound(src, 75) to_chat(user, "You unfasten the external bolts.") anchored = FALSE build_step = PTURRET_UNSECURED @@ -57,27 +57,21 @@ if(PTURRET_START_INTERNAL_ARMOUR) if(istype(I, /obj/item/wrench)) - playsound(loc, I.usesound, 100, 1) + I.play_tool_sound(src, 100) to_chat(user, "You bolt the metal armor into place.") build_step = PTURRET_INTERNAL_ARMOUR_ON return else if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(!WT.isOn()) - return - if(WT.get_fuel() < 5) //uses up 5 fuel. - to_chat(user, "You need more fuel to complete this task!") + if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel return - playsound(loc, WT.usesound, 50, 1) to_chat(user, "You start to remove the turret's interior metal armor...") - if(do_after(user, 20*I.toolspeed, target = src)) - if(!WT.isOn() || !WT.remove_fuel(5, user)) - return + + if(I.use_tool(src, user, 20, volume=50, amount=5)) //uses up 5 fuel build_step = PTURRET_BOLTED to_chat(user, "You remove the turret's interior metal armor.") - new /obj/item/stack/sheet/metal( loc, 2) + new /obj/item/stack/sheet/metal(drop_location(), 2) return @@ -92,7 +86,7 @@ return else if(istype(I, /obj/item/wrench)) - playsound(loc, I.usesound, 100, 1) + I.play_tool_sound(src, 100) to_chat(user, "You remove the turret's metal armor bolts.") build_step = PTURRET_START_INTERNAL_ARMOUR return @@ -109,7 +103,7 @@ if(PTURRET_SENSORS_ON) if(istype(I, /obj/item/screwdriver)) - playsound(loc, I.usesound, 100, 1) + I.play_tool_sound(src, 100) build_step = PTURRET_CLOSED to_chat(user, "You close the internal access hatch.") return @@ -126,24 +120,18 @@ return else if(istype(I, /obj/item/screwdriver)) - playsound(loc, I.usesound, 100, 1) + I.play_tool_sound(src, 100) build_step = PTURRET_SENSORS_ON to_chat(user, "You open the internal access hatch.") return if(PTURRET_START_EXTERNAL_ARMOUR) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(!WT.isOn()) + if(!I.tool_start_check(user, amount=5)) return - if(WT.get_fuel() < 5) - to_chat(user, "You need more fuel to complete this task!") - playsound(loc, WT.usesound, 50, 1) to_chat(user, "You begin to weld the turret's armor down...") - if(do_after(user, 30*I.toolspeed, target = src)) - if(!WT.isOn() || !WT.remove_fuel(5, user)) - return + if(I.use_tool(src, user, 30, volume=50, amount=5)) build_step = PTURRET_EXTERNAL_ARMOUR_ON to_chat(user, "You weld the turret's armor down.") @@ -161,7 +149,7 @@ qdel(src) else if(istype(I, /obj/item/crowbar)) - playsound(loc, I.usesound, 75, 1) + I.play_tool_sound(src, 75) to_chat(user, "You pry off the turret's exterior armor.") new /obj/item/stack/sheet/metal(loc, 2) build_step = PTURRET_CLOSED diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 5a863e85da..2cca8f505c 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -29,7 +29,7 @@ anchored = !anchored power_change() to_chat(user, "You [anchored ? "attached" : "detached"] [src].") - playsound(loc, G.usesound, 75, 1) + G.play_tool_sound(src) return var/allowed = is_type_in_typecache(G, allowed_devices) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index dde4bb180c..e2c4eedc72 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -144,7 +144,7 @@ /obj/machinery/shieldgen/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/screwdriver)) - playsound(src.loc, W.usesound, 100, 1) + W.play_tool_sound(src, 100) panel_open = !panel_open if(panel_open) to_chat(user, "You open the panel and expose the wiring.") @@ -170,11 +170,11 @@ to_chat(user, "The bolts are covered! Unlocking this would retract the covers.") return if(!anchored && !isinspace()) - playsound(src.loc, W.usesound, 100, 1) + W.play_tool_sound(src, 100) to_chat(user, "You secure \the [src] to the floor!") anchored = TRUE else if(anchored) - playsound(src.loc, W.usesound, 100, 1) + W.play_tool_sound(src, 100) to_chat(user, "You unsecure \the [src] from the floor!") if(active) to_chat(user, "\The [src] shuts off!") diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 6b86c48071..0d10a1ecb9 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -116,14 +116,14 @@ to_chat(user, "The bomb must be placed on solid ground to attach it.") else to_chat(user, "You firmly wrench the bomb to the floor.") - playsound(loc, I.usesound, 50, 1) + I.play_tool_sound(src) anchored = TRUE if(active) to_chat(user, "The bolts lock in place.") else if(!active) to_chat(user, "You wrench the bomb from the floor.") - playsound(loc, I.usesound, 50, 1) + I.play_tool_sound(src) anchored = FALSE else to_chat(user, "The bolts are locked down!") @@ -159,18 +159,12 @@ else if(istype(I, /obj/item/weldingtool)) if(payload || !wires.is_all_cut() || !open_panel) return - var/obj/item/weldingtool/WT = I - if(!WT.isOn()) - return - if(WT.get_fuel() < 5) //uses up 5 fuel. - to_chat(user, "You need more fuel to complete this task!") + + if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel return - playsound(loc, WT.usesound, 50, 1) to_chat(user, "You start to cut [src] apart...") - if(do_after(user, 20*I.toolspeed, target = src)) - if(!WT.isOn() || !WT.remove_fuel(5, user)) - return + if(I.use_tool(src, user, 20, volume=50, amount=5)) //uses up 5 fuel to_chat(user, "You cut [src] apart.") new /obj/item/stack/sheet/plasteel( loc, 5) qdel(src) @@ -448,7 +442,7 @@ /obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/crowbar) && beakers.len > 0) - playsound(loc, I.usesound, 50, 1) + I.play_tool_sound(src) for (var/obj/item/B in beakers) B.forceMove(drop_location()) beakers -= B diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index b0396b566a..3fa3836143 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -260,7 +260,7 @@ cut_overlays() if(panel_open) add_overlay("[initial(icon_state)]-panel") - playsound(src, W.usesound, 50, 1) + W.play_tool_sound(src) updateUsrDialog() else to_chat(user, "You must first secure [src].") diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index fe01877cfd..f691586a1b 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -2,77 +2,34 @@ ///// Construction datums ////// //////////////////////////////// -/datum/construction/mecha/custom_action(step, atom/used_atom, mob/user) - if(istype(used_atom, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = used_atom - if (W.remove_fuel(0, user)) +/datum/construction/mecha/custom_action(step, obj/item/I, mob/user) + if(I.tool_behaviour == TOOL_WELDER) + if(I.use_tool(holder, user, 0)) playsound(holder, 'sound/items/welder2.ogg', 50, 1) else return FALSE - else if(istype(used_atom, /obj/item/wrench)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) - else if(istype(used_atom, /obj/item/screwdriver)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) + else if(I.tool_behaviour) + return I.use_tool(holder, user, 0, volume=50) - else if(istype(used_atom, /obj/item/wirecutters)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) + else if(istype(I, /obj/item/stack)) + return I.use_tool(holder, user, 0, volume=50, amount=5) - else if(istype(used_atom, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = used_atom - if(C.use(4)) - playsound(holder, 'sound/items/deconstruct.ogg', 50, 1) - else - to_chat(user, ("There's not enough cable to finish the task!")) - return FALSE - else if(istype(used_atom, /obj/item/stack/ore/bluespace_crystal)) - var/obj/item/stack/ore/bluespace_crystal/BSC = used_atom - BSC.use(1) - else if(istype(used_atom, /obj/item/stack)) - var/obj/item/stack/S = used_atom - if(S.get_amount() < 5) - to_chat(user, ("There's not enough material in this stack!")) - return FALSE - else - S.use(5) return TRUE -/datum/construction/reversible/mecha/custom_action(index as num, diff as num, atom/used_atom, mob/user) - if(istype(used_atom, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = used_atom - if (W.remove_fuel(0, user)) +/datum/construction/reversible/mecha/custom_action(index as num, diff as num, obj/item/I, mob/user) + if(I.tool_behaviour == TOOL_WELDER) + if(I.use_tool(holder, user, 0)) playsound(holder, 'sound/items/welder2.ogg', 50, 1) else return FALSE - else if(istype(used_atom, /obj/item/wrench)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) - else if(istype(used_atom, /obj/item/screwdriver)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) + else if(I.tool_behaviour) + return I.use_tool(holder, user, 0, volume=50) - else if(istype(used_atom, /obj/item/wirecutters)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) + else if(istype(I, /obj/item/stack)) + return I.use_tool(holder, user, 0, volume=50, amount=5) - else if(istype(used_atom, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = used_atom - if (C.use(4)) - playsound(holder, 'sound/items/deconstruct.ogg', 50, 1) - else - to_chat(user, ("There's not enough cable to finish the task!")) - return FALSE - else if(istype(used_atom, /obj/item/stack)) - var/obj/item/stack/S = used_atom - if(S.get_amount() < 5) - to_chat(user, ("There's not enough material in this stack!")) - return FALSE - else - S.use(5) return TRUE diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 065415cba9..bb0eb3c2e7 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -240,9 +240,8 @@ else if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/weldingtool/WT = W - if(obj_integrityYou repair the damaged gas tank.") @@ -251,9 +250,7 @@ obj_integrity += min(10, max_integrity-obj_integrity) if(obj_integrity == max_integrity) to_chat(user, "It looks to be fully repaired now.") - else - to_chat(user, "[WT] needs to be on for this task!") - return 1 + return 1 else to_chat(user, "The [name] is at full integrity!") return 1 diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 21323855eb..dc909d90d1 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -36,23 +36,24 @@ /obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weldingtool)) - if(salvage_num <= 0) + if(salvage_num <= 0 || !length(welder_salvage)) to_chat(user, "You don't see anything that can be cut with [I]!") return - var/obj/item/weldingtool/WT = I - if(welder_salvage && welder_salvage.len && WT.remove_fuel(0, user)) - var/type = prob(70) ? pick(welder_salvage) : null - if(type) - var/N = new type(get_turf(user)) - user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") - if(istype(N, /obj/item/mecha_parts/part)) - welder_salvage -= type - salvage_num-- - else - to_chat(user, "You fail to salvage anything valuable from [src]!") - else + + if(!I.use_tool(src, user, 0, volume=50)) return + var/type = prob(70) ? pick(welder_salvage) : null + if(type) + var/N = new type(get_turf(user)) + user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") + if(istype(N, /obj/item/mecha_parts/part)) + welder_salvage -= type + salvage_num-- + else + to_chat(user, "You fail to salvage anything valuable from [src]!") + return + else if(istype(I, /obj/item/wirecutters)) if(salvage_num <= 0) to_chat(user, "You don't see anything that can be cut with [I]!") diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index a337253c59..4499b9b62e 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -88,7 +88,7 @@ /obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wirecutters)) - playsound(loc, I.usesound, 100, 1) + I.play_tool_sound(src, 100) if(ruined) to_chat(user, "You remove the remnants of the poster.") qdel(src) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 75fe78959d..31e0f1c540 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -30,4 +30,4 @@ /obj/effect/decal/cleanable/robot_debris/old name = "dusty robot debris" - desc = "Looks like nobody has touched this in a while." + desc = "Looks like nobody has touched this in a while." \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 84cd7be2eb..3ddeede1b7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -743,3 +743,72 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/MouseExited() deltimer(tip_timer)//delete any in-progress timer if the mouse is moved off the item before it finishes closeToolTip(usr) + + +// Called when a mob tries to use the item as a tool. +// Handles most checks. +/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks) + // No delay means there is no start message, and no reason to call tool_start_check before use_tool. + // Run the start check here so we wouldn't have to call it manually. + if(!delay && !tool_start_check(user, amount)) + return + + delay *= toolspeed + + // Play tool sound at the beginning of tool usage. + play_tool_sound(target, volume) + + if(delay) + // Create a callback with checks that would be called every tick by do_after. + var/datum/callback/tool_check = CALLBACK(src, .proc/tool_check_callback, user, amount, extra_checks) + + if(ismob(target)) + if(!do_mob(user, target, delay, extra_checks=tool_check)) + return + + else + if(!do_after(user, delay, target=target, extra_checks=tool_check)) + return + else + // Invoke the extra checks once, just in case. + if(extra_checks && !extra_checks.Invoke()) + return + + // Use tool's fuel, stack sheets or charges if amount is set. + if(amount && !use(amount)) + return + + // Play tool sound at the end of tool usage, + // but only if the delay between the beginning and the end is not too small + if(delay >= MIN_TOOL_SOUND_DELAY) + play_tool_sound(target, volume) + + return TRUE + +// Called before use_tool if there is a delay, or by use_tool if there isn't. +// Only ever used by welding tools and stacks, so it's not added on any other use_tool checks. +/obj/item/proc/tool_start_check(mob/living/user, amount=0) + return tool_use_check(user, amount) + +// A check called by tool_start_check once, and by use_tool on every tick of delay. +/obj/item/proc/tool_use_check(mob/living/user, amount) + return !amount + +// Generic use proc. Depending on the item, it uses up fuel, charges, sheets, etc. +// Returns TRUE on success, FALSE on failure. +/obj/item/proc/use(used) + return !used + +// Plays item's usesound, if any. +/obj/item/proc/play_tool_sound(atom/target, volume=50) + if(target && usesound && volume) + var/played_sound = usesound + + if(islist(usesound)) + played_sound = pick(usesound) + + playsound(target, played_sound, volume, 1) + +// Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually. +/obj/item/proc/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks) + return tool_use_check(user, amount) && (!extra_checks || extra_checks.Invoke()) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 6c2c8e58b4..36d2c068c6 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -11,6 +11,7 @@ flags_1 = CONDUCT_1 | NOBLUDGEON_1 slot_flags = SLOT_BELT + usesound = 'sound/effects/spray2.ogg' var/obj/item/device/toner/ink = null @@ -20,7 +21,7 @@ //This proc doesn't just check if the painter can be used, but also uses it. //Only call this if you are certain that the painter will be used right after this check! -/obj/item/airlock_painter/proc/use(mob/user) +/obj/item/airlock_painter/proc/use_paint(mob/user) if(can_use(user)) ink.charges-- playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 8613a0c115..2f506fb419 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -78,9 +78,17 @@ return A.emag_act(user) -/obj/item/card/emag/fake/afterattack() - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) - return +/obj/item/card/emagfake + desc = "It's a card with a magnetic strip attached to some circuitry." + name = "cryptographic sequencer" + icon_state = "emag" + item_state = "card-id" + lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' + +/obj/item/card/emagfake/afterattack() + . = ..() + playsound(src, 'sound/items/bikehorn.ogg', 50, 1) /obj/item/card/id name = "identification card" diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 9c8e4343a8..e622026d21 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -807,4 +807,4 @@ CIGARETTE PACKETS ARE IN FANCY.DM return if(reagents && reagents.total_volume) - hand_reagents() \ No newline at end of file + hand_reagents() diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index b56b448f0d..7831978cbe 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -292,7 +292,7 @@ new_setting = "Freezer" name = initial(new_type.name) build_path = initial(new_type.build_path) - playsound(user, I.usesound, 50, 1) + I.play_tool_sound(src) to_chat(user, "You change the circuitboard setting to \"[new_setting]\".") else return ..() diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 481ca2a722..83cec3c258 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -170,11 +170,9 @@ to_chat(user, "Turn off [src] before you perform this action!") return 0 user.visible_message("[user] unscrews [src]'s maintenance panel and begins fiddling with its innards...", "You begin resetting [src]...") - playsound(user, I.usesound, 50, 1) - if(!do_after(user, 40*I.toolspeed, target = user)) + if(!I.use_tool(src, user, 40, volume=50)) return 0 user.visible_message("[user] refastens [src]'s maintenance panel!", "You reset [src] to its factory settings!") - playsound(user, 'sound/items/screwdriver2.ogg', 50, 1) obj_flags &= ~EMAGGED radiation_count = 0 update_icon() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index c2deb2666a..69de7025c0 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -27,6 +27,7 @@ hitsound = 'sound/weapons/tap.ogg' toolspeed = 1 tool_behaviour = TOOL_MULTITOOL + usesound = 'sound/weapons/empty.ogg' var/datum/integrated_io/selected_io = null //functional for integrated circuits. var/mode = 0 diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 77d1795b6b..bfba8e9838 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -57,37 +57,28 @@ /obj/item/device/radio/intercom/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/screwdriver)) - var/obj/item/screwdriver/S = I if(unfastened) user.visible_message("[user] starts tightening [src]'s screws...", "You start screwing in [src]...") - playsound(src, S.usesound, 50, 1) - if(!do_after(user, 30 * S.toolspeed, target = src)) - return - user.visible_message("[user] tightens [src]'s screws!", "You tighten [src]'s screws.") - playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) - unfastened = FALSE + if(I.use_tool(src, user, 30, volume=50)) + user.visible_message("[user] tightens [src]'s screws!", "You tighten [src]'s screws.") + unfastened = FALSE else user.visible_message("[user] starts loosening [src]'s screws...", "You start unscrewing [src]...") - playsound(src, S.usesound, 50, 1) - if(!do_after(user, 60 * S.toolspeed, target = src)) - return - user.visible_message("[user] loosens [src]'s screws!", "You unscrew [src], loosening it from the wall.") - playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) - unfastened = TRUE + if(I.use_tool(src, user, 40, volume=50)) + user.visible_message("[user] loosens [src]'s screws!", "You unscrew [src], loosening it from the wall.") + unfastened = TRUE return else if(istype(I, /obj/item/wrench)) if(!unfastened) to_chat(user, "You need to unscrew [src] from the wall first!") return - var/obj/item/wrench/W = I user.visible_message("[user] starts unsecuring [src]...", "You start unsecuring [src]...") - playsound(src, W.usesound, 50, 1) - if(!do_after(user, 80 * W.toolspeed, target = src)) - return - user.visible_message("[user] unsecures [src]!", "You detach [src] from the wall.") - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) - new/obj/item/wallframe/intercom(get_turf(src)) - qdel(src) + I.play_tool_sound(src) + if(I.use_tool(src, user, 80)) + user.visible_message("[user] unsecures [src]!", "You detach [src] from the wall.") + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + new/obj/item/wallframe/intercom(get_turf(src)) + qdel(src) return return ..() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 69b6e54841..45782f0ee8 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -276,17 +276,11 @@ /obj/item/device/tape/attackby(obj/item/I, mob/user, params) - if(ruined) - var/delay = -1 - if (istype(I, /obj/item/screwdriver)) - delay = 120*I.toolspeed - else if(istype(I, /obj/item/pen)) - delay = 120*1.5 - if (delay != -1) - to_chat(user, "You start winding the tape back in...") - if(do_after(user, delay, target = src)) - to_chat(user, "You wound the tape back in.") - fix() + if(ruined && istype(I, /obj/item/screwdriver) || istype(I, /obj/item/pen)) + to_chat(user, "You start winding the tape back in...") + if(I.use_tool(src, user, 120)) + to_chat(user, "You wound the tape back in.") + fix() //Random colour tapes /obj/item/device/tape/random diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 8698594555..8851b3446b 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -55,7 +55,7 @@ if(beakers.len) stage_change(READY) to_chat(user, "You lock the [initial(name)] assembly.") - playsound(loc, I.usesound, 25, -3) + I.play_tool_sound(src, 25) else to_chat(user, "You need to add at least one beaker before locking the [initial(name)] assembly!") else if(stage == READY && !nadeassembly) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index b8c2344dac..f92042383d 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -43,7 +43,7 @@ update_icon() return if(nadeassembly && istype(I, /obj/item/wirecutters)) - playsound(src, I.usesound, 20, 1) + I.play_tool_sound(src, 20) nadeassembly.forceMove(get_turf(src)) nadeassembly.master = null nadeassembly = null diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm new file mode 100644 index 0000000000..3f48849c77 --- /dev/null +++ b/code/game/objects/items/hot_potato.dm @@ -0,0 +1,151 @@ +//CREATOR'S NOTE: DO NOT FUCKING GIVE THIS TO BOTANY! +/obj/item/hot_potato + name = "hot potato" + desc = "A label on the side of this potato reads \"Product of DonkCo Service Wing. Activate far away from populated areas. Device will only attach to sapient creatures.\" You can attack anyone with it to force it on them instead of yourself!" + icon = 'icons/obj/hydroponics/harvest.dmi' + icon_state = "potato" + flags_1 = NOBLUDGEON_1 + force = 0 + var/icon_off = "potato" + var/icon_on = "potato_active" + var/detonation_timerid + var/activation_time = 0 + var/timer = 600 //deciseconds + var/show_timer = FALSE + var/reusable = FALSE //absolute madman + var/sticky = TRUE + var/forceful_attachment = TRUE + var/stimulant = TRUE + var/detonate_explosion = TRUE + var/detonate_dev_range = 0 + var/detonate_heavy_range = 0 + var/detonate_light_range = 2 + var/detonate_flash_range = 5 + var/detonate_fire_range = 5 + + var/color_val = FALSE + +/obj/item/hot_potato/proc/detonate() + var/atom/location = loc + location.visible_message("[src] [detonate_explosion? "explodes" : "activates"]!", "[src] activates! You've ran out of time!") + if(detonate_explosion) + explosion(src, detonate_dev_range, detonate_heavy_range, detonate_light_range, detonate_flash_range, flame_range = detonate_fire_range) + deactivate() + if(!reusable) + var/mob/M = loc + if(istype(M)) + M.dropItemToGround(src, TRUE) + qdel(src) + +/obj/item/hot_potato/proc/is_active() + return isnull(detonation_timerid)? FALSE : TRUE + +/obj/item/hot_potato/attack_self(mob/user) + if(activate(timer, user)) + user.visible_message("[user] squeezes [src], which promptly starts to flash red-hot colors!", "You squeeze [src], activating its countdown and attachment mechanism!", + "You hear a mechanical click and a loud beeping!") + return + return ..() + +/obj/item/hot_potato/process() + if(stimulant) + if(isliving(loc)) + var/mob/living/L = loc + L.SetStun(0) + L.SetKnockdown(0) + L.SetSleeping(0) + L.SetUnconscious(0) + L.reagents.add_reagent("muscle_stimulant", CLAMP(5 - L.reagents.get_reagent_amount("muscle_stimulant"), 0, 5)) //If you don't have legs or get bola'd, tough luck! + color_val = !color_val + L.add_atom_colour(color_val? "#ffff00" : "#00ffff", FIXED_COLOUR_PRIORITY) + +/obj/item/hot_potato/examine(mob/user) + . = ..() + if(is_active()) + to_chat(user, "[src] is flashing red-hot! You should probably get rid of it!") + if(show_timer) + to_chat(user, "[src]'s timer looks to be at [(activation_time - world.time) / 10] seconds!") + +/obj/item/hot_potato/equipped(mob/user) + . = ..() + if(is_active()) + to_chat(user, "You have a really bad feeling about [src]!") + +/obj/item/hot_potato/afterattack(atom/target, mob/user, adjacent, params) + if(!adjacent || !ismob(target)) + return ..() + force_onto(target, user) + +/obj/item/hot_potato/proc/force_onto(mob/living/victim, mob/user) + if(!istype(victim) || user != loc || victim == user) + return FALSE + if(!victim.client) + to_chat(user, "[src] refuses to attach to a non-sapient creature!") + if(victim.stat != CONSCIOUS || !victim.get_num_legs()) + to_chat(user, "[src] refuses to attach to someone incapable of using it!") + user.temporarilyRemoveItemFromInventory(src, TRUE) + . = FALSE + if(!victim.put_in_hands(src)) + if(forceful_attachment) + victim.dropItemToGround(victim.get_inactive_held_item()) + if(!victim.put_in_hands(src)) + victim.dropItemToGround(victim.get_active_held_item()) + if(victim.put_in_hands(src)) + . = TRUE + else + . = TRUE + else + . = TRUE + if(.) + add_logs(user, victim, "forced a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto") + user.visible_message("[user] forces [src] onto [victim]!", "You force [src] onto [victim]!", "You hear a mechanical click and a beep.") + user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + else + add_logs(user, victim, "tried to force a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto") + user.visible_message("[user] tried to force [src] onto [victim], but it could not attach!", "You try to force [src] onto [victim], but it is unable to attach!", "You hear a mechanical click and two buzzes.") + user.put_in_hands(src) + +/obj/item/hot_potato/dropped(mob/user) + . = ..() + user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + +/obj/item/hot_potato/proc/activate(delay, mob/user) + if(is_active()) + return + update_icon() + if(sticky) + flags_1 |= NODROP_1 + name = "primed [name]" + activation_time = timer + world.time + detonation_timerid = addtimer(CALLBACK(src, .proc/detonate), delay, TIMER_STOPPABLE) + START_PROCESSING(SSfastprocess, src) + var/turf/T = get_turf(src) + message_admins("[user? "[ADMIN_LOOKUPFLW(user)] has primed [src]" : "A [src] has been primed"] (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [COORD(T)]([T.loc])") + log_game("[user? "[user] has primed [src]" : "A [src] has been primed"] ([detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [COORD(T)]([T.loc])") + +/obj/item/hot_potato/proc/deactivate() + update_icon() + name = initial(name) + flags_1 &= ~NODROP_1 + deltimer(detonation_timerid) + STOP_PROCESSING(SSfastprocess, src) + detonation_timerid = null + if(ismob(loc)) + var/mob/user = loc + user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + +/obj/item/hot_potato/update_icon() + icon_state = is_active()? icon_on : icon_off + +/obj/item/hot_potato/syndicate + detonate_light_range = 4 + detonate_fire_range = 5 + +/obj/item/hot_potato/harmless + detonate_explosion = FALSE + +/obj/item/hot_potato/harmless/toy + desc = "A label on the side of this potato reads \"Product of DonkCo Toys and Recreation department.\" You can attack anyone with it to put it on them instead, if they have a free hand to take it!" + sticky = FALSE + reusable = TRUE + forceful_attachment = FALSE diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 578ba28317..e27c6166fe 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -62,7 +62,7 @@ /obj/item/inducer/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/screwdriver)) - playsound(src, W.usesound, 50, 1) + W.play_tool_sound(src) if(!opened) to_chat(user, "You unscrew the battery compartment.") opened = TRUE diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index c63ee01bf4..2b950197a7 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -122,7 +122,7 @@ to_chat(user, "You already murdered it!") return user.visible_message("[user] tears out the stuffing from [src]!", "You rip a bunch of the stuffing from [src]. Murderer.") - playsound(I, I.usesound, 50, TRUE) + I.play_tool_sound(src) stuffed = FALSE else to_chat(user, "You remove the grenade from [src].") diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index c55c35662d..e5bc6ea715 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -44,7 +44,7 @@ fisto_setting = 3 if(3) fisto_setting = 1 - playsound(loc, W.usesound, 50, 1) + W.play_tool_sound(src) to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting].") else if(istype(W, /obj/item/screwdriver)) if(tank) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index c0500f5d21..fa7d14d236 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -25,14 +25,11 @@ if(pinnedLoc) pinnedLoc.forceMove(loc) -/obj/item/target/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - removeOverlays() - to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.") - else - return ..() +/obj/item/target/welder_act(mob/living/user, obj/item/I) + if(I.use_tool(src, user, 0, volume=40)) + removeOverlays() + to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.") + return TRUE /obj/item/target/attack_hand(mob/user) if(pinnedLoc) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 75e9d1e974..7d2e0c0b43 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -40,17 +40,15 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ icon_state = "rods" /obj/item/stack/rods/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - + if(istype(W, /obj/item/weldingtool)) if(get_amount() < 2) to_chat(user, "You need at least two rods to do this!") return - if(WT.remove_fuel(0,user)) + if(W.use_tool(src, user, 0, volume=40)) var/obj/item/stack/sheet/metal/new_item = new(usr.loc) - user.visible_message("[user.name] shaped [src] into metal with the welding tool.", \ - "You shape [src] into metal with the welding tool.", \ + user.visible_message("[user.name] shaped [src] into metal with [W].", \ + "You shape [src] into metal with [W].", \ "You hear welding.") var/obj/item/stack/rods/R = src src = null diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index d93f5dd5fd..c0045c721b 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -279,21 +279,22 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( /obj/item/shard/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/device/lightreplacer)) I.attackby(src, user) - else if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(WT.remove_fuel(0, user)) - var/obj/item/stack/sheet/glass/NG = new (user.loc) - for(var/obj/item/stack/sheet/glass/G in user.loc) - if(G == NG) - continue - if(G.amount >= G.max_amount) - continue - G.attackby(NG, user) - to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.") - qdel(src) else return ..() +/obj/item/shard/welder_act(mob/living/user, obj/item/I) + if(I.use_tool(src, user, 0, volume=50)) + var/obj/item/stack/sheet/glass/NG = new (user.loc) + for(var/obj/item/stack/sheet/glass/G in user.loc) + if(G == NG) + continue + if(G.amount >= G.max_amount) + continue + G.attackby(NG, user) + to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.") + qdel(src) + return TRUE + /obj/item/shard/Crossed(mob/living/L) if(istype(L) && has_gravity(loc)) playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d12f787d7d..0c4e522107 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -25,7 +25,7 @@ /obj/item/stack/on_grind() for(var/i in 1 to grind_results.len) //This should only call if it's ground, so no need to check if grind_results exists - grind_results[grind_results[i]] *= amount //Gets the key at position i, then the reagent amount of that key, then multiplies it by stack size + grind_results[grind_results[i]] *= get_amount() //Gets the key at position i, then the reagent amount of that key, then multiplies it by stack size /obj/item/stack/grind_requirements() if(is_cyborg) @@ -247,7 +247,7 @@ return 0 return 1 -/obj/item/stack/proc/use(used, transfer = FALSE) // return 0 = borked; return 1 = had enough +/obj/item/stack/use(used, transfer = FALSE) // return 0 = borked; return 1 = had enough if(zero_amount()) return 0 if (is_cyborg) @@ -260,6 +260,20 @@ update_weight() return 1 +/obj/item/stack/tool_use_check(mob/living/user, amount) + if(get_amount() < amount) + if(singular_name) + if(amount > 1) + to_chat(user, "You need at least [amount] [singular_name]\s to do this!") + else + to_chat(user, "You need at least [amount] [singular_name] to do this!") + else + to_chat(user, "You need at least [amount] to do this!") + + return FALSE + + return TRUE + /obj/item/stack/proc/zero_amount() if(is_cyborg) return source.energy < cost diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index d51e01ffcb..4e15cea273 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -21,18 +21,15 @@ /obj/item/stack/tile/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(get_amount() < 4) to_chat(user, "You need at least four tiles to do this!") return - if(WT.is_hot() && !mineralType) + if(!mineralType) to_chat(user, "You can not reform this!") return - if(WT.remove_fuel(0,user)) - + if(W.use_tool(src, user, 0, volume=40)) if(mineralType == "plasma") atmos_spawn_air("plasma=5;TEMP=1000") user.visible_message("[user.name] sets the plasma tiles on fire!", \ diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 0f7bdd616c..1a0474b94d 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -34,17 +34,17 @@ /obj/item/storage/secure/attackby(obj/item/W, mob/user, params) if(locked) if (istype(W, /obj/item/screwdriver)) - if (do_after(user, 20*W.toolspeed, target = user)) + if (W.use_tool(src, user, 20)) open =! open to_chat(user, "You [open ? "open" : "close"] the service panel.") return - if (istype(W, /obj/item/wirecutters) || istype(W, /obj/item/card/emag)) + if (istype(W, /obj/item/wirecutters)) to_chat(user, "[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be pulsed.") if ((istype(W, /obj/item/device/multitool)) && (!l_hacking)) if(src.open == 1) to_chat(user, "Now attempting to reset internal memory, please hold.") src.l_hacking = 1 - if (do_after(usr, 400*W.toolspeed, target = user)) + if (W.use_tool(src, user, 400)) to_chat(user, "Internal memory reset - lock has been disengaged.") src.l_set = 0 src.l_hacking = 0 diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 945b738bd0..ea7a762b1e 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -16,7 +16,7 @@ materials = list(MAT_METAL=75) attack_verb = list("stabbed") hitsound = 'sound/weapons/bladeslice.ogg' - usesound = 'sound/items/screwdriver.ogg' + usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') tool_behaviour = TOOL_SCREWDRIVER toolspeed = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 992c01fc2b..7425835764 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -12,7 +12,7 @@ force = 3 throwforce = 5 hitsound = "swing_hit" - usesound = 'sound/items/welder.ogg' + usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') var/acti_sound = 'sound/items/welderactivate.ogg' var/deac_sound = 'sound/items/welderdeactivate.ogg' throw_speed = 3 @@ -73,7 +73,7 @@ damtype = "fire" ++burned_fuel_for if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) - remove_fuel(1) + use(1) update_icon() //This is to start fires. process() is only called if the welder is on. @@ -107,10 +107,10 @@ var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM) - if(src.remove_fuel(1)) - playsound(loc, usesound, 50, 1) + if(src.use_tool(H, user, 0, volume=50, amount=1)) if(user == H) - user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") + user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", + "You start fixing some of the dents on [H]'s [affecting.name].") if(!do_mob(user, H, 50)) return item_heal_robotic(H, user, 15, 0) @@ -125,8 +125,8 @@ reagents.trans_to(O, reagents.total_volume) to_chat(user, "You empty [src]'s fuel tank into [O].") update_icon() - if(welding) - remove_fuel(1) + if(isOn()) + use(1) var/turf/location = get_turf(user) location.hotspot_expose(700, 50, 1) if(get_fuel() <= 0) @@ -150,26 +150,23 @@ update_icon() -//Returns the amount of fuel in the welder +// Returns the amount of fuel in the welder /obj/item/weldingtool/proc/get_fuel() return reagents.get_reagent_amount("welding_fuel") -//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use() -/obj/item/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null) - if(!welding || !check_fuel()) - return 0 - if(amount) +// Uses fuel from the welding tool. +/obj/item/weldingtool/use(used = 0) + if(!isOn() || !check_fuel()) + return FALSE + + if(used) burned_fuel_for = 0 - if(get_fuel() >= amount) - reagents.remove_reagent("welding_fuel", amount) + if(get_fuel() >= used) + reagents.remove_reagent("welding_fuel", used) check_fuel() - if(M) - M.flash_act(light_intensity) return TRUE else - if(M) - to_chat(M, "You need more welding fuel to complete this task!") return FALSE @@ -231,6 +228,24 @@ /obj/item/weldingtool/proc/isOn() return welding +// When welding is about to start, run a normal tool_use_check, then flash a mob if it succeeds. +/obj/item/weldingtool/tool_start_check(mob/living/user, amount=0) + . = tool_use_check(user, amount) + if(. && user) + user.flash_act(light_intensity) + +// If welding tool ran out of fuel during a construction task, construction fails. +/obj/item/weldingtool/tool_use_check(mob/living/user, amount) + if(!isOn() || !check_fuel()) + to_chat(user, "[src] has to be on to complete this task!") + return FALSE + + if(get_fuel() >= amount) + return TRUE + else + to_chat(user, "You need more welding fuel to complete this task!") + return FALSE + /obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) @@ -260,10 +275,10 @@ to_chat(user, "You need one rod to start building a flamethrower!") /obj/item/weldingtool/ignition_effect(atom/A, mob/user) - if(welding && remove_fuel(1, user)) - . = "[user] casually lights [A] with [src], what a badass." + if(use_tool(A, user, 0, amount=1)) + return "[user] casually lights [A] with [src], what a badass." else - . = "" + return "" /obj/item/weldingtool/largetank name = "industrial welding tool" diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 9e5edcacbb..539a60986a 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -66,7 +66,7 @@ name = "crushed can" icon_state = "cola" resistance_flags = NONE - grind_results = list("aluminum" = 10) + grind_results = list("aluminium" = 10) /obj/item/trash/attack(mob/M, mob/living/user) return @@ -81,4 +81,4 @@ /obj/item/trash/coal/burn() visible_message("[src] fuses into a diamond! Someone wasn't so naughty after all...") new /obj/item/stack/ore/diamond(loc) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 5424724d32..4425dcff6c 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -32,13 +32,12 @@ if(state != EMPTY_CORE) to_chat(user, "The core must be empty to deconstruct it!") return - var/obj/item/weldingtool/WT = P - if(!WT.isOn()) - to_chat(user, "The welder must be on for this task!") + + if(!P.tool_start_check(user, amount=0)) return - playsound(loc, WT.usesound, 50, 1) + to_chat(user, "You start to deconstruct the frame...") - if(do_after(user, 20*P.toolspeed, target = src) && src && state == EMPTY_CORE && WT && WT.remove_fuel(0, user)) + if(P.use_tool(src, user, 20, volume=50) && state == EMPTY_CORE) to_chat(user, "You deconstruct the frame.") deconstruct(TRUE) return @@ -56,13 +55,13 @@ return if(CIRCUIT_CORE) if(istype(P, /obj/item/screwdriver)) - playsound(loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You screw the circuit board into place.") state = SCREWED_CORE update_icon() return if(istype(P, /obj/item/crowbar)) - playsound(loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You remove the circuit board.") state = EMPTY_CORE update_icon() @@ -71,7 +70,7 @@ return if(SCREWED_CORE) if(istype(P, /obj/item/screwdriver) && circuit) - playsound(loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You unfasten the circuit board.") state = CIRCUIT_CORE update_icon() @@ -93,7 +92,7 @@ if(brain) to_chat(user, "Get that [brain.name] out of there first!") else - playsound(loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You remove the cables.") state = SCREWED_CORE update_icon() @@ -152,7 +151,7 @@ return if(istype(P, /obj/item/crowbar) && brain) - playsound(loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You remove the brain.") brain.forceMove(loc) brain = null @@ -161,7 +160,7 @@ if(GLASS_CORE) if(istype(P, /obj/item/crowbar)) - playsound(loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You remove the glass panel.") state = CABLED_CORE update_icon() @@ -169,7 +168,7 @@ return if(istype(P, /obj/item/screwdriver)) - playsound(loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You connect the monitor.") if(brain) SSticker.mode.remove_antag_for_borging(brain.brainmob.mind) @@ -198,7 +197,7 @@ return if(istype(P, /obj/item/screwdriver)) - playsound(loc, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "You disconnect the monitor.") state = GLASS_CORE update_icon() diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index b4b05e20a8..e8f326856a 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -38,7 +38,7 @@ /obj/structure/bed/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) deconstruct(TRUE) else return ..() diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 913d22aa74..b60849028a 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -73,7 +73,7 @@ /obj/structure/chair/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) deconstruct() else if(istype(W, /obj/item/assembly/shock_kit)) if(!user.temporarilyRemoveItemFromInventory(W)) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 08700369b9..3ebac6f65f 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -29,7 +29,6 @@ var/cutting_tool = /obj/item/weldingtool var/open_sound = 'sound/machines/click.ogg' var/close_sound = 'sound/machines/click.ogg' - var/cutting_sound = 'sound/items/welder.ogg' var/material_drop = /obj/item/stack/sheet/metal var/material_drop_amount = 2 var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable. @@ -216,19 +215,18 @@ if(opened) if(istype(W, cutting_tool)) if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - to_chat(user, "You begin cutting \the [src] apart...") - playsound(loc, cutting_sound, 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(!opened || !WT.isOn()) - return - playsound(loc, cutting_sound, 50, 1) - user.visible_message("[user] slices apart \the [src].", - "You cut \the [src] apart with \the [WT].", - "You hear welding.") - deconstruct(TRUE) + if(!W.tool_start_check(user, amount=0)) return + + to_chat(user, "You begin cutting \the [src] apart...") + if(W.use_tool(src, user, 40, volume=50)) + if(!opened) + return + user.visible_message("[user] slices apart \the [src].", + "You cut \the [src] apart with \the [W].", + "You hear welding.") + deconstruct(TRUE) + return else // for example cardboard box is cut with wirecutters user.visible_message("[user] cut apart \the [src].", \ "You cut \the [src] apart with \the [W].") @@ -237,25 +235,23 @@ if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too return else if(istype(W, /obj/item/weldingtool) && can_weld_shut) - var/obj/item/weldingtool/WT = W - if(!WT.remove_fuel(0, user)) + if(!W.tool_start_check(user, amount=0)) return + to_chat(user, "You begin [welded ? "unwelding":"welding"] \the [src]...") - playsound(loc, 'sound/items/welder2.ogg', 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(opened || !WT.isOn()) + if(W.use_tool(src, user, 40, volume=50)) + if(opened) return - playsound(loc, WT.usesound, 50, 1) welded = !welded user.visible_message("[user] [welded ? "welds shut" : "unweldeds"] \the [src].", - "You [welded ? "weld" : "unwelded"] \the [src] with \the [WT].", + "You [welded ? "weld" : "unwelded"] \the [src] with \the [W].", "You hear welding.") update_icon() else if(istype(W, /obj/item/wrench) && anchorable) if(isinspace() && !anchored) return anchored = !anchored - playsound(src.loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) user.visible_message("[user] [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \ "You [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \ "You hear a ratchet.") diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 2eff5fe25a..a22ea805ea 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -10,7 +10,6 @@ can_weld_shut = 0 cutting_tool = /obj/item/wirecutters open_sound = "rustle" - cutting_sound = 'sound/items/poster_ripped.ogg' material_drop = /obj/item/stack/sheet/cardboard delivery_icon = "deliverybox" anchorable = FALSE @@ -68,6 +67,5 @@ move_speed_multiplier = 2 cutting_tool = /obj/item/weldingtool open_sound = 'sound/machines/click.ogg' - cutting_sound = 'sound/items/welder.ogg' material_drop = /obj/item/stack/sheet/plasteel #undef SNAKE_SPAM_TICKS diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index a41710ea7d..b0d8c89c59 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -105,6 +105,7 @@ icon_door = "black" /obj/structure/closet/wardrobe/chaplain_black/PopulateContents() + new /obj/item/clothing/accessory/pocketprotector/cosmetology(src) new /obj/item/clothing/under/rank/chaplain(src) new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/clothing/suit/nun(src) @@ -177,6 +178,7 @@ icon_door = "atmos_wardrobe" /obj/structure/closet/wardrobe/atmospherics_yellow/PopulateContents() + new /obj/item/clothing/accessory/pocketprotector(src) new /obj/item/storage/backpack/duffelbag/engineering(src) new /obj/item/storage/backpack/satchel/eng(src) new /obj/item/storage/backpack/industrial(src) @@ -193,6 +195,7 @@ icon_door = "yellow" /obj/structure/closet/wardrobe/engineering_yellow/PopulateContents() + new /obj/item/clothing/accessory/pocketprotector(src) new /obj/item/storage/backpack/duffelbag/engineering(src) new /obj/item/storage/backpack/industrial(src) new /obj/item/storage/backpack/satchel/eng(src) @@ -211,6 +214,7 @@ name = "medical doctor's wardrobe" /obj/structure/closet/wardrobe/white/medical/PopulateContents() + new /obj/item/clothing/accessory/pocketprotector(src) new /obj/item/storage/backpack/duffelbag/med(src) new /obj/item/storage/backpack/medic(src) new /obj/item/storage/backpack/satchel/med(src) @@ -318,6 +322,7 @@ icon_door = "white" /obj/structure/closet/wardrobe/science_white/PopulateContents() + new /obj/item/clothing/accessory/pocketprotector(src) new /obj/item/storage/backpack/science(src) new /obj/item/storage/backpack/science(src) new /obj/item/storage/backpack/satchel/tox(src) diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm index 4f385f43a5..4973cb2623 100644 --- a/code/game/objects/structures/crates_lockers/crates/bins.dm +++ b/code/game/objects/structures/crates_lockers/crates/bins.dm @@ -33,7 +33,7 @@ do_animate() else if(istype(W, /obj/item/wrench)) anchored = !anchored - playsound(src.loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) else return ..() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 5a506ace06..a4efc89701 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -96,13 +96,13 @@ else to_chat(user, "Access denied.") else if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP && !broken) - var/obj/item/weldingtool/WT = W - if(obj_integrity < max_integrity && WT.remove_fuel(5, user)) + if(obj_integrity < max_integrity) + if(!W.tool_start_check(user, amount=5)) + return + to_chat(user, "You begin repairing [src].") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, amount=5, volume=50)) obj_integrity = max_integrity - playsound(loc, 'sound/items/welder2.ogg', 50, 1) update_icon() to_chat(user, "You repair [src].") else @@ -117,7 +117,7 @@ qdel(src) else to_chat(user, "You start to [open ? "close":"open"] [src].") - if(do_after(user, 20*W.toolspeed, target = src)) + if(W.use_tool(src, user, 20)) to_chat(user, "You [open ? "close":"open"] [src].") toggle_lock(user) else if(open && !showpiece) @@ -177,15 +177,15 @@ /obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wrench)) //The player can only deconstruct the wooden frame to_chat(user, "You start disassembling [src]...") - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) + I.play_tool_sound(src) + if(I.use_tool(src, user, 30)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) new /obj/item/stack/sheet/mineral/wood(get_turf(src), 5) qdel(src) else if(istype(I, /obj/item/electronics/airlock)) to_chat(user, "You start installing the electronics into [src]...") - playsound(src.loc, I.usesound, 50, 1) + I.play_tool_sound(src) if(do_after(user, 30, target = src) && user.transferItemToLoc(I,src)) electronics = I to_chat(user, "You install the airlock electronics.") diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 22d00d6cab..dafd7dcd83 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -59,40 +59,34 @@ created_name = t else if(istype(W, /obj/item/weldingtool) && (mineral || glass || !anchored )) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - playsound(src, 'sound/items/welder2.ogg', 50, 1) - if(mineral) - var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]") - user.visible_message("[user] welds the [mineral] plating off the airlock assembly.", "You start to weld the [mineral] plating off the airlock assembly...") - if(do_after(user, 40 * WT.toolspeed, target = src)) - if(!src || !WT.isOn()) - return - to_chat(user, "You weld the [mineral] plating off.") - new mineral_path(loc, 2) - var/obj/structure/door_assembly/PA = new previous_assembly(loc) - transfer_assembly_vars(src, PA) + if(!W.tool_start_check(user, amount=0)) + return - else if(glass) - user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly...") - if(do_after(user, 40 * WT.toolspeed, target = src)) - if(!src || !WT.isOn()) - return - to_chat(user, "You weld the glass panel out.") - if(heat_proof_finished) - new /obj/item/stack/sheet/rglass(get_turf(src)) - heat_proof_finished = 0 - else - new /obj/item/stack/sheet/glass(get_turf(src)) - glass = 0 - else if(!anchored) - user.visible_message("[user] disassembles the airlock assembly.", \ - "You start to disassemble the airlock assembly...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!WT.isOn()) - return - to_chat(user, "You disassemble the airlock assembly.") - deconstruct(TRUE) + if(mineral) + var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]") + user.visible_message("[user] welds the [mineral] plating off the airlock assembly.", "You start to weld the [mineral] plating off the airlock assembly...") + if(W.use_tool(src, user, 40, volume=50)) + to_chat(user, "You weld the [mineral] plating off.") + new mineral_path(loc, 2) + var/obj/structure/door_assembly/PA = new previous_assembly(loc) + transfer_assembly_vars(src, PA) + + else if(glass) + user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly...") + if(W.use_tool(src, user, 40, volume=50)) + to_chat(user, "You weld the glass panel out.") + if(heat_proof_finished) + new /obj/item/stack/sheet/rglass(get_turf(src)) + heat_proof_finished = 0 + else + new /obj/item/stack/sheet/glass(get_turf(src)) + glass = 0 + else if(!anchored) + user.visible_message("[user] disassembles the airlock assembly.", \ + "You start to disassemble the airlock assembly...") + if(W.use_tool(src, user, 40, volume=50)) + to_chat(user, "You disassemble the airlock assembly.") + deconstruct(TRUE) else if(istype(W, /obj/item/wrench)) if(!anchored ) @@ -103,12 +97,11 @@ break if(door_check) - playsound(src, W.usesound, 100, 1) user.visible_message("[user] secures the airlock assembly to the floor.", \ "You start to secure the airlock assembly to the floor...", \ "You hear wrenching.") - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) if(anchored) return to_chat(user, "You secure the airlock assembly.") @@ -118,38 +111,34 @@ to_chat(user, "There is another door here!") else - playsound(src, W.usesound, 100, 1) user.visible_message("[user] unsecures the airlock assembly from the floor.", \ "You start to unsecure the airlock assembly from the floor...", \ "You hear wrenching.") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!anchored ) + if(W.use_tool(src, user, 40, volume=100)) + if(!anchored) return to_chat(user, "You unsecure the airlock assembly.") name = "airlock assembly" anchored = FALSE else if(istype(W, /obj/item/stack/cable_coil) && state == AIRLOCK_ASSEMBLY_NEEDS_WIRES && anchored ) - var/obj/item/stack/cable_coil/C = W - if (C.get_amount() < 1) - to_chat(user, "You need one length of cable to wire the airlock assembly!") + if(!W.tool_start_check(user, amount=1)) return + user.visible_message("[user] wires the airlock assembly.", \ "You start to wire the airlock assembly...") - if(do_after(user, 40, target = src)) - if(C.get_amount() < 1 || state != AIRLOCK_ASSEMBLY_NEEDS_WIRES) + if(W.use_tool(src, user, 40, amount=1)) + if(state != AIRLOCK_ASSEMBLY_NEEDS_WIRES) return - C.use(1) state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS to_chat(user, "You wire the airlock assembly.") name = "wired airlock assembly" else if(istype(W, /obj/item/wirecutters) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) - playsound(src, W.usesound, 100, 1) user.visible_message("[user] cuts the wires from the airlock assembly.", \ "You start to cut the wires from the airlock assembly...") - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) if(state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) return to_chat(user, "You cut the wires from the airlock assembly.") @@ -158,7 +147,7 @@ name = "secured airlock assembly" else if(istype(W, /obj/item/electronics/airlock) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) - playsound(src, W.usesound, 100, 1) + W.play_tool_sound(src, 100) user.visible_message("[user] installs the electronics into the airlock assembly.", \ "You start to install electronics into the airlock assembly...") if(do_after(user, 40, target = src)) @@ -174,11 +163,10 @@ else if(istype(W, /obj/item/crowbar) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) - playsound(src, W.usesound, 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", \ "You start to remove electronics from the airlock assembly...") - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) if(state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) return to_chat(user, "You remove the airlock electronics.") @@ -237,11 +225,10 @@ to_chat(user, "You cannot add [G] to [src]!") else if(istype(W, /obj/item/screwdriver) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) - playsound(src, W.usesound, 100, 1) user.visible_message("[user] finishes the airlock.", \ "You start finishing the airlock...") - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) if(loc && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) to_chat(user, "You finish the airlock.") var/obj/machinery/door/airlock/door diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 4e891d047f..790e0d1b66 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -6,18 +6,17 @@ density = TRUE anchored = TRUE -/obj/structure/dresser/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/wrench)) +/obj/structure/dresser/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wrench)) to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") - playsound(src, P.usesound, 50, 1) - if(do_after(user, 20, target = src)) + if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") anchored = !anchored else return ..() /obj/structure/dresser/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/mineral/wood (get_turf(src), 10) + new /obj/item/stack/sheet/mineral/wood(drop_location(), 10) qdel(src) /obj/structure/dresser/attack_hand(mob/user) diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index da99839e92..1e84ec3acf 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -13,7 +13,7 @@ /obj/structure/chair/e_chair/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/wrench)) var/obj/structure/chair/C = new /obj/structure/chair(loc) - playsound(loc, W.usesound, 50, 1) + W.play_tool_sound(src) C.setDir(dir) part.forceMove(loc) part.master = null diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index bb223b2e04..88ad622351 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -43,8 +43,8 @@ /obj/structure/extinguisher_cabinet/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wrench) && !stored_extinguisher) to_chat(user, "You start unsecuring [name]...") - playsound(loc, I.usesound, 50, 1) - if(do_after(user, 60*I.toolspeed, target = src)) + I.play_tool_sound(src) + if(I.use_tool(src, user, 60)) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You unsecure [name].") deconstruct(TRUE) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 2f17926a9b..dec4709550 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -109,15 +109,11 @@ else to_chat(user, "You can't reach, close it first!") - else if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) + else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.use_tool(src, user, 0, volume=50)) dismantle(user, TRUE) - else if(istype(W, /obj/item/gun/energy/plasmacutter)) - dismantle(user, TRUE) else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) - var/obj/item/pickaxe/drill/jackhammer/D = W - D.playDigSound() + W.play_tool_sound(src) dismantle(user, TRUE) else return ..() @@ -125,7 +121,7 @@ /obj/structure/falsewall/proc/dismantle(mob/user, disassembled=TRUE, obj/item/tool = null) user.visible_message("[user] dismantles the false wall.", "You dismantle the false wall.") if(tool) - playsound(src, tool.usesound, 100, 1) + tool.play_tool_sound(src, 100) else playsound(src, 'sound/items/welder.ogg', 100, 1) deconstruct(disassembled) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index afcd855caf..a75056c31a 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -25,13 +25,13 @@ if(iscyborg(user) || istype(I, /obj/item/device/multitool)) toggle_lock(user) else if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP && !broken) - var/obj/item/weldingtool/WT = I - if(obj_integrity < max_integrity && WT.remove_fuel(2, user)) + if(obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=2)) + return + to_chat(user, "You begin repairing [src].") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*I.toolspeed, target = src)) + if(I.use_tool(src, user, 40, volume=50, amount=2)) obj_integrity = max_integrity - playsound(loc, 'sound/items/welder2.ogg', 50, 1) update_icon() to_chat(user, "You repair [src].") else diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 5c119fd3c1..5ac250408f 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -13,13 +13,12 @@ /obj/structure/fluff/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/wrench) && deconstructible) user.visible_message("[user] starts disassembling [src]...", "You start disassembling [src]...") - playsound(user, I.usesound, 50, 1) - if(!do_after(user, 50, target = src)) - return 0 - user.visible_message("[user] disassembles [src]!", "You break down [src] into scrap metal.") - playsound(user, 'sound/items/deconstruct.ogg', 50, 1) - new/obj/item/stack/sheet/metal(get_turf(src)) - qdel(src) + I.play_tool_sound(src) + if(I.use_tool(src, user, 50)) + user.visible_message("[user] disassembles [src]!", "You break down [src] into scrap metal.") + playsound(user, 'sound/items/deconstruct.ogg', 50, 1) + new/obj/item/stack/sheet/metal(drop_location()) + qdel(src) return ..() diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 66124f8b6d..05935a6d48 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -34,18 +34,16 @@ if(istype(W, /obj/item/gun/energy/plasmacutter)) to_chat(user, "You start slicing apart the girder...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) to_chat(user, "You slice apart the girder.") var/obj/item/stack/sheet/metal/M = new (loc, 2) M.add_fingerprint(user) qdel(src) else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) - var/obj/item/pickaxe/drill/jackhammer/D = W to_chat(user, "You smash through the girder!") new /obj/item/stack/sheet/metal(get_turf(src)) - D.playDigSound() + W.play_tool_sound(src) qdel(src) @@ -68,7 +66,7 @@ return to_chat(user, "You start building a reinforced false wall...") if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You create a false wall. Push on it to open or close the passage.") @@ -80,8 +78,8 @@ to_chat(user, "You need at least five rods to add plating!") return to_chat(user, "You start adding plating...") - if (do_after(user, 40, target = src)) - if(!src.loc || !S || S.get_amount() < 5) + if(do_after(user, 40, target = src)) + if(S.get_amount() < 5) return S.use(5) to_chat(user, "You add the plating.") @@ -102,7 +100,7 @@ return to_chat(user, "You start building a false wall...") if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You create a false wall. Push on it to open or close the passage.") @@ -115,7 +113,7 @@ return to_chat(user, "You start adding plating...") if (do_after(user, 40, target = src)) - if(loc == null || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You add the plating.") @@ -132,7 +130,7 @@ return to_chat(user, "You start building a reinforced false wall...") if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You create a reinforced false wall. Push on it to open or close the passage.") @@ -145,7 +143,7 @@ return to_chat(user, "You start finalizing the reinforced wall...") if(do_after(user, 50, target = src)) - if(!src.loc || !S || S.get_amount() < 1) + if(S.get_amount() < 1) return S.use(1) to_chat(user, "You fully reinforce the wall.") @@ -158,8 +156,8 @@ if(S.get_amount() < 1) return to_chat(user, "You start reinforcing the girder...") - if (do_after(user, 60, target = src)) - if(!src.loc || !S || S.get_amount() < 1) + if(do_after(user, 60, target = src)) + if(S.get_amount() < 1) return S.use(1) to_chat(user, "You reinforce the girder.") @@ -175,7 +173,7 @@ to_chat(user, "You need at least two sheets to create a false wall!") return if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You create a false wall. Push on it to open or close the passage.") @@ -189,7 +187,7 @@ return to_chat(user, "You start adding plating...") if (do_after(user, 40, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You add the plating.") @@ -214,11 +212,10 @@ /obj/structure/girder/screwdriver_act(mob/user, obj/item/tool) . = FALSE if(state == GIRDER_DISPLACED) - playsound(src, tool.usesound, 100, 1) user.visible_message("[user] disassembles the girder.", "You start to disassemble the girder...", "You hear clanking and banging noises.") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) if(state != GIRDER_DISPLACED) return state = GIRDER_DISASSEMBLED @@ -226,65 +223,60 @@ var/obj/item/stack/sheet/metal/M = new (loc, 2) M.add_fingerprint(user) qdel(src) - return TRUE + return TRUE else if(state == GIRDER_REINF) - playsound(src, tool.usesound, 100, 1) to_chat(user, "You start unsecuring support struts...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) if(state != GIRDER_REINF) return to_chat(user, "You unsecure the support struts.") state = GIRDER_REINF_STRUTS - return TRUE + return TRUE else if(state == GIRDER_REINF_STRUTS) - playsound(src, tool.usesound, 100, 1) to_chat(user, "You start securing support struts...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) if(state != GIRDER_REINF_STRUTS) return to_chat(user, "You secure the support struts.") state = GIRDER_REINF - return TRUE + return TRUE // Wirecutter behavior for girders /obj/structure/girder/wirecutter_act(mob/user, obj/item/tool) . = FALSE if(state == GIRDER_REINF_STRUTS) - playsound(src.loc, tool.usesound, 100, 1) to_chat(user, "You start removing the inner grille...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) to_chat(user, "You remove the inner grille.") new /obj/item/stack/sheet/plasteel(get_turf(src)) var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) qdel(src) - return TRUE + return TRUE /obj/structure/girder/wrench_act(mob/user, obj/item/tool) . = FALSE if(state == GIRDER_DISPLACED) if(!isfloorturf(loc)) to_chat(user, "A floor must be present to secure the girder!") - return - playsound(src, tool.usesound, 100, 1) + to_chat(user, "You start securing the girder...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) to_chat(user, "You secure the girder.") var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) qdel(src) - return TRUE + return TRUE else if(state == GIRDER_NORMAL && can_displace) - playsound(src, tool.usesound, 100, 1) to_chat(user, "You start unsecuring the girder...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) to_chat(user, "You unsecure the girder.") var/obj/structure/girder/displaced/D = new (loc) transfer_fingerprints_to(D) qdel(src) - return TRUE + return TRUE /obj/structure/girder/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGRILLE)) @@ -348,41 +340,25 @@ add_fingerprint(user) if(istype(W, /obj/item/melee/cultblade/dagger) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].") - var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) - R.amount = 1 + new /obj/item/stack/sheet/runed_metal(drop_location(), 1) qdel(src) - else if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - playsound(src.loc, W.usesound, 50, 1) - to_chat(user, "You start slicing apart the girder...") - if(do_after(user, 40*W.toolspeed, target = src)) - if( !WT.isOn() ) - return - to_chat(user, "You slice apart the girder.") - var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) - R.amount = 1 - transfer_fingerprints_to(R) - qdel(src) + else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return - else if(istype(W, /obj/item/gun/energy/plasmacutter)) to_chat(user, "You start slicing apart the girder...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=50)) to_chat(user, "You slice apart the girder.") - var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) - R.amount = 1 + var/obj/item/stack/sheet/runed_metal/R = new(drop_location(), 1) transfer_fingerprints_to(R) qdel(src) else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) - var/obj/item/pickaxe/drill/jackhammer/D = W to_chat(user, "Your jackhammer smashes through the girder!") - var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) - R.amount = 2 + var/obj/item/stack/sheet/runed_metal/R = new(drop_location(), 2) transfer_fingerprints_to(R) - D.playDigSound() + W.play_tool_sound(src) qdel(src) else if(istype(W, /obj/item/stack/sheet/runed_metal)) @@ -392,7 +368,7 @@ return 0 user.visible_message("[user] begins laying runed metal on [src]...", "You begin constructing a runed wall...") if(do_after(user, 50, target = src)) - if(R.get_amount() < 1 || !R) + if(R.get_amount() < 1) return user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.") R.use(1) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 270223f9a8..733ec9952b 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -137,11 +137,11 @@ add_fingerprint(user) if(istype(W, /obj/item/wirecutters)) if(!shock(user, 100)) - playsound(src, W.usesound, 100, 1) + W.play_tool_sound(src, 100) deconstruct() else if((istype(W, /obj/item/screwdriver)) && (isturf(loc) || anchored)) if(!shock(user, 90)) - playsound(src, W.usesound, 100, 1) + W.play_tool_sound(src, 100) anchored = !anchored user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src].", \ "You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.") diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 0f12f847d7..a6f9ecb68f 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -82,7 +82,7 @@ mybag.attackby(I, user) else if(istype(I, /obj/item/crowbar)) user.visible_message("[user] begins to empty the contents of [src].", "You begin to empty the contents of [src]...") - if(do_after(user, 30*I.toolspeed, target = src)) + if(I.use_tool(src, user, 30)) to_chat(usr, "You empty the contents of [src]'s bucket onto the floor.") reagents.reaction(src.loc) src.reagents.clear_reagents() diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 415024d2e0..0639ce26ab 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -23,18 +23,13 @@ transfer_fingerprints_to(F) qdel(src) else if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(!WT.remove_fuel(0, user)) + if(!I.tool_start_check(user, amount=0)) return to_chat(user, "You begin cutting \the [src] apart...") - playsound(src.loc, WT.usesound, 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(!WT.isOn()) - return - playsound(src.loc, WT.usesound, 50, 1) + if(I.use_tool(src, user, 50, volume=50)) visible_message("[user] slices apart \the [src].", - "You cut \the [src] apart with \the [WT].", - "You hear welding.") + "You cut \the [src] apart with \the [I].", + "You hear welding.") new /obj/item/stack/sheet/metal(src.loc, 4) qdel(src) return @@ -56,18 +51,15 @@ /obj/structure/kitchenspike/attack_paw(mob/user) return src.attack_hand(usr) +/obj/structure/kitchenspike/crowbar_act(mob/living/user, obj/item/I) + if(has_buckled_mobs()) + to_chat(user, "You can't do that while something's on the spike!") + return TRUE -/obj/structure/kitchenspike/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/crowbar)) - if(!has_buckled_mobs()) - playsound(loc, I.usesound, 100, 1) - if(do_after(user, 20*I.toolspeed, target = src)) - to_chat(user, "You pry the spikes out of the frame.") - deconstruct(TRUE) - else - to_chat(user, "You can't do that while something's on the spike!") - else - return ..() + if(I.use_tool(src, user, 20, volume=100)) + to_chat(user, "You pry the spikes out of the frame.") + deconstruct(TRUE) + return TRUE /obj/structure/kitchenspike/attack_hand(mob/user) if(VIABLE_MOB_CHECK(user.pulling) && user.a_intent == INTENT_GRAB && !has_buckled_mobs()) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 924ccfb3b2..f0168694f0 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -59,23 +59,24 @@ new /obj/item/shard( src.loc ) qdel(src) -/obj/structure/mirror/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) - var/obj/item/weldingtool/WT = I - if(broken) - user.changeNext_move(CLICK_CD_MELEE) - if(WT.remove_fuel(0, user)) - to_chat(user, "You begin repairing [src]...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 10*I.toolspeed, target = src)) - if(!user || !WT || !WT.isOn()) - return - to_chat(user, "You repair [src].") - broken = 0 - icon_state = initial(icon_state) - desc = initial(desc) - else - return ..() +/obj/structure/mirror/welder_act(mob/living/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return FALSE + + if(!broken) + return TRUE + + if(!I.tool_start_check(user, amount=0)) + return TRUE + + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 10, volume=50)) + to_chat(user, "You repair [src].") + broken = 0 + icon_state = initial(icon_state) + desc = initial(desc) + + return TRUE /obj/structure/mirror/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 91c42f41af..e6cc6a15f6 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -359,4 +359,4 @@ GLOBAL_LIST_EMPTY(crematoriums) . = !density if(ismovableatom(caller)) var/atom/movable/mover = caller - . = . || (mover.pass_flags & PASSTABLE) \ No newline at end of file + . = . || (mover.pass_flags & PASSTABLE) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index a73824ca2b..b3b3d55381 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -370,25 +370,6 @@ user.set_machine(src) song.interact(user) -/obj/structure/piano/attackby(obj/item/O, mob/user, params) - if (istype(O, /obj/item/wrench)) - if (!anchored && !isinspace()) - playsound(src, O.usesound, 50, 1) - to_chat(user, " You begin to tighten \the [src] to the floor...") - if (do_after(user, 20*O.toolspeed, target = src)) - user.visible_message( \ - "[user] tightens \the [src]'s casters.", \ - "You tighten \the [src]'s casters. Now it can be played again.", \ - "You hear ratchet.") - anchored = TRUE - else if(anchored) - playsound(src, O.usesound, 50, 1) - to_chat(user, " You begin to loosen \the [src]'s casters...") - if (do_after(user, 40*O.toolspeed, target = src)) - user.visible_message( \ - "[user] loosens \the [src]'s casters.", \ - "You loosen \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") - anchored = FALSE - else - return ..() +/obj/structure/piano/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 40) + return TRUE diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index d0d8989e04..99903901bd 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -21,18 +21,16 @@ add_fingerprint(user) if(istype(W, /obj/item/screwdriver)) if(state == PLASTIC_FLAPS_NORMAL) - playsound(src.loc, W.usesound, 100, 1) user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.") - if(do_after(user, 100*W.toolspeed, target = src)) + if(W.use_tool(src, user, 100, volume=100)) if(state != PLASTIC_FLAPS_NORMAL) return state = PLASTIC_FLAPS_DETACHED anchored = FALSE to_chat(user, "You unscrew [src] from the floor.") else if(state == PLASTIC_FLAPS_DETACHED) - playsound(src.loc, W.usesound, 100, 1) user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.") - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) if(state != PLASTIC_FLAPS_DETACHED) return state = PLASTIC_FLAPS_NORMAL @@ -40,9 +38,8 @@ to_chat(user, "You screw [src] from the floor.") else if(istype(W, /obj/item/wirecutters)) if(state == PLASTIC_FLAPS_DETACHED) - playsound(src.loc, W.usesound, 100, 1) user.visible_message("[user] cuts apart [src].", "You start to cut apart [src].", "You hear cutting.") - if(do_after(user, 50*W.toolspeed, target = src)) + if(W.use_tool(src, user, 50, volume=100)) if(state != PLASTIC_FLAPS_DETACHED) return to_chat(user, "You cut apart [src].") diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index c8ef972a63..3d9789785c 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -81,7 +81,7 @@ if(istype(W, /obj/item/screwdriver)) can_rotate = !can_rotate to_chat(user, "You [can_rotate ? "unlock" : "lock"] [src]'s rotation.") - playsound(src, W.usesound, 50, 1) + W.play_tool_sound(src) return if(istype(W, /obj/item/wrench)) @@ -89,47 +89,46 @@ to_chat(user, "Unweld [src] from the floor first!") return user.visible_message("[user] starts to dismantle [src].", "You start to dismantle [src]...") - if(do_after(user, 80*W.toolspeed, target = src)) - playsound(src, W.usesound, 50, 1) + if(W.use_tool(src, user, 80, volume=50)) to_chat(user, "You dismantle [src].") new framebuildstacktype(drop_location(), framebuildstackamount) if(buildstackamount) new buildstacktype(drop_location(), buildstackamount) qdel(src) else if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(obj_integrity < max_integrity) - if(WT.remove_fuel(0,user)) - user.visible_message("[user] starts to repair [src].", - "You begin repairing [src]...", - "You hear welding.") - playsound(src, W.usesound, 40, 1) - if(do_after(user,40*WT.toolspeed, target = src)) - obj_integrity = max_integrity - user.visible_message("[user] has repaired [src].", \ - "You finish repairing [src].") + if(!W.tool_start_check(user, amount=0)) + return + + user.visible_message("[user] starts to repair [src].", + "You begin repairing [src]...", + "You hear welding.") + if(W.use_tool(src, user, 40, volume=40)) + obj_integrity = max_integrity + user.visible_message("[user] has repaired [src].", \ + "You finish repairing [src].") else if(!anchored) - if (WT.remove_fuel(0,user)) - playsound(src, W.usesound, 50, 1) - user.visible_message("[user] starts to weld [src] to the floor.", - "You start to weld [src] to the floor...", - "You hear welding.") - if (do_after(user,20*W.toolspeed, target = src)) - if(!WT.isOn()) - return - anchored = TRUE - to_chat(user, "You weld [src] to the floor.") + if(!W.tool_start_check(user, amount=0)) + return + + user.visible_message("[user] starts to weld [src] to the floor.", + "You start to weld [src] to the floor...", + "You hear welding.") + if (W.use_tool(src, user, 20, volume=50)) + anchored = TRUE + to_chat(user, "You weld [src] to the floor.") else - if (WT.remove_fuel(0,user)) - playsound(src, W.usesound, 50, 1) - user.visible_message("[user] starts to cut [src] free from the floor.", "You start to cut [src] free from the floor...", "You hear welding.") - if (do_after(user,20*W.toolspeed, target = src)) - if(!WT.isOn()) - return - anchored = FALSE - to_chat(user, "You cut [src] free from the floor.") + if(!W.tool_start_check(user, amount=0)) + return + + user.visible_message("[user] starts to cut [src] free from the floor.", + "You start to cut [src] free from the floor...", + "You hear welding.") + if (W.use_tool(src, user, 20, volume=50)) + anchored = FALSE + to_chat(user, "You cut [src] free from the floor.") + //Finishing the frame else if(istype(W, /obj/item/stack/sheet)) if(finished) diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index 0aa447ca58..a976c2e3fe 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -112,18 +112,17 @@ if(istype(W, /obj/item/screwdriver) && !anchored) if(deconstruction_state == SHOWCASE_SCREWDRIVERED) to_chat(user, "You screw the screws back into the showcase.") - playsound(loc, W.usesound, 100, 1) + W.play_tool_sound(src, 100) deconstruction_state = SHOWCASE_CONSTRUCTED else if (deconstruction_state == SHOWCASE_CONSTRUCTED) to_chat(user, "You unscrew the screws.") - playsound(loc, W.usesound, 100, 1) + W.play_tool_sound(src, 100) deconstruction_state = SHOWCASE_SCREWDRIVERED if(istype(W, /obj/item/crowbar) && deconstruction_state == SHOWCASE_SCREWDRIVERED) - if(do_after(user, 20*W.toolspeed, target = src)) - playsound(loc, W.usesound, 100, 1) + if(W.use_tool(src, user, 20, volume=100)) to_chat(user, "You start to crowbar the showcase apart...") - new /obj/item/stack/sheet/metal (get_turf(src), 4) + new /obj/item/stack/sheet/metal(drop_location(), 4) qdel(src) if(deconstruction_state == SHOWCASE_CONSTRUCTED && default_unfasten_wrench(user, W)) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index 382858dd53..c3547116fd 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -27,21 +27,21 @@ if(BURN) playsound(loc, 'sound/items/welder.ogg', 80, 1) -/obj/structure/sign/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/wrench) && buildable_sign) +/obj/structure/sign/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wrench) && buildable_sign) user.visible_message("[user] starts removing [src]...", \ "You start unfastening [src].") - playsound(src, O.usesound, 50, 1) - if(!do_after(user, 30*O.toolspeed, target = src)) - return - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) - user.visible_message("[user] unfastens [src].", \ - "You unfasten [src].") - var/obj/item/sign_backing/SB = new (get_turf(user)) - SB.icon_state = icon_state - SB.sign_path = type - qdel(src) - else if(istype(O, /obj/item/pen) && buildable_sign) + I.play_tool_sound(src) + if(I.use_tool(src, user, 40)) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + user.visible_message("[user] unfastens [src].", \ + "You unfasten [src].") + var/obj/item/sign_backing/SB = new (get_turf(user)) + SB.icon_state = icon_state + SB.sign_path = type + qdel(src) + return + else if(istype(I, /obj/item/pen) && buildable_sign) var/list/sign_types = list("Secure Area", "Biohazard", "High Voltage", "Radiation", "Hard Vacuum Ahead", "Disposal: Leads To Space", "Danger: Fire", "No Smoking", "Medbay", "Science", "Chemistry", \ "Hydroponics", "Xenobiology") var/obj/structure/sign/sign_type diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 67b42c128c..9aebbd955b 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -18,11 +18,10 @@ user.changeNext_move(CLICK_CD_MELEE) if(istype(W, /obj/item/wrench)) if(anchored) - playsound(src.loc, W.usesound, 100, 1) user.visible_message("[user] is loosening the [name]'s bolts.", \ "You are loosening the [name]'s bolts...") - if(do_after(user,40*W.toolspeed, target = src)) - if(!src.loc || !anchored) + if(W.use_tool(src, user, 40, volume=100)) + if(!anchored) return user.visible_message("[user] loosened the [name]'s bolts!", \ "You loosen the [name]'s bolts!") @@ -31,44 +30,28 @@ if(!isfloorturf(src.loc)) user.visible_message("A floor must be present to secure the [name]!") return - playsound(src.loc, W.usesound, 100, 1) user.visible_message("[user] is securing the [name]'s bolts...", \ "You are securing the [name]'s bolts...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src.loc || anchored) + if(W.use_tool(src, user, 40, volume=100)) + if(anchored) return user.visible_message("[user] has secured the [name]'s bolts.", \ "You have secured the [name]'s bolts.") anchored = TRUE - else if(istype(W, /obj/item/gun/energy/plasmacutter)) - playsound(src, 'sound/items/welder.ogg', 100, 1) - user.visible_message("[user] is slicing apart the [name]...", \ - "You are slicing apart the [name]...") - if(do_after(user,40*W.toolspeed, target = src)) - if(!src.loc) - return - user.visible_message("[user] slices apart the [name].", \ - "You slice apart the [name].") - deconstruct(TRUE) - else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) - var/obj/item/pickaxe/drill/jackhammer/D = W - if(!src.loc) - return - user.visible_message("[user] destroys the [name]!", \ + user.visible_message("[user] destroys the [name]!", "You destroy the [name].") - D.playDigSound() + W.play_tool_sound(src) qdel(src) - else if(istype(W, /obj/item/weldingtool) && !anchored) - playsound(loc, W.usesound, 40, 1) + else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return FALSE + user.visible_message("[user] is slicing apart the [name].", \ "You are slicing apart the [name]...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src.loc) - return - playsound(loc, 'sound/items/welder2.ogg', 50, 1) + if(W.use_tool(src, user, 40, volume=50)) user.visible_message("[user] slices apart the [name].", \ "You slice apart the [name]!") deconstruct(TRUE) diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index 268c30b88d..2b503f4200 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -24,8 +24,8 @@ /obj/structure/table_frame/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wrench)) to_chat(user, "You start disassembling [src]...") - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) + I.play_tool_sound(src) + if(I.use_tool(src, user, 30)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) deconstruct(TRUE) else if(istype(I, /obj/item/stack/sheet/plasteel)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index e3c88b937b..1a00c90b05 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -95,23 +95,19 @@ pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ "[user] pushes [pushed_mob] onto [src].") add_logs(user, pushed_mob, "pushed") - var/mob/living/carbon/human/H = pushed_mob - if(istype(H) && H.ckey == "kevinz000") - H.forcesay("*moan") + /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) if(istype(I, /obj/item/screwdriver) && deconstruction_ready) to_chat(user, "You start disassembling [src]...") - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE) return if(istype(I, /obj/item/wrench) && deconstruction_ready) to_chat(user, "You start deconstructing [src]...") - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 40*I.toolspeed, target = src)) + if(I.use_tool(src, user, 40, volume=50)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) deconstruct(TRUE, 1) return @@ -309,23 +305,19 @@ /obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - playsound(src.loc, W.usesound, 50, 1) - if(deconstruction_ready) - to_chat(user, "You start strengthening the reinforced table...") - if (do_after(user, 50*W.toolspeed, target = src)) - if(!src || !WT.isOn()) - return - to_chat(user, "You strengthen the table.") - deconstruction_ready = 0 - else - to_chat(user, "You start weakening the reinforced table...") - if (do_after(user, 50*W.toolspeed, target = src)) - if(!src || !WT.isOn()) - return - to_chat(user, "You weaken the table.") - deconstruction_ready = 1 + if(!W.tool_start_check(user, amount=0)) + return + + if(deconstruction_ready) + to_chat(user, "You start strengthening the reinforced table...") + if (W.use_tool(src, user, 50, volume=50)) + to_chat(user, "You strengthen the table.") + deconstruction_ready = 0 + else + to_chat(user, "You start weakening the reinforced table...") + if (W.use_tool(src, user, 50, volume=50)) + to_chat(user, "You weaken the table.") + deconstruction_ready = 1 else . = ..() @@ -449,7 +441,7 @@ /obj/structure/rack/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) deconstruct(TRUE) return if(user.a_intent == INTENT_HARM) diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index f701d92360..a958cc2fb6 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -42,8 +42,7 @@ to_chat(user, "Remove the pod first!") return user.visible_message("[user] starts to deattach \the [src].", "You start to deattach the [name]...") - playsound(src.loc, W.usesound, 50, 1) - if(do_after(user, 35*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=50)) to_chat(user, "You deattach the [name].") var/obj/structure/c_transit_tube/R = new tube_construction(loc) R.setDir(dir) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index 7df9e104a4..883cd8e4bb 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -28,22 +28,17 @@ build_type = flipped_build_type else build_type = initial(build_type) - icon_state = "[base_icon][flipped]" + icon_state = "[base_icon][flipped]" -/obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) - to_chat(user, "You start attaching the [name]...") - add_fingerprint(user) - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 40*I.toolspeed, target = src)) - if(QDELETED(src)) - return - to_chat(user, "You attach the [name].") - var/obj/structure/transit_tube/R = new build_type(loc, dir) - transfer_fingerprints_to(R) - qdel(src) - else - return ..() +/obj/structure/c_transit_tube/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You start attaching the [name]...") + add_fingerprint(user) + if(I.use_tool(src, user, 40, volume=50)) + to_chat(user, "You attach the [name].") + var/obj/structure/transit_tube/R = new build_type(loc, dir) + transfer_fingerprints_to(R) + qdel(src) + return TRUE // transit tube station /obj/structure/c_transit_tube/station diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index eabe4499a4..03082cd4ba 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -30,7 +30,7 @@ /obj/structure/transit_tube_pod/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/crowbar)) if(!moving) - playsound(src.loc, I.usesound, 50, 1) + I.play_tool_sound(src) if(contents.len) user.visible_message("[user] empties \the [src].", "You empty \the [src].") empty_pod() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index d4fbb60b2d..29a98c5554 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -75,7 +75,7 @@ if(istype(I, /obj/item/crowbar)) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...") playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) + if(I.use_tool(src, user, 30)) user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern update_icon() @@ -159,13 +159,7 @@ ..() /obj/structure/urinal/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/screwdriver)) - to_chat(user, "You start to [exposed ? "screw the cap back into place" : "unscrew the cap to the drain protector"]...") - playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) - if(do_after(user, 20*I.toolspeed, target = src)) - user.visible_message("[user] [exposed ? "screws the cap back into place" : "unscrew the cap to the drain protector"]!", "You [exposed ? "screw the cap back into place" : "unscrew the cap on the drain"]!", "You hear metal and squishing noises.") - exposed = !exposed - else if(exposed) + if(exposed) if (hiddenitem) to_chat(user, "There is already something in the drain enclosure.") return @@ -177,6 +171,18 @@ return hiddenitem = I to_chat(user, "You place [I] into the drain enclosure.") + else + return ..() + +/obj/structure/urinal/screwdriver_act(mob/living/user, obj/item/I) + to_chat(user, "You start to [exposed ? "screw the cap back into place" : "unscrew the cap to the drain protector"]...") + playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) + if(I.use_tool(src, user, 20)) + user.visible_message("[user] [exposed ? "screws the cap back into place" : "unscrew the cap to the drain protector"]!", + "You [exposed ? "screw the cap back into place" : "unscrew the cap on the drain"]!", + "You hear metal and squishing noises.") + exposed = !exposed + return TRUE /obj/item/reagent_containers/food/urinalcake @@ -247,19 +253,23 @@ /obj/machinery/shower/attackby(obj/item/I, mob/user, params) if(I.type == /obj/item/device/analyzer) to_chat(user, "The water temperature seems to be [watertemp].") - if(istype(I, /obj/item/wrench)) - to_chat(user, "You begin to adjust the temperature valve with \the [I]...") - if(do_after(user, 50*I.toolspeed, target = src)) - switch(watertemp) - if("normal") - watertemp = "freezing" - if("freezing") - watertemp = "boiling" - if("boiling") - watertemp = "normal" - user.visible_message("[user] adjusts the shower with \the [I].", "You adjust the shower with \the [I] to [watertemp] temperature.") - log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])") - add_hiddenprint(user) + else + return ..() + +/obj/machinery/shower/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You begin to adjust the temperature valve with \the [I]...") + if(I.use_tool(src, user, 50)) + switch(watertemp) + if("normal") + watertemp = "freezing" + if("freezing") + watertemp = "boiling" + if("boiling") + watertemp = "normal" + user.visible_message("[user] adjusts the shower with \the [I].", "You adjust the shower with \the [I] to [watertemp] temperature.") + log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])") + add_hiddenprint(user) + return TRUE /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up @@ -611,34 +621,24 @@ /obj/structure/curtain/attackby(obj/item/W, mob/user) if (istype(W, /obj/item/toy/crayon)) color = input(user,"","Choose Color",color) as color - else if(istype(W, /obj/item/screwdriver)) - if(anchored) - playsound(src.loc, W.usesound, 100, 1) - user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.") - if(do_after(user, 50*W.toolspeed, target = src)) - if(!anchored) - return - anchored = FALSE - to_chat(user, "You unscrew [src] from the floor.") - else - playsound(src.loc, W.usesound, 100, 1) - user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.") - if(do_after(user, 50*W.toolspeed, target = src)) - if(anchored) - return - anchored = TRUE - to_chat(user, "You screw [src] to the floor.") - else if(istype(W, /obj/item/wirecutters)) - if(!anchored) - playsound(src.loc, W.usesound, 100, 1) - user.visible_message("[user] cuts apart [src].", "You start to cut apart [src].", "You hear cutting.") - if(do_after(user, 50*W.toolspeed, target = src)) - if(anchored) - return - to_chat(user, "You cut apart [src].") - deconstruct() else - . = ..() + return ..() + +/obj/structure/curtain/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 50) + return TRUE + +/obj/structure/curtain/wirecutter_act(mob/living/user, obj/item/I) + if(anchored) + return TRUE + + user.visible_message("[user] cuts apart [src].", + "You start to cut apart [src].", "You hear cutting.") + if(I.use_tool(src, user, 50, volume=100) && !anchored) + to_chat(user, "You cut apart [src].") + deconstruct() + + return TRUE /obj/structure/curtain/attack_hand(mob/user) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 23a1113665..c819490a12 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -87,36 +87,34 @@ add_fingerprint(user) switch(state) if("01") - if(istype(W, /obj/item/weldingtool) && !anchored ) - var/obj/item/weldingtool/WT = W - if (WT.remove_fuel(0,user)) - user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly...") - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || !WT.isOn()) - return - to_chat(user, "You disassemble the windoor assembly.") - var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) - RG.add_fingerprint(user) - if(secure) - var/obj/item/stack/rods/R = new (get_turf(src), 4) - R.add_fingerprint(user) - qdel(src) - else + if(istype(W, /obj/item/weldingtool) && !anchored) + if(!W.tool_start_check(user, amount=0)) return + user.visible_message("[user] disassembles the windoor assembly.", + "You start to disassemble the windoor assembly...") + + if(W.use_tool(src, user, 40, volume=50)) + to_chat(user, "You disassemble the windoor assembly.") + var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) + RG.add_fingerprint(user) + if(secure) + var/obj/item/stack/rods/R = new (get_turf(src), 4) + R.add_fingerprint(user) + qdel(src) + return + //Wrenching an unsecure assembly anchors it in place. Step 4 complete if(istype(W, /obj/item/wrench) && !anchored) for(var/obj/machinery/door/window/WD in loc) if(WD.dir == dir) to_chat(user, "There is already a windoor in that location!") return - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...") + user.visible_message("[user] secures the windoor assembly to the floor.", + "You start to secure the windoor assembly to the floor...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || anchored) + if(W.use_tool(src, user, 40, volume=100)) + if(anchored) return for(var/obj/machinery/door/window/WD in loc) if(WD.dir == dir) @@ -131,11 +129,11 @@ //Unwrenching an unsecure assembly un-anchors it. Step 4 undone else if(istype(W, /obj/item/wrench) && anchored) - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...") + user.visible_message("[user] unsecures the windoor assembly to the floor.", + "You start to unsecure the windoor assembly to the floor...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || !anchored) + if(W.use_tool(src, user, 40, volume=100)) + if(!anchored) return to_chat(user, "You unsecure the windoor assembly.") anchored = FALSE @@ -188,11 +186,10 @@ //Removing wire from the assembly. Step 5 undone. if(istype(W, /obj/item/wirecutters)) - playsound(loc, W.usesound, 100, 1) user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || state != "02") + if(W.use_tool(src, user, 40, volume=100)) + if(state != "02") return to_chat(user, "You cut the windoor wires.") @@ -207,8 +204,9 @@ else if(istype(W, /obj/item/electronics/airlock)) if(!user.transferItemToLoc(W, src)) return - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...") + W.play_tool_sound(src, 100) + user.visible_message("[user] installs the electronics into the airlock assembly.", + "You start to install electronics into the airlock assembly...") if(do_after(user, 40, target = src)) if(!src || electronics) @@ -225,12 +223,10 @@ if(!electronics) return - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...") + user.visible_message("[user] removes the electronics from the airlock assembly.", + "You start to uninstall electronics from the airlock assembly...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || !electronics) - return + if(W.use_tool(src, user, 40, volume=100) && electronics) to_chat(user, "You remove the airlock electronics.") name = "wired windoor assembly" var/obj/item/electronics/airlock/ae @@ -254,58 +250,56 @@ if(!electronics) to_chat(usr, "The assembly is missing electronics!") return - usr << browse(null, "window=windoor_access") - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...") + user << browse(null, "window=windoor_access") + user.visible_message("[user] pries the windoor into the frame.", + "You start prying the windoor into the frame...") - if(do_after(user, 40*W.toolspeed, target = src)) - - if(loc && electronics) - - density = TRUE //Shouldn't matter but just incase - to_chat(user, "You finish the windoor.") - - if(secure) - var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc) - if(facing == "l") - windoor.icon_state = "leftsecureopen" - windoor.base_state = "leftsecure" - else - windoor.icon_state = "rightsecureopen" - windoor.base_state = "rightsecure" - windoor.setDir(dir) - windoor.density = FALSE - - if(electronics.one_access) - windoor.req_one_access = electronics.accesses - else - windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.forceMove(windoor) - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() + if(W.use_tool(src, user, 40, volume=100) && electronics) + density = TRUE //Shouldn't matter but just incase + to_chat(user, "You finish the windoor.") + if(secure) + var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc) + if(facing == "l") + windoor.icon_state = "leftsecureopen" + windoor.base_state = "leftsecure" else - var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc) - if(facing == "l") - windoor.icon_state = "leftopen" - windoor.base_state = "left" - else - windoor.icon_state = "rightopen" - windoor.base_state = "right" - windoor.setDir(dir) - windoor.density = FALSE + windoor.icon_state = "rightsecureopen" + windoor.base_state = "rightsecure" + windoor.setDir(dir) + windoor.density = FALSE + if(electronics.one_access) + windoor.req_one_access = electronics.accesses + else windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.loc = windoor - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() + windoor.electronics = electronics + electronics.forceMove(windoor) + if(created_name) + windoor.name = created_name + qdel(src) + windoor.close() + + + else + var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc) + if(facing == "l") + windoor.icon_state = "leftopen" + windoor.base_state = "left" + else + windoor.icon_state = "rightopen" + windoor.base_state = "right" + windoor.setDir(dir) + windoor.density = FALSE + + windoor.req_access = electronics.accesses + windoor.electronics = electronics + electronics.loc = windoor + if(created_name) + windoor.name = created_name + qdel(src) + windoor.close() else @@ -318,7 +312,13 @@ /obj/structure/windoor_assembly/ComponentInitialize() . = ..() - AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation)) + AddComponent( + /datum/component/simple_rotation, + ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, + null, + CALLBACK(src, .proc/can_be_rotated), + CALLBACK(src,.proc/after_rotation) + ) /obj/structure/windoor_assembly/proc/can_be_rotated(mob/user,rotation_type) if(anchored) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e7cd1f4eab..f923453f62 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -178,39 +178,39 @@ return 1 //skip the afterattack add_fingerprint(user) + if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) - var/obj/item/weldingtool/WT = I if(obj_integrity < max_integrity) - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin repairing [src]...") - playsound(src, WT.usesound, 40, 1) - if(do_after(user, 40*I.toolspeed, target = src)) - obj_integrity = max_integrity - playsound(src, 'sound/items/Welder2.ogg', 50, 1) - update_nearby_icons() - to_chat(user, "You repair [src].") + if(!I.tool_start_check(user, amount=0)) + return + + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + update_nearby_icons() + to_chat(user, "You repair [src].") else to_chat(user, "[src] is already in good condition!") return if(!(flags_1&NODECONSTRUCT_1)) if(istype(I, /obj/item/screwdriver)) - playsound(src, I.usesound, 75, 1) + I.play_tool_sound(src, 75) if(reinf) if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME) to_chat(user, "You begin to [state == WINDOW_SCREWED_TO_FRAME ? "unscrew the window from":"screw the window to"] the frame...") - if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) + if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) state = (state == WINDOW_IN_FRAME ? WINDOW_SCREWED_TO_FRAME : WINDOW_IN_FRAME) to_chat(user, "You [state == WINDOW_IN_FRAME ? "unfasten the window from":"fasten the window to"] the frame.") else if(state == WINDOW_OUT_OF_FRAME) to_chat(user, "You begin to [anchored ? "unscrew the frame from":"screw the frame to"] the floor...") - if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) + if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) anchored = !anchored update_nearby_icons() to_chat(user, "You [anchored ? "fasten the frame to":"unfasten the frame from"] the floor.") else //if we're not reinforced, we don't need to check or update state to_chat(user, "You begin to [anchored ? "unscrew the window from":"screw the window to"] the floor...") - if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) + if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) anchored = !anchored air_update_turf(TRUE) update_nearby_icons() @@ -220,16 +220,16 @@ else if (istype(I, /obj/item/crowbar) && reinf && (state == WINDOW_OUT_OF_FRAME || state == WINDOW_IN_FRAME)) to_chat(user, "You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...") - playsound(src, I.usesound, 75, 1) - if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) + I.play_tool_sound(src, 75) + if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) state = (state == WINDOW_OUT_OF_FRAME ? WINDOW_IN_FRAME : WINDOW_OUT_OF_FRAME) to_chat(user, "You pry the window [state == WINDOW_IN_FRAME ? "into":"out of"] the frame.") return else if(istype(I, /obj/item/wrench) && !anchored) - playsound(src, I.usesound, 75, 1) + I.play_tool_sound(src, 75) to_chat(user, " You begin to disassemble [src]...") - if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) + if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) var/obj/item/stack/sheet/G = new glass_type(user.loc, glass_amount) G.add_fingerprint(user) playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 80329f20a1..257ae07a55 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -39,30 +39,34 @@ if(default_unfasten_wrench(user, I)) return else if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I switch(state) if(ENGINE_UNWRENCHED) to_chat(user, "The [src.name] needs to be wrenched to the floor!") if(EM_SECURED) - if(WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user.name] starts to weld the [name] to the floor.", \ - "You start to weld \the [src] to the floor...", \ - "You hear welding.") - if(do_after(user,ENGINE_WELDTIME*WT.toolspeed, target = src) && WT.isOn()) - state = ENGINE_WELDED - to_chat(user, "You weld \the [src] to the floor.") - alter_engine_power(engine_power) + if(!I.tool_start_check(user, amount=0)) + return + + user.visible_message("[user.name] starts to weld the [name] to the floor.", \ + "You start to weld \the [src] to the floor...", \ + "You hear welding.") + + if(I.use_tool(src, user, ENGINE_WELDTIME, volume=50)) + state = ENGINE_WELDED + to_chat(user, "You weld \the [src] to the floor.") + alter_engine_power(engine_power) + if(EM_WELDED) - if(WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user.name] starts to cut the [name] free from the floor.", \ - "You start to cut \the [src] free from the floor...", \ - "You hear welding.") - if(do_after(user,ENGINE_WELDTIME*WT.toolspeed, target = src) && WT.isOn()) - state = ENGINE_WRENCHED - to_chat(user, "You cut \the [src] free from the floor.") - alter_engine_power(-engine_power) + if(!I.tool_start_check(user, amount=0)) + return + + user.visible_message("[user.name] starts to cut the [name] free from the floor.", \ + "You start to cut \the [src] free from the floor...", \ + "You hear welding.") + + if(I.use_tool(src, user, ENGINE_WELDTIME, volume=50)) + state = ENGINE_WRENCHED + to_chat(user, "You cut \the [src] free from the floor.") + alter_engine_power(-engine_power) return else return ..() diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index ab03b571fc..129a8c119a 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -156,8 +156,8 @@ return P.attackby(T, user, params) -/turf/open/floor/proc/pry_tile(obj/item/C, mob/user, silent = FALSE) - playsound(src, C.usesound, 80, 1) +/turf/open/floor/proc/pry_tile(obj/item/I, mob/user, silent = FALSE) + I.play_tool_sound(src, 80) return remove_tile(user, silent) /turf/open/floor/proc/remove_tile(mob/user, silent = FALSE, make_tile = TRUE) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 02b34dd0d2..d3a340965f 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -39,7 +39,7 @@ /turf/open/floor/wood/pry_tile(obj/item/C, mob/user, silent = FALSE) var/is_screwdriver = istype(C, /obj/item/screwdriver) - playsound(src, C.usesound, 80, 1) + C.play_tool_sound(src, 80) return remove_tile(user, silent, make_tile = is_screwdriver) /turf/open/floor/wood/remove_tile(mob/user, silent = FALSE, make_tile = TRUE) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index c6a2984fed..721cb12e9d 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -196,19 +196,14 @@ flick_overlay(I, viewing, 8) L.adjustToxLoss(-3, TRUE, TRUE) -/turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params) +/turf/open/floor/clockwork/crowbar_act(mob/living/user, obj/item/I) if(baseturfs == type) - return - if(istype(I, /obj/item/crowbar)) - user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...") - playsound(src, I.usesound, 20, 1) - if(!do_after(user, 70*I.toolspeed, target = src)) - return 0 + return TRUE + user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...") + if(I.use_tool(src, user, 70, volume=80)) user.visible_message("[user] pries up [src]!", "You pry up [src]!") - playsound(src, I.usesound, 80, 1) make_plating() - return 1 - return ..() + return TRUE /turf/open/floor/clockwork/make_plating() new /obj/item/stack/tile/brass(src) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index e26d2701a8..be55db5408 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -78,15 +78,15 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, 1) else to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") - else if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/welder = C - if( welder.isOn() && (broken || burnt) ) - if(welder.remove_fuel(0,user)) - to_chat(user, "You fix some dents on the broken plating.") - playsound(src, welder.usesound, 80, 1) - icon_state = icon_plating - burnt = 0 - broken = 0 + +/turf/open/floor/plating/welder_act(mob/living/user, obj/item/I) + if((broken || burnt) && I.use_tool(src, user, 0, volume=80)) + to_chat(user, "You fix some dents on the broken plating.") + icon_state = icon_plating + burnt = FALSE + broken = FALSE + + return TRUE /turf/open/floor/plating/foam name = "metal foam plating" diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 60382b9052..0bd4572b35 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -25,18 +25,14 @@ ..() return //unplateable -/turf/open/floor/engine/attackby(obj/item/C, mob/user, params) - if(!C || !user) - return - if(istype(C, /obj/item/wrench)) - to_chat(user, "You begin removing rods...") - playsound(src, C.usesound, 80, 1) - if(do_after(user, 30*C.toolspeed, target = src)) - if(!istype(src, /turf/open/floor/engine)) - return - new /obj/item/stack/rods(src, 2) - ChangeTurf(/turf/open/floor/plating) - return +/turf/open/floor/engine/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You begin removing rods...") + if(I.use_tool(src, user, 30, volume=80)) + if(!istype(src, /turf/open/floor/engine)) + return TRUE + new /obj/item/stack/rods(src, 2) + ChangeTurf(/turf/open/floor/plating) + return TRUE /turf/open/floor/engine/acid_act(acidpwr, acid_volume) acidpwr = min(acidpwr, 50) //we reduce the power so reinf floor never get melted. diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index a40203beba..856537c1d5 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -139,7 +139,7 @@ /turf/open/lava/smooth/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE - baseturfs = /turf/open/chasm/lavaland + baseturfs = /turf/open/lava/smooth/lava_land_surface /turf/open/lava/smooth/airless initial_gas_mix = "TEMP=2.7" diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 8a473cc42a..6e3c1d66f3 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -60,7 +60,6 @@ return last_act = world.time to_chat(user, "You start picking...") - P.playDigSound() if(do_after(user,P.digspeed, target = src)) if(ismineralturf(src)) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 4211c83d37..6a68a894cf 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -50,25 +50,24 @@ playsound(src, 'sound/effects/bang.ogg', 50, 1) to_chat(M, "This wall is far too strong for you to destroy.") -/turf/closed/wall/r_wall/try_destroy(obj/item/W, mob/user, turf/T) - if(istype(W, /obj/item/pickaxe/drill/jackhammer)) - var/obj/item/pickaxe/drill/jackhammer/D = W - to_chat(user, "You begin to smash though the [name]...") +/turf/closed/wall/r_wall/try_destroy(obj/item/I, mob/user, turf/T) + if(istype(I, /obj/item/pickaxe/drill/jackhammer)) + to_chat(user, "You begin to smash though [src]...") if(do_after(user, 50, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W) - return 1 - D.playDigSound() - visible_message("[user] smashes through the [name] with the [D.name]!", "You hear the grinding of metal.") + if(!istype(src, /turf/closed/wall/r_wall)) + return TRUE + I.play_tool_sound(src) + visible_message("[user] smashes through [src] with [I]!", "You hear the grinding of metal.") dismantle_wall() - return 1 - return 0 + return TRUE + return FALSE /turf/closed/wall/r_wall/try_decon(obj/item/W, mob/user, turf/T) //DECONSTRUCTION switch(d_state) if(INTACT) if(istype(W, /obj/item/wirecutters)) - playsound(src, W.usesound, 100, 1) + W.play_tool_sound(src, 100) d_state = SUPPORT_LINES update_icon() to_chat(user, "You cut the outer grille.") @@ -77,9 +76,8 @@ if(SUPPORT_LINES) if(istype(W, /obj/item/screwdriver)) to_chat(user, "You begin unsecuring the support lines...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != SUPPORT_LINES) + if(W.use_tool(src, user, 40, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_LINES) return 1 d_state = COVER update_icon() @@ -87,31 +85,19 @@ return 1 else if(istype(W, /obj/item/wirecutters)) - playsound(src, W.usesound, 100, 1) + W.play_tool_sound(src, 100) d_state = INTACT update_icon() to_chat(user, "You repair the outer grille.") return 1 if(COVER) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin slicing through the metal cover...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 60*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !WT || !WT.isOn() || d_state != COVER) - return 1 - d_state = CUT_COVER - update_icon() - to_chat(user, "You press firmly on the cover, dislodging it.") - return 1 - - if(istype(W, /obj/item/gun/energy/plasmacutter)) + if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return to_chat(user, "You begin slicing through the metal cover...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 60*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != COVER) + if(W.use_tool(src, user, 60, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) return 1 d_state = CUT_COVER update_icon() @@ -120,9 +106,8 @@ if(istype(W, /obj/item/screwdriver)) to_chat(user, "You begin securing the support lines...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != COVER) + if(W.use_tool(src, user, 40, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) return 1 d_state = SUPPORT_LINES update_icon() @@ -132,9 +117,8 @@ if(CUT_COVER) if(istype(W, /obj/item/crowbar)) to_chat(user, "You struggle to pry off the cover...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 100*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != CUT_COVER) + if(W.use_tool(src, user, 100, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) return 1 d_state = BOLTS update_icon() @@ -142,24 +126,22 @@ return 1 if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin welding the metal cover back to the frame...") - playsound(src, WT.usesound, 100, 1) - if(do_after(user, 60*WT.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !WT || !WT.isOn() || d_state != CUT_COVER) - return 1 - d_state = COVER - update_icon() - to_chat(user, "The metal cover has been welded securely to the frame.") + if(!W.tool_start_check(user, amount=0)) + return + to_chat(user, "You begin welding the metal cover back to the frame...") + if(W.use_tool(src, user, 60, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) + return TRUE + d_state = COVER + update_icon() + to_chat(user, "The metal cover has been welded securely to the frame.") return 1 if(BOLTS) if(istype(W, /obj/item/wrench)) to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != BOLTS) + if(W.use_tool(src, user, 40, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != BOLTS) return 1 d_state = SUPPORT_RODS update_icon() @@ -168,9 +150,8 @@ if(istype(W, /obj/item/crowbar)) to_chat(user, "You start to pry the cover back into place...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 20*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != BOLTS) + if(W.use_tool(src, user, 20, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != BOLTS) return 1 d_state = CUT_COVER update_icon() @@ -178,24 +159,12 @@ return 1 if(SUPPORT_RODS) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin slicing through the support rods...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 100*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !WT || !WT.isOn() || d_state != SUPPORT_RODS) - return 1 - d_state = SHEATH - update_icon() - to_chat(user, "You slice through the support rods.") - return 1 - - if(istype(W, /obj/item/gun/energy/plasmacutter)) + if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return to_chat(user, "You begin slicing through the support rods...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 100*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != SUPPORT_RODS) + if(W.use_tool(src, user, 100, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_RODS) return 1 d_state = SHEATH update_icon() @@ -204,9 +173,9 @@ if(istype(W, /obj/item/wrench)) to_chat(user, "You start tightening the bolts which secure the support rods to their frame...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != SUPPORT_RODS) + W.play_tool_sound(src, 100) + if(W.use_tool(src, user, 40)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_RODS) return 1 d_state = BOLTS update_icon() @@ -216,26 +185,24 @@ if(SHEATH) if(istype(W, /obj/item/crowbar)) to_chat(user, "You struggle to pry off the outer sheath...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 100*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != SHEATH) + if(W.use_tool(src, user, 100, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) return 1 to_chat(user, "You pry off the outer sheath.") dismantle_wall() return 1 if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin welding the support rods back together...") - playsound(src, WT.usesound, 100, 1) - if(do_after(user, 100*WT.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !WT || !WT.isOn() || d_state != SHEATH) - return 1 - d_state = SUPPORT_RODS - update_icon() - to_chat(user, "You weld the support rods back together.") - return 1 + if(!W.tool_start_check(user, amount=0)) + return + to_chat(user, "You begin welding the support rods back together...") + if(W.use_tool(src, user, 100, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) + return TRUE + d_state = SUPPORT_RODS + update_icon() + to_chat(user, "You weld the support rods back together.") + return 1 return 0 /turf/closed/wall/r_wall/proc/update_icon() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index e95ea32046..ff113f8cd9 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -190,18 +190,21 @@ return ..() /turf/closed/wall/proc/try_clean(obj/item/W, mob/user, turf/T) - if((user.a_intent != INTENT_HELP) || !LAZYLEN(dent_decals) || !istype(W, /obj/item/weldingtool)) + if((user.a_intent != INTENT_HELP) || !LAZYLEN(dent_decals)) return FALSE - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) + + if(istype(W, /obj/item/weldingtool)) + if(!W.tool_start_check(user, amount=0)) + return FALSE + to_chat(user, "You begin fixing dents on the wall...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, slicing_duration * W.toolspeed * 0.1, target = src)) - if(iswallturf(src) && user && !QDELETED(WT) && WT.isOn() && !QDELETED(T) && (user.loc == T) && (user.get_active_held_item() == WT) && LAZYLEN(dent_decals)) + if(W.use_tool(src, user, slicing_duration, volume=100)) + if(iswallturf(src) && LAZYLEN(dent_decals)) to_chat(user, "You fix some dents on the wall.") cut_overlay(dent_decals) LAZYCLEARLIST(dent_decals) return TRUE + return FALSE /turf/closed/wall/proc/try_wallmount(obj/item/W, mob/user, turf/T) @@ -218,40 +221,29 @@ return FALSE -/turf/closed/wall/proc/try_decon(obj/item/W, mob/user, turf/T) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - to_chat(user, "You begin slicing through the outer plating...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, slicing_duration * W.toolspeed, target = src)) - if(iswallturf(src) && user && !QDELETED(WT) && WT.isOn() && !QDELETED(T) && (user.loc == T) && (user.get_active_held_item() == WT)) - to_chat(user, "You remove the outer plating.") - dismantle_wall() - return TRUE - else if(istype(W, /obj/item/gun/energy/plasmacutter)) +/turf/closed/wall/proc/try_decon(obj/item/I, mob/user, turf/T) + if(istype(I, /obj/item/weldingtool) || istype(I, /obj/item/gun/energy/plasmacutter)) + if(!I.tool_start_check(user, amount=0)) + return FALSE + to_chat(user, "You begin slicing through the outer plating...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, slicing_duration * W.toolspeed, target = src)) - if(!iswallturf(src) || !user || QDELETED(W) || QDELETED(T)) - return TRUE - if((user.loc == T) && (user.get_active_held_item() == W)) + if(I.use_tool(src, user, slicing_duration, volume=100)) + if(iswallturf(src)) to_chat(user, "You remove the outer plating.") dismantle_wall() - visible_message("The wall was sliced apart by [user]!", "You hear metal being sliced apart.") - return TRUE + return TRUE + return FALSE -/turf/closed/wall/proc/try_destroy(obj/item/W, mob/user, turf/T) - if(istype(W, /obj/item/pickaxe/drill/jackhammer)) - var/obj/item/pickaxe/drill/jackhammer/D = W - if(!iswallturf(src) || !user || !W || !T) +/turf/closed/wall/proc/try_destroy(obj/item/I, mob/user, turf/T) + if(istype(I, /obj/item/pickaxe/drill/jackhammer)) + if(!iswallturf(src)) return TRUE - if( user.loc == T && user.get_active_held_item() == W ) - D.playDigSound() + if(user.loc == T) + I.play_tool_sound(src) dismantle_wall() - visible_message("[user] smashes through the [name] with the [W.name]!", "You hear the grinding of metal.") + visible_message("[user] smashes through [src] with [I]!", "You hear the grinding of metal.") return TRUE return FALSE diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index ee15730278..48e7cf896f 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -73,19 +73,18 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/is_banned(mob/M) if(!M) return FALSE - . = (jobban_isbanned(M,"Syndicate") || (job_rank && jobban_isbanned(M,job_rank))) + . = (jobban_isbanned(M, ROLE_SYNDICATE) || (job_rank && jobban_isbanned(M,job_rank))) /datum/antagonist/proc/replace_banned_player() set waitfor = FALSE var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [name]?", "[name]", null, job_rank, 50, owner.current) - var/mob/dead/observer/theghost = null - if(candidates.len) - theghost = pick(candidates) + if(LAZYLEN(candidates)) + var/client/C = pick(candidates) to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") - message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.") + message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.") owner.current.ghostize(0) - owner.current.key = theghost.key + owner.current.key = C.key /datum/antagonist/proc/on_removal() remove_innate_effects() diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index b508151d3b..5695a8c480 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -2,7 +2,7 @@ throw_speed = 1 throw_range = 5 w_class = WEIGHT_CLASS_TINY - var/used = 0 + var/used = FALSE /obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) return @@ -57,13 +57,13 @@ to_chat(H, "You already used this contract!") return var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src) - if(candidates.len) + if(LAZYLEN(candidates)) if(used) to_chat(H, "You already used this contract!") return - used = 1 - var/mob/dead/observer/theghost = pick(candidates) - spawn_antag(theghost.client, get_turf(src), href_list["school"],H.mind) + used = TRUE + var/client/C = pick(candidates) + spawn_antag(C, get_turf(src), href_list["school"],H.mind) else to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.") @@ -120,12 +120,12 @@ to_chat(user, "You activate [src] and wait for confirmation.") var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE) - if(nuke_candidates.len) + if(LAZYLEN(nuke_candidates)) if(!(check_usability(user))) return used = TRUE - var/mob/dead/observer/theghost = pick(nuke_candidates) - spawn_antag(theghost.client, get_turf(src), "syndieborg", user.mind) + var/client/C = pick(nuke_candidates) + spawn_antag(C, get_turf(src), "syndieborg", user.mind) do_sparks(4, TRUE, src) qdel(src) else @@ -213,13 +213,13 @@ return if(used) return - var/list/demon_candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", null, null, ROLE_ALIEN, 50, src) - if(demon_candidates.len) + var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src) + if(LAZYLEN(candidates)) if(used) return - used = 1 - var/mob/dead/observer/theghost = pick(demon_candidates) - spawn_antag(theghost.client, get_turf(src), initial(demon_type.name),user.mind) + used = TRUE + var/client/C = pick(candidates) + spawn_antag(C, get_turf(src), initial(demon_type.name),user.mind) to_chat(user, shatter_msg) to_chat(user, veil_msg) playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 0bcb6f967e..26452e0945 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -682,8 +682,8 @@ Congratulations! You are now trained for invasive xenobiology research!"} /obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wrench)) to_chat(user, "You start disassembling [src]...") - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) + I.play_tool_sound(src) + if(I.use_tool(src, user, 30)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) for(var/i = 1, i <= framestackamount, i++) new framestack(get_turf(src)) diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 9b767a0130..b9114da9ea 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -262,10 +262,9 @@ mind_control_duration = 1800 /obj/item/organ/heart/gland/egg/activate() - to_chat(owner, "You lay an egg!") - var/obj/item/reagent_containers/food/snacks/egg/egg = new(owner.drop_location()) - egg.reagents.add_reagent(get_random_reagent_id(), 15) - egg.desc += " It looks weird..." + owner.visible_message("[owner] [pick(EGG_LAYING_MESSAGES)]") + var/turf/T = owner.drop_location() + new /obj/item/reagent_containers/food/snacks/egg/gland(T) /obj/item/organ/heart/gland/electric cooldown_low = 800 diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index f692335ee1..d8371d3751 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -2,7 +2,7 @@ name = "Brother" antagpanel_category = "Brother" job_rank = ROLE_BROTHER - var/special_role = "blood brother" + var/special_role = ROLE_BROTHER var/datum/team/brother_team/team /datum/antagonist/brother/create_team(datum/team/brother_team/new_team) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index c15b655da9..d6afa339d5 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -76,6 +76,13 @@ . = ..() /datum/antagonist/changeling/on_removal() + //We'll be using this from now on + var/mob/living/carbon/C = owner.current + if(istype(C)) + var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) + if(B && (B.decoy_override != initial(B.decoy_override))) + B.vital = TRUE + B.decoy_override = FALSE remove_changeling_powers() owner.objectives -= objectives . = ..() @@ -389,7 +396,7 @@ var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner if(team_mode) //No backstabbing while in a team - kill_objective.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) + kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) else kill_objective.find_target() objectives += kill_objective @@ -397,7 +404,7 @@ var/datum/objective/maroon/maroon_objective = new maroon_objective.owner = owner if(team_mode) - maroon_objective.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) + maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) else maroon_objective.find_target() objectives += maroon_objective @@ -419,7 +426,7 @@ var/datum/objective/escape/escape_with_identity/identity_theft = new identity_theft.owner = owner if(team_mode) - identity_theft.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) + identity_theft.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) else identity_theft.find_target() objectives += identity_theft diff --git a/code/modules/antagonists/clockcult/clock_items/integration_cog.dm b/code/modules/antagonists/clockcult/clock_items/integration_cog.dm index 0e1e299325..4e4aff5569 100644 --- a/code/modules/antagonists/clockcult/clock_items/integration_cog.dm +++ b/code/modules/antagonists/clockcult/clock_items/integration_cog.dm @@ -34,4 +34,4 @@ else adjust_clockwork_power(1) //Continue generating power when the cell has run dry; 5 W/second -#undef COG_MAX_SIPHON_THRESHOLD \ No newline at end of file +#undef COG_MAX_SIPHON_THRESHOLD diff --git a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm index 63c0182f7f..00a3406da1 100644 --- a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm +++ b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm @@ -27,11 +27,11 @@ var/distance = get_dist(src, O) to_chat(user, "[O] ([distance == 0 ? "same tile" : "[distance] tiles [dir2text(get_dir(src, O))]"])") -/obj/structure/destructible/clockwork/trap/wrench_act(mob/living/user, obj/item/wrench) +/obj/structure/destructible/clockwork/trap/wrench_act(mob/living/user, obj/item/I) if(!is_servant_of_ratvar(user)) return ..() to_chat(user, "You break down the delicate components of [src] into brass.") - playsound(src, wrench.usesound, 50, TRUE) + I.play_tool_sound(src) new/obj/item/stack/tile/brass(get_turf(src)) qdel(src) return TRUE @@ -56,14 +56,14 @@ return ..() -/obj/structure/destructible/clockwork/trap/wirecutter_act(mob/living/user, obj/item/wirecutters) +/obj/structure/destructible/clockwork/trap/wirecutter_act(mob/living/user, obj/item/I) if(!is_servant_of_ratvar(user)) return if(!wired_to.len) to_chat(user, "[src] has no connections!") return to_chat(user, "You sever all connections to [src].") - playsound(src, wirecutters.usesound, 50, TRUE) + I.play_tool_sound(src) for(var/V in wired_to) var/obj/structure/destructible/clockwork/trap/T = V T.wired_to -= src diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index b1734b3aef..fb8397eed7 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -31,9 +31,8 @@ if(anchored) to_chat(user, "[src] needs to be unsecured to disassemble it!") else - playsound(src, I.usesound, 100, 1) user.visible_message("[user] starts to disassemble [src].", "You start to disassemble [src]...") - if(do_after(user, 30*I.toolspeed, target = src) && !anchored) + if(I.use_tool(src, user, 30, volume=100) && !anchored) to_chat(user, "You disassemble [src].") deconstruct(TRUE) return 1 diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm index 2a05b14d70..067801677b 100644 --- a/code/modules/antagonists/clockcult/clockcult.dm +++ b/code/modules/antagonists/clockcult/clockcult.dm @@ -51,7 +51,7 @@ var/mob/living/current = owner.current SSticker.mode.servants_of_ratvar += owner SSticker.mode.update_servant_icons_added(owner) - owner.special_role = "Servant of Ratvar" + owner.special_role = ROLE_SERVANT_OF_RATVAR owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) if(issilicon(current)) if(iscyborg(current) && !silent) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm new file mode 100644 index 0000000000..e6a78ab1fd --- /dev/null +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -0,0 +1,775 @@ +/datum/action/innate/cult/blood_magic //Blood magic handles the creation of blood spells (formerly talismans) + name = "Prepare Blood Magic" + button_icon_state = "carve" + desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an empowering rune" + var/list/spells = list() + var/channeling = FALSE + +/datum/action/innate/cult/blood_magic/Grant() + ..() + button.screen_loc = "6:-29,4:-2" + button.moved = "6:-29,4:-2" + +/datum/action/innate/cult/blood_magic/Remove() + for(var/X in spells) + qdel(X) + ..() + +/datum/action/innate/cult/blood_magic/IsAvailable() + if(!iscultist(owner)) + return FALSE + return ..() + +/datum/action/innate/cult/blood_magic/proc/Positioning() + var/list/screen_loc_split = splittext(button.screen_loc,",") + var/list/screen_loc_X = splittext(screen_loc_split[1],":") + var/list/screen_loc_Y = splittext(screen_loc_split[2],":") + var/pix_X = text2num(screen_loc_X[2]) + for(var/datum/action/innate/cult/blood_spell/B in spells) + if(B.button.locked) + var/order = pix_X+spells.Find(B)*31 + B.button.screen_loc = "[screen_loc_X[1]]:[order],[screen_loc_Y[1]]:[screen_loc_Y[2]]" + B.button.moved = B.button.screen_loc + +/datum/action/innate/cult/blood_magic/Activate() + var/rune = FALSE + var/limit = RUNELESS_MAX_BLOODCHARGE + for(var/obj/effect/rune/empower/R in range(1, owner)) + rune = TRUE + break + if(rune) + limit = MAX_BLOODCHARGE + if(spells.len >= limit) + if(rune) + to_chat(owner, "Your body has reached its limit, you cannot store more than [MAX_BLOODCHARGE] spells at once. Pick a spell to nullify.") + else + to_chat(owner, "Your body has reached its limit, you cannot have more than [RUNELESS_MAX_BLOODCHARGE] spells at once without an empowering rune! Pick a spell to nullify.") + var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells + if(nullify_spell) + qdel(nullify_spell) + return + var/entered_spell_name + var/datum/action/innate/cult/blood_spell/BS + var/list/possible_spells = list() + for(var/I in subtypesof(/datum/action/innate/cult/blood_spell)) + var/datum/action/innate/cult/blood_spell/J = I + var/cult_name = initial(J.name) + possible_spells[cult_name] = J + possible_spells += "(REMOVE SPELL)" + entered_spell_name = input(owner, "Pick a blood spell to prepare...", "Spell Choices") as null|anything in possible_spells + if(entered_spell_name == "(REMOVE SPELL)") + var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells + if(nullify_spell) + qdel(nullify_spell) + return + BS = possible_spells[entered_spell_name] + if(QDELETED(src) || owner.incapacitated() || !BS) + return + to_chat(owner,"You begin to carve unnatural symbols into your flesh!") + SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10)) + if(!channeling) + channeling = TRUE + else + to_chat(owner, "You are already invoking blood magic!") + return + if(do_after(owner, 100 - rune*65, target = owner)) + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.bleed(30 - rune*25) + var/datum/action/innate/cult/blood_spell/new_spell = new BS(owner) + new_spell.Grant(owner, src) + spells += new_spell + Positioning() + to_chat(owner, "Your wounds glows with power, you have prepared a [new_spell.name] invocation!") + channeling = FALSE + +/datum/action/innate/cult/blood_spell //The next generation of talismans + name = "Blood Magic" + button_icon_state = "telerune" + desc = "Fear the Old Blood." + var/charges = 1 + var/magic_path = null + var/obj/item/melee/blood_magic/hand_magic + var/datum/action/innate/cult/blood_magic/all_magic + var/base_desc //To allow for updating tooltips + var/invocation + var/health_cost = 0 + +/datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM) + if(health_cost) + desc += "
Deals [health_cost] damage to your arm per use." + base_desc = desc + desc += "
Has [charges] use\s remaining." + all_magic = BM + ..() + button.locked = TRUE + +/datum/action/innate/cult/blood_spell/Remove() + if(all_magic) + all_magic.spells -= src + if(hand_magic) + qdel(hand_magic) + hand_magic = null + ..() + +/datum/action/innate/cult/blood_spell/IsAvailable() + if(!iscultist(owner) || owner.incapacitated() || !charges) + return FALSE + return ..() + +/datum/action/innate/cult/blood_spell/Activate() + if(magic_path) //If this spell flows from the hand + if(!hand_magic) + hand_magic = new magic_path(owner, src) + if(!owner.put_in_hands(hand_magic)) + qdel(hand_magic) + hand_magic = null + to_chat(owner, "You have no empty hand for invoking blood magic!") + return + to_chat(owner, "Your old wounds glow again as you invoke the [name].") + return + if(hand_magic) + qdel(hand_magic) + hand_magic = null + to_chat(owner, "You snuff out the spell with your hand, saving its power for another time.") + + +//Cult Blood Spells +/datum/action/innate/cult/blood_spell/stun + name = "Stun" + desc = "A potent spell that will stun and mute victims upon contact." + button_icon_state = "hand" + magic_path = "/obj/item/melee/blood_magic/stun" + health_cost = 10 + +/datum/action/innate/cult/blood_spell/teleport + name = "Teleport" + desc = "A useful spell that teleport cultists to a chosen destination on contact." + button_icon_state = "tele" + magic_path = "/obj/item/melee/blood_magic/teleport" + health_cost = 7 + +/datum/action/innate/cult/blood_spell/emp + name = "Electromagnetic Pulse" + desc = "A large spell that immediately disables all electronics in the area." + button_icon_state = "emp" + health_cost = 10 + invocation = "Ta'gh fara'qha fel d'amar det!" + +/datum/action/innate/cult/blood_spell/emp/Activate() + owner.visible_message("[owner]'s hand flashes a bright blue!", \ + "You speak the cursed words, emitting an EMP blast from your hand.") + empulse(owner, 3, 6) + owner.whisper(invocation, language = /datum/language/common) + charges-- + if(charges<=0) + qdel(src) + +/datum/action/innate/cult/blood_spell/shackles + name = "Shadow Shackles" + desc = "A stealthy spell that will handcuff and temporarily silence your victim." + button_icon_state = "cuff" + charges = 4 + magic_path = "/obj/item/melee/blood_magic/shackles" + +/datum/action/innate/cult/blood_spell/construction + name = "Twisted Construction" + desc = "A sinister spell used to convert:
Plasteel into runed metal
25 metal into a construct shell
Cyborgs directly into constructs
Cyborg shells into construct shells
Airlocks into runed airlocks (harm intent)" + button_icon_state = "transmute" + magic_path = "/obj/item/melee/blood_magic/construction" + +/datum/action/innate/cult/blood_spell/equipment + name = "Summon Equipment" + desc = "A crucial spell that enables you to summon either a ritual dagger or combat gear including armored robes, the nar'sien bola, and an eldritch longsword." + button_icon_state = "equip" + magic_path = "/obj/item/melee/blood_magic/armor" + +/datum/action/innate/cult/blood_spell/equipment/Activate() + var/choice = alert(owner,"Choose your equipment type",,"Combat Equipment","Ritual Dagger","Cancel") + if(choice == "Ritual Dagger") + var/turf/T = get_turf(owner) + owner.visible_message("[owner]'s hand glows red for a moment.", \ + "Red light begins to shimmer and take form within your hand!") + var/obj/O = new /obj/item/melee/cultblade/dagger(T) + if(owner.put_in_hands(O)) + to_chat(owner, "A ritual dagger appears in your hand!") + else + owner.visible_message("A ritual dagger appears at [owner]'s feet!", \ + "A ritual dagger materializes at your feet.") + SEND_SOUND(owner, sound('sound/effects/magic.ogg',0,1,25)) + charges-- + desc = base_desc + desc += "
Has [charges] use\s remaining." + if(charges<=0) + qdel(src) + else if(choice == "Combat Equipment") + ..() + +/datum/action/innate/cult/blood_spell/horror + name = "Hallucinations" + desc = "A ranged yet stealthy spell that will break the mind of the victim with nightmarish hallucinations." + button_icon_state = "horror" + var/obj/effect/proc_holder/horror/PH + charges = 4 + +/datum/action/innate/cult/blood_spell/horror/New() + PH = new() + PH.attached_action = src + ..() + +/datum/action/innate/cult/blood_spell/horror/Destroy() + var/obj/effect/proc_holder/horror/destroy = PH + . = ..() + if(destroy && !QDELETED(destroy)) + QDEL_NULL(destroy) + +/datum/action/innate/cult/blood_spell/horror/Activate() + PH.toggle(owner) //the important bit + return TRUE + +/obj/effect/proc_holder/horror + active = FALSE + ranged_mousepointer = 'icons/effects/cult_target.dmi' + var/datum/action/innate/cult/blood_spell/attached_action + +/obj/effect/proc_holder/horror/Destroy() + var/datum/action/innate/cult/blood_spell/AA = attached_action + . = ..() + if(AA && !QDELETED(AA)) + QDEL_NULL(AA) + +/obj/effect/proc_holder/horror/proc/toggle(mob/user) + if(active) + remove_ranged_ability("You dispel the magic...") + else + add_ranged_ability(user, "You prepare to horrify a target...") + +/obj/effect/proc_holder/horror/InterceptClickOn(mob/living/caller, params, atom/target) + if(..()) + return + if(ranged_ability_user.incapacitated() || !iscultist(caller)) + remove_ranged_ability() + return + var/turf/T = get_turf(ranged_ability_user) + if(!isturf(T)) + return FALSE + if(target in view(7, get_turf(ranged_ability_user))) + if(!ishuman(target) || iscultist(target)) + return + var/mob/living/carbon/human/H = target + H.hallucination = max(H.hallucination, 240) + SEND_SOUND(ranged_ability_user, sound('sound/effects/ghost.ogg',0,1,50)) + var/image/C = image('icons/effects/cult_effects.dmi',H,"bloodsparkles", ABOVE_MOB_LAYER) + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, FALSE) + addtimer(CALLBACK(H,/atom/.proc/remove_alt_appearance,"cult_apoc",TRUE), 2400, TIMER_OVERRIDE|TIMER_UNIQUE) + to_chat(ranged_ability_user,"[H] has been cursed with living nightmares!") + attached_action.charges-- + attached_action.desc = attached_action.base_desc + attached_action.desc += "
Has [attached_action.charges] use\s remaining." + attached_action.UpdateButtonIcon() + if(attached_action.charges <= 0) + remove_mousepointer(ranged_ability_user.client) + remove_ranged_ability("You have exhausted the spell's power!") + qdel(src) + +/datum/action/innate/cult/blood_spell/veiling + name = "Conceal Presence" + desc = "A multi-function spell that alternates between hiding and revealing nearby cult runes, structures, turf, and airlocks." + invocation = "Kla'atu barada nikt'o!" + button_icon_state = "gone" + charges = 10 + var/revealing = FALSE //if it reveals or not + +/datum/action/innate/cult/blood_spell/veiling/Activate() + if(!revealing) + owner.visible_message("Thin grey dust falls from [owner]'s hand!", \ + "You invoke the veiling spell, hiding nearby runes.") + charges-- + SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25)) + owner.whisper(invocation, language = /datum/language/common) + for(var/obj/effect/rune/R in range(5,owner)) + R.conceal() + for(var/obj/structure/destructible/cult/S in range(5,owner)) + S.conceal() + for(var/turf/open/floor/engine/cult/T in range(5,owner)) + T.realappearance.alpha = 0 + for(var/obj/machinery/door/airlock/cult/AL in range(5, owner)) + AL.conceal() + revealing = TRUE + name = "Reveal Runes" + button_icon_state = "back" + else + owner.visible_message("A flash of light shines from [owner]'s hand!", \ + "You invoke the counterspell, revealing nearby runes.") + charges-- + owner.whisper(invocation, language = /datum/language/common) + SEND_SOUND(owner, sound('sound/magic/enter_blood.ogg',0,1,25)) + for(var/obj/effect/rune/R in range(7,owner)) //More range in case you weren't standing in exactly the same spot + R.reveal() + for(var/obj/structure/destructible/cult/S in range(6,owner)) + S.reveal() + for(var/turf/open/floor/engine/cult/T in range(6,owner)) + T.realappearance.alpha = initial(T.realappearance.alpha) + for(var/obj/machinery/door/airlock/cult/AL in range(6, owner)) + AL.reveal() + revealing = FALSE + name = "Conceal Runes" + button_icon_state = "gone" + if(charges<= 0) + qdel(src) + desc = base_desc + desc += "
Has [charges] use\s remaining." + UpdateButtonIcon() + +/datum/action/innate/cult/blood_spell/manipulation + name = "Blood Rites" + desc = "A complex spell that allows you to gather blood and use it for healing or other powerful spells." + invocation = "Fel'th Dol Ab'orod!" + button_icon_state = "manip" + charges = 5 + magic_path = "/obj/item/melee/blood_magic/manipulator" + + +// The "magic hand" items +/obj/item/melee/blood_magic + name = "\improper magical aura" + desc = "Sinister looking aura that distorts the flow of reality around it." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "disintegrate" + item_state = null + flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 + w_class = WEIGHT_CLASS_HUGE + throwforce = 0 + throw_range = 0 + throw_speed = 0 + var/invocation + var/uses = 1 + var/health_cost = 0 //The amount of health taken from the user when invoking the spell + var/datum/action/innate/cult/blood_spell/source + +/obj/item/melee/blood_magic/New(loc, spell) + source = spell + uses = source.charges + health_cost = source.health_cost + ..() + +/obj/item/melee/blood_magic/Destroy() + if(!QDELETED(source)) + if(uses <= 0) + source.hand_magic = null + qdel(source) + source = null + else + source.hand_magic = null + source.charges = uses + source.desc = source.base_desc + source.desc += "
Has [uses] use\s remaining." + source.UpdateButtonIcon() + ..() + +/obj/item/melee/blood_magic/attack_self(mob/living/user) + afterattack(user, user, TRUE) + +/obj/item/melee/blood_magic/attack(mob/living/M, mob/living/carbon/user) + if(!iscarbon(user) || !iscultist(user)) + uses = 0 + qdel(src) + return + add_logs(user, M, "used a cult spell on", source.name, "") + M.lastattacker = user.real_name + M.lastattackerckey = user.ckey + +/obj/item/melee/blood_magic/afterattack(atom/target, mob/living/carbon/user, proximity) + if(invocation) + user.whisper(invocation, language = /datum/language/common) + if(health_cost) + if(user.active_hand_index == 1) + user.apply_damage(health_cost, BRUTE, "l_arm") + else + user.apply_damage(health_cost, BRUTE, "r_arm") + if(uses <= 0) + qdel(src) + else if(source) + source.desc = source.base_desc + source.desc += "
Has [uses] use\s remaining." + source.UpdateButtonIcon() + +//Stun +/obj/item/melee/blood_magic/stun + name = "Stunning Aura " + color = "#ff0000" // red + invocation = "Fuu ma'jin!" + +/obj/item/melee/blood_magic/stun/afterattack(atom/target, mob/living/carbon/user, proximity) + if(!isliving(target) || !proximity) + return + var/mob/living/L = target + if(iscultist(target)) + return + if(iscultist(user)) + user.visible_message("[user] holds up their hand, which explodes in a flash of red light!", \ + "You stun [L] with the spell!") + var/obj/item/nullrod/N = locate() in L + if(N) + target.visible_message("[L]'s holy weapon absorbs the light!", \ + "Your holy weapon absorbs the blinding light!") + else + L.Knockdown(180) + L.flash_act(1,1) + if(issilicon(target)) + var/mob/living/silicon/S = L + S.emp_act(EMP_HEAVY) + else if(iscarbon(target)) + var/mob/living/carbon/C = L + C.silent += 6 + C.stuttering += 15 + C.cultslurring += 15 + C.Jitter(15) + if(is_servant_of_ratvar(L)) + L.adjustBruteLoss(15) + uses-- + ..() + +//Teleportation +/obj/item/melee/blood_magic/teleport + name = "Shifting Aura" + color = RUNE_COLOR_TELEPORT + desc = "A potent spell that teleport cultists on contact." + invocation = "Sas'so c'arta forbici!" + +/obj/item/melee/blood_magic/teleport/afterattack(atom/target, mob/living/carbon/user, proximity) + if(!iscultist(target) || !proximity) + to_chat(user, "You can only teleport adjacent cultists with this spell!") + return + if(iscultist(user)) + var/list/potential_runes = list() + var/list/teleportnames = list() + for(var/R in GLOB.teleport_runes) + var/obj/effect/rune/teleport/T = R + potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T + + if(!potential_runes.len) + to_chat(user, "There are no valid runes to teleport to!") + log_game("Teleport talisman failed - no other teleport runes") + return + + var/turf/T = get_turf(src) + if(is_away_level(T.z)) + to_chat(user, "You are not in the right dimension!") + log_game("Teleport spell failed - user in away mission") + return + + var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked + var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? + if(QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune || !proximity) + return + var/turf/dest = get_turf(actual_selected_rune) + if(is_blocked_turf(dest, TRUE)) + to_chat(user, "The target rune is blocked. Attempting to teleport to it would be massively unwise.") + return + uses-- + user.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!", \ + "You speak the words of the talisman and find yourself somewhere else!", "You hear a sharp crack.") + var/mob/living/L = target + L.forceMove(dest) + dest.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.") + ..() + +//Shackles +/obj/item/melee/blood_magic/shackles + name = "Binding Aura" + desc = "Allows you to bind a victim and temporarily silence them." + invocation = "In'totum Lig'abis!" + color = "#000000" // black + +/obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity) + if(iscultist(user) && iscarbon(target) && proximity) + var/mob/living/carbon/C = target + if(C.get_num_arms() >= 2 || C.get_arm_ignore()) + CuffAttack(C, user) + else + user.visible_message("This victim doesn't have enough arms to complete the restraint!") + return + ..() + +/obj/item/melee/blood_magic/shackles/proc/CuffAttack(mob/living/carbon/C, mob/living/user) + if(!C.handcuffed) + playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) + C.visible_message("[user] begins restraining [C] with dark magic!", \ + "[user] begins shaping a dark magic around your wrists!") + if(do_mob(user, C, 30)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/restraints/handcuffs/energy/cult/used(C) + C.update_handcuffed() + C.silent += 5 + to_chat(user, "You shackle [C].") + add_logs(user, C, "shackled") + uses-- + else + to_chat(user, "[C] is already bound.") + else + to_chat(user, "You fail to shackle [C].") + else + to_chat(user, "[C] is already bound.") + + +/obj/item/restraints/handcuffs/energy/cult //For the shackling spell + name = "shadow shackles" + desc = "Shackles that bind the wrists with sinister magic." + trashtype = /obj/item/restraints/handcuffs/energy/used + flags_1 = DROPDEL_1 + +/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user) + user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \ + "Your [src] shatters in a discharge of dark magic!") + . = ..() + + +//Construction: Creates a construct shell out of 25 metal sheets, or converts plasteel into runed metal +/obj/item/melee/blood_magic/construction + name = "Corrupting Aura" + desc = "Corrupts metal and plasteel into more sinister forms." + invocation = "Ethra p'ni dedol!" + color = "#000000" // black + +/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(proximity_flag && iscultist(user)) + var/turf/T = get_turf(target) + if(istype(target, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/candidate = target + if(candidate.use(50)) + uses-- + to_chat(user, "A dark cloud eminates from your hand and swirls around the metal, twisting it into a construct shell!") + new /obj/structure/constructshell(T) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + else + to_chat(user, "You need 50 metal to produce a construct shell!") + else if(istype(target, /obj/item/stack/sheet/plasteel)) + var/obj/item/stack/sheet/plasteel/candidate = target + var/quantity = min(candidate.amount, uses) + uses -= quantity + new /obj/item/stack/sheet/runed_metal(T,quantity) + candidate.use(quantity) + to_chat(user, "A dark cloud eminates from you hand and swirls around the plasteel, transforming it into runed metal!") + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + else if(istype(target,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/candidate = target + if(candidate.mmi) + user.visible_message("A dark cloud eminates from [user]'s hand and swirls around [candidate]!") + playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, 1) + var/prev_color = candidate.color + candidate.color = "black" + if(do_after(user, 90, target = candidate)) + candidate.emp_act(EMP_HEAVY) + var/construct_class = alert(user, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") + user.visible_message("The dark cloud receedes from what was formerly [candidate], revealing a\n [construct_class]!") + switch(construct_class) + if("Juggernaut") + makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, candidate, user, 0, T) + if("Wraith") + makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, candidate, user, 0, T) + if("Artificer") + makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, candidate, user, 0, T) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + uses-- + candidate.mmi = null + qdel(candidate) + else + candidate.color = prev_color + else + uses-- + to_chat(user, "A dark cloud eminates from you hand and swirls around [candidate] - twisting it into a construct shell!") + new /obj/structure/constructshell(T) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + else if(istype(target,/obj/machinery/door/airlock)) + target.narsie_act() + uses-- + user.visible_message("Black ribbons suddenly eminate from [user]'s hand and cling to the airlock - twisting and corrupting it!") + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) + else + to_chat(user, "The spell will not work on [target]!") + ..() + +//Armor: Gives the target a basic cultist combat loadout +/obj/item/melee/blood_magic/armor + name = "Bladed Aura" + desc = "A spell that will equip the target with cultist equipment if there is a slot to equip it to." + color = "#33cc33" // green + +/obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity) + if(iscarbon(target) && proximity) + uses-- + var/mob/living/carbon/C = target + C.visible_message("Otherworldly armor suddenly appears on [C]!") + C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,slot_w_uniform) + C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) + C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) + C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes) + C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back) + if(C == user) + qdel(src) //Clears the hands + C.put_in_hands(new /obj/item/melee/cultblade(user)) + C.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user)) + ..() + +/obj/item/melee/blood_magic/manipulator + name = "Ritual Aura" + desc = "A spell that will absorb blood from anything you touch.
Touching cultists and constructs can heal them.
Clicking the hand will potentially let you focus the spell into something stronger." + color = "#7D1717" + +/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity) + if(proximity) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(NOBLOOD in H.dna.species.species_traits) + to_chat(user,"Blood rites do not work on species with no blood!") + return + if(iscultist(H)) + if(H.stat == DEAD) + to_chat(user,"Only a revive rune can bring back the dead!") + return + if(H.blood_volume < BLOOD_VOLUME_SAFE) + var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume + if(uses*2 < restore_blood) + H.blood_volume += uses*2 + to_chat(user,"You use the last of your blood rites to restore what blood you could!") + uses = 0 + return ..() + else + H.blood_volume = BLOOD_VOLUME_SAFE + uses -= round(restore_blood/2) + to_chat(user,"Your blood rites have restored [H == user ? "your" : "their"] blood to safe levels!") + var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss() + if(overall_damage == 0) + to_chat(user,"That cultist doesn't require healing!") + else + var/ratio = uses/overall_damage + if(H == user) + to_chat(user,"Your blood healing is far less efficient when used on yourself!") + ratio *= 0.35 // Healing is half as effective if you can't perform a full heal + uses -= round(overall_damage) // Healing is 65% more "expensive" even if you can still perform the full heal + if(ratio>1) + ratio = 1 + uses -= round(overall_damage) + H.visible_message("[H] is fully healed by [H==user ? "their":"[H]'s"]'s blood magic!") + else + H.visible_message("[H] is partially healed by [H==user ? "their":"[H]'s"] blood magic.") + uses = 0 + ratio *= -1 + H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0) + H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0) + H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0) + H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0) + H.updatehealth() + playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25) + new /obj/effect/temp_visual/cult/sparks(get_turf(H)) + user.Beam(H,icon_state="sendbeam",time=15) + else + if(H.stat == DEAD) + to_chat(user,"Their blood has stopped flowing, you'll have to find another way to extract it.") + return + if(H.cultslurring) + to_chat(user,"Their blood has been tainted by an even stronger form of blood magic, it's no use to us like this!") + return + if(H.blood_volume > BLOOD_VOLUME_SAFE) + H.blood_volume -= 100 + uses += 50 + user.Beam(H,icon_state="drainbeam",time=10) + playsound(get_turf(H), 'sound/magic/enter_blood.ogg', 50) + H.visible_message("[user] has drained some of [H]'s blood!") + to_chat(user,"Your blood rite gains 50 charges from draining [H]'s blood.") + new /obj/effect/temp_visual/cult/sparks(get_turf(H)) + else + to_chat(user,"They're missing too much blood - you cannot drain them further!") + return + if(isconstruct(target)) + var/mob/living/simple_animal/M = target + var/missing = M.maxHealth - M.health + if(missing) + if(uses > missing) + M.adjustHealth(-missing) + M.visible_message("[M] is fully healed by [user]'s blood magic!") + uses -= missing + else + M.adjustHealth(-uses) + M.visible_message("[M] is partially healed by [user]'s blood magic!") + uses = 0 + playsound(get_turf(M), 'sound/magic/staff_healing.ogg', 25) + user.Beam(M,icon_state="sendbeam",time=10) + if(istype(target, /obj/effect/decal/cleanable/blood)) + blood_draw(target, user) + ..() + +/obj/item/melee/blood_magic/manipulator/proc/blood_draw(atom/target, mob/living/carbon/human/user) + var/temp = 0 + var/turf/T = get_turf(target) + if(T) + for(var/obj/effect/decal/cleanable/blood/B in view(T, 2)) + if(B.blood_state == "blood") + if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam + temp += 30 + else + temp += max((B.bloodiness**2)/800,1) + new /obj/effect/temp_visual/cult/turf/floor(get_turf(B)) + qdel(B) + for(var/obj/effect/decal/cleanable/trail_holder/TH in view(T, 2)) + qdel(TH) + var/obj/item/clothing/shoes/shoecheck = user.shoes + if(shoecheck && shoecheck.bloody_shoes["blood"]) + temp += shoecheck.bloody_shoes["blood"]/20 + shoecheck.bloody_shoes["blood"] = 0 + if(temp) + user.Beam(T,icon_state="drainbeam",time=15) + new /obj/effect/temp_visual/cult/sparks(get_turf(user)) + playsound(T, 'sound/magic/enter_blood.ogg', 50) + to_chat(user, "Your blood rite has gained [round(temp)] charge\s from blood sources around you!") + uses += max(1, round(temp)) + +/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) + if(iscultist(user)) + var/list/options = list("Blood Spear (200)", "Blood Bolt Barrage (400)", "Blood Beam (600)") + var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options + if(!choice) + to_chat(user, "You decide against conducting a greater blood rite.") + return + switch(choice) + if("Blood Spear (200)") + if(uses < 200) + to_chat(user, "You need 200 charges to perform this rite.") + else + uses -= 200 + var/turf/T = get_turf(user) + qdel(src) + var/datum/action/innate/cult/spear/S = new(user) + var/obj/item/twohanded/cult_spear/rite = new(T) + S.Grant(user, rite) + rite.spear_act = S + if(user.put_in_hands(rite)) + to_chat(user, "A [rite.name] appears in your hand!") + else + user.visible_message("A [rite.name] appears at [user]'s feet!", \ + "A [rite.name] materializes at your feet.") + if("Blood Bolt Barrage (400)") + if(uses < 400) + to_chat(user, "You need 400 charges to perform this rite.") + else + var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood() + uses -= 400 + qdel(src) + if(user.put_in_hands(rite)) + to_chat(user, "Your hands glow with power!") + else + to_chat(user, "You need a free hand for this rite!") + qdel(rite) + if("Blood Beam (600)") + if(uses < 600) + to_chat(user, "You need 600 charges to perform this rite.") + else + var/obj/rite = new /obj/item/blood_beam() + uses -= 600 + qdel(src) + if(user.put_in_hands(rite)) + to_chat(user, "Your hands glow with POWER OVERWHELMING!!!") + else + to_chat(user, "You need a free hand for this rite!") + qdel(rite) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 84cc26d81a..77f1dd034f 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -123,9 +123,11 @@ if(cooldowntime > world.time) to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return - var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield") + var/choice if(user.mind.has_antag_datum(/datum/antagonist/cult/master)) choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Bastard Sword") + else + choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield") var/list/pickedtype = list() switch(choice) if("Shielded Robe") diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 8e6ae30d28..4c95b0a408 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -125,16 +125,15 @@ structure_check() searches for nearby cultist structures required for the invoca if(L.stat) continue invokers += L - if(invokers.len >= req_cultists) - invokers -= user if(allow_excess_invokers) chanters += invokers else shuffle_inplace(invokers) for(var/i in 1 to req_cultists) - var/L = pick_n_take(invokers) - if(L) - chanters += L + var/C = pick_n_take(invokers) + if(!C) + break + chanters += C return chanters /obj/effect/rune/proc/invoke(var/list/invokers) diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm index 22f1d96cd3..cb6f8ad6e1 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -135,8 +135,8 @@ adj = "objectiveless" else return - new_owner.assigned_role = "Space Ninja" - new_owner.special_role = "Space Ninja" + new_owner.assigned_role = ROLE_NINJA + new_owner.special_role = ROLE_NINJA new_owner.add_antag_datum(src) message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].") log_admin("[key_name(admin)] has [adj] ninja'ed [new_owner.current].") diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index b32a8f69e8..910caa7fca 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -115,9 +115,8 @@ switch(deconstruction_state) if(NUKESTATE_INTACT) if(istype(I, /obj/item/screwdriver/nuke)) - playsound(loc, I.usesound, 100, 1) to_chat(user, "You start removing [src]'s front panel's screws...") - if(do_after(user, 60*I.toolspeed,target=src)) + if(I.use_tool(src, user, 60, volume=100)) deconstruction_state = NUKESTATE_UNSCREWED to_chat(user, "You remove the screws from [src]'s front panel.") update_icon() @@ -125,14 +124,13 @@ if(NUKESTATE_PANEL_REMOVED) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/welder = I - playsound(loc, I.usesound, 100, 1) + if(!I.tool_start_check(user, amount=1)) + return to_chat(user, "You start cutting [src]'s inner plate...") - if(welder.remove_fuel(1,user)) - if(do_after(user,80*I.toolspeed,target=src)) - to_chat(user, "You cut [src]'s inner plate.") - deconstruction_state = NUKESTATE_WELDED - update_icon() + if(I.use_tool(src, user, 80, volume=100, amount=1)) + to_chat(user, "You cut [src]'s inner plate.") + deconstruction_state = NUKESTATE_WELDED + update_icon() return if(NUKESTATE_CORE_EXPOSED) if(istype(I, /obj/item/nuke_core_container)) @@ -148,19 +146,15 @@ to_chat(user, "You fail to load the plutonium core into [core_box]. [core_box] has already been used!") return if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I - if(M.amount >= 20) - to_chat(user, "You begin repairing [src]'s inner metal plate...") - if(do_after(user, 100, target=src)) - if(M.use(20)) - to_chat(user, "You repair [src]'s inner metal plate. The radiation is contained.") - deconstruction_state = NUKESTATE_PANEL_REMOVED - STOP_PROCESSING(SSobj, core) - update_icon() - else - to_chat(user, "You need more metal to do that!") - else - to_chat(user, "You need more metal to do that!") + if(!I.tool_start_check(user, amount=20)) + return + + to_chat(user, "You begin repairing [src]'s inner metal plate...") + if(I.use_tool(src, user, 100, amount=20)) + to_chat(user, "You repair [src]'s inner metal plate. The radiation is contained.") + deconstruction_state = NUKESTATE_PANEL_REMOVED + STOP_PROCESSING(SSobj, core) + update_icon() return . = ..() @@ -169,16 +163,14 @@ switch(deconstruction_state) if(NUKESTATE_UNSCREWED) to_chat(user, "You start removing [src]'s front panel...") - playsound(loc, tool.usesound, 100, 1) - if(do_after(user, 30 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 30, volume=100)) to_chat(user, "You remove [src]'s front panel.") deconstruction_state = NUKESTATE_PANEL_REMOVED update_icon() return TRUE if(NUKESTATE_WELDED) to_chat(user, "You start prying off [src]'s inner plate...") - playsound(loc, tool.usesound, 100, 1) - if(do_after(user, 50 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 30, volume=100)) to_chat(user, "You pry off [src]'s inner plate. You can see the core's green glow!") deconstruction_state = NUKESTATE_CORE_EXPOSED update_icon() diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 8401dc8ced..7b07b762c0 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -112,7 +112,7 @@ nuke_team = new_team /datum/antagonist/nukeop/admin_add(datum/mind/new_owner,mob/admin) - new_owner.assigned_role = "Syndicate" + new_owner.assigned_role = ROLE_SYNDICATE new_owner.add_antag_datum(src) message_admins("[key_name_admin(admin)] has nuke op'ed [new_owner.current].") log_admin("[key_name(admin)] has nuke op'ed [new_owner.current].") diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 2c21bd5145..5be923ddcc 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -224,7 +224,6 @@ invisibility = INVISIBILITY_ABSTRACT revealed = FALSE ghostize(0)//Don't re-enter invisible corpse - SSshuttle.shuttle_purchase_requirements_met |= "revenant" //reveal, stun, icon updates, cast checks, and essence changing diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 5c89fe24cf..e708cb9254 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -184,7 +184,7 @@ carbon_mob.flash_act(1, 1) rev_mind.current.Stun(100) rev_mind.add_antag_datum(/datum/antagonist/rev,rev_team) - rev_mind.special_role = "Revolutionary" + rev_mind.special_role = ROLE_REV return TRUE /datum/antagonist/rev/head/proc/demote() diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 6c55563810..da34debf95 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -6,7 +6,7 @@ var/should_specialise = TRUE //do we split into AI and human, set to true on inital assignment only var/ai_datum = /datum/antagonist/traitor/AI var/human_datum = /datum/antagonist/traitor/human - var/special_role = "traitor" + var/special_role = ROLE_TRAITOR var/employer = "The Syndicate" var/give_objectives = TRUE var/should_give_codewords = TRUE @@ -85,7 +85,9 @@ return /datum/antagonist/traitor/human/forge_traitor_objectives() - var/is_hijacker = prob(10) + var/is_hijacker = FALSE + if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks + is_hijacker = prob(10) var/martyr_chance = prob(20) var/objective_count = is_hijacker //Hijacking counts towards number of objectives if(!SSticker.mode.exchange_blue && SSticker.mode.traitors.len >= 8) //Set up an exchange if there are enough traitors diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index d1f1ff3f87..8f82b2737b 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -1,3 +1,4 @@ + //Apprenticeship contract - moved to antag_spawner.dm ///////////////////////////Veil Render////////////////////// diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index e447fc46aa..c23d7fe5a5 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -156,12 +156,12 @@ /datum/antagonist/wizard/apply_innate_effects(mob/living/mob_override) var/mob/living/M = mob_override || owner.current update_wiz_icons_added(M, wiz_team ? TRUE : FALSE) //Don't bother showing the icon if you're solo wizard - M.faction |= "wizard" + M.faction |= ROLE_WIZARD /datum/antagonist/wizard/remove_innate_effects(mob/living/mob_override) var/mob/living/M = mob_override || owner.current update_wiz_icons_removed(M) - M.faction -= "wizard" + M.faction -= ROLE_WIZARD /datum/antagonist/wizard/get_admin_commands() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 7925d586e7..bb8f89812a 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -653,14 +653,14 @@ switch(buildstage) if(2) if(istype(W, /obj/item/wirecutters) && panel_open && wires.is_all_cut()) - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) to_chat(user, "You cut the final wires.") new /obj/item/stack/cable_coil(loc, 5) buildstage = 1 update_icon() return else if(istype(W, /obj/item/screwdriver)) // Opening that Air Alarm up. - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].") update_icon() @@ -674,8 +674,8 @@ if(istype(W, /obj/item/crowbar)) user.visible_message("[user.name] removes the electronics from [src.name].",\ "You start prying out the circuit...") - playsound(src.loc, W.usesound, 50, 1) - if (do_after(user, 20*W.toolspeed, target = src)) + W.play_tool_sound(src) + if (W.use_tool(src, user, 20)) if (buildstage == 1) to_chat(user, "You remove the air alarm electronics.") new /obj/item/electronics/airalarm( src.loc ) @@ -725,7 +725,7 @@ if(istype(W, /obj/item/wrench)) to_chat(user, "You detach \the [src] from the wall.") - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) new /obj/item/wallframe/airalarm( user.loc ) qdel(src) return diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index ef62c00f86..0f57bd85e9 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -183,39 +183,44 @@ Pipelines + Other Objects -> Pipe network if(user.dropItemToGround(pipe)) pipe.setPipingLayer(piping_layer) //align it with us return TRUE - if(istype(W, /obj/item/wrench)) - if(can_unwrench(user)) - var/turf/T = get_turf(src) - if (level==1 && isturf(T) && T.intact) - to_chat(user, "You must remove the plating first!") - return TRUE - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - add_fingerprint(user) - - var/unsafe_wrenching = FALSE - var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() - - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src]...") - if (internal_pressure > 2*ONE_ATMOSPHERE) - to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") - unsafe_wrenching = TRUE //Oh dear oh dear - - if (do_after(user, 20*W.toolspeed, target = src) && !QDELETED(src)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src].", \ - "You hear ratchet.") - investigate_log("was REMOVED by [key_name(usr)]", INVESTIGATE_ATMOS) - - //You unwrenched a pipe full of pressure? Let's splat you into the wall, silly. - if(unsafe_wrenching) - unsafe_pressure_release(user, internal_pressure) - deconstruct(TRUE) else return ..() +/obj/machinery/atmospherics/wrench_act(mob/living/user, obj/item/I) + if(!can_unwrench(user)) + return TRUE + + var/turf/T = get_turf(src) + if (level==1 && isturf(T) && T.intact) + to_chat(user, "You must remove the plating first!") + return TRUE + + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + add_fingerprint(user) + + var/unsafe_wrenching = FALSE + var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() + + to_chat(user, "You begin to unfasten \the [src]...") + + if (internal_pressure > 2*ONE_ATMOSPHERE) + to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") + unsafe_wrenching = TRUE //Oh dear oh dear + + if(I.use_tool(src, user, 20, volume=50)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "You unfasten \the [src].", \ + "You hear ratchet.") + investigate_log("was REMOVED by [key_name(usr)]", INVESTIGATE_ATMOS) + + //You unwrenched a pipe full of pressure? Let's splat you into the wall, silly. + if(unsafe_wrenching) + unsafe_pressure_release(user, internal_pressure) + deconstruct(TRUE) + return TRUE + /obj/machinery/atmospherics/proc/can_unwrench(mob/user) return can_unwrench @@ -345,8 +350,6 @@ Pipelines + Other Objects -> Pipe network return list() /obj/machinery/atmospherics/update_remote_sight(mob/user) -// if(isborer(user)) -// user.sight |= (SEE_PIXELS) user.sight |= (SEE_TURFS|BLIND) //Used for certain children of obj/machinery/atmospherics to not show pipe vision when mob is inside it. diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 3acc12114f..eca0a6797a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -269,28 +269,21 @@ broadcast_status() update_icon() -/obj/machinery/atmospherics/components/unary/vent_pump/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if (WT.remove_fuel(0, user)) - playsound(loc, WT.usesound, 40, 1) - to_chat(user, "You begin welding the vent...") - if(do_after(user, W.toolspeed * 20, target = src)) - if(!src || !WT.isOn()) - return - playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) - if(!welded) - user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") - welded = TRUE - else - user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") - welded = FALSE - update_icon() - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) - pipe_vision_img.plane = ABOVE_HUD_PLANE - return 0 - else - return ..() +/obj/machinery/atmospherics/components/unary/vent_pump/welder_act(mob/living/user, obj/item/I) + if(!I.tool_start_check(user, amount=0)) + return TRUE + to_chat(user, "You begin welding the vent...") + if(I.use_tool(src, user, 20, volume=50)) + if(!welded) + user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") + welded = TRUE + else + user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") + welded = FALSE + update_icon() + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) + pipe_vision_img.plane = ABOVE_HUD_PLANE + return TRUE /obj/machinery/atmospherics/components/unary/vent_pump/can_unwrench(mob/user) . = ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 2437b85dde..4672114227 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -263,28 +263,21 @@ ..() update_icon_nopipes() -/obj/machinery/atmospherics/components/unary/vent_scrubber/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 40, 1) - to_chat(user, "Now welding the scrubber.") - if(do_after(user, 20*W.toolspeed, target = src)) - if(!src || !WT.isOn()) - return - playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) - if(!welded) - user.visible_message("[user] welds the scrubber shut.","You weld the scrubber shut.", "You hear welding.") - welded = TRUE - else - user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") - welded = FALSE - update_icon() - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) - pipe_vision_img.plane = ABOVE_HUD_PLANE - return 0 - else - return ..() +/obj/machinery/atmospherics/components/unary/vent_scrubber/welder_act(mob/living/user, obj/item/I) + if(!I.tool_start_check(user, amount=0)) + return TRUE + to_chat(user, "Now welding the scrubber.") + if(I.use_tool(src, user, 20, volume=50)) + if(!welded) + user.visible_message("[user] welds the scrubber shut.","You weld the scrubber shut.", "You hear welding.") + welded = TRUE + else + user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") + welded = FALSE + update_icon() + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) + pipe_vision_img.plane = ABOVE_HUD_PLANE + return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/can_unwrench(mob/user) . = ..() diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index ccddc8f8ac..6582dad6df 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -100,19 +100,20 @@ to_chat(user, status()) -/obj/machinery/meter/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/wrench)) - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src]...") - if (do_after(user, 40*W.toolspeed, target = src)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe_meter(loc) - qdel(src) - else - return ..() +/obj/machinery/meter/wrench_act(mob/user, obj/item/I) + to_chat(user, "You begin to unfasten \the [src]...") + if (I.use_tool(src, user, 40, volume=50)) + user.visible_message( + "[user] unfastens \the [src].", + "You unfasten \the [src].", + "You hear ratchet.") + deconstruct() + return TRUE + +/obj/machinery/meter/deconstruct(disassembled = TRUE) + if(!(flags_1 & NODECONSTRUCT_1)) + new /obj/item/pipe_meter(loc) + qdel(src) /obj/machinery/meter/attack_ai(mob/user) return attack_hand(user) @@ -131,8 +132,7 @@ /obj/machinery/meter/singularity_pull(S, current_size) ..() if(current_size >= STAGE_FIVE) - new /obj/item/pipe_meter(loc) - qdel(src) + deconstruct() // TURF METER - REPORTS A TILE'S AIR CONTENTS // why are you yelling? diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 13bef3ba1b..13649a742a 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -278,21 +278,20 @@ new /obj/item/stack/sheet/metal (loc, 5) qdel(src) -/obj/machinery/portable_atmospherics/canister/attackby(obj/item/W, mob/user, params) - if(user.a_intent != INTENT_HARM && istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(stat & BROKEN) - if(!WT.remove_fuel(0, user)) - return - playsound(loc, WT.usesound, 40, 1) - to_chat(user, "You begin cutting [src] apart...") - if(do_after(user, 30, target = src)) - deconstruct(TRUE) - else - to_chat(user, "You cannot slice [src] apart when it isn't broken.") - return 1 +/obj/machinery/portable_atmospherics/canister/welder_act(mob/living/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return FALSE + + if(stat & BROKEN) + if(!I.tool_start_check(user, amount=0)) + return TRUE + to_chat(user, "You begin cutting [src] apart...") + if(I.use_tool(src, user, 30, volume=50)) + deconstruct(TRUE) else - return ..() + to_chat(user, "You cannot slice [src] apart when it isn't broken.") + + return TRUE /obj/machinery/portable_atmospherics/canister/obj_break(damage_flag) if((stat & BROKEN) || (flags_1 & NODECONSTRUCT_1)) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 6cf9cec361..f21e005b9a 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -92,7 +92,7 @@ if(!(stat & BROKEN)) if(connected_port) disconnect() - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) user.visible_message( \ "[user] disconnects [src].", \ "You unfasten [src] from the port.", \ @@ -107,7 +107,7 @@ if(!connect(possible_port)) to_chat(user, "[name] failed to connect to the port.") return - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) user.visible_message( \ "[user] connects [src].", \ "You fasten [src] to the port.", \ diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 614a2c194b..171310add9 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -49,12 +49,12 @@ /obj/item/clothing/gloves/color/black/ce item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. -/obj/item/clothing/gloves/color/black/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/wirecutters)) +/obj/item/clothing/gloves/color/black/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wirecutters)) if(can_be_cut && icon_state == initial(icon_state))//only if not dyed to_chat(user, "You snip the fingertips off of [src].") - playsound(user.loc, W.usesound, rand(10,50), 1) - new /obj/item/clothing/gloves/fingerless(user.loc) + I.play_tool_sound(src) + new /obj/item/clothing/gloves/fingerless(drop_location()) qdel(src) ..() diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 85ae7c3b18..d0cbabb052 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -105,22 +105,33 @@ /datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents) if(!R.tools.len) - return 1 + return TRUE var/list/possible_tools = list() + var/list/present_qualities = list() for(var/obj/item/I in user.contents) if(istype(I, /obj/item/storage)) for(var/obj/item/SI in I.contents) possible_tools += SI.type + if(SI.tool_behaviour) + present_qualities.Add(SI.tool_behaviour) + possible_tools += I.type + + if(I.tool_behaviour) + present_qualities.Add(I.tool_behaviour) + possible_tools += contents main_loop: for(var/A in R.tools) - for(var/I in possible_tools) - if(ispath(I,A)) - continue main_loop - return 0 - return 1 + if(A in present_qualities) + continue + else + for(var/I in possible_tools) + if(ispath(I, A)) + continue main_loop + return FALSE + return TRUE /datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) var/list/contents = get_surroundings(user) @@ -401,8 +412,7 @@ data["catalyst_text"] = catalyst_text for(var/a in R.tools) - var/atom/A = a //cheat-typecast - tool_text += " [R.tools[A]] [initial(A.name)]," + tool_text += " [a]," tool_text = replacetext(tool_text,",","",-1) data["tool_text"] = tool_text diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index fa63da1ef1..28a8d779ec 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -16,7 +16,7 @@ result = /obj/item/gun reqs = list(/obj/item/gun = 1) parts = list(/obj/item/gun = 1) - tools = list(/obj/item/weldingtool, /obj/item/screwdriver, /obj/item/wirecutters) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) time = 50 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -134,7 +134,7 @@ /obj/item/gun/energy/e_gun/advtaser = 1, /obj/item/stock_parts/cell = 1, /obj/item/device/assembly/prox_sensor = 1) - tools = list(/obj/item/weldingtool, /obj/item/screwdriver) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER) time = 60 category = CAT_ROBOT @@ -146,7 +146,7 @@ /obj/item/melee/baton = 1, /obj/item/device/assembly/prox_sensor = 1, /obj/item/bodypart/r_arm/robot = 1) - tools = list(/obj/item/weldingtool) + tools = list(TOOL_WELDER) time = 60 category = CAT_ROBOT @@ -192,8 +192,7 @@ /datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but name = "Pneumatic Cannon" result = /obj/item/pneumatic_cannon/ghetto - tools = list(/obj/item/weldingtool, - /obj/item/wrench) + tools = list(TOOL_WELDER, TOOL_WRENCH) reqs = list(/obj/item/stack/sheet/metal = 4, /obj/item/stack/packageWrap = 8, /obj/item/pipe = 2) @@ -209,7 +208,7 @@ /obj/item/stack/rods = 1) parts = list(/obj/item/device/assembly/igniter = 1, /obj/item/weldingtool = 1) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 10 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -220,7 +219,7 @@ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /obj/item/rcd_ammo = 1, /obj/item/stock_parts/manipulator = 2) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -231,7 +230,7 @@ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /obj/item/stock_parts/capacitor/adv = 2, /obj/item/stock_parts/micro_laser/ultra = 1) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -240,7 +239,7 @@ name = "Dragonsbreath Shell" result = /obj/item/ammo_casing/shotgun/dragonsbreath reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -252,7 +251,7 @@ /datum/reagent/glycerol = 5, /datum/reagent/toxin/acid = 5, /datum/reagent/toxin/acid/fluacid = 5) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -263,7 +262,7 @@ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /obj/item/stock_parts/micro_laser/ultra = 1, /obj/item/stock_parts/subspace/crystal = 1) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -275,7 +274,7 @@ /obj/item/stack/sheet/metal = 1, /obj/item/stack/cable_coil = 1, /datum/reagent/fuel = 10) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -286,7 +285,7 @@ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /obj/item/stock_parts/capacitor/adv = 1, /obj/item/stock_parts/micro_laser/high = 1) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -298,7 +297,7 @@ /obj/item/pipe = 1, /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5) - tools = list(/obj/item/screwdriver) + tools = list(TOOL_SCREWDRIVER) time = 100 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -309,7 +308,7 @@ reqs = list(/obj/item/circular_saw = 1, /obj/item/stack/cable_coil = 3, /obj/item/stack/sheet/plasteel = 5) - tools = list(/obj/item/weldingtool) + tools = list(TOOL_WELDER) time = 50 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -590,7 +589,7 @@ name = "Makeshift Rapid Cable Layer" result = /obj/item/twohanded/rcl/ghetto time = 40 - tools = list(/obj/item/weldingtool, /obj/item/screwdriver, /obj/item/wrench) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) reqs = list(/obj/item/stack/sheet/metal = 15) category = CAT_MISC diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index 10039f7a8b..3e5ecb6f45 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -15,12 +15,21 @@ name = "egg" desc = "An egg!" icon_state = "egg" - list_reagents = list("nutriment" = 1) + list_reagents = list("eggyolk" = 5) cooked_type = /obj/item/reagent_containers/food/snacks/boiledegg filling_color = "#F0E68C" - tastes = list("egg" = 1) foodtype = MEAT - grind_results = list("eggyolk" = 5) + grind_results = list() + +/obj/item/reagent_containers/food/snacks/egg/gland + desc = "An egg! It looks weird..." + +/obj/item/reagent_containers/food/snacks/egg/gland/Initialize() + . = ..() + reagents.add_reagent(get_random_reagent_id(), 15) + + var/color = mix_color_from_reagents(reagents.reagent_list) + add_atom_colour(color, FIXED_COLOUR_PRIORITY) /obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) if(!..()) //was it caught by a mob? @@ -30,7 +39,7 @@ qdel(src) /obj/item/reagent_containers/food/snacks/egg/attackby(obj/item/W, mob/user, params) - if(istype( W, /obj/item/toy/crayon )) + if(istype(W, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = W var/clr = C.item_color @@ -38,7 +47,7 @@ to_chat(usr, "[src] refuses to take on this colour!") return - to_chat(usr, "You colour [src] [clr].") + to_chat(usr, "You colour [src] with [W].") icon_state = "egg-[clr]" item_color = clr else @@ -47,42 +56,34 @@ /obj/item/reagent_containers/food/snacks/egg/blue icon_state = "egg-blue" item_color = "blue" - tastes = list("egg" = 4, "the back of class" = 1) /obj/item/reagent_containers/food/snacks/egg/green icon_state = "egg-green" item_color = "green" - tastes = list("egg" = 4, "the back of class" = 1) /obj/item/reagent_containers/food/snacks/egg/mime icon_state = "egg-mime" item_color = "mime" - tastes = list("egg" = 4, "the back of class" = 1) /obj/item/reagent_containers/food/snacks/egg/orange icon_state = "egg-orange" item_color = "orange" - tastes = list("egg" = 4, "the back of class" = 1) /obj/item/reagent_containers/food/snacks/egg/purple icon_state = "egg-purple" item_color = "purple" - tastes = list("egg" = 4, "the back of class" = 1) /obj/item/reagent_containers/food/snacks/egg/rainbow icon_state = "egg-rainbow" item_color = "rainbow" - tastes = list("egg" = 4, "the back of class" = 1) /obj/item/reagent_containers/food/snacks/egg/red icon_state = "egg-red" item_color = "red" - tastes = list("egg" = 4, "the back of class" = 1) /obj/item/reagent_containers/food/snacks/egg/yellow icon_state = "egg-yellow" item_color = "yellow" - tastes = list("egg" = 4, "the back of class" = 1) /obj/item/reagent_containers/food/snacks/friedegg name = "fried egg" diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 5bc2be78ce..b91a848421 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -62,7 +62,7 @@ "[user] starts to fix part of the microwave.", \ "You start to fix part of the microwave..." \ ) - if (do_after(user,20*O.toolspeed, target = src)) + if (O.use_tool(src, user, 20)) user.visible_message( \ "[user] fixes part of the microwave.", \ "You fix part of the microwave." \ @@ -73,7 +73,7 @@ "[user] starts to fix part of the microwave.", \ "You start to fix part of the microwave..." \ ) - if (do_after(user,20*O.toolspeed, target = src)) + if (O.use_tool(src, user, 20)) user.visible_message( \ "[user] fixes the microwave.", \ "You fix the microwave." \ diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 8fc5c43bcc..5277a25991 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -801,8 +801,7 @@ if(!anchored && !isinspace()) user.visible_message("[user] begins to wrench [src] into place.", \ "You begin to wrench [src] in place...") - playsound(loc, O.usesound, 50, 1) - if (do_after(user, 20*O.toolspeed, target = src)) + if (O.use_tool(src, user, 20, volume=50)) if(anchored) return anchored = TRUE @@ -811,8 +810,7 @@ else if(anchored) user.visible_message("[user] begins to unwrench [src].", \ "You begin to unwrench [src]...") - playsound(loc, O.usesound, 50, 1) - if (do_after(user, 20*O.toolspeed, target = src)) + if (O.use_tool(src, user, 20, volume=50)) if(!anchored) return anchored = FALSE @@ -821,7 +819,7 @@ else if(istype(O, /obj/item/wirecutters) && unwrenchable) using_irrigation = !using_irrigation - playsound(src, O.usesound, 50, 1) + O.play_tool_sound(src) user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \ "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.") for(var/obj/machinery/hydroponics/h in range(1,src)) @@ -832,11 +830,11 @@ to_chat(user, "[src] doesn't have any plants or weeds!") return user.visible_message("[user] starts digging out [src]'s plants...", "You start digging out [src]'s plants...") - playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) + O.play_tool_sound(src) if(!do_after(user, 50, target = src) || (!myseed && !weedlevel)) return user.visible_message("[user] digs out the plants in [src]!", "You dig out all of [src]'s plants!") - playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) + O.play_tool_sound(src) if(myseed) //Could be that they're just using it as a de-weeder age = 0 plant_health = 0 diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index b039c1e968..fcb566fcd8 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -279,8 +279,8 @@ visible_message(" [user] waves [src] around [target].") -/obj/item/device/electronic_assembly/screwdriver_act(mob/living/user, obj/item/S) - playsound(src, S.usesound, 50, 1) +/obj/item/device/electronic_assembly/screwdriver_act(mob/living/user, obj/item/I) + I.play_tool_sound(src) opened = !opened to_chat(user, "You [opened ? "open" : "close"] the maintenance hatch of [src].") update_icon() diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index 91aa958ae9..d9369091e8 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -194,20 +194,10 @@ GLOBAL_PROTECT(exp_to_update) return -1 if(!SSdbcore.Connect()) return -1 - var/datum/DBQuery/exp_read = SSdbcore.NewQuery("SELECT job, minutes FROM [format_table_name("role_time")] WHERE ckey = '[sanitizeSQL(ckey)]'") - if(!exp_read.Execute()) + if (!isnum(minutes)) return -1 var/list/play_records = list() - while(exp_read.NextRow()) - play_records[exp_read.item[1]] = text2num(exp_read.item[2]) - for(var/rtype in SSjob.name_occupations) - if(!play_records[rtype]) - play_records[rtype] = 0 - for(var/rtype in GLOB.exp_specialmap) - if(!play_records[rtype]) - play_records[rtype] = 0 - var/list/old_records = play_records.Copy() if(isliving(mob)) if(mob.stat != DEAD) var/rolefound = FALSE @@ -245,15 +235,19 @@ GLOBAL_PROTECT(exp_to_update) to_chat(src,"You got: [minutes] Ghost EXP!") else if(minutes) //Let "refresh" checks go through return - prefs.exp = play_records for(var/jtype in play_records) - if(play_records[jtype] != old_records[jtype]) - LAZYINITLIST(GLOB.exp_to_update) - GLOB.exp_to_update.Add(list(list( - "job" = "'[sanitizeSQL(jtype)]'", - "ckey" = "'[sanitizeSQL(ckey)]'", - "minutes" = play_records[jtype]))) + var/jvalue = play_records[jtype] + if (!jvalue) + continue + if (!isnum(jvalue)) + CRASH("invalid job value [jtype]:[jvalue]") + LAZYINITLIST(GLOB.exp_to_update) + GLOB.exp_to_update.Add(list(list( + "job" = "'[sanitizeSQL(jtype)]'", + "ckey" = "'[sanitizeSQL(ckey)]'", + "minutes" = jvalue))) + prefs.exp[jtype] += jvalue addtimer(CALLBACK(SSblackbox,/datum/controller/subsystem/blackbox/proc/update_exp_db),20,TIMER_OVERRIDE|TIMER_UNIQUE) diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index 7f7fdca900..d6f07df931 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -90,6 +90,5 @@ Chaplain belt = /obj/item/device/pda/chaplain uniform = /obj/item/clothing/under/rank/chaplain backpack_contents = list(/obj/item/device/camera/spooky = 1) - accessory = /obj/item/clothing/accessory/pocketprotector/cosmetology backpack = /obj/item/storage/backpack/cultpack satchel = /obj/item/storage/backpack/cultpack diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm index b61c61f6c8..1b1619cc24 100644 --- a/code/modules/jobs/job_types/engineering.dm +++ b/code/modules/jobs/job_types/engineering.dm @@ -41,7 +41,6 @@ Chief Engineer shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/hardhat/white gloves = /obj/item/clothing/gloves/color/black/ce - accessory = /obj/item/clothing/accessory/pocketprotector/full backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/device/modular_computer/tablet/preset/advanced=1) backpack = /obj/item/storage/backpack/industrial @@ -96,7 +95,6 @@ Station Engineer shoes = /obj/item/clothing/shoes/workboots head = /obj/item/clothing/head/hardhat r_pocket = /obj/item/device/t_scanner - accessory = /obj/item/clothing/accessory/pocketprotector/full backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng @@ -150,7 +148,6 @@ Atmospheric Technician ears = /obj/item/device/radio/headset/headset_eng uniform = /obj/item/clothing/under/rank/atmospheric_technician r_pocket = /obj/item/device/analyzer - accessory = /obj/item/clothing/accessory/pocketprotector/full backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 151ed213f8..1f2df19f64 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -112,7 +112,6 @@ Chemist uniform = /obj/item/clothing/under/rank/chemist shoes = /obj/item/clothing/shoes/sneakers/white suit = /obj/item/clothing/suit/toggle/labcoat/chemist - accessory = /obj/item/clothing/accessory/pocketprotector/full backpack = /obj/item/storage/backpack/chemistry satchel = /obj/item/storage/backpack/satchel/chem duffelbag = /obj/item/storage/backpack/duffelbag/med diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index 7fc1dada77..d8579a37b0 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -43,7 +43,6 @@ Research Director suit = /obj/item/clothing/suit/toggle/labcoat l_hand = /obj/item/clipboard l_pocket = /obj/item/device/laser_pointer - accessory = /obj/item/clothing/accessory/pocketprotector/full backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/device/modular_computer/tablet/preset/advanced=1) backpack = /obj/item/storage/backpack/science @@ -91,7 +90,6 @@ Scientist backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox - accessory = /obj/item/clothing/accessory/pocketprotector/full /* Roboticist diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index 7d3127a6b4..54df252f5d 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -12,6 +12,7 @@ /datum/proc/key_up(key, client/user) // Called when a key is released return /datum/proc/keyLoop(client/user) // Called once every frame + set waitfor = FALSE return // removes all the existing macros @@ -46,4 +47,4 @@ if(prefs.hotkeys) winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=default") else - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=old_default") \ No newline at end of file + winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=old_default") diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index b7673a9640..2b9ed28842 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -57,14 +57,12 @@ switch(state) if(0) if(istype(I, /obj/item/wrench)) - playsound(loc, I.usesound, 100, 1) - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") anchored = TRUE state = 1 if(istype(I, /obj/item/crowbar)) - playsound(loc, I.usesound, 100, 1) - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You pry the frame apart.") deconstruct(TRUE) @@ -77,7 +75,7 @@ state = 2 icon_state = "book-0" if(istype(I, /obj/item/wrench)) - playsound(loc, I.usesound, 100, 1) + I.play_tool_sound(src, 100) to_chat(user, "You unwrench the frame.") anchored = FALSE state = 0 @@ -99,14 +97,14 @@ if(!newname) return else - name = ("bookcase ([sanitize(newname)])") + name = "bookcase ([sanitize(newname)])" else if(istype(I, /obj/item/crowbar)) if(contents.len) to_chat(user, "You need to remove the books first!") else - playsound(loc, I.usesound, 100, 1) + I.play_tool_sound(src, 100) to_chat(user, "You pry the shelf out.") - new /obj/item/stack/sheet/mineral/wood(loc, 2) + new /obj/item/stack/sheet/mineral/wood(drop_location(), 2) state = 1 icon_state = "bookempty" else diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index db11737a49..174fada464 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -186,10 +186,7 @@ /obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user) if(locked) - if(istype(W, /obj/item/card/emag)) - boom(user) - return - else if(istype(W, /obj/item/device/multitool)) + if(istype(W, /obj/item/device/multitool)) to_chat(user, "DECA-CODE LOCK REPORT:") if(attempts == 1) to_chat(user, "* Anti-Tamper Bomb will activate on next failed access attempt.") @@ -215,6 +212,10 @@ return return ..() +/obj/structure/closet/crate/secure/loot/emag_act(mob/user) + if(locked) + boom(user) + /obj/structure/closet/crate/secure/loot/togglelock(mob/user) if(locked) boom(user) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 5e65ca675b..b455e55db9 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -38,18 +38,18 @@ var/obj/item/crusher_trophy/T = t to_chat(user, "It has \a [T] attached, which causes [T.effect_desc()].") -/obj/item/twohanded/required/kinetic_crusher/attackby(obj/item/A, mob/living/user) - if(istype(A, /obj/item/crowbar)) +/obj/item/twohanded/required/kinetic_crusher/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/crowbar)) if(LAZYLEN(trophies)) to_chat(user, "You remove [src]'s trophies.") - playsound(loc, A.usesound, 100, 1) + I.play_tool_sound(src) for(var/t in trophies) var/obj/item/crusher_trophy/T = t T.remove_from(src, user) else to_chat(user, "There are no trophies on [src].") - else if(istype(A, /obj/item/crusher_trophy)) - var/obj/item/crusher_trophy/T = A + else if(istype(I, /obj/item/crusher_trophy)) + var/obj/item/crusher_trophy/T = I T.add_to(src, user) else return ..() diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index b34bb980ee..1038d8c267 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -13,13 +13,13 @@ w_class = WEIGHT_CLASS_BULKY materials = list(MAT_METAL=2000) //one sheet, but where can you make them? var/digspeed = 40 - var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg') + usesound = list('sound/effects/picaxe1.ogg', 'sound/effects/picaxe2.ogg', 'sound/effects/picaxe3.ogg') attack_verb = list("hit", "pierced", "sliced", "attacked") /obj/item/pickaxe/suicide_act(mob/living/user) user.visible_message("[user] begins digging into their chest! It looks like [user.p_theyre()] trying to commit suicide!") if(do_after(user,30, target = user)) - playDigSound() + play_tool_sound(user) return BRUTELOSS user.visible_message("[user] couldn't do it!") return SHAME @@ -34,9 +34,6 @@ w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=1000) -/obj/item/pickaxe/proc/playDigSound() - playsound(src, pick(digsound),50,1) - /obj/item/pickaxe/silver name = "silver-plated pickaxe" icon_state = "spickaxe" @@ -59,7 +56,7 @@ item_state = "jackhammer" slot_flags = SLOT_BELT digspeed = 25 //available from roundstart, faster than a pickaxe. - digsound = list('sound/weapons/drill.ogg') + usesound = 'sound/weapons/drill.ogg' hitsound = 'sound/weapons/drill.ogg' desc = "An electric mining drill for the especially scrawny." @@ -84,7 +81,7 @@ icon_state = "jackhammer" item_state = "jackhammer" digspeed = 5 //the epitome of powertools. extremely fast mining, laughs at puny walls - digsound = list('sound/weapons/sonic_jackhammer.ogg') + usesound = 'sound/weapons/sonic_jackhammer.ogg' hitsound = 'sound/weapons/sonic_jackhammer.ogg' desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls." @@ -99,6 +96,7 @@ slot_flags = SLOT_BELT force = 8 var/digspeed = 20 + usesound = 'sound/effects/shovel_dig.ogg' throwforce = 4 item_state = "shovel" w_class = WEIGHT_CLASS_NORMAL @@ -109,7 +107,7 @@ /obj/item/shovel/suicide_act(mob/living/user) user.visible_message("[user] begins digging their own grave! It looks like [user.p_theyre()] trying to commit suicide!") if(do_after(user,30, target = user)) - playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) + play_tool_sound(user) return BRUTELOSS user.visible_message("[user] couldn't do it!") return SHAME diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 573c3dab71..66faa7cb2c 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -138,16 +138,16 @@ density = TRUE pixel_y = -32 -/obj/item/device/gps/computer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles the gps.", \ - "You start to disassemble the gps...", "You hear clanking and banging noises.") - if(do_after(user, 20*W.toolspeed, target = src)) - new /obj/item/device/gps(loc) - qdel(src) - return - return ..() +/obj/item/device/gps/computer/wrench_act(mob/living/user, obj/item/I) + if(flags_1 & NODECONSTRUCT_1) + return TRUE + + user.visible_message("[user] disassembles [src].", + "You start to disassemble [src]...", "You hear clanking and banging noises.") + if(I.use_tool(src, user, 20, volume=50)) + new /obj/item/device/gps(loc) + qdel(src) + return TRUE /obj/item/device/gps/computer/attack_hand(mob/user) attack_self(user) @@ -214,14 +214,15 @@ new buildstacktype(loc,buildstackamount) qdel(src) -/obj/structure/fans/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles the fan.", \ - "You start to disassemble the fan...", "You hear clanking and banging noises.") - if(do_after(user, 20*W.toolspeed, target = src)) - deconstruct() - return ..() +/obj/structure/fans/wrench_act(mob/living/user, obj/item/I) + if(flags_1 & NODECONSTRUCT_1) + return TRUE + + user.visible_message("[user] disassembles [src].", + "You start to disassemble [src]...", "You hear clanking and banging noises.") + if(I.use_tool(src, user, 20, volume=50)) + deconstruct() + return TRUE /obj/structure/fans/tiny name = "tiny fan" diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index da44a49626..fae8985a73 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -46,9 +46,9 @@ new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 800), - new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400), - new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/device/mine_bot_ugprade/health, 400), - new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/device/mine_bot_ugprade/cooldown, 600), + new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_upgrade, 400), + new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/device/mine_bot_upgrade/health, 400), + new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/device/mine_bot_upgrade/cooldown, 600), new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/slime/sentience/mining, 1000), new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150), diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index fe90caf279..3ab7b2dc5c 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -64,18 +64,21 @@ /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = I - if(W.welding && !stat) - if(AIStatus != AI_OFF && AIStatus != AI_IDLE) - to_chat(user, "[src] is moving around too much to repair!") - return - if(maxHealth == health) - to_chat(user, "[src] is at full integrity.") - else - if(W.remove_fuel(0, user)) - adjustBruteLoss(-10) - to_chat(user, "You repair some of the armor on [src].") + if(stat) return + if(AIStatus != AI_OFF && AIStatus != AI_IDLE) + to_chat(user, "[src] is moving around too much to repair!") + return + + if(maxHealth == health) + to_chat(user, "[src] is at full integrity.") + return + + if(I.use_tool(src, user, 0, volume=40)) + adjustBruteLoss(-10) + to_chat(user, "You repair some of the armor on [src].") + return + if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner)) to_chat(user, "You instruct [src] to drop any collected ore.") DropOre() @@ -202,18 +205,18 @@ //Melee -/obj/item/device/mine_bot_ugprade +/obj/item/device/mine_bot_upgrade name = "minebot melee upgrade" desc = "A minebot upgrade." icon_state = "door_electronics" icon = 'icons/obj/module.dmi' -/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity) +/obj/item/device/mine_bot_upgrade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity) if(!istype(M) || !proximity) return upgrade_bot(M, user) -/obj/item/device/mine_bot_ugprade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) +/obj/item/device/mine_bot_upgrade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) if(M.melee_damage_upper != initial(M.melee_damage_upper)) to_chat(user, "[src] already has a combat upgrade installed!") return @@ -223,10 +226,10 @@ //Health -/obj/item/device/mine_bot_ugprade/health +/obj/item/device/mine_bot_upgrade/health name = "minebot chassis upgrade" -/obj/item/device/mine_bot_ugprade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) +/obj/item/device/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) if(M.maxHealth != initial(M.maxHealth)) to_chat(user, "[src] already has a reinforced chassis!") return @@ -236,10 +239,10 @@ //Cooldown -/obj/item/device/mine_bot_ugprade/cooldown +/obj/item/device/mine_bot_upgrade/cooldown name = "minebot cooldown upgrade" -/obj/item/device/mine_bot_ugprade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) +/obj/item/device/mine_bot_upgrade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) name = "minebot cooldown upgrade" if(M.ranged_cooldown_time != initial(M.ranged_cooldown_time)) to_chat(user, "[src] already has a decreased weapon cooldown!") diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 163e590ea9..56020b5407 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -39,15 +39,15 @@ . = ..() add_overlay(stack_overlays) -/obj/item/stack/ore/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = I - if(W.remove_fuel(15) && refined_type) - new refined_type(get_turf(src.loc)) - qdel(src) - else if(W.isOn()) - to_chat(user, "Not enough fuel to smelt [src].") - ..() +/obj/item/stack/ore/welder_act(mob/living/user, obj/item/I) + if(!refined_type) + return TRUE + + if(I.use_tool(src, user, 0, volume=50, amount=15)) + new refined_type(drop_location()) + use(1) + + return TRUE /obj/item/stack/ore/uranium name = "uranium ore" @@ -114,13 +114,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/plasma -/obj/item/stack/ore/plasma/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = I - if(W.welding) - to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!") - else - ..() +/obj/item/stack/ore/plasma/welder_act(mob/living/user, obj/item/I) + to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!") + return TRUE /obj/item/stack/ore/silver @@ -423,21 +419,19 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ else to_chat(user, "You need one length of cable to attach a string to the coin!") return - - else if(istype(W, /obj/item/wirecutters)) - if(!string_attached) - ..() - return - - var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc) - CC.amount = 1 - CC.update_icon() - overlays = list() - string_attached = null - to_chat(user, "You detach the string from the coin.") else ..() +/obj/item/coin/wirecutter_act(mob/living/user, obj/item/I) + if(!string_attached) + return TRUE + + new /obj/item/stack/cable_coil(drop_location(), 1) + overlays = list() + string_attached = null + to_chat(user, "You detach the string from the coin.") + return TRUE + /obj/item/coin/attack_self(mob/user) if(cooldown < world.time) if(string_attached) //does the coin have a wire attached diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 6c62b5a365..a9c660e554 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -9,23 +9,25 @@ density = TRUE pressure_resistance = 5*ONE_ATMOSPHERE -/obj/structure/ore_box/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/stack/ore)) - user.transferItemToLoc(W, src) - else if (istype(W, /obj/item/storage)) - var/obj/item/storage/S = W +/obj/structure/ore_box/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/ore)) + user.transferItemToLoc(I, src) + else if(istype(I, /obj/item/storage)) + var/obj/item/storage/S = I for(var/obj/item/stack/ore/O in S.contents) S.remove_from_storage(O, src) //This will move the item to this item's contents to_chat(user, "You empty the ore in [S] into \the [src].") - else if(istype(W, /obj/item/crowbar)) - playsound(src, W.usesound, 50, 1) - var/obj/item/crowbar/C = W - if(do_after(user, 50*C.toolspeed, target = src)) - user.visible_message("[user] pries \the [src] apart.", "You pry apart \the [src].", "You hear splitting wood.") - deconstruct(TRUE, user) else return ..() +/obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I) + if(I.use_tool(src, user, 50, volume=50)) + user.visible_message("[user] pries \the [src] apart.", + "You pry apart \the [src].", + "You hear splitting wood.") + deconstruct(TRUE, user) + return TRUE + /obj/structure/ore_box/examine(mob/living/user) if(Adjacent(user) && istype(user)) show_contents(user) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index f494f32f6f..ee21d21bb5 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -121,6 +121,19 @@ return I return FALSE +//Checks if we're holding a tool that has given quality +//Returns the tool that has the best version of this quality +/mob/proc/is_holding_tool_quality(quality) + var/obj/item/best_item + var/best_quality = INFINITY + + for(var/obj/item/I in held_items) + if(I.tool_behaviour == quality && I.toolspeed < best_quality) + best_item = I + best_quality = I.toolspeed + + return best_item + //To appropriately fluff things like "they are holding [I] in their [get_held_index_name(get_held_index_of_item(I))]" //Can be overriden to pass off the fluff to something else (eg: science allowing people to add extra robotic limbs, and having this proc react to that @@ -286,7 +299,7 @@ return doUnEquip(I, force, null, TRUE, idrop) //DO NOT CALL THIS PROC -//use one of the above 2 helper procs +//use one of the above 3 helper procs //you may override it, but do not modify the args /mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) //Force overrides NODROP_1 for things like wizarditis and admin undress. //Use no_move if the item is just gonna be immediately moved afterward diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c2e0abb349..bc170eff68 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -355,24 +355,21 @@ /mob/living/silicon/robot/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src)) user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/weldingtool/WT = W if (!getBruteLoss()) to_chat(user, "[src] is already in good condition!") return - if (WT.remove_fuel(0, user)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. - if(src == user) - to_chat(user, "You start fixing yourself...") - if(!do_after(user, 50, target = src)) - return + if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. + return + if(src == user) + to_chat(user, "You start fixing yourself...") + if(!W.use_tool(src, user, 50)) + return - adjustBruteLoss(-30) - updatehealth() - add_fingerprint(user) - visible_message("[user] has fixed some of the dents on [src].") - return - else - to_chat(user, "The welder must be on for this task!") - return + adjustBruteLoss(-30) + updatehealth() + add_fingerprint(user) + visible_message("[user] has fixed some of the dents on [src].") + return else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) user.changeNext_move(CLICK_CD_MELEE) @@ -444,9 +441,8 @@ spark_system.start() return else - playsound(src, W.usesound, 50, 1) to_chat(user, "You start to unfasten [src]'s securing bolts...") - if(do_after(user, 50*W.toolspeed, target = src) && !cell) + if(W.use_tool(src, user, 50, volume=50) && !cell) user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!") deconstruct() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 07499b0a1f..ac48f9e6d5 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -303,12 +303,10 @@ if(!open) to_chat(user, "Unable to repair with the maintenance panel closed!") return - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) + + if(W.use_tool(src, user, 0, volume=40)) adjustHealth(-10) user.visible_message("[user] repairs [src]!","You repair [src].") - else - to_chat(user, "The welder must be on for this task!") else if(W.force) //if force is non-zero do_sparks(5, TRUE, src) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index f2333ef713..274a252cc1 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -101,8 +101,7 @@ if(ASSEMBLY_FOURTH_STEP) if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) + if(W.use_tool(src, user, 0, volume=40)) name = "shielded frame assembly" to_chat(user, "You weld the vest to [src].") build_step++ @@ -183,9 +182,8 @@ if(8) if(istype(W, /obj/item/screwdriver)) - playsound(loc, W.usesound, 100, 1) to_chat(user, "You start attaching the gun to the frame...") - if(do_after(user, 40*W.toolspeed, 0, src, 1)) + if(W.use_tool(src, user, 40, volume=100)) name = "armed [name]" to_chat(user, "Taser gun attached.") build_step++ @@ -391,8 +389,7 @@ switch(build_step) if(ASSEMBLY_FIRST_STEP) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(WT.remove_fuel(0, user)) + if(I.use_tool(src, user, 0, volume=40)) add_overlay("hs_hole") to_chat(user, "You weld a hole in [src]!") build_step++ @@ -414,8 +411,7 @@ build_step++ else if(istype(I, /obj/item/weldingtool)) //deconstruct - var/obj/item/weldingtool/WT = I - if(WT.remove_fuel(0, user)) + if(I.use_tool(src, user, 0, volume=40)) cut_overlay("hs_hole") to_chat(user, "You weld the hole in [src] shut!") build_step-- diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index dc2fb0eb09..ea4bb1d089 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -27,7 +27,7 @@ maxHealth = 30 unsuitable_atmos_damage = 0 wander = 0 - speed = -1 + speed = 0 ventcrawler = VENTCRAWLER_ALWAYS healable = 0 density = FALSE diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 1ec3d204c1..2ee268014b 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -80,7 +80,7 @@ if(istype(I, /obj/item/screwdriver) && stat != DEAD) if(health < maxHealth) to_chat(user, "You start to tighten loose screws on [src]...") - if(do_after(user,80*I.toolspeed,target=user)) + if(I.use_tool(src, user, 80)) adjustBruteLoss(-getBruteLoss()) visible_message("[user] tightens [src == user ? "[user.p_their()]" : "[src]'s"] loose screws!", "You tighten [src == user ? "your" : "[src]'s"] loose screws.") else @@ -91,12 +91,10 @@ else if(istype(I, /obj/item/wrench) && user != src) //They aren't required to be hacked, because laws can change in other ways (i.e. admins) user.visible_message("[user] starts resetting [src]...", \ "You press down on [src]'s factory reset control...") - playsound(src, I.usesound, 50, 1) - if(!do_after(user, 50*I.toolspeed, target = src)) - return - user.visible_message("[user] resets [src]!", \ - "You reset [src]'s directives to factory defaults!") - update_drone_hack(FALSE) + if(I.use_tool(src, user, 50, volume=50)) + user.visible_message("[user] resets [src]!", \ + "You reset [src]'s directives to factory defaults!") + update_drone_hack(FALSE) return else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 57ed8720bf..7ebd88d22e 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -253,7 +253,7 @@ pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL var/list/feedMessages = list("It clucks happily.","It clucks happily.") - var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") + var/list/layMessage = EGG_LAYING_MESSAGES var/list/validColors = list("brown","black","white") gold_core_spawnable = FRIENDLY_SPAWN var/static/chicken_count = 0 @@ -290,7 +290,7 @@ if(!.) return if((!stat && prob(3) && eggsleft > 0) && egg_type) - visible_message("[src] [pick(layMessage)]") + visible_message("[src] [pick(layMessage)]") eggsleft-- var/obj/item/E = new egg_type(get_turf(src)) E.pixel_x = rand(-6,6) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 03e57c5ec6..e1cc2f3cb6 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -393,18 +393,15 @@ return if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(!WT.isOn()) - to_chat(user, "\The [W] is off.") - return - if(obj_integrity == max_integrity) to_chat(user, "\The [src] does not require repairs.") return + if(!W.tool_start_check(user, amount=1)) + return + to_chat(user, "You begin repairing damage to \the [src]...") - var/dmg = round(max_integrity - obj_integrity) - if(WT.remove_fuel(round(dmg/75)) && do_after(usr, dmg/10)) + if(W.use_tool(src, user, 20, volume=50, amount=1)) obj_integrity = max_integrity to_chat(user, "You repair \the [src].") return diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index fed93fabd3..6f7c99dac8 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -56,8 +56,7 @@ updateUsrDialog() else if(istype(P, /obj/item/wrench)) to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") - playsound(loc, P.usesound, 50, 1) - if(do_after(user, 20, target = src)) + if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") anchored = !anchored else if(user.a_intent != INTENT_HARM) diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index df69e9548a..92543bad90 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -60,7 +60,7 @@ update_icon() return if(istype(P, /obj/item/screwdriver) && storedcutter) - playsound(src, P.usesound, 50, 1) + P.play_tool_sound(src) to_chat(user, "[storedcutter] has been [cuttersecured ? "unsecured" : "secured"].") cuttersecured = !cuttersecured return diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 14aad9c7b7..b28b076812 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -42,9 +42,9 @@ /obj/item/photo/suicide_act(mob/living/carbon/user) user.visible_message("[user] is taking one last look at \the [src]! It looks like [user.p_theyre()] giving in to death!")//when you wanna look at photo of waifu one last time before you die... - if (user.gender == MALE) + if (user.gender == MALE) playsound(user, 'sound/voice/human/manlaugh1.ogg', 50, 1)//EVERY TIME I DO IT MAKES ME LAUGH - else if (user.gender == FEMALE) + else if (user.gender == FEMALE) playsound(user, 'sound/voice/human/womanlaugh.ogg', 50, 1) return OXYLOSS @@ -609,11 +609,10 @@ /obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver) || istype(I, /obj/item/wrench)) to_chat(user, "You start unsecuring [name]...") - playsound(loc, I.usesound, 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) + if(I.use_tool(src, user, 30, volume=50)) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You unsecure [name].") - deconstruct() + deconstruct() return else if(istype(I, /obj/item/photo)) diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index f8b8cae22a..cfbb3d199b 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -159,14 +159,14 @@ /obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/wrench)) if(!anchored) - playsound(src.loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) user.visible_message("[user.name] secures the [src.name] to the floor.", \ "You secure the anchor bolts to the floor.", \ "You hear a ratchet.") src.anchored = TRUE connect_to_network() else if(!linked_shielding.len > 0) - playsound(src.loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) user.visible_message("[user.name] unsecures the [src.name].", \ "You remove the anchor bolts.", \ "You hear a ratchet.") diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a99ccd4d14..c68b2bedb0 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -383,9 +383,9 @@ if (terminal) to_chat(user, "Disconnect the wires first!") return - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) to_chat(user, "You are trying to remove the power control board..." ) - if(do_after(user, 50*W.toolspeed, target = src)) + if(W.use_tool(src, user, 50)) if (has_electronics==1) has_electronics = 0 if (stat & BROKEN) @@ -417,13 +417,12 @@ else if(integration_cog) user.visible_message("[user] starts prying [integration_cog] from [src]...", \ "You painstakingly start tearing [integration_cog] out of [src]'s guts...") - playsound(src, W.usesound, 50, TRUE) - if(!do_after(user, 100 * W.toolspeed, target = src)) - return - user.visible_message("[user] destroys [integration_cog] in [src]!", \ - "[integration_cog] comes free with a clank and snaps in two as the machinery returns to normal!") - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - QDEL_NULL(integration_cog) + W.play_tool_sound(src) + if(W.use_tool(src, user, 100)) + user.visible_message("[user] destroys [integration_cog] in [src]!", \ + "[integration_cog] comes free with a clank and snaps in two as the machinery returns to normal!") + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + QDEL_NULL(integration_cog) return else if (opened!=2) //cover isn't removed opened = 0 @@ -468,12 +467,12 @@ if (has_electronics==1) has_electronics = 2 stat &= ~MAINT - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) to_chat(user, "You screw the circuit electronics into place.") else if (has_electronics==2) has_electronics = 1 stat |= MAINT - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) to_chat(user, "You unfasten the electronics.") else /* has_electronics==0 */ to_chat(user, "There is nothing to secure!") @@ -578,17 +577,12 @@ return else if (istype(W, /obj/item/weldingtool) && opened && has_electronics==0 && !terminal) - var/obj/item/weldingtool/WT = W - if (WT.get_fuel() < 3) - to_chat(user, "You need more welding fuel to complete this task!") + if(!W.tool_start_check(user, amount=3)) return user.visible_message("[user.name] welds [src].", \ "You start welding the APC frame...", \ "You hear welding.") - playsound(src.loc, WT.usesound, 50, 1) - if(do_after(user, 50*W.toolspeed, target = src)) - if(!src || !WT.remove_fuel(3, user)) - return + if(W.use_tool(src, user, 50, volume=50, amount=3)) if ((stat & BROKEN) || opened==2) new /obj/item/stack/sheet/metal(loc) user.visible_message(\ @@ -911,6 +905,8 @@ return 1 /obj/machinery/power/apc/proc/toggle_breaker() + if(!is_operational() || failure_timer) + return operating = !operating update() update_icon() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 883df8a6c9..289c78b712 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -471,6 +471,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai singular_name = "cable piece" full_w_class = WEIGHT_CLASS_SMALL grind_results = list("copper" = 2) //2 copper per cable in the coil + usesound = 'sound/items/deconstruct.ogg' /obj/item/stack/cable_coil/cyborg is_cyborg = 1 diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index c985302509..da8608ce9f 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -70,7 +70,7 @@ return 100*charge/maxcharge // use power from a cell -/obj/item/stock_parts/cell/proc/use(amount) +/obj/item/stock_parts/cell/use(amount) if(rigged && amount > 0) explode() return 0 diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 6afb080897..cb7c9b1a69 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -188,20 +188,16 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(GRAV_NEEDS_SCREWDRIVER) if(istype(I, /obj/item/screwdriver)) to_chat(user, "You secure the screws of the framework.") - playsound(src.loc, I.usesound, 50, 1) + I.play_tool_sound(src) broken_state++ update_icon() return if(GRAV_NEEDS_WELDING) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(WT.remove_fuel(1, user)) + if(I.use_tool(src, user, 0, volume=50, amount=1)) to_chat(user, "You mend the damaged framework.") - playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) broken_state++ update_icon() - else if(WT.isOn()) - to_chat(user, "You don't have enough fuel to mend the damaged framework!") return if(GRAV_NEEDS_PLASTEEL) if(istype(I, /obj/item/stack/sheet/plasteel)) @@ -218,7 +214,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(GRAV_NEEDS_WRENCH) if(istype(I, /obj/item/wrench)) to_chat(user, "You secure the plating to the framework.") - playsound(src.loc, I.usesound, 75, 1) + I.play_tool_sound(src) set_fix() return return ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 0ee64aa9c1..022b1f7d5b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -109,25 +109,19 @@ switch(stage) if(1) if(istype(W, /obj/item/wrench)) - playsound(src.loc, W.usesound, 75, 1) to_chat(usr, "You begin deconstructing [src]...") - if (!do_after(usr, 30*W.toolspeed, target = src)) - return - new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) - user.visible_message("[user.name] deconstructs [src].", \ - "You deconstruct [src].", "You hear a ratchet.") - playsound(src.loc, 'sound/items/deconstruct.ogg', 75, 1) - qdel(src) + if (W.use_tool(src, user, 30, volume=50)) + new /obj/item/stack/sheet/metal(drop_location(), sheets_refunded) + user.visible_message("[user.name] deconstructs [src].", \ + "You deconstruct [src].", "You hear a ratchet.") + playsound(src.loc, 'sound/items/deconstruct.ogg', 75, 1) + qdel(src) return if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if(coil.use(1)) - switch(fixture_type) - if ("tube") - icon_state = "tube-construct-stage2" - if("bulb") - icon_state = "bulb-construct-stage2" + icon_state = "[fixture_type]-construct-stage2" stage = 2 user.visible_message("[user.name] adds wires to [src].", \ "You add wires to [src].") @@ -141,25 +135,21 @@ if(istype(W, /obj/item/wirecutters)) stage = 1 - switch(fixture_type) - if ("tube") - icon_state = "tube-construct-stage1" - if("bulb") - icon_state = "bulb-construct-stage1" - new /obj/item/stack/cable_coil(get_turf(loc), 1, "red") + icon_state = "[fixture_type]-construct-stage1" + new /obj/item/stack/cable_coil(drop_location(), 1, "red") user.visible_message("[user.name] removes the wiring from [src].", \ "You remove the wiring from [src].", "You hear clicking.") - playsound(loc, W.usesound, 100, 1) + W.play_tool_sound(src, 100) return if(istype(W, /obj/item/screwdriver)) user.visible_message("[user.name] closes [src]'s casing.", \ "You close [src]'s casing.", "You hear screwing.") - playsound(loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) switch(fixture_type) if("tube") newlight = new /obj/machinery/light/built(loc) - if ("bulb") + if("bulb") newlight = new /obj/machinery/light/small/built(loc) newlight.setDir(dir) transfer_fingerprints_to(newlight) @@ -429,7 +419,7 @@ // attempt to stick weapon into light socket else if(status == LIGHT_EMPTY) if(istype(W, /obj/item/screwdriver)) //If it's a screwdriver open it. - playsound(src.loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) user.visible_message("[user.name] opens [src]'s casing.", \ "You open [src]'s casing.", "You hear a noise.") deconstruct() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index ba3379df45..dc8e6e0793 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -195,7 +195,7 @@ return else if(istype(O, /obj/item/screwdriver)) panel_open = !panel_open - playsound(src.loc, O.usesound, 50, 1) + O.play_tool_sound(src) if(panel_open) to_chat(user, "You open the access panel.") else diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index c7a026dd83..507fdcaa66 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -207,10 +207,16 @@ return P /obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user, silent) - if(state == EM_WELDED) + if(active) + if(!silent) + to_chat(user, "Turn \the [src] off first!") + return FAILED_UNFASTEN + + else if(state == EM_WELDED) if(!silent) to_chat(user, "[src] is welded to the floor!") return FAILED_UNFASTEN + return ..() /obj/machinery/power/emitter/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) @@ -221,45 +227,52 @@ else state = EM_UNSECURED -/obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - if(active) - to_chat(user, "Turn \the [src] off first!") - return - default_unfasten_wrench(user, W, 0) - return +/obj/machinery/power/emitter/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 0) + return TRUE - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(active) - to_chat(user, "Turn \the [src] off first.") - return - switch(state) - if(EM_UNSECURED) - to_chat(user, "The [src.name] needs to be wrenched to the floor!") - if(EM_SECURED) - if(WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user.name] starts to weld the [name] to the floor.", \ - "You start to weld \the [src] to the floor...", \ - "You hear welding.") - if(do_after(user,20*W.toolspeed, target = src) && WT.isOn()) - state = EM_WELDED - to_chat(user, "You weld \the [src] to the floor.") - connect_to_network() - if(EM_WELDED) - if(WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user.name] starts to cut the [name] free from the floor.", \ - "You start to cut \the [src] free from the floor...", \ - "You hear welding.") - if(do_after(user,20*W.toolspeed, target = src) && WT.isOn()) - state = EM_SECURED - to_chat(user, "You cut \the [src] free from the floor.") - disconnect_from_network() - return +/obj/machinery/power/emitter/welder_act(mob/living/user, obj/item/I) + if(active) + to_chat(user, "Turn \the [src] off first.") + return TRUE - if(W.GetID()) + switch(state) + if(EM_UNSECURED) + to_chat(user, "The [src.name] needs to be wrenched to the floor!") + if(EM_SECURED) + if(!I.tool_start_check(user, amount=0)) + return TRUE + user.visible_message("[user.name] starts to weld the [name] to the floor.", \ + "You start to weld \the [src] to the floor...", \ + "You hear welding.") + if(I.use_tool(src, user, 20, volume=50)) + state = EM_WELDED + to_chat(user, "You weld \the [src] to the floor.") + connect_to_network() + if(EM_WELDED) + if(!I.tool_start_check(user, amount=0)) + return TRUE + user.visible_message("[user.name] starts to cut the [name] free from the floor.", \ + "You start to cut \the [src] free from the floor...", \ + "You hear welding.") + if(I.use_tool(src, user, 20, volume=50)) + state = EM_SECURED + to_chat(user, "You cut \the [src] free from the floor.") + disconnect_from_network() + + return TRUE + +/obj/machinery/power/emitter/crowbar_act(mob/living/user, obj/item/I) + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/power/emitter/screwdriver_act(mob/living/user, obj/item/I) + default_deconstruction_screwdriver(user, "emitter_open", "emitter", I) + return TRUE + + +/obj/machinery/power/emitter/attackby(obj/item/I, mob/user, params) + if(I.GetID()) if(obj_flags & EMAGGED) to_chat(user, "The lock seems to be broken!") return @@ -273,20 +286,11 @@ to_chat(user, "Access denied.") return - if(is_wire_tool(W) && panel_open) + else if(is_wire_tool(I) && panel_open) wires.interact(user) return - if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W)) - return - - if(exchange_parts(user, W)) - return - - if(default_pry_open(W)) - return - - if(default_deconstruction_crowbar(W)) + else if(exchange_parts(user, I)) return return ..() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index cdfbb35b34..4f39d34954 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -77,10 +77,16 @@ field_generator power level display to_chat(user, "[src] needs to be firmly secured to the floor first!") /obj/machinery/field/generator/can_be_unfasten_wrench(mob/user, silent) - if(state == FG_WELDED) + if(active) + if(!silent) + to_chat(user, "Turn \the [src] off first!") + return FAILED_UNFASTEN + + else if(state == FG_WELDED) if(!silent) to_chat(user, "[src] is welded to the floor!") return FAILED_UNFASTEN + return ..() /obj/machinery/field/generator/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) @@ -91,41 +97,41 @@ field_generator power level display else state = FG_UNSECURED -/obj/machinery/field/generator/attackby(obj/item/W, mob/user, params) +/obj/machinery/field/generator/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 0) + return TRUE + +/obj/machinery/field/generator/welder_act(mob/living/user, obj/item/I) if(active) to_chat(user, "[src] needs to be off!") - return - else if(istype(W, /obj/item/wrench)) - default_unfasten_wrench(user, W, 0) + return TRUE - else if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - switch(state) - if(FG_UNSECURED) - to_chat(user, "[src] needs to be wrenched to the floor!") + switch(state) + if(FG_UNSECURED) + to_chat(user, "[src] needs to be wrenched to the floor!") - if(FG_SECURED) - if (WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user] starts to weld [src] to the floor.", \ - "You start to weld \the [src] to the floor...", \ - "You hear welding.") - if(do_after(user,20*W.toolspeed, target = src) && state == FG_SECURED && WT.isOn()) - state = FG_WELDED - to_chat(user, "You weld the field generator to the floor.") + if(FG_SECURED) + if(!I.tool_start_check(user, amount=0)) + return TRUE + user.visible_message("[user] starts to weld [src] to the floor.", \ + "You start to weld \the [src] to the floor...", \ + "You hear welding.") + if(I.use_tool(src, user, 20, volume=50) && state == FG_SECURED) + state = FG_WELDED + to_chat(user, "You weld the field generator to the floor.") - if(FG_WELDED) - if (WT.remove_fuel(0,user)) - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user] starts to cut [src] free from the floor.", \ - "You start to cut \the [src] free from the floor...", \ - "You hear welding.") - if(do_after(user,20*W.toolspeed, target = src) && state == FG_WELDED && WT.isOn()) - state = FG_SECURED - to_chat(user, "You cut \the [src] free from the floor.") + if(FG_WELDED) + if(!I.tool_start_check(user, amount=0)) + return TRUE + user.visible_message("[user] starts to cut [src] free from the floor.", \ + "You start to cut \the [src] free from the floor...", \ + "You hear welding.") + if(I.use_tool(src, user, 20, volume=50) && state == FG_WELDED) + state = FG_SECURED + to_chat(user, "You cut \the [src] free from the floor.") + + return TRUE - else - return ..() /obj/machinery/field/generator/attack_animal(mob/living/simple_animal/M) if(M.environment_smash & ENVIRONMENT_SMASH_RWALLS && active == FG_OFFLINE && state != FG_UNSECURED) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 3658be4522..b7808abc1f 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -65,7 +65,7 @@ switch(construction_state) if(PA_CONSTRUCTION_UNSECURED) if(istype(W, /obj/item/wrench) && !isinspace()) - playsound(loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) anchored = TRUE user.visible_message("[user.name] secures the [name] to the floor.", \ "You secure the external bolts.") @@ -73,7 +73,7 @@ did_something = TRUE if(PA_CONSTRUCTION_UNWIRED) if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) anchored = FALSE user.visible_message("[user.name] detaches the [name] from the floor.", \ "You remove the external bolts.") diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index c1ba907ada..9d5ff2dd81 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -270,7 +270,7 @@ switch(construction_state) if(PA_CONSTRUCTION_UNSECURED) if(istype(W, /obj/item/wrench) && !isinspace()) - playsound(loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) anchored = TRUE user.visible_message("[user.name] secures the [name] to the floor.", \ "You secure the external bolts.") @@ -278,7 +278,7 @@ did_something = TRUE if(PA_CONSTRUCTION_UNWIRED) if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) anchored = FALSE user.visible_message("[user.name] detaches the [name] from the floor.", \ "You remove the external bolts.") diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 5701ae0ed6..81cf66c26a 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -56,16 +56,14 @@ obj_integrity = max_integrity update_icon() -/obj/machinery/power/solar/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/crowbar)) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...") - if(do_after(user, 50*W.toolspeed, target = src)) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.") - deconstruct(TRUE) - else - return ..() +/obj/machinery/power/solar/crowbar_act(mob/user, obj/item/I) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...") + if(I.use_tool(src, user, 50)) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + user.visible_message("[user] takes the glass off [src].", "You take the glass off [src].") + deconstruct(TRUE) + return TRUE /obj/machinery/power/solar/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -214,10 +212,10 @@ anchored = !anchored if(anchored) user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") - playsound(src.loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) else user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") - playsound(src.loc, W.usesound, 75, 1) + W.play_tool_sound(src, 75) return 1 if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) @@ -407,8 +405,7 @@ /obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20, volume=50)) if (src.stat & BROKEN) to_chat(user, "The broken glass falls out.") var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc ) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index ab4cdca105..0123919eb9 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -531,19 +531,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user)) return if(istype(W, /obj/item/scalpel/supermatter)) - var/obj/item/scalpel/supermatter/scalpel = W - playsound(src, W.usesound, 100, 1) - to_chat(user, "You carefully begin to scrape [src] with [W]...") - if(do_after(user, 60 * W.toolspeed, TRUE, src)) - if (scalpel.usesLeft) - to_chat(user, "You extract a sliver from [src]. [src] begins to react violently!") - new /obj/item/nuke_core/supermatter_sliver(drop_location()) - matter_power += 200 - scalpel.usesLeft-- - if (!scalpel.usesLeft) - to_chat(user, "A tiny piece of [W] falls off, rendering it useless!") - else - to_chat(user, "You fail to extract a sliver from [src]. [W] isn't sharp enough anymore!") + to_chat(user, "You carefully begin to scrape \the [src] with \the [W]...") + if(W.use_tool(src, user, 60, volume=100)) + to_chat(user, "You extract a sliver from \the [src]. \The [src] begins to react violently!") + new /obj/item/nuke_core/supermatter_sliver(drop_location()) + matter_power += 200 else if(user.dropItemToGround(W)) user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ "You touch \the [src] with \the [W], and everything suddenly goes silent.\n\The [W] flashes into dust as you flinch away from \the [src].",\ diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index b6d086f739..837a2b15c7 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -48,26 +48,31 @@ . = 1 -/obj/machinery/power/terminal/proc/dismantle(mob/living/user, obj/item/W) +/obj/machinery/power/terminal/proc/dismantle(mob/living/user, obj/item/I) if(isturf(loc)) var/turf/T = loc if(T.intact) to_chat(user, "You must first expose the power terminal!") return - if(!master || master.can_terminal_dismantle()) - user.visible_message("[user.name] dismantles the power terminal from [master].", \ - "You begin to cut the cables...") + if(master && !master.can_terminal_dismantle()) + return - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - if(do_after(user, 50*W.toolspeed, target = src)) - if(!master || master.can_terminal_dismantle()) - if(prob(50) && electrocute_mob(user, powernet, src, 1, TRUE)) - do_sparks(5, TRUE, master) - return - new /obj/item/stack/cable_coil(loc, 10) - to_chat(user, "You cut the cables and dismantle the power terminal.") - qdel(src) + user.visible_message("[user.name] dismantles the power terminal from [master].", + "You begin to cut the cables...") + + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + if(I.use_tool(src, user, 50)) + if(master && !master.can_terminal_dismantle()) + return + + if(prob(50) && electrocute_mob(user, powernet, src, 1, TRUE)) + do_sparks(5, TRUE, master) + return + + new /obj/item/stack/cable_coil(drop_location(), 10) + to_chat(user, "You cut the cables and dismantle the power terminal.") + qdel(src) /obj/machinery/power/terminal/attackby(obj/item/W, mob/living/user, params) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 3163a72313..c999554d87 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -60,17 +60,14 @@ if(powernet && (powernet == control.powernet)) //update if we're still in the same powernet control.currentdir = angle -/obj/machinery/power/tracker/attackby(obj/item/W, mob/user, params) - - if(istype(W, /obj/item/crowbar)) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] begins to take the glass off the solar tracker.", "You begin to take the glass off the solar tracker...") - if(do_after(user, 50*W.toolspeed, target = src)) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - user.visible_message("[user] takes the glass off the tracker.", "You take the glass off the tracker.") - deconstruct(TRUE) - else - return ..() +/obj/machinery/power/tracker/crowbar_act(mob/user, obj/item/I) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...") + if(I.use_tool(src, user, 50)) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + user.visible_message("[user] takes the glass off [src].", "You take the glass off [src].") + deconstruct(TRUE) + return TRUE /obj/machinery/power/tracker/obj_break(damage_flag) if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 692d9b4733..14e529ba23 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -107,35 +107,34 @@ return 0 ..() -/obj/item/gun/ballistic/revolver/detective/attackby(obj/item/A, mob/user, params) - ..() - if(istype(A, /obj/item/screwdriver)) - if(magazine.caliber == "38") - to_chat(user, "You begin to reinforce the barrel of [src]...") +/obj/item/gun/ballistic/revolver/detective/screwdriver_act(mob/living/user, obj/item/I) + if(magazine.caliber == "38") + to_chat(user, "You begin to reinforce the barrel of [src]...") + if(magazine.ammo_count()) + afterattack(user, user) //you know the drill + user.visible_message("[src] goes off!", "[src] goes off in your face!") + return TRUE + if(I.use_tool(src, user, 30)) if(magazine.ammo_count()) - afterattack(user, user) //you know the drill - user.visible_message("[src] goes off!", "[src] goes off in your face!") - return - if(do_after(user, 30*A.toolspeed, target = src)) - if(magazine.ammo_count()) - to_chat(user, "You can't modify it!") - return - magazine.caliber = "357" - desc = "The barrel and chamber assembly seems to have been modified." - to_chat(user, "You reinforce the barrel of [src]. Now it will fire .357 rounds.") - else - to_chat(user, "You begin to revert the modifications to [src]...") + to_chat(user, "You can't modify it!") + return TRUE + magazine.caliber = "357" + desc = "The barrel and chamber assembly seems to have been modified." + to_chat(user, "You reinforce the barrel of [src]. Now it will fire .357 rounds.") + else + to_chat(user, "You begin to revert the modifications to [src]...") + if(magazine.ammo_count()) + afterattack(user, user) //and again + user.visible_message("[src] goes off!", "[src] goes off in your face!") + return TRUE + if(I.use_tool(src, user, 30)) if(magazine.ammo_count()) - afterattack(user, user) //and again - user.visible_message("[src] goes off!", "[src] goes off in your face!") + to_chat(user, "You can't modify it!") return - if(do_after(user, 30*A.toolspeed, target = src)) - if(magazine.ammo_count()) - to_chat(user, "You can't modify it!") - return - magazine.caliber = "38" - desc = initial(desc) - to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.") + magazine.caliber = "38" + desc = initial(desc) + to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.") + return TRUE /obj/item/gun/ballistic/revolver/mateba diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index f3ff4e965d..e3fc09f270 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -33,17 +33,17 @@ var/obj/item/borg/upgrade/modkit/M = A to_chat(user, "There is \a [M] installed, using [M.cost]% capacity.") -/obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/crowbar)) +/obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/crowbar)) if(modkits.len) to_chat(user, "You pry the modifications out.") - playsound(loc, A.usesound, 100, 1) + I.play_tool_sound(src, 100) for(var/obj/item/borg/upgrade/modkit/M in modkits) M.uninstall(src) else to_chat(user, "There are no modifications currently installed.") - else if(istype(A, /obj/item/borg/upgrade/modkit)) - var/obj/item/borg/upgrade/modkit/MK = A + else if(istype(I, /obj/item/borg/upgrade/modkit)) + var/obj/item/borg/upgrade/modkit/MK = I MK.install(src, user) else ..() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index b79ed02d86..19308c812f 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -127,7 +127,7 @@ can_charge = 0 heat = 3800 - usesound = 'sound/items/welder.ogg' + usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') tool_behaviour = TOOL_WELDER toolspeed = 0.7 //plasmacutters can be used as welders, and are faster than standard welders @@ -136,20 +136,29 @@ if(cell) to_chat(user, "[src] is [round(cell.percent())]% charged.") -/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/stack/sheet/mineral/plasma)) - var/obj/item/stack/sheet/S = A - S.use(1) +/obj/item/gun/energy/plasmacutter/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/stack/sheet/mineral/plasma)) + I.use(1) cell.give(1000) - to_chat(user, "You insert [A] in [src], recharging it.") - else if(istype(A, /obj/item/stack/ore/plasma)) - var/obj/item/stack/ore/S = A - S.use(1) + to_chat(user, "You insert [I] in [src], recharging it.") + else if(istype(I, /obj/item/stack/ore/plasma)) + I.use(1) cell.give(500) - to_chat(user, "You insert [A] in [src], recharging it.") + to_chat(user, "You insert [I] in [src], recharging it.") else ..() +// Tool procs, in case plasma cutter is used as welder +/obj/item/gun/energy/plasmacutter/tool_use_check(mob/living/user, amount) + if(cell.charge >= amount * 100) + return TRUE + + to_chat(user, "You need more charge to complete this task!") + return FALSE + +/obj/item/gun/energy/plasmacutter/use(amount) + return cell.use(amount * 100) + /obj/item/gun/energy/plasmacutter/update_icon() return diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index a25d8938b6..2888f3acca 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -530,6 +530,7 @@ name = "Egg Yolk" id = "eggyolk" description = "It's full of protein." + nutriment_factor = 3 * REAGENTS_METABOLISM color = "#FFB500" taste_description = "egg" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index d24720b42d..789b92a9b9 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1193,4 +1193,17 @@ name = "Corazone" id = "corazone" description = "A medication used to treat pain, fever, and inflammation, along with heart attacks." - color = "#F5F5F5" \ No newline at end of file + color = "#F5F5F5" + +/datum/reagent/medicine/muscle_stimulant + name = "Muscle Stimulant" + id = "muscle_stimulant" + description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain." + +/datum/reagent/medicine/muscle_stimulant/on_mob_add(mob/living/M) + . = ..() + M.add_trait(TRAIT_IGNORESLOWDOWN, id) + +/datum/reagent/medicine/muscle_stimulant/on_mob_delete(mob/living/M) + . = ..() + M.remove_trait(TRAIT_IGNORESLOWDOWN, id) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 9ce8135757..9d26b65151 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -100,7 +100,7 @@ to_chat(user, "[src] is full.") else to_chat(user, "You break [E] in [src].") - reagents.add_reagent("eggyolk", 5) + E.reagents.trans_to(src, E.reagents.total_volume) qdel(E) return ..() @@ -397,4 +397,4 @@ /obj/item/reagent_containers/glass/beaker/large/bromine name = "bromine beaker" - list_reagents = list("bromine" = 50) \ No newline at end of file + list_reagents = list("bromine" = 50) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index c8a7b9744f..89d859d36d 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -118,9 +118,7 @@ if(istype(I, /obj/item/crowbar)) user.visible_message("[user] struggles to pry up \the [src] with \the [I].", \ "You struggle to pry up \the [src] with \the [I].") - if(do_after(user, 40*I.toolspeed, target = src)) - if(QDELETED(src)) - return //prevent multiple decontructs + if(I.use_tool(src, user, 40, volume=40)) if(!(stat & BROKEN)) var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc) C.id = id @@ -130,7 +128,7 @@ else if(istype(I, /obj/item/wrench)) if(!(stat & BROKEN)) - playsound(loc, I.usesound, 50, 1) + I.play_tool_sound(src) setDir(turn(dir,-45)) update_move_direction() to_chat(user, "You rotate [src].") diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 2af691679c..71235045f3 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -82,19 +82,17 @@ if(!pressure_charging && !full_pressure && !flush) if(istype(I, /obj/item/screwdriver)) panel_open = !panel_open - playsound(get_turf(src), I.usesound, 50, 1) + I.play_tool_sound(src) to_chat(user, "You [panel_open ? "remove":"attach"] the screws around the power connection.") return else if(istype(I, /obj/item/weldingtool) && panel_open) - var/obj/item/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/welder2.ogg', 100, 1) - to_chat(user, "You start slicing the floorweld off \the [src]...") - if(do_after(user,20*I.toolspeed, target = src) && panel_open) - if(!W.isOn()) - return - to_chat(user, "You slice the floorweld off \the [src].") - deconstruct() + if(!I.tool_start_check(user, amount=0)) + return + + to_chat(user, "You start slicing the floorweld off \the [src]...") + if(I.use_tool(src, user, 20, volume=100) && panel_open) + to_chat(user, "You slice the floorweld off \the [src].") + deconstruct() return if(user.a_intent != INTENT_HARM) diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 783e4da714..23d6d5502b 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -155,24 +155,21 @@ anchored = TRUE density = initial(pipe_type.density) to_chat(user, "You attach the [pipename] to the underfloor.") - playsound(src, I.usesound, 100, 1) + I.play_tool_sound(src, 100) update_icon() else if(istype(I, /obj/item/weldingtool)) if(anchored) - var/obj/item/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src, I.usesound, 50, 1) - to_chat(user, "You start welding the [pipename] in place...") - if(do_after(user, 8*I.toolspeed, target = src)) - if(!loc || !W.isOn()) - return - to_chat(user, "The [pipename] has been welded in place.") + if(!I.tool_start_check(user, amount=0)) + return - var/obj/O = new pipe_type(loc, src) - transfer_fingerprints_to(O) + to_chat(user, "You start welding the [pipename] in place...") + if(I.use_tool(src, user, 8, volume=50)) + to_chat(user, "The [pipename] has been welded in place.") + var/obj/O = new pipe_type(loc, src) + transfer_fingerprints_to(O) - return + return else to_chat(user, "You need to attach it to the plating first!") return diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm index 0ef1717969..d7a2d5f820 100644 --- a/code/modules/recycling/disposal/outlet.dm +++ b/code/modules/recycling/disposal/outlet.dm @@ -69,21 +69,16 @@ H.vent_gas(T) qdel(H) +/obj/structure/disposaloutlet/welder_act(mob/living/user, obj/item/I) + if(!I.tool_start_check(user, amount=0)) + return TRUE -/obj/structure/disposaloutlet/attackby(obj/item/I, mob/user, params) - add_fingerprint(user) - if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src, 'sound/items/welder2.ogg', 100, 1) - to_chat(user, "You start slicing the floorweld off [src]...") - if(do_after(user, 20*I.toolspeed, target = src)) - if(!W.isOn()) - return - to_chat(user, "You slice the floorweld off [src].") - stored.forceMove(loc) - transfer_fingerprints_to(stored) - stored = null - qdel(src) - else - return ..() + playsound(src, 'sound/items/welder2.ogg', 100, 1) + to_chat(user, "You start slicing the floorweld off [src]...") + if(I.use_tool(src, user, 20)) + to_chat(user, "You slice the floorweld off [src].") + stored.forceMove(loc) + transfer_fingerprints_to(stored) + stored = null + qdel(src) + return TRUE diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 02ca211cb8..ba089f6fb2 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -141,26 +141,19 @@ return ..() -//attack by item -//weldingtool: unfasten and convert to obj/disposalconstruct -/obj/structure/disposalpipe/attackby(obj/item/I, mob/user, params) - add_fingerprint(user) - if(istype(I, /obj/item/weldingtool)) - if(!can_be_deconstructed(user)) - return +//welding tool: unfasten and convert to obj/disposalconstruct +/obj/structure/disposalpipe/welder_act(mob/living/user, obj/item/I) + if(!can_be_deconstructed(user)) + return TRUE - var/obj/item/weldingtool/W = I - if(W.remove_fuel(0, user)) - playsound(src, I.usesound, 50, 1) - to_chat(user, "You start slicing [src]...") - // check if anything changed over 2 seconds - if(do_after(user, 30*I.toolspeed, target = src)) - if(!W.isOn()) - return - deconstruct() - to_chat(user, "You slice [src].") - else - return ..() + if(!I.tool_start_check(user, amount=0)) + return TRUE + + to_chat(user, "You start slicing [src]...") + if(I.use_tool(src, user, 30, volume=50)) + deconstruct() + to_chat(user, "You slice [src].") + return TRUE //checks if something is blocking the deconstruction (e.g. trunk with a bin still linked to it) /obj/structure/disposalpipe/proc/can_be_deconstructed() diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 3230115eea..377421ca05 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -135,7 +135,7 @@ /datum/outfit/lavaland_syndicate/comms name = "Lavaland Syndicate Comms Agent" r_hand = /obj/item/melee/transforming/energy/sword/saber - mask = /obj/item/clothing/mask/chameleon + mask = /obj/item/clothing/mask/chameleon/gps suit = /obj/item/clothing/suit/armor/vest /obj/item/clothing/mask/chameleon/gps/Initialize() diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 8ec0172fad..6921d7e3a2 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -126,7 +126,7 @@ to_chat(user, "You insert the flash into the eye socket.") else if(istype(W, /obj/item/crowbar)) if(flash1 || flash2) - playsound(src.loc, W.usesound, 50, 1) + W.play_tool_sound(src) to_chat(user, "You remove the flash from [src].") if(flash1) flash1.forceMove(user.loc) diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index b22b45efce..f2884d1da8 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -14,7 +14,7 @@ /datum/surgery_step/fix_brain name = "fix brain" - implements = list(/obj/item/hemostat = 85, /obj/item/screwdriver = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100 + implements = list(/obj/item/hemostat = 85, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100 time = 120 //long and complicated /datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target) diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm index 1a1582712a..fe6b9a5b88 100644 --- a/code/modules/surgery/core_removal.dm +++ b/code/modules/surgery/core_removal.dm @@ -12,7 +12,7 @@ //extract brain /datum/surgery_step/extract_core name = "extract core" - implements = list(/obj/item/hemostat = 100, /obj/item/crowbar = 100) + implements = list(/obj/item/hemostat = 100, TOOL_CROWBAR = 100) time = 16 /datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 00a9a99bb0..dad5c3551c 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -8,7 +8,7 @@ //fix eyes /datum/surgery_step/fix_eyes name = "fix eyes" - implements = list(/obj/item/hemostat = 100, /obj/item/screwdriver = 45, /obj/item/pen = 25) + implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 45, /obj/item/pen = 25) time = 64 /datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index cfec06c7ea..7dc2a6afa9 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -8,7 +8,7 @@ //extract implant /datum/surgery_step/extract_implant name = "extract implant" - implements = list(/obj/item/hemostat = 100, /obj/item/crowbar = 65) + implements = list(/obj/item/hemostat = 100, TOOL_CROWBAR = 65) time = 64 var/obj/item/implant/I = null diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index e2316c0e4d..0183b2bba1 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -6,7 +6,7 @@ /datum/surgery_step/replace name = "sever muscles" - implements = list(/obj/item/scalpel = 100, /obj/item/wirecutters = 55) + implements = list(/obj/item/scalpel = 100, TOOL_WIRECUTTER = 55) time = 32 diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 5a201bfc84..002b68fdf9 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -25,7 +25,7 @@ //remove fat /datum/surgery_step/remove_fat name = "remove loose fat" - implements = list(/obj/item/retractor = 100, /obj/item/screwdriver = 45, /obj/item/wirecutters = 35) + implements = list(/obj/item/retractor = 100, TOOL_SCREWDRIVER = 45, TOOL_WIRECUTTER = 35) time = 32 /datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm index 0bdef2aac9..6431770fa9 100644 --- a/code/modules/surgery/mechanic_steps.dm +++ b/code/modules/surgery/mechanic_steps.dm @@ -2,7 +2,7 @@ /datum/surgery_step/mechanic_open name = "unscrew shell" implements = list( - /obj/item/screwdriver = 100, + TOOL_SCREWDRIVER = 100, /obj/item/scalpel = 75, // med borgs could try to unskrew shell with scalpel /obj/item/kitchen/knife = 50, /obj/item = 10) // 10% success with any sharp item. @@ -22,7 +22,7 @@ /datum/surgery_step/mechanic_close name = "screw shell" implements = list( - /obj/item/screwdriver = 100, + TOOL_SCREWDRIVER = 100, /obj/item/scalpel = 75, /obj/item/kitchen/knife = 50, /obj/item = 10) // 10% success with any sharp item. @@ -42,7 +42,7 @@ /datum/surgery_step/prepare_electronics name = "prepare electronics" implements = list( - /obj/item/device/multitool = 100, + TOOL_MULTITOOL = 100, /obj/item/hemostat = 10) // try to reboot internal controllers via short circuit with some conductor time = 24 @@ -54,7 +54,7 @@ /datum/surgery_step/mechanic_unwrench name = "unwrench bolts" implements = list( - /obj/item/wrench = 100, + TOOL_WRENCH = 100, /obj/item/retractor = 10) time = 24 @@ -66,7 +66,7 @@ /datum/surgery_step/mechanic_wrench name = "wrench bolts" implements = list( - /obj/item/wrench = 100, + TOOL_WRENCH = 100, /obj/item/retractor = 10) time = 24 diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 8ce80ec8a0..d8b4bf4229 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -67,7 +67,7 @@ name = "manipulate organs" repeatable = 1 implements = list(/obj/item/organ = 100, /obj/item/reagent_containers/food/snacks/organ = 0, /obj/item/organ_storage = 100) - var/implements_extract = list(/obj/item/hemostat = 100, /obj/item/crowbar = 55) + var/implements_extract = list(/obj/item/hemostat = 100, TOOL_CROWBAR = 55) var/current_type var/obj/item/organ/I = null @@ -75,25 +75,6 @@ ..() implements = implements + implements_extract -/datum/surgery_step/manipulate_organs/tool_check(mob/user, obj/item/tool) - if(istype(tool, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = tool - if(!WT.isOn()) - return 0 - - else if(istype(tool, /obj/item/lighter)) - var/obj/item/lighter/L = tool - if(!L.lit) - return 0 - - else if(istype(tool, /obj/item/match)) - var/obj/item/match/M = tool - if(!M.lit) - return 0 - - return 1 - - /datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) I = null if(istype(tool, /obj/item/organ_storage)) @@ -118,13 +99,6 @@ else if(implement_type in implements_extract) current_type = "extract" var/list/organs = target.getorganszone(target_zone) - -/* var/mob/living/simple_animal/borer/B = target.has_brain_worms() - if(target.has_brain_worms()) - user.visible_message("[user] begins to extract [B] from [target]'s [parse_zone(target_zone)].", - "You begin to extract [B] from [target]'s [parse_zone(target_zone)]...") - return TRUE*/ - if(!organs.len) to_chat(user, "There are no removable organs in [target]'s [parse_zone(target_zone)]!") return -1 @@ -164,13 +138,6 @@ "You insert [tool] into [target]'s [parse_zone(target_zone)].") else if(current_type == "extract") -/* var/mob/living/simple_animal/borer/B = target.has_brain_worms() - if(B && B.victim == target) - user.visible_message("[user] successfully extracts [B] from [target]'s [parse_zone(target_zone)]!", - "You successfully extract [B] from [target]'s [parse_zone(target_zone)].") - add_logs(user, target, "surgically removed [B] from", addition="INTENT: [uppertext(user.a_intent)]") - B.leave_victim() - return FALSE */ if(I && I.owner == target) user.visible_message("[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!", "You successfully extract [I] from [target]'s [parse_zone(target_zone)].") diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 8a4c795c63..beed1cce7f 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -19,7 +19,7 @@ //clamp bleeders /datum/surgery_step/clamp_bleeders name = "clamp bleeders" - implements = list(/obj/item/hemostat = 100, /obj/item/wirecutters = 60, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15) + implements = list(/obj/item/hemostat = 100, TOOL_WIRECUTTER = 60, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15) time = 24 /datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -35,7 +35,7 @@ //retract skin /datum/surgery_step/retract_skin name = "retract skin" - implements = list(/obj/item/retractor = 100, /obj/item/screwdriver = 45, /obj/item/wirecutters = 35) + implements = list(/obj/item/retractor = 100, TOOL_SCREWDRIVER = 45, TOOL_WIRECUTTER = 35) time = 24 /datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -47,35 +47,19 @@ //close incision /datum/surgery_step/close name = "mend incision" - implements = list(/obj/item/cautery = 100, /obj/item/gun/energy/laser = 90, /obj/item/weldingtool = 70, - /obj/item/lighter = 45, /obj/item/match = 20) + implements = list(/obj/item/cautery = 100, /obj/item/gun/energy/laser = 90, TOOL_WELDER = 70, + /obj/item = 30) // 30% success with any hot item. time = 24 /datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].", "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...") - /datum/surgery_step/close/tool_check(mob/user, obj/item/tool) - if(istype(tool, /obj/item/cautery)) - return 1 + if(implement_type == TOOL_WELDER || implement_type == /obj/item) + return tool.is_hot() - if(istype(tool, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = tool - if(WT.isOn()) - return 1 - - else if(istype(tool, /obj/item/lighter)) - var/obj/item/lighter/L = tool - if(L.lit) - return 1 - - else if(istype(tool, /obj/item/match)) - var/obj/item/match/M = tool - if(M.lit) - return 1 - - return 0 + return TRUE /datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(locate(/datum/surgery_step/saw) in surgery.steps) @@ -105,7 +89,7 @@ //drill bone /datum/surgery_step/drill name = "drill bone" - implements = list(/obj/item/surgicaldrill = 100, /obj/item/pickaxe/drill = 60, /obj/item/mecha_parts/mecha_equipment/drill = 60, /obj/item/screwdriver = 20) + implements = list(/obj/item/surgicaldrill = 100, /obj/item/pickaxe/drill = 60, /obj/item/mecha_parts/mecha_equipment/drill = 60, TOOL_SCREWDRIVER = 20) time = 30 /datum/surgery_step/drill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 8b48989c3f..51449976cc 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -51,16 +51,11 @@ SetSlotFromZone() to_chat(user, "You modify [src] to be installed on the [zone == "r_arm" ? "right" : "left"] arm.") update_icon() - else if(istype(W, /obj/item/card/emag)) - emag_act() /obj/item/organ/cyberimp/arm/Remove(mob/living/carbon/M, special = 0) Retract() ..() -/obj/item/organ/cyberimp/arm/emag_act() - return 0 - /obj/item/organ/cyberimp/arm/emp_act(severity) if(prob(15/severity) && owner) to_chat(owner, "[src] is hit by EMP!") @@ -126,10 +121,6 @@ to_chat(owner, "The implant doesn't respond. It seems to be broken...") return - // You can emag the arm-mounted implant by activating it while holding emag in it's hand. - if(istype(owner.get_active_held_item(), /obj/item/card/emag) && emag_act()) - return - if(!holder || (holder in src)) holder = null if(contents.len == 1) @@ -176,7 +167,6 @@ /obj/item/organ/cyberimp/arm/gun/taser/l zone = "l_arm" - /obj/item/organ/cyberimp/arm/toolset name = "integrated toolset implant" desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contains all necessary tools." diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 0de1683fbd..b7d4a77f72 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -60,7 +60,7 @@ var/turf/open/floorloc = get_turf(user) floorloc.contents += contents to_chat(user, "You remove the [storedorgan] from [src].") - playsound(get_turf(user), I.usesound, 50, 1) + I.play_tool_sound(src) storedorgan = null if(uses != INFINITE) uses-- diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index f1f2c11a05..7d84a5d107 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -6,7 +6,7 @@ //reshape_face /datum/surgery_step/reshape_face name = "reshape face" - implements = list(/obj/item/scalpel = 100, /obj/item/kitchen/knife = 50, /obj/item/wirecutters = 35) + implements = list(/obj/item/scalpel = 100, /obj/item/kitchen/knife = 50, TOOL_WIRECUTTER = 35) time = 64 /datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 445628566e..fa9e45ca4b 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -9,19 +9,28 @@ /datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/success = 0 + var/success = FALSE if(accept_hand) if(!tool) - success = 1 + success = TRUE + if(accept_any_item) if(tool && tool_check(user, tool)) - success = 1 - else - for(var/path in implements) - if(istype(tool, path)) - implement_type = path + success = TRUE + + else if(tool) + for(var/key in implements) + var/match = FALSE + + if(ispath(key) && istype(tool, key)) + match = TRUE + else if(tool.tool_behaviour == key) + match = TRUE + + if(match) + implement_type = key if(tool_check(user, tool)) - success = 1 + success = TRUE break if(success) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 3e7e026ef4..d02ee0373d 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1236,6 +1236,14 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. surplus = 20 restricted_roles = list("Janitor") +/datum/uplink_item/role_restricted/explosive_hot_potato + name = "Exploding Hot Potato" + desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead." + item = /obj/item/hot_potato/syndicate + cost = 4 + surplus = 0 + restricted_roles = list("Cook", "Botanist", "Clown", "Mime") + /datum/uplink_item/role_restricted/his_grace name = "His Grace" desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, He will thirst for blood and must be used to kill to sate that thirst. \ diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 66ae84f559..dd43f8fd40 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -12,10 +12,9 @@ /obj/vehicle/ridden/scooter/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wrench)) to_chat(user, "You begin to remove the handlebars...") - playsound(get_turf(user), 'sound/items/ratchet.ogg', 50, 1) - if(do_after(user, 40*I.toolspeed, target = src)) - var/obj/vehicle/ridden/scooter/skateboard/S = new(loc) - new /obj/item/stack/rods(get_turf(src),2) + if(I.use_tool(src, user, 40, volume=50)) + var/obj/vehicle/ridden/scooter/skateboard/S = new(drop_location()) + new /obj/item/stack/rods(drop_location(), 2) to_chat(user, "You remove the handlebars from [src].") if(has_buckled_mobs()) var/mob/living/carbon/H = buckled_mobs[1] @@ -102,21 +101,16 @@ /obj/item/scooter_frame/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wrench)) to_chat(user, "You deconstruct [src].") - new /obj/item/stack/rods(get_turf(src),10) - playsound(get_turf(user), 'sound/items/ratchet.ogg', 50, 1) + new /obj/item/stack/rods(drop_location(), 10) + I.play_tool_sound(src) qdel(src) return else if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I - if(M.get_amount() < 5) - to_chat(user, "You need at least five metal sheets to make proper wheels!") + if(!I.tool_start_check(user, amount=5)) return to_chat(user, "You begin to add wheels to [src].") - if(do_after(user, 80, target = src)) - if(!M || M.get_amount() < 5) - return - M.use(5) + if(I.use_tool(src, user, 80, volume=50, amount=5)) to_chat(user, "You finish making wheels for [src].") new /obj/vehicle/ridden/scooter/skateboard(user.loc) qdel(src) @@ -124,27 +118,21 @@ /obj/vehicle/ridden/scooter/skateboard/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) to_chat(user, "You begin to deconstruct and remove the wheels on [src]...") - playsound(get_turf(user), I.usesound, 50, 1) - if(do_after(user, 20, target = src)) + if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You deconstruct the wheels on [src].") - new /obj/item/stack/sheet/metal(get_turf(src),5) - new /obj/item/scooter_frame(get_turf(src)) + new /obj/item/stack/sheet/metal(drop_location(), 5) + new /obj/item/scooter_frame(drop_location()) if(has_buckled_mobs()) var/mob/living/carbon/H = buckled_mobs[1] unbuckle_mob(H) qdel(src) else if(istype(I, /obj/item/stack/rods)) - var/obj/item/stack/rods/C = I - if(C.get_amount() < 2) - to_chat(user, "You need at least two rods to make proper handlebars!") + if(!I.tool_start_check(user, amount=2)) return to_chat(user, "You begin making handlebars for [src].") - if(do_after(user, 25, target = src)) - if(!C || C.get_amount() < 2) - return + if(I.use_tool(src, user, 25, volume=50, amount=2)) to_chat(user, "You add the rods to [src], creating handlebars.") - C.use(2) var/obj/vehicle/ridden/scooter/S = new(loc) if(has_buckled_mobs()) var/mob/living/carbon/H = buckled_mobs[1] From c5b5a0491eb27f00ae7e399bcb56e09ff73746b6 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 12 Feb 2018 21:10:36 -0500 Subject: [PATCH 041/108] DME --- tgstation.dme | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tgstation.dme b/tgstation.dme index 1473106833..11a31dc3dc 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -188,7 +188,6 @@ #include "code\citadel\cit_crewobjectives.dm" #include "code\citadel\cit_displaycases.dm" #include "code\citadel\cit_emotes.dm" -#include "code\citadel\cit_genemods.dm" #include "code\citadel\cit_guns.dm" #include "code\citadel\cit_kegs.dm" #include "code\citadel\cit_miscreants.dm" @@ -498,7 +497,6 @@ #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\traitor_chan.dm" #include "code\game\gamemodes\clock_cult\clock_cult.dm" -#include "code\game\gamemodes\cult\blood_magic.dm" #include "code\game\gamemodes\cult\cult.dm" #include "code\game\gamemodes\devil\devil_game_mode.dm" #include "code\game\gamemodes\devil\game_mode.dm" @@ -738,7 +736,6 @@ #include "code\game\objects\items\charter.dm" #include "code\game\objects\items\chrono_eraser.dm" #include "code\game\objects\items\cigs_lighters.dm" -#include "code\game\objects\items\clown.dm" #include "code\game\objects\items\clown_items.dm" #include "code\game\objects\items\control_wand.dm" #include "code\game\objects\items\cosmetics.dm" @@ -1188,7 +1185,6 @@ #include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm" #include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm" #include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm" -#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm" #include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm" #include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm" #include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm" @@ -1284,7 +1280,6 @@ #include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" #include "code\modules\atmospherics\machinery\other\meter.dm" #include "code\modules\atmospherics\machinery\other\miner.dm" -#include "code\modules\atmospherics\machinery\other\zvent.dm" #include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" #include "code\modules\atmospherics\machinery\pipes\manifold.dm" #include "code\modules\atmospherics\machinery\pipes\manifold4w.dm" @@ -1353,6 +1348,7 @@ #include "code\modules\client\verbs\ooc.dm" #include "code\modules\client\verbs\ping.dm" #include "code\modules\client\verbs\suicide.dm" +#include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\ears\_ears.dm" From 0a384243f63f15cece70e58ce41f61892527cb45 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 12 Feb 2018 21:22:09 -0500 Subject: [PATCH 042/108] work! compile! actually function! --- code/__DEFINES/misc.dm | 2 + code/_compile_options.dm | 74 ++++++++---------------------- code/modules/client/preferences.dm | 2 +- 3 files changed, 22 insertions(+), 56 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index c3a331b651..a75b7dd3c0 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -519,3 +519,5 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define OVERRIDE_LOG_DIRECTORY_PARAMETER "log-directory" //Prevent the master controller from starting automatically, overrides TEST_RUN_PARAMETER #define NO_INIT_PARAMETER "no-init" + +#define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 5e2cca0cc9..c47c0699d2 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -5,7 +5,7 @@ #ifdef TESTING //#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing. - //implies FIND_REF_NO_CHECK_TICK + //implies FIND_REF_NO_CHECK_TICK //#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping @@ -13,6 +13,8 @@ //#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green #endif +//#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER + #ifndef PRELOAD_RSC //set to: #define PRELOAD_RSC 0 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; @@ -22,56 +24,6 @@ #define FORCE_MAP "_maps/runtimestation.json" #endif -#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary. - // 1 will enable set background. 0 will disable set background. - -//ADMIN STUFF -#define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. - -#define SPAM_TRIGGER_WARNING 5 //Number of identical messages required before the spam-prevention will warn you to stfu -#define SPAM_TRIGGER_AUTOMUTE 10 //Number of identical messages required before the spam-prevention will automute you - -//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam -#define MAX_MESSAGE_LEN 1024 -#define MAX_NAME_LEN 42 -#define MAX_BROADCAST_LEN 512 -#define MAX_CHARTER_LEN 80 - -//MINOR TWEAKS/MISC -#define AGE_MIN 18 //youngest a character can be -#define AGE_MAX 85 //oldest a character can be -#define WIZARD_AGE_MIN 30 //youngest a wizard can be -#define APPRENTICE_AGE_MIN 29 //youngest an apprentice can be -#define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up -#define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets -#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you - -#define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases -#define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default. -#define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism - -#define MAX_STACK_AMOUNT_METAL 50 -#define MAX_STACK_AMOUNT_GLASS 50 -#define MAX_STACK_AMOUNT_RODS 60 - -// AI Toggles -#define AI_CAMERA_LUMINOSITY 5 -#define AI_VOX 1 // Comment out if you don't want VOX to be enabled and have players download the voice sounds. - -//Additional code for the above flags. -#ifdef TESTING -#warn compiling in TESTING mode. testing() debug messages will be visible. -#endif - - -#ifdef GC_FAILURE_HARD_LOOKUP -#define FIND_REF_NO_CHECK_TICK -#endif - -#ifdef TRAVISTESTING -#define TESTING -#endif - //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 511 #if DM_VERSION < MIN_COMPILER_VERSION @@ -80,7 +32,19 @@ #error You need version 511 or higher #endif -//Update this whenever the db schema changes -//make sure you add an update to the schema_version stable in the db changelog -#define DB_MAJOR_VERSION 4 -#define DB_MINOR_VERSION 0 +//Additional code for the above flags. +#ifdef TESTING +#warn compiling in TESTING mode. testing() debug messages will be visible. +#endif + +#ifdef GC_FAILURE_HARD_LOOKUP +#define FIND_REF_NO_CHECK_TICK +#endif + +#ifdef TRAVISBUILDING +#define UNIT_TESTS +#endif + +#ifdef TRAVISTESTING +#define TESTING +#endif diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 6e86cd69a1..982417fd21 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -181,7 +181,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/uplink_spawn_loc = UPLINK_PDA - var/list/exp + var/list/exp = list() var/list/menuoptions var/action_buttons_screen_locs = list() From f129de2bc232f1f0ed1eb0a556364b7d45f1a101 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 12 Feb 2018 21:28:30 -0500 Subject: [PATCH 043/108] work!!! --- tgstation.dme | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tgstation.dme b/tgstation.dme index 11a31dc3dc..814f0470cb 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -754,6 +754,7 @@ #include "code\game\objects\items\his_grace.dm" #include "code\game\objects\items\holosign_creator.dm" #include "code\game\objects\items\holy_weapons.dm" +#include "code\game\objects\items\hot_potato.dm" #include "code\game\objects\items\inducer.dm" #include "code\game\objects\items\kitchen.dm" #include "code\game\objects\items\latexballoon.dm" @@ -1192,6 +1193,7 @@ #include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm" #include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm" #include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm" +#include "code\modules\antagonists\cult\blood_magic.dm" #include "code\modules\antagonists\cult\cult.dm" #include "code\modules\antagonists\cult\cult_comms.dm" #include "code\modules\antagonists\cult\cult_items.dm" From 2952446d8bd97ece83d1456c27808d230fbff728 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 12 Feb 2018 21:39:00 -0500 Subject: [PATCH 044/108] COMPILE! --- tgstation.dme | 1 - 1 file changed, 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 814f0470cb..d38cb9ba42 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1350,7 +1350,6 @@ #include "code\modules\client\verbs\ooc.dm" #include "code\modules\client\verbs\ping.dm" #include "code\modules\client\verbs\suicide.dm" -#include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\ears\_ears.dm" From 0c9bb1a2490962fe2d38426ad14d2b73d66e54d8 Mon Sep 17 00:00:00 2001 From: Buggy123 Date: Mon, 12 Feb 2018 22:11:04 -0500 Subject: [PATCH 045/108] Tritium now produces water vapor when combusting. (#35354) * HYDROGEN+OXYGEN=WATER * Burning Tritium now produces a lot of radiation. * Fixes check and line positions * No longer spews absurd quantities of radiation. --- code/modules/atmospherics/gasmixtures/reactions.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 67bb932df2..cf64ee68b2 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -6,12 +6,14 @@ #define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 #define PLASMA_OXYGEN_FULLBURN 10 #define FIRE_CARBON_ENERGY_RELEASED 100000 //Amount of heat released per mole of burnt carbon into the tile +#define FIRE_HYDROGEN_ENERGY_RELEASED 280000 // Amount of heat released per mole of burnt hydrogen and/or tritium(hydrogen isotope) #define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile //General assmos defines. #define WATER_VAPOR_FREEZE 200 #define NITRYL_FORMATION_ENERGY 100000 #define TRITIUM_BURN_OXY_FACTOR 100 #define TRITIUM_BURN_TRIT_FACTOR 10 +#define TRITIUM_BURN_RADIOACTIVITY_FACTOR 1000000 //The neutrons gotta go somewhere. Completely arbitrary number. #define SUPER_SATURATION_THRESHOLD 96 #define STIMULUM_HEAT_SCALE 100000 #define STIMULUM_FIRST_RISE 0.65 @@ -120,10 +122,12 @@ cached_gases[/datum/gas/oxygen][MOLES] -= cached_gases[/datum/gas/tritium][MOLES] if(burned_fuel) - energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel + energy_released += FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel + if(location) + radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) - ASSERT_GAS(/datum/gas/carbon_dioxide, air) - cached_gases[/datum/gas/carbon_dioxide][MOLES] += burned_fuel/TRITIUM_BURN_OXY_FACTOR + ASSERT_GAS(/datum/gas/water_vapor, air) //oxygen+more-or-less hydrogen=H2O + cached_gases[/datum/gas/water_vapor][MOLES] += burned_fuel/TRITIUM_BURN_OXY_FACTOR cached_results[id] += burned_fuel From a11b073139dbdd1627b24a136316c6a95c026bef Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 12 Feb 2018 23:13:19 -0500 Subject: [PATCH 047/108] this shuttle got the axe for being too fun, comrade --- _maps/shuttles/emergency_saltmine.dmm | 947 -------------------------- 1 file changed, 947 deletions(-) delete mode 100644 _maps/shuttles/emergency_saltmine.dmm diff --git a/_maps/shuttles/emergency_saltmine.dmm b/_maps/shuttles/emergency_saltmine.dmm deleted file mode 100644 index 8cd5bdbcf2..0000000000 --- a/_maps/shuttles/emergency_saltmine.dmm +++ /dev/null @@ -1,947 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/closed/wall/clockwork, -/area/shuttle/escape) -"ac" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"ad" = ( -/obj/effect/spawner/structure/window/shuttle, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"ae" = ( -/turf/closed/wall/mineral/titanium, -/turf/closed/wall/mineral/cult, -/area/shuttle/escape) -"af" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, -/obj/structure/destructible/clockwork/trap/brass_skewer, -/turf/open/indestructible/clock_spawn_room, -/area/shuttle/escape) -"ag" = ( -/obj/structure/shuttle/engine/propulsion/right{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/escape) -"ah" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"ai" = ( -/obj/machinery/computer/emergency_shuttle, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aj" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/card/emag/fake, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"ak" = ( -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"al" = ( -/obj/effect/decal/cleanable/salt, -/turf/open/floor/plasteel/cult, -/area/shuttle/escape) -"am" = ( -/obj/effect/decal/cleanable/salt, -/obj/effect/decal/cleanable/crayon, -/turf/open/floor/plasteel/cult, -/area/shuttle/escape) -"an" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/plasteel/cult, -/area/shuttle/escape) -"ao" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/tome, -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/cult, -/area/shuttle/escape) -"ap" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/clothing/gloves/clockwork, -/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, -/obj/structure/destructible/clockwork/trap/brass_skewer, -/turf/open/indestructible/clock_spawn_room, -/area/shuttle/escape) -"aq" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/clothing/suit/armor/clockwork, -/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, -/obj/structure/destructible/clockwork/trap/brass_skewer, -/turf/open/indestructible/clock_spawn_room, -/area/shuttle/escape) -"ar" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/salt, -/obj/item/clothing/shoes/clockwork, -/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, -/obj/structure/destructible/clockwork/trap/brass_skewer, -/turf/open/indestructible/clock_spawn_room, -/area/shuttle/escape) -"as" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/escape) -"at" = ( -/obj/effect/decal/cleanable/salt, -/obj/machinery/portable_atmospherics/canister/water_vapor, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"au" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/structure/holosign/wetsign, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"av" = ( -/obj/machinery/door/airlock/command/glass{ - name = "bridge door"; - req_access_txt = "19"; - secondsElectrified = -1 - }, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aw" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, -/turf/open/indestructible/clock_spawn_room, -/area/shuttle/escape) -"ax" = ( -/obj/structure/shuttle/engine/propulsion/left{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/escape) -"ay" = ( -/obj/machinery/light, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"az" = ( -/turf/open/floor/plasteel/cult, -/turf/closed/wall/mineral/cult, -/area/shuttle/escape) -"aA" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/twohanded/spear, -/obj/item/device/assembly/flash/handheld, -/turf/open/floor/plasteel/cult, -/area/shuttle/escape) -"aB" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/greentext, -/obj/item/banhammer, -/turf/open/floor/plasteel/cult, -/area/shuttle/escape) -"aC" = ( -/obj/effect/decal/cleanable/salt, -/turf/open/indestructible/clock_spawn_room, -/area/shuttle/escape) -"aD" = ( -/obj/machinery/door/airlock/security/glass{ - name = "security airlock"; - req_access_txt = "63"; - secondsElectrified = -1 - }, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/plasteel/cult, -/area/shuttle/escape) -"aE" = ( -/obj/structure/sign/poster/contraband/energy_swords, -/turf/closed/wall/clockwork, -/area/shuttle/escape) -"aF" = ( -/obj/structure/sign/poster/contraband/revolver, -/turf/closed/wall/clockwork, -/area/shuttle/escape) -"aG" = ( -/obj/effect/decal/cleanable/salt, -/obj/machinery/door/airlock/clockwork{ - req_access = null - }, -/turf/open/indestructible/clock_spawn_room, -/area/shuttle/escape) -"aH" = ( -/obj/structure/sign/poster/contraband/kudzu, -/turf/closed/wall/clockwork, -/area/shuttle/escape) -"aI" = ( -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6, -/turf/closed/wall/clockwork, -/area/shuttle/escape) -"aJ" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/beaker/waterbottle/large, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aK" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/grown/bananapeel, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aL" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/decal/cleanable/salt, -/obj/item/clothing/mask/vape, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aM" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/glass, -/obj/item/toy/plush/plushvar, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aN" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/snacks/salad/validsalad, -/obj/item/toy/figure/warden, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aO" = ( -/obj/item/grown/bananapeel, -/obj/item/storage/backpack, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aP" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aQ" = ( -/obj/item/soap/deluxe, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aR" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/glass, -/obj/item/toy/spinningtoy, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aS" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/toy/katana, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aT" = ( -/obj/machinery/door/airlock/titanium, -/obj/item/soap/deluxe, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aU" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/toy/syndicateballoon, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aW" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/clothing/mask/vape, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aX" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/glass, -/obj/item/toy/plush/narplush, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"aY" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/snacks/salad/validsalad, -/obj/item/toy/figure/hos, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"ba" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/gun/ballistic/revolver/reverse, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bb" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/toy/sword, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bc" = ( -/obj/machinery/light/small, -/obj/item/soap/deluxe, -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bd" = ( -/obj/machinery/door/airlock/titanium, -/obj/docking_port/mobile/emergency{ - dheight = 0; - dir = 8; - dwidth = 6; - height = 18; - name = "Saltmine"; - port_direction = 4; - timid = 1; - width = 14 - }, -/obj/item/soap/deluxe, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"be" = ( -/obj/effect/decal/cleanable/salt, -/mob/living/simple_animal/bot/secbot/beepsky, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bf" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/beaker/waterbottle/large, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bg" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/grown/bananapeel, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bh" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/effect/decal/cleanable/salt, -/obj/item/clothing/mask/vape, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bi" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/window/plasma/reinforced, -/obj/structure/table/glass, -/obj/item/toy/plush/nukeplushie, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bj" = ( -/obj/structure/window/plasma/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/grown/bananapeel, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bk" = ( -/obj/structure/window/plasma/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/snacks/salad/validsalad, -/obj/item/toy/figure/secofficer, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bl" = ( -/obj/structure/window/plasma/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/grown/bananapeel, -/obj/item/storage/backpack, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bm" = ( -/obj/structure/window/plasma/reinforced, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bn" = ( -/obj/structure/sign/poster/contraband/lizard, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"bo" = ( -/obj/structure/sign/poster/contraband/lusty_xenomorph, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"bp" = ( -/obj/structure/sign/poster/contraband/grey_tide, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"bq" = ( -/obj/structure/sign/poster/contraband/fun_police, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"br" = ( -/obj/structure/sign/poster/official/wtf_is_co2, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"bs" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/beaker/waterbottle/large, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bt" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/grown/bananapeel, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bu" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/clothing/head/collectable/wizard, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bv" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/glass, -/obj/item/clothing/head/kitty/genuine, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bw" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/grown/bananapeel, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/obj/item/device/assembly/flash, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bx" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/obj/item/toy/plush/lizardplushie, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"by" = ( -/obj/effect/decal/cleanable/salt, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"bz" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/wizrobe, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bA" = ( -/obj/structure/table/glass, -/obj/effect/decal/cleanable/salt, -/obj/item/clothing/head/rabbitears, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bB" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/animalhide/lizard, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bC" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/salt, -/obj/item/bikehorn, -/obj/item/organ/eyes/moth, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bD" = ( -/obj/effect/decal/cleanable/salt, -/turf/open/floor/fakepit, -/area/shuttle/escape) -"bE" = ( -/obj/structure/table/glass, -/obj/effect/decal/cleanable/salt, -/obj/item/storage/firstaid/fire, -/turf/open/floor/fakepit, -/area/shuttle/escape) -"bF" = ( -/obj/machinery/light, -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/gun/magic/wand/resurrection/inert, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bG" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/glass, -/obj/item/clothing/head/rabbitears, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bH" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/bottle/lizardwine, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bI" = ( -/turf/open/chasm, -/area/shuttle/escape) -"bJ" = ( -/obj/structure/table/glass, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/salt, -/obj/item/clothing/mask/frog, -/obj/item/storage/box/hug/medical, -/turf/open/floor/fakepit, -/area/shuttle/escape) -"bK" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/glass, -/obj/item/clothing/head/kitty/genuine, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bL" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/toy/plush/lizardplushie, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"bM" = ( -/obj/effect/decal/cleanable/salt, -/obj/machinery/sleeper/syndie, -/turf/open/floor/fakepit, -/area/shuttle/escape) -"bN" = ( -/obj/structure/table/glass, -/obj/effect/decal/cleanable/salt, -/obj/item/grenade/flashbang, -/obj/item/grenade/flashbang, -/obj/item/grenade/flashbang, -/obj/item/grenade/flashbang, -/obj/item/grenade/flashbang, -/turf/open/floor/fakepit, -/area/shuttle/escape) -"jz" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/statue/plasma/scientist{ - desc = "This statue is suitably made from tears of a certain man, you can still hear him crying to this day."; - oreAmount = 0 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"oC" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/window, -/obj/structure/window{ - dir = 4 - }, -/mob/living/simple_animal/hostile/retaliate/clown{ - health = 200; - maxHealth = 200 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"rH" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/mecha_parts/mecha_equipment/weapon/honker, -/obj/structure/table/reinforced, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"vf" = ( -/obj/effect/spawner/structure/window/shuttle, -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"wp" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, -/obj/structure/destructible/clockwork/trap/brass_skewer, -/obj/item/device/radio/beacon, -/turf/open/indestructible/clock_spawn_room, -/area/shuttle/escape) -"xd" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/codespeak_manual/unlimited, -/turf/open/floor/plasteel/cult, -/area/shuttle/escape) -"xi" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/snacks/grown/citrus/orange, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"Ac" = ( -/obj/effect/decal/cleanable/salt, -/mob/living/simple_animal/bot/honkbot, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"CB" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/window{ - dir = 4 - }, -/mob/living/simple_animal/hostile/retaliate/clown{ - health = 200; - maxHealth = 200 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"Ho" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/neck/petcollar, -/obj/item/restraints/handcuffs, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"HA" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/table/reinforced, -/obj/item/clothing/under/schoolgirl, -/obj/item/clothing/head/kitty, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"Iq" = ( -/obj/effect/decal/cleanable/salt, -/obj/structure/bed/dogbed/ian, -/obj/item/stack/sheet/animalhide/corgi, -/obj/item/reagent_containers/food/snacks/meat/slab/corgi, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"LR" = ( -/obj/effect/decal/cleanable/salt, -/obj/mecha/combat/honker{ - max_integrity = 60 - }, -/turf/open/floor/fakespace, -/area/shuttle/escape) -"Uc" = ( -/obj/effect/decal/cleanable/salt, -/obj/item/grown/bananapeel, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/armor/reactive/table, -/turf/open/floor/fakespace, -/area/shuttle/escape) - -(1,1,1) = {" -aa -aa -ac -ac -ac -ac -ad -ad -ad -ad -ad -ac -aa -aa -"} -(2,1,1) = {" -aa -ac -ah -LR -CB -vf -jz -aU -aU -aU -jz -ah -ac -aa -"} -(3,1,1) = {" -aa -ac -ai -oC -xi -av -Ac -ak -be -ak -Ac -ak -ac -aa -"} -(4,1,1) = {" -aa -ac -aj -rH -ay -ac -aJ -aJ -bf -bs -aJ -aJ -ac -aa -"} -(5,1,1) = {" -aa -ac -ak -at -ak -ac -aK -aK -bg -bt -aK -aK -ac -aa -"} -(6,1,1) = {" -aa -ac -Iq -au -ak -ac -aL -aW -bh -bu -bz -bF -ah -ac -"} -(7,1,1) = {" -aa -ae -ae -av -az -ae -aK -aK -bg -bt -aK -aK -aK -ac -"} -(8,1,1) = {" -aa -ae -al -al -al -az -aM -aX -bi -bv -bA -bG -bK -ac -"} -(9,1,1) = {" -aa -ae -am -al -aA -aD -aK -aK -bj -bw -aK -aK -aK -ad -"} -(10,1,1) = {" -aa -ae -an -al -al -az -aN -aY -bk -bx -bB -bH -bL -ad -"} -(11,1,1) = {" -aa -ae -al -al -al -ae -aO -aO -bl -bt -aK -aK -aK -ad -"} -(12,1,1) = {" -aa -ae -ao -xd -aB -ae -aP -ba -bm -Ho -aK -Uc -HA -ac -"} -(13,1,1) = {" -ab -ab -ab -ab -ab -aE -aQ -aQ -bn -ah -bC -ad -ac -ac -"} -(14,1,1) = {" -ab -wp -ap -af -af -aF -aR -aR -bo -by -bD -bD -bM -ac -"} -(15,1,1) = {" -ab -wp -aq -af -af -aG -aQ -aQ -bp -by -bD -bI -bD -ac -"} -(16,1,1) = {" -ab -wp -ar -aw -aC -aH -aS -bb -bq -ac -bE -bJ -bN -ac -"} -(17,1,1) = {" -ab -ab -ab -ab -ab -aI -aQ -bc -br -ac -ac -ac -ac -ac -"} -(18,1,1) = {" -ac -ag -as -ax -ac -ac -aT -bd -ac -ah -ag -as -ax -ac -"} From e3e65a523712166027e788fb61c84b4c8fc3f4da Mon Sep 17 00:00:00 2001 From: YPO <30683121+YPOQ@users.noreply.github.com> Date: Sun, 11 Feb 2018 19:29:43 -0700 Subject: [PATCH 048/108] Fixes blood contracts being unusable if the popup is cancelled --- .../mining/lavaland/necropolis_chests.dm | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 2ef83c54b7..442a2aa2dc 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -910,19 +910,19 @@ if(used) return used = TRUE - + var/list/da_list = list() for(var/I in GLOB.alive_mob_list & GLOB.player_list) var/mob/living/L = I da_list[L.real_name] = L - - var/choice = input(user,"Who do you want dead?","Choose Your Victim") as null|anything in da_list - - choice = da_list[choice] - - if(!choice) - return + var/choice = input(user,"Who do you want dead?","Choose Your Victim") as null|anything in da_list + + choice = da_list[choice] + + if(!choice) + used = FALSE + return if(!(isliving(choice))) to_chat(user, "[choice] is already dead!") used = FALSE @@ -931,26 +931,25 @@ to_chat(user, "You feel like writing your own name into a cursed death warrant would be unwise.") used = FALSE return - else - var/mob/living/L = choice + var/mob/living/L = choice - message_admins("[L] has been marked for death!") + message_admins("[L] has been marked for death!") - var/datum/objective/survive/survive = new - survive.owner = L.mind - L.mind.objectives += survive - add_logs(user, L, "took out a blood contract on", src) - to_chat(L, "You've been marked for death! Don't let the demons get you!") - L.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) - var/obj/effect/mine/pickup/bloodbath/B = new(L) - INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, L) + var/datum/objective/survive/survive = new + survive.owner = L.mind + L.mind.objectives += survive + add_logs(user, L, "took out a blood contract on", src) + to_chat(L, "You've been marked for death! Don't let the demons get you!") + L.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) + var/obj/effect/mine/pickup/bloodbath/B = new(L) + INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, L) - for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H == L) - continue - to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!") - H.put_in_hands(new /obj/item/kitchen/knife/butcher(H), TRUE) + for(var/mob/living/carbon/human/H in GLOB.player_list) + if(H == L) + continue + to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!") + H.put_in_hands(new /obj/item/kitchen/knife/butcher(H), TRUE) qdel(src) From c45c1c17df0cfb5200089be1bd96386767c85acd Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sun, 11 Feb 2018 21:25:35 -0500 Subject: [PATCH 050/108] Fixes scooter runtime --- code/modules/vehicles/scooter.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 66ae84f559..3af70e12e8 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -67,13 +67,14 @@ /obj/vehicle/ridden/scooter/skateboard/Collide(atom/A) . = ..() if(A.density && has_buckled_mobs()) - var/mob/living/carbon/H = buckled_mobs[1] + var/mob/living/H = buckled_mobs[1] var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals)) unbuckle_mob(H) H.throw_at(throw_target, 4, 3) H.Knockdown(100) H.adjustStaminaLoss(40) - if(!istype(H.head,/obj/item/clothing/head/helmet/) && !istype(H.head,/obj/item/clothing/head/hardhat)) + var/head_slot = H.get_item_by_slot(slot_head) + if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) H.adjustBrainLoss(3) H.updatehealth() visible_message("[src] crashes into [A], sending [H] flying!") From 789bf296611bdfb6f1593f0f982fde87dc28b7e9 Mon Sep 17 00:00:00 2001 From: Dax Dupont Date: Tue, 13 Feb 2018 12:39:47 +0100 Subject: [PATCH 052/108] Adds tada emoji (#35560) --- icons/emoji.dmi | Bin 31896 -> 32226 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/emoji.dmi b/icons/emoji.dmi index e8ed3aaa7bfa19e1021bcfb10e4f70d3b2129d38..90bda8605eeb8226081657dfad35b17cfbf24838 100644 GIT binary patch delta 13475 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

f#h*Ln(Bw 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 a-;fT3a)h>mN(o`0LqS&cW39AV$o~N*qbqX& delta 13143 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 Date: Tue, 13 Feb 2018 06:27:47 -0600 Subject: [PATCH 054/108] Automatic changelog generation for PR #5453 [ci skip] --- html/changelogs/AutoChangeLog-pr-5453.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5453.yml diff --git a/html/changelogs/AutoChangeLog-pr-5453.yml b/html/changelogs/AutoChangeLog-pr-5453.yml new file mode 100644 index 0000000000..6e9eaebe6a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5453.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "After consulting with their in-house physicists, Nanotrasen has updated their worst-case disaster training simulation \"Space Station 13\". The combustion of hydrogen isotopes now produces water vapor instead of carbon dioxide." From 306e51f9bfb8362e9af6d68cedd8efd559bebd50 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 06:28:17 -0600 Subject: [PATCH 055/108] Automatic changelog generation for PR #5456 [ci skip] --- html/changelogs/AutoChangeLog-pr-5456.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5456.yml diff --git a/html/changelogs/AutoChangeLog-pr-5456.yml b/html/changelogs/AutoChangeLog-pr-5456.yml new file mode 100644 index 0000000000..0bbfaf59f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5456.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - rscadd: "Added hooray emoji!" From 833a700cbb9e67678c4d4b266766b85ff9f0f241 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Tue, 13 Feb 2018 08:13:48 -0500 Subject: [PATCH 056/108] Fixes invalid throwat args (#35565) --- code/datums/martial/wrestling.dm | 2 +- code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/modules/antagonists/changeling/powers/mutations.dm | 4 ++-- code/modules/flufftext/Hallucination.dm | 4 ++-- code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm | 2 +- code/modules/mob/living/living.dm | 2 +- .../mob/living/simple_animal/guardian/types/charger.dm | 2 +- .../mob/living/simple_animal/hostile/megafauna/swarmer.dm | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index ac9bfcbab5..8ac7e76cdb 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -191,7 +191,7 @@ if (T && isturf(T)) if (!D.stat) D.emote("scream") - D.throw_at(T, 10, 4, callback = CALLBACK(D, /mob/living/carbon/human/.Knockdown, 20)) + D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human/.Knockdown, 20)) add_logs(A, D, "has thrown with wrestling") return 0 diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 2cd44f75b9..a8c799afa9 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -302,7 +302,7 @@ log_message("Launched a [O.name] from [name], targeting [target].") projectiles-- proj_init(O) - O.throw_at(target, missile_range, missile_speed, spin = 0, diagonals_first = diags_first) + O.throw_at(target, missile_range, missile_speed, chassis.occupant, FALSE, diagonals_first = diags_first) return 1 //used for projectile initilisation (priming flashbang) and additional logging diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index ec0f4ea025..118c692bc0 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -352,12 +352,12 @@ if(INTENT_GRAB) C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(src, .proc/tentacle_grab, H, C)) + C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, .proc/tentacle_grab, H, C)) return 1 if(INTENT_HARM) C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(src, .proc/tentacle_stab, H, C)) + C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, .proc/tentacle_stab, H, C)) return 1 else L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index a203f7e3b9..f334368a7a 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -239,10 +239,10 @@ GLOBAL_LIST_INIT(hallucinations_major, list( xeno = new(pump.loc,target) sleep(10) xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) + xeno.throw_at(target,7,1, xeno, FALSE, TRUE) sleep(10) xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) + xeno.throw_at(pump,7,1, xeno, FALSE, TRUE) sleep(10) var/xeno_name = xeno.name to_chat(target, "[xeno_name] begins climbing into the ventilation system...") diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 2462242e25..ada1d1f21c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -54,7 +54,7 @@ leaping = 1 weather_immunities += "lava" update_icons() - throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin=0, diagonals_first = 1, callback = CALLBACK(src, .leap_end)) + throw_at(A, MAX_ALIEN_LEAP_DIST, 1, src, FALSE, TRUE, callback = CALLBACK(src, .leap_end)) /mob/living/carbon/alien/humanoid/hunter/proc/leap_end() leaping = 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fd7ae7e22f..f4c14ab353 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -711,7 +711,7 @@ /mob/living/singularity_pull(S, current_size) ..() if(current_size >= STAGE_SIX) - throw_at(S,14,3, spin=1) + throw_at(S, 14, 3, src, TRUE) else step_towards(src,S) diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 479dc3f1c9..7a4c454f9f 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -33,7 +33,7 @@ /mob/living/simple_animal/hostile/guardian/charger/Shoot(atom/targeted_atom) charging = 1 - throw_at(targeted_atom, range, 1, src, 0, callback = CALLBACK(src, .proc/charging_end)) + throw_at(targeted_atom, range, 1, src, FALSE, TRUE, callback = CALLBACK(src, .proc/charging_end)) /mob/living/simple_animal/hostile/guardian/charger/proc/charging_end() charging = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index 4c803d6c00..ef7aa175a4 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -145,7 +145,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa return FALSE if(ischasm(newloc) && !throwing) - throw_at(get_edge_target_turf(src, get_dir(src, newloc)), 7 , 3, spin = FALSE) //my planet needs me + throw_at(get_edge_target_turf(src, get_dir(src, newloc)), 7 , 3, src, FALSE) //my planet needs me return FALSE return ..() From 6d980b488db45c3f084aeae112923e864a3780b2 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 13 Feb 2018 12:53:59 -0200 Subject: [PATCH 058/108] Merge pull request #35625 from praisenarsie/patch-31 Removes the empty moth language file --- code/modules/language/moth.dm | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 code/modules/language/moth.dm diff --git a/code/modules/language/moth.dm b/code/modules/language/moth.dm deleted file mode 100644 index e69de29bb2..0000000000 From a103a44252d4bc1c0a815872c7cdf3219253cb81 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 13 Feb 2018 18:00:10 +0200 Subject: [PATCH 060/108] Merge pull request #35574 from ShizCalev/sentience-fix Sanity check for sentience event --- code/modules/events/sentience.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 50ed1211c4..b4b939fdba 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -31,7 +31,7 @@ var/list/potential = list() for(var/mob/living/simple_animal/L in GLOB.alive_mob_list) var/turf/T = get_turf(L) - if(!is_station_level(T.z)) + if(!T || !is_station_level(T.z)) continue if(!(L in GLOB.player_list) && !L.mind) potential += L From 3c9966041d3e050d5fb92dda363dd6ee788be427 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 13 Feb 2018 18:23:07 +0200 Subject: [PATCH 062/108] Merge pull request #35571 from ShizCalev/spider_infestation-fix Fixes spider_infestation event --- code/modules/events/spider_infestation.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index a3c625e396..58c52cbec3 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -21,7 +21,9 @@ /datum/round_event/spider_infestation/start() var/list/vents = list() - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in world) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines) + if(QDELETED(temp_vent)) + continue if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] if(temp_vent_parent.other_atmosmch.len > 20) From d44ccdb009f8a834328548dc53f42ec31f51afc6 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 13 Feb 2018 18:29:48 +0200 Subject: [PATCH 064/108] Merge pull request #35575 from ShizCalev/communications-console-runtime Fixes communications console runtime --- code/game/machinery/computer/communications.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 0a9693733c..d0f06e19c8 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -366,7 +366,7 @@ if(!aicurrmsg || !answer || aicurrmsg.possible_answers.len < answer) aistate = STATE_MESSAGELIST aicurrmsg.answered = answer - log_game("[key_name(usr)] answered [currmsg.title] comm message. Answer : [currmsg.answered]") + log_game("[key_name(usr)] answered [aicurrmsg.title] comm message. Answer : [aicurrmsg.answered]") if(aicurrmsg.answer_callback) aicurrmsg.answer_callback.Invoke() aistate = STATE_VIEWMESSAGE From c52562fed3f366f7154bd59efbc027c127e1984b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 13 Feb 2018 12:10:24 -0600 Subject: [PATCH 066/108] Update __donator.dm --- modular_citadel/code/modules/client/loadout/__donator.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 0cbabd3ca5..3d71d73077 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -180,3 +180,9 @@ category = slot_hands path = /obj/item/storage/backpack/satchel/carrot ckeywhitelist = list("improvedname") + +/datum/gear/gladiator + name = "Gladiator Armor" + category = slot_wear_suit + path = /obj/item/clothing/under/gladiator + ckeywhitelist = list("aroche") From e6ace7bc56f485d8079aa6874f78358fd5cc7ed6 Mon Sep 17 00:00:00 2001 From: oranges Date: Wed, 14 Feb 2018 09:12:03 +1300 Subject: [PATCH 067/108] Adds heart-shaped boxes of chocolate to the valentines event --- code/game/objects/items/storage/fancy.dm | 18 ++++++++++++++++++ code/modules/events/holiday/vday.dm | 2 +- .../food_and_drinks/food/snacks_other.dm | 9 +++++++++ icons/mob/inhands/misc/food_lefthand.dmi | Bin 3132 -> 3355 bytes icons/mob/inhands/misc/food_righthand.dmi | Bin 3077 -> 3278 bytes icons/obj/food/containers.dmi | Bin 9238 -> 10799 bytes 6 files changed, 28 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 2baf26abae..cb1e5e8177 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -11,6 +11,7 @@ * Candle Box * Cigarette Box * Cigar Case + * Heart Shaped Box w/ Chocolates */ /obj/item/storage/fancy @@ -84,6 +85,7 @@ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' name = "egg box" + desc = "A carton for containing eggs." storage_slots = 12 can_hold = list(/obj/item/reagent_containers/food/snacks/egg) spawn_type = /obj/item/reagent_containers/food/snacks/egg @@ -279,3 +281,19 @@ name = "\improper premium havanian cigar case" desc = "A case of classy Havanian cigars." spawn_type = /obj/item/clothing/mask/cigarette/cigar/havana + +/* + * Heart Shaped Box w/ Chocolates + */ + +/obj/item/storage/fancy/heart_box + name = "heart-shaped box" + desc = "A heart-shaped box for holding tiny chocolates." + icon = 'icons/obj/food/containers.dmi' + icon_state = "heartbox" + icon_type = "chocolate" + lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' + storage_slots = 8 + can_hold = list(/obj/item/reagent_containers/food/snacks/tinychocolate) + spawn_type = /obj/item/reagent_containers/food/snacks/tinychocolate diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 0084cb7ea5..25464ba297 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -18,7 +18,7 @@ H.put_in_hands(new /obj/item/valentine) var/obj/item/storage/backpack/b = locate() in H.contents new /obj/item/reagent_containers/food/snacks/candyheart(b) - + new /obj/item/storage/fancy/heart_box(b) var/list/valentines = list() for(var/mob/living/M in GLOB.player_list) diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index a674a20c96..4645993758 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -560,3 +560,12 @@ filling_color = "#F6CB0B" tastes = list("pineapple" = 1) foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/tinychocolate + name = "chocolate" + desc = "A tiny and sweet chocolate." + icon_state = "tiny_chocolate" + list_reagents = list("nutriment" = 1, "sugar" = 1, "cocoa" = 1) + filling_color = "#A0522D" + tastes = list("chocolate" = 1) + foodtype = JUNKFOOD | SUGAR \ No newline at end of file diff --git a/icons/mob/inhands/misc/food_lefthand.dmi b/icons/mob/inhands/misc/food_lefthand.dmi index 081ac1227af3310fe00000e4a8b2b991fb16019b..1cb5b00418e6c46bf7128675a978471d267177c7 100644 GIT binary patch delta 3208 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 XJ0#G&5>ivf?*S-%6TL!R`-lGrtfLY! delta 2980 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 TIqnCunB|%nSn89{cwGAfnI&ae diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index f95ce283d2992585aab50f98be18c2e2f6e1f91d..dd251810915403f9bc76ff604ee86bcaddda6e12 100644 GIT binary patch literal 10799 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 literal 9238 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 Mu8B^ymcz^c1@xs9cK`qY From 5793fe893f6973be8fc042040a6cbc6b0384c069 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 13 Feb 2018 12:18:26 -0800 Subject: [PATCH 068/108] The Cook now only works under siege. (#35597) The chef's CQC skill now only works in the kitchen area --- code/datums/martial/cqc.dm | 20 ++++++++++++++++++-- code/modules/jobs/job_types/cargo_service.dm | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index fd00e0bc58..294714163f 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -8,6 +8,14 @@ name = "CQC" help_verb = /mob/living/carbon/human/proc/CQC_help block_chance = 75 + var/just_a_cook = FALSE + var/static/list/areas_under_siege = typecacheof(list(/area/crew_quarters/kitchen, + /area/crew_quarters/cafeteria, + /area/crew_quarters/bar)) + +/datum/martial_art/cqc/under_siege + name = "Culinary School Training" + just_a_cook = TRUE /datum/martial_art/cqc/proc/drop_restraining() restraining = 0 @@ -92,6 +100,9 @@ return 1 /datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(just_a_cook) + if(!is_type_in_typecache(get_area(A), areas_under_siege)) + return 0 add_to_streak("G",D) if(check_streak(A,D)) return 1 @@ -107,6 +118,9 @@ return 1 /datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(just_a_cook) + if(!is_type_in_typecache(get_area(A), areas_under_siege)) + return 0 add_to_streak("H",D) if(check_streak(A,D)) return 1 @@ -135,6 +149,9 @@ return 1 /datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(just_a_cook) + if(!is_type_in_typecache(get_area(A), areas_under_siege)) + return 0 add_to_streak("D",D) var/obj/item/I = null if(check_streak(A,D)) @@ -170,7 +187,6 @@ set name = "Remember The Basics" set desc = "You try to remember some of the basics of CQC." set category = "CQC" - to_chat(usr, "You try to remember some of the basics of CQC.") to_chat(usr, "Slam: Grab Harm. Slam opponent into the ground, knocking them down.") @@ -178,7 +194,7 @@ to_chat(usr, "Restrain: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.") to_chat(usr, "Pressure: Disarm Grab. Decent stamina damage.") to_chat(usr, "Consecutive CQC: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.") - + to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.") /obj/item/cqc_manual diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index a832f62376..c74fbd3b1b 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -216,7 +216,7 @@ Cook var/chosen_box = pick(possible_boxes) var/obj/item/storage/box/I = new chosen_box(src) H.equip_to_slot_or_del(I,slot_in_backpack) - var/datum/martial_art/cqc/justacook = new + var/datum/martial_art/cqc/under_siege/justacook = new justacook.teach(H) /* From a2c1aac79b7ac660ddf3578f505a54814ea2e8d4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 15:23:50 -0600 Subject: [PATCH 070/108] Automatic changelog generation for PR #5464 [ci skip] --- html/changelogs/AutoChangeLog-pr-5464.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5464.yml diff --git a/html/changelogs/AutoChangeLog-pr-5464.yml b/html/changelogs/AutoChangeLog-pr-5464.yml new file mode 100644 index 0000000000..2ec5074007 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5464.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Heart-shaped boxes of chocolates are now included in Valentine's Day event gifts" From 900fab0bf28783a147033de7a68614c806326611 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 15:24:20 -0600 Subject: [PATCH 071/108] Automatic changelog generation for PR #5465 [ci skip] --- html/changelogs/AutoChangeLog-pr-5465.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5465.yml diff --git a/html/changelogs/AutoChangeLog-pr-5465.yml b/html/changelogs/AutoChangeLog-pr-5465.yml new file mode 100644 index 0000000000..ac80a64f1d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5465.yml @@ -0,0 +1,4 @@ +author: "Iamgoofball" +delete-after: True +changes: + - bugfix: "The Cook now ONLY works under siege." From 6a094232bc5bd41a5a1c71fedc5b8f63fdf0ff56 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 14 Feb 2018 00:47:58 +0200 Subject: [PATCH 072/108] Merge pull request #35642 from MrStonedOne/patch-482 [s]Fixes blacklisted byond builds --- code/modules/client/client_procs.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 77c71823f5..a38a4c5d40 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -4,8 +4,8 @@ #define UPLOAD_LIMIT 1048576 //Restricts client uploads to the server to 1MB //Could probably do with being lower. GLOBAL_LIST_INIT(blacklisted_builds, list( - 1407 = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", - 1408 = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", + "1407" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", + "1408" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", )) @@ -235,10 +235,10 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) . = ..() //calls mob.Login() #if DM_VERSION >= 512 - if (byond_build in GLOB.blacklisted_builds) + if (num2text(byond_build) in GLOB.blacklisted_builds) log_access("Failed login: blacklisted byond version") to_chat(src, "Your version of byond is blacklisted.") - to_chat(src, "Byond build [byond_build] ([byond_version].[byond_build]) has been blacklisted for the following reason: [GLOB.blacklisted_builds[byond_build]].") + to_chat(src, "Byond build [byond_build] ([byond_version].[byond_build]) has been blacklisted for the following reason: [GLOB.blacklisted_builds[num2text(byond_build)]].") to_chat(src, "Please download a new version of byond. if [byond_build] is the latest, you can go to http://www.byond.com/download/build/ to download other versions.") if(connecting_admin) to_chat(src, "As an admin, you are being allowed to continue using this version, but please consider changing byond versions") From 6bdb3ad4c05aa2bb121c3b753bd98dc8e4fea7a1 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 14 Feb 2018 01:15:18 +0200 Subject: [PATCH 074/108] Merge pull request #35594 from praisenarsie/patch-30 Fixes rat kebabs --- .../food_and_drinks/recipes/tablecraft/recipes_meat.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index d0e5587bfd..b33d6a520b 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -178,7 +178,7 @@ /obj/item/reagent_containers/food/snacks/deadmouse = 1 ) result = /obj/item/reagent_containers/food/snacks/kebab/rat - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/doubleratkebab name = "Double Rat Kebab" @@ -187,7 +187,7 @@ /obj/item/reagent_containers/food/snacks/deadmouse = 2 ) result = /obj/item/reagent_containers/food/snacks/kebab/rat/double - category = CAT_MEAT + subcategory = CAT_MEAT /datum/crafting_recipe/food/ricepork name = "Rice and pork" From 1346e88e6bf64c98131f9df769b72efbf288fb35 Mon Sep 17 00:00:00 2001 From: TehZombehz Date: Tue, 13 Feb 2018 17:52:18 -0600 Subject: [PATCH 076/108] Fix for invisible heartboxes --- code/game/objects/items/storage/fancy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index cb1e5e8177..1cf5162bbe 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -291,7 +291,7 @@ desc = "A heart-shaped box for holding tiny chocolates." icon = 'icons/obj/food/containers.dmi' icon_state = "heartbox" - icon_type = "chocolate" + icon_type = "heart" lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' storage_slots = 8 From dffee584596c0e8e64d79f1ffa97648f107c7972 Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Mon, 12 Feb 2018 23:00:52 +0000 Subject: [PATCH 078/108] Transference potions rename the mob to just your name So instead of "Braxton Cherry as parrot", it'll just be "Braxton Cherry" now. Polymorphing keeps your name, this has always bugged me as ugly and unneeded. --- code/modules/research/xenobiology/xenobiology.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index c6b9e4b902..df69eb9380 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -661,7 +661,7 @@ user.death() to_chat(SM, "In a quick flash, you feel your consciousness flow into [SM]!") to_chat(SM, "You are now [SM]. Your allegiances, alliances, and role is still the same as it was prior to consciousness transfer!") - SM.name = "[SM.name] as [user.real_name]" + SM.name = "[user.real_name]" qdel(src) /obj/item/slimepotion/slime/steroid From 79fddcb18808e356a8c35891673d8379f3fbde72 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 18:19:09 -0600 Subject: [PATCH 080/108] Automatic changelog generation for PR #5467 [ci skip] --- html/changelogs/AutoChangeLog-pr-5467.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5467.yml diff --git a/html/changelogs/AutoChangeLog-pr-5467.yml b/html/changelogs/AutoChangeLog-pr-5467.yml new file mode 100644 index 0000000000..ba61559a87 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5467.yml @@ -0,0 +1,4 @@ +author: "Frozenguy5" +delete-after: True +changes: + - bugfix: "You can craft rat kebabs now." From f857f53524a4404d6b465d32b495fa192d8ea514 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 18:37:51 -0600 Subject: [PATCH 081/108] Automatic changelog generation for PR #5469 [ci skip] --- html/changelogs/AutoChangeLog-pr-5469.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5469.yml diff --git a/html/changelogs/AutoChangeLog-pr-5469.yml b/html/changelogs/AutoChangeLog-pr-5469.yml new file mode 100644 index 0000000000..7ae6cf54a9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5469.yml @@ -0,0 +1,4 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "Transference potions now just rename the mob that you are transferring into with your name, rather than your name plus the old name of the mob." From 9041b0b2645bee74d80055a775bb4ee9cc88cbe6 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 14 Feb 2018 02:41:52 +0200 Subject: [PATCH 082/108] Disables clogged vents until it can be reworked --- code/modules/events/vent_clog.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 2bdd2db814..60c806f195 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -2,7 +2,7 @@ name = "Clogged Vents" typepath = /datum/round_event/vent_clog weight = 25 - max_occurrences = 1 + max_occurrences = 0 min_players = 50 /datum/round_event/vent_clog From 38145c93c79921d4517e3b327d17c9f5804b8719 Mon Sep 17 00:00:00 2001 From: AnturK Date: Wed, 14 Feb 2018 02:43:24 +0100 Subject: [PATCH 084/108] Greentext antag datum and OnRoundend hook. (#35584) * Greentext antag datum and OnRoundend hook. * review stuff --- code/__HELPERS/roundend.dm | 5 ++++ code/controllers/subsystem/ticker.dm | 9 +++++++ .../antagonists/greentext/greentext.dm | 19 ++++++++++++++ code/modules/events/wizard/greentext.dm | 25 +++++++++++-------- tgstation.dme | 1 + 5 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 code/modules/antagonists/greentext/greentext.dm diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index ee575f686f..5c6856d3f6 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -162,6 +162,11 @@ if(LAZYLEN(GLOB.round_end_notifiees)) send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") + for(var/I in round_end_events) + var/datum/callback/cb = I + cb.InvokeAsync() + LAZYCLEARLIST(round_end_events) + for(var/client/C in GLOB.clients) if(!C.credits) C.RollCredits() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 03a1325923..4ab8332303 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -61,6 +61,7 @@ SUBSYSTEM_DEF(ticker) var/round_start_time = 0 var/list/round_start_events + var/list/round_end_events var/mode_result = "undefined" var/end_state = "undefined" @@ -336,12 +337,20 @@ SUBSYSTEM_DEF(ticker) send2irc("Server", "Round [GLOB.round_id ? "#[GLOB.round_id]:" : "of"] [hide_mode ? "secret":"[mode.name]"] has started[allmins.len ? ".":" with no active admins online!"]") setup_done = TRUE +//These callbacks will fire after roundstart key transfer /datum/controller/subsystem/ticker/proc/OnRoundstart(datum/callback/cb) if(!HasRoundStarted()) LAZYADD(round_start_events, cb) else cb.InvokeAsync() +//These callbacks will fire before roundend report +/datum/controller/subsystem/ticker/proc/OnRoundend(datum/callback/cb) + if(current_state >= GAME_STATE_FINISHED) + cb.InvokeAsync() + else + LAZYADD(round_end_events, cb) + /datum/controller/subsystem/ticker/proc/station_explosion_detonation(atom/bomb) if(bomb) //BOOM var/turf/epi = bomb.loc diff --git a/code/modules/antagonists/greentext/greentext.dm b/code/modules/antagonists/greentext/greentext.dm new file mode 100644 index 0000000000..469eeb9882 --- /dev/null +++ b/code/modules/antagonists/greentext/greentext.dm @@ -0,0 +1,19 @@ +/datum/antagonist/greentext + name = "winner" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = TRUE //Not that it will be there for long + +/datum/antagonist/greentext/proc/forge_objectives() + var/datum/objective/O = new /datum/objective("Succeed") + O.completed = TRUE //YES! + O.owner = owner + objectives += O + owner.objectives += objectives + +/datum/antagonist/greentext/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/greentext/on_removal() + owner.objectives -= objectives + . = ..() \ No newline at end of file diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 156ecea2ec..fb944d9230 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -28,12 +28,15 @@ var/mob/living/last_holder var/mob/living/new_holder var/list/color_altered_mobs = list() + var/datum/callback/roundend_callback resistance_flags = FIRE_PROOF | ACID_PROOF var/quiet = FALSE -/obj/item/greentext/New() - ..() +/obj/item/greentext/Initialize(mapload) + . = ..() GLOB.poi_list |= src + roundend_callback = CALLBACK(src,.proc/check_winner) + SSticker.OnRoundend(roundend_callback) /obj/item/greentext/equipped(mob/living/user as mob) to_chat(user, "So long as you leave this place with greentext in hand you know will be happy...") @@ -57,20 +60,19 @@ STOP_PROCESSING(SSobj, src) ..() -/obj/item/greentext/process() - if(new_holder && is_centcom_level(new_holder.z))//you're winner! +/obj/item/greentext/proc/check_winner() + if(!new_holder) + return + + if(is_centcom_level(new_holder.z))//you're winner! to_chat(new_holder, "At last it feels like victory is assured!") - new_holder.mind.special_role = "winner" - var/datum/objective/O = new /datum/objective("Succeed") - O.completed = 1 //YES! - O.owner = new_holder.mind - new_holder.mind.objectives += O - new_holder.mind.add_antag_datum(/datum/antagonist/auto_custom) + new_holder.mind.add_antag_datum(/datum/antagonist/greentext) new_holder.log_message("Won with greentext!!!", INDIVIDUAL_ATTACK_LOG) color_altered_mobs -= new_holder resistance_flags |= ON_FIRE qdel(src) +/obj/item/greentext/process() if(last_holder && last_holder != new_holder) //Somehow it was swiped without ever getting dropped to_chat(last_holder, "A sudden wave of failure washes over you...") last_holder.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) @@ -80,7 +82,7 @@ if(!(resistance_flags & ON_FIRE) && !force) return QDEL_HINT_LETMELIVE - . = ..() + SSticker.round_end_events -= roundend_callback GLOB.poi_list.Remove(src) for(var/i in GLOB.player_list) var/mob/M = i @@ -93,6 +95,7 @@ // can't skip the mob check as it also does the decolouring if(!quiet) to_chat(M, message) + . = ..() /obj/item/greentext/quiet quiet = TRUE diff --git a/tgstation.dme b/tgstation.dme index 1473106833..9de3253c25 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1210,6 +1210,7 @@ #include "code\modules\antagonists\devil\true_devil\_true_devil.dm" #include "code\modules\antagonists\devil\true_devil\inventory.dm" #include "code\modules\antagonists\ert\ert.dm" +#include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\highlander\highlander.dm" #include "code\modules\antagonists\monkey\monkey.dm" #include "code\modules\antagonists\morph\morph.dm" From fc92759584913fd2d7e6cb0a56a350335d257288 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 19:47:44 -0600 Subject: [PATCH 086/108] Automatic changelog generation for PR #5470 [ci skip] --- html/changelogs/AutoChangeLog-pr-5470.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5470.yml diff --git a/html/changelogs/AutoChangeLog-pr-5470.yml b/html/changelogs/AutoChangeLog-pr-5470.yml new file mode 100644 index 0000000000..f1a9fb3df8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5470.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - tweak: "The clogged vents event has been removed for pressing ceremonial reasons" From 01f76f4588cdb45ea7f95a27aec885cc6bc6879e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 19:56:23 -0600 Subject: [PATCH 087/108] Automatic changelog generation for PR #5440 [ci skip] --- html/changelogs/AutoChangeLog-pr-5440.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5440.yml diff --git a/html/changelogs/AutoChangeLog-pr-5440.yml b/html/changelogs/AutoChangeLog-pr-5440.yml new file mode 100644 index 0000000000..0707b4f149 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5440.yml @@ -0,0 +1,4 @@ +author: "Cebutris" +delete-after: True +changes: + - rscadd: "Added in prayer beads, code and sprites shamelessly stolen from Paradise. Chaplains can pray for people, to heal their wounds without the risk of braindamage, and cleanse their mind of unholy thoughts" From 745ca227c3298721469b386c52b784e4060ce3d8 Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> Date: Tue, 13 Feb 2018 21:46:33 -0500 Subject: [PATCH 088/108] Fixes Battlecruiser Turrets and Improves Turret's Faction Capabilities (#35427) * Update portable_turret.dm * Update portable_turret.dm * Update portable_turret.dm * f --- .../RandomRuins/SpaceRuins/caravanambush.dmm | 4 ++-- _maps/templates/pirate_ship.dmm | 18 +++++++++--------- .../machinery/porta_turret/portable_turret.dm | 19 ++++++++++--------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 1081a01b03..4e55ba107d 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -529,14 +529,14 @@ "bb" = ( /obj/machinery/porta_turret/syndicate/pod{ dir = 5; - faction = "pirate" + faction = list("pirate") }, /turf/closed/wall/mineral/plastitanium, /area/shuttle/caravan/pirate) "bc" = ( /obj/machinery/porta_turret/syndicate/pod{ dir = 6; - faction = "pirate" + faction = list("pirate") }, /turf/closed/wall/mineral/plastitanium, /area/shuttle/caravan/pirate) diff --git a/_maps/templates/pirate_ship.dmm b/_maps/templates/pirate_ship.dmm index 954e396486..8b513991b0 100644 --- a/_maps/templates/pirate_ship.dmm +++ b/_maps/templates/pirate_ship.dmm @@ -904,13 +904,6 @@ }, /turf/open/floor/plating, /area/shuttle/pirate) -"cf" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 1; - faction = "pirate" - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/pirate) "cg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/public/glass{ @@ -1788,6 +1781,13 @@ }, /turf/open/floor/engine/vacuum, /area/shuttle/pirate) +"dV" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 1; + faction = list("pirate") + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/pirate) (1,1,1) = {" aa @@ -1803,7 +1803,7 @@ aj aj bF aj -cf +dV aj aj aj @@ -2323,7 +2323,7 @@ aj aj bW aj -cf +dV aj aj aj diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 2a483cdf6e..ba4b5143e2 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -67,7 +67,7 @@ var/on = TRUE //determines if the turret is on - var/faction = "turret" // Same faction mobs will never be shot at, no matter the other settings + var/list/faction = list("turret") // Same faction mobs will never be shot at, no matter the other settings var/datum/effect_system/spark_spread/spark_system //the spark system, used for generating... sparks? @@ -488,9 +488,10 @@ /obj/machinery/porta_turret/proc/in_faction(mob/target) - if(!(faction in target.faction)) - return 0 - return 1 + for(var/faction1 in faction) + if(faction1 in target.faction) + return TRUE + return FALSE /obj/machinery/porta_turret/proc/target(atom/movable/target) if(target) @@ -570,7 +571,7 @@ stun_projectile_sound = 'sound/weapons/gunshot.ogg' icon_state = "syndie_off" base_icon_state = "syndie" - faction = ROLE_SYNDICATE + faction = list(ROLE_SYNDICATE) emp_vunerable = 0 desc = "A ballistic machine gun auto-turret." @@ -606,7 +607,7 @@ lethal_projectile = /obj/item/projectile/bullet/syndicate_turret /obj/machinery/porta_turret/ai - faction = "silicon" + faction = list("silicon") /obj/machinery/porta_turret/ai/assess_perp(mob/living/carbon/human/perp) return 10 //AI turrets shoot at everything not in their faction @@ -618,7 +619,7 @@ lethal_projectile = /obj/item/projectile/plasma/turret lethal_projectile_sound = 'sound/weapons/plasma_cutter.ogg' mode = TURRET_LETHAL //It would be useless in stun mode anyway - faction = "neutral" //Minebots, medibots, etc that should not be shot. + faction = list("neutral","silicon","turret") //Minebots, medibots, etc that should not be shot. /obj/machinery/porta_turret/aux_base/assess_perp(mob/living/carbon/human/perp) return 0 //Never shoot humanoids. You are on your own if Ashwalkers or the like attack! @@ -647,7 +648,7 @@ stun_projectile_sound = 'sound/weapons/plasma_cutter.ogg' icon_state = "syndie_off" base_icon_state = "syndie" - faction = "turret" + faction = list("neutral","silicon","turret") emp_vunerable = 0 mode = TURRET_LETHAL @@ -664,7 +665,7 @@ desc = "A turret built with substandard parts and run down further with age. Still capable of delivering lethal lasers to the odd space carp, but not much else." stun_projectile = /obj/item/projectile/beam/weak lethal_projectile = /obj/item/projectile/beam/weak - faction = "neutral" + faction = list("neutral","silicon","turret") //////////////////////// //Turret Control Panel// From 70f90f825213ac4a4081a02dca45c3d339b10fdd Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 13 Feb 2018 21:56:57 -0500 Subject: [PATCH 090/108] Merge pull request #35612 from vuonojenmustaturska/vuonojenmustaturska-patch-1 Prevents docking ports from being thrown away by chasms --- code/datums/components/chasm.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index ec4a15749b..87a71e466e 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -7,6 +7,7 @@ var/static/list/falling_atoms = list() // Atoms currently falling into chasms var/static/list/forbidden_types = typecacheof(list( /obj/singularity, + /obj/docking_port, /obj/structure/lattice, /obj/structure/stone_tile, /obj/item/projectile, From da5cc6a8cce4386534c9d942411dd9a5ef5d1694 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 13 Feb 2018 21:57:44 -0500 Subject: [PATCH 092/108] Merge pull request #35618 from YPOQ/processdeaddiseasefix Fixes process_dead diseases not processing at all --- code/modules/mob/living/carbon/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index a36ad80045..6375950d34 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -254,7 +254,7 @@ if(prob(D.infectivity)) D.spread() - if(stat != DEAD && !D.process_dead) + if(stat != DEAD || D.process_dead) D.stage_act() //todo generalize this and move hud out From 807a2ebaebfbbb79106a2d59035c31586a1d78e7 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 13 Feb 2018 21:59:44 -0500 Subject: [PATCH 094/108] Merge pull request #35605 from MrStonedOne/patch-481 Fixes ai transform being picky --- code/modules/mob/transform_procs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 6bec609e3a..01c1bb6815 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -344,8 +344,8 @@ landmark_loc += sloc.loc if(!landmark_loc.len) - message_admins("[src] cannot be made an AI as there are no valid spawn points. Yell at a mapper!") - return + message_admins("Could not find ai landmark for [src]. Yell at a mapper! We are spawning them at their current location.") + landmark_loc += loc if(client) stop_sound_channel(CHANNEL_LOBBYMUSIC) From 38fdf926609c1679d3f328b6888a3b78ca5f7c37 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 13 Feb 2018 21:58:55 -0500 Subject: [PATCH 096/108] Merge pull request #35610 from ShizCalev/fridge-cleanup Cleans up turf underneath fridges --- _maps/map_files/BoxStation/BoxStation.dmm | 4 ++-- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/PubbyStation/PubbyStation.dmm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 035e336660..9ac007c75d 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -17558,7 +17558,7 @@ /area/crew_quarters/kitchen) "aSP" = ( /obj/machinery/smartfridge, -/turf/open/floor/plating, +/turf/closed/wall, /area/crew_quarters/kitchen) "aSQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -24115,7 +24115,7 @@ /area/science/robotics/mechbay) "bjQ" = ( /obj/machinery/smartfridge/chemistry/preloaded, -/turf/open/floor/plating, +/turf/closed/wall, /area/medical/chemistry) "bjR" = ( /obj/structure/table/glass, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 56b25bc4ac..ad794e3a67 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -46058,7 +46058,7 @@ /area/hydroponics) "bSW" = ( /obj/machinery/smartfridge, -/turf/open/floor/plating, +/turf/closed/wall, /area/hydroponics) "bSX" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index c8c6aa43cb..a96d5ce178 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -20622,7 +20622,7 @@ /area/hydroponics) "aZZ" = ( /obj/machinery/smartfridge, -/turf/open/floor/plating, +/turf/closed/wall, /area/crew_quarters/kitchen) "baa" = ( /obj/structure/disposalpipe/segment, @@ -26739,7 +26739,7 @@ /area/medical/chemistry) "bpX" = ( /obj/machinery/smartfridge/chemistry/preloaded, -/turf/open/floor/plasteel/dark, +/turf/closed/wall, /area/medical/chemistry) "bpY" = ( /turf/closed/wall, From 98c9e0948f52351a7173a4b99ca64a2a4c3fbc27 Mon Sep 17 00:00:00 2001 From: Dax Dupont Date: Wed, 14 Feb 2018 04:09:00 +0100 Subject: [PATCH 098/108] Assblasts some power creep in circuit labs (#35506) * Circuit printers no longer start upgraded. * Replaces roundstart upgraded printer with regular printer * Replaces roundstart upgraded printer with regular printer w\ key remap --- _maps/map_files/BoxStation/BoxStation.dmm | 4 +- .../map_files/Deltastation/DeltaStation2.dmm | 4794 ++--------------- _maps/map_files/MetaStation/MetaStation.dmm | 4 +- .../integrated_electronics/core/printer.dm | 5 +- 4 files changed, 366 insertions(+), 4441 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 035e336660..c43fcb6879 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -38329,7 +38329,6 @@ /area/science/misc_lab) "bQY" = ( /obj/structure/table/reinforced, -/obj/item/device/integrated_circuit_printer/upgraded, /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of his office."; dir = 2; @@ -38337,6 +38336,7 @@ network = list("RD"); pixel_y = 28 }, +/obj/item/device/integrated_circuit_printer, /turf/open/floor/plasteel/white, /area/science/circuit) "bQZ" = ( @@ -42858,7 +42858,6 @@ /area/science/circuit) "cbZ" = ( /obj/structure/table/reinforced, -/obj/item/device/integrated_circuit_printer/upgraded, /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of his office."; dir = 1; @@ -42866,6 +42865,7 @@ network = list("RD"); pixel_y = -28 }, +/obj/item/device/integrated_circuit_printer, /turf/open/floor/plasteel/white, /area/science/circuit) "cca" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 55f4ad95f7..332d61e57c 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -112,27 +112,6 @@ /obj/structure/cable, /turf/open/space, /area/solar/starboard/fore) -"aap" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) -"aaq" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned) -"aar" = ( -/obj/machinery/door/airlock/titanium{ - cyclelinkeddir = 2; - name = "External Airlock" - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) "aas" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland1"; @@ -152,40 +131,6 @@ /obj/effect/landmark/xeno_spawn, /turf/open/space, /area/solar/starboard/fore) -"aav" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned) -"aaw" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) -"aax" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"aay" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned) -"aaz" = ( -/obj/structure/window/reinforced, -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned) "aaA" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/pod_1) @@ -204,108 +149,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/fore) -"aaF" = ( -/obj/structure/closet/firecloset/full, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"aaG" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"aaH" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plasteel/greenblue/side{ - dir = 1 - }, -/area/shuttle/abandoned) -"aaI" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/circuitboard/machine/hydroponics, -/turf/open/floor/plasteel/greenblue/side{ - dir = 5 - }, -/area/shuttle/abandoned) -"aaJ" = ( -/obj/machinery/door/airlock/titanium{ - cyclelinkeddir = 1; - glass = 1; - name = "Internal Airlock" - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"aaK" = ( -/obj/structure/closet/secure_closet/freezer/kitchen/mining, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/flour, -/turf/open/floor/plasteel/greenblue/side{ - dir = 9 - }, -/area/shuttle/abandoned) -"aaL" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/greenblue/side{ - dir = 1 - }, -/area/shuttle/abandoned) -"aaM" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"aaN" = ( -/obj/structure/closet/emcloset, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plating, -/area/shuttle/abandoned) "aaO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -356,132 +199,6 @@ "aaS" = ( /turf/closed/wall/mineral/plastitanium, /area/construction/mining/aux_base) -"aaT" = ( -/obj/structure/closet/crate{ - name = "emergency supplies crate" - }, -/obj/item/storage/toolbox/emergency, -/obj/item/storage/toolbox/emergency, -/obj/item/device/flashlight/flare{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/device/flashlight/flare{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/item/crowbar, -/obj/item/wrench, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/extinguisher, -/obj/item/extinguisher, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"aaU" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/storage/box/hug/medical, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"aaV" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/door/airlock/maintenance/glass{ - name = "Maintenance" - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"aaW" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"aaX" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/green/corner{ - dir = 4 - }, -/area/shuttle/abandoned) -"aaY" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/blue/corner{ - dir = 1 - }, -/area/shuttle/abandoned) -"aaZ" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"aba" = ( -/obj/structure/sink/kitchen{ - pixel_z = 30 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/green/corner{ - dir = 4 - }, -/area/shuttle/abandoned) -"abb" = ( -/obj/machinery/door/airlock/maintenance/glass{ - name = "Maintenance" - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"abc" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"abd" = ( -/obj/structure/closet/crate{ - name = "spare equipment crate" - }, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/relic, -/obj/item/device/t_scanner, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct/small{ - dir = 4 - }, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/shuttle/abandoned) "abe" = ( /obj/effect/turf_decal/delivery, /obj/item/twohanded/required/kirbyplants/random, @@ -539,49 +256,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) -"abk" = ( -/obj/machinery/vending/hydroseeds, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/greenblue/side, -/area/shuttle/abandoned) -"abl" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/stack/sheet/metal/fifty, -/obj/item/circuitboard/machine/hydroponics, -/obj/item/circuitboard/machine/gibber, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/green/corner{ - dir = 8 - }, -/area/shuttle/abandoned) -"abm" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"abn" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/blue/corner, -/area/shuttle/abandoned) -"abo" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/greenblue/side, -/area/shuttle/abandoned) "abp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ @@ -644,105 +318,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/fore) -"abw" = ( -/obj/structure/closet/wardrobe, -/obj/item/clothing/under/trek/command/next, -/obj/item/clothing/under/trek/command/next, -/obj/item/clothing/under/trek/engsec/next, -/obj/item/clothing/under/trek/engsec/next, -/obj/item/clothing/under/trek/medsci/next, -/obj/item/clothing/under/trek/medsci/next, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/spawner/lootdrop/costume, -/obj/item/clothing/under/rank/centcom_commander{ - desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; - name = "\improper dusty old CentCom jumpsuit" - }, -/obj/item/clothing/under/rank/centcom_officer{ - desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; - name = "\improper dusty old CentCom jumpsuit" - }, -/obj/item/clothing/under/rank/centcom_officer{ - desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; - name = "\improper dusty old CentCom jumpsuit" - }, -/obj/item/clothing/head/centhat{ - desc = "There's a gouge through the top where something has clawed clean through it. Whoever was wearing it probably doesn't need a hat any more."; - name = "\improper damaged CentCom hat" - }, -/turf/open/floor/plasteel/barber, -/area/shuttle/abandoned) -"abx" = ( -/obj/structure/reagent_dispensers/beerkeg, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/barber, -/area/shuttle/abandoned) -"aby" = ( -/obj/item/storage/bag/plants/portaseeder, -/obj/structure/table, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 13; - pixel_y = 5 - }, -/obj/item/reagent_containers/glass/bottle/nutrient/ez, -/obj/item/reagent_containers/glass/bottle/nutrient/ez, -/obj/item/reagent_containers/glass/bottle/nutrient/ez, -/obj/item/reagent_containers/glass/bottle/nutrient/rh{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/greenblue/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"abz" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"abA" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/greenblue/side{ - dir = 4 - }, -/area/shuttle/abandoned) -"abB" = ( -/obj/item/soap, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/shower{ - pixel_y = 15 - }, -/turf/open/floor/plasteel/freezer, -/area/shuttle/abandoned) "abC" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -795,85 +370,6 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"abI" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/barber, -/area/shuttle/abandoned) -"abJ" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/dice, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/barber, -/area/shuttle/abandoned) -"abK" = ( -/obj/structure/table, -/obj/item/wrench, -/obj/item/crowbar, -/obj/item/clothing/suit/apron, -/obj/item/shovel/spade, -/obj/item/cultivator, -/obj/item/device/plant_analyzer, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/wirecutters, -/turf/open/floor/plasteel/blue/corner{ - dir = 1 - }, -/area/shuttle/abandoned) -"abL" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/storage/box/donkpockets, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"abM" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/plasteel/green/corner{ - dir = 4 - }, -/area/shuttle/abandoned) -"abN" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct/small{ - dir = 1 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/toilet{ - dir = 8 - }, -/turf/open/floor/plasteel/freezer, -/area/shuttle/abandoned) -"abO" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct/small{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/shuttle/abandoned) "abP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -922,50 +418,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"abU" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/mopbucket, -/turf/open/floor/plasteel/greenblue/side{ - dir = 9 - }, -/area/shuttle/abandoned) -"abV" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/corner{ - dir = 8 - }, -/area/shuttle/abandoned) -"abW" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"abX" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/corner, -/area/shuttle/abandoned) -"abY" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/door/airlock{ - name = "Laborotary" - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) "abZ" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -1027,78 +479,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"acg" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 8 - }, -/turf/open/floor/plasteel/greenblue/side{ - dir = 10 - }, -/area/shuttle/abandoned) -"ach" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/toy/cards/deck, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"aci" = ( -/turf/open/space/basic, -/area/space) -"acj" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/door/airlock/glass{ - name = "Dormitory" - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"ack" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/abandoned) -"acl" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/gun/energy/floragun, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"acm" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 4 - }, -/area/shuttle/abandoned) -"acn" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 1 - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) "aco" = ( /turf/open/floor/plasteel/neutral, /area/hallway/secondary/entry) @@ -1160,99 +540,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"acw" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/bed, -/turf/open/floor/plasteel/greenblue/side{ - dir = 10 - }, -/area/shuttle/abandoned) -"acx" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/mop, -/turf/open/floor/plasteel/greenblue/side, -/area/shuttle/abandoned) -"acy" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/device/gps{ - gpstag = "ITVSAC"; - pixel_x = -1; - pixel_y = 2 - }, -/obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/floor/plasteel/neutral/corner{ - dir = 1 - }, -/area/shuttle/abandoned) -"acz" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"acA" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/corner{ - dir = 4 - }, -/area/shuttle/abandoned) -"acB" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12 - }, -/obj/structure/mirror{ - pixel_x = -30 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"acC" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"acD" = ( -/obj/structure/urinal{ - pixel_x = 30 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"acE" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/arrival) "acF" = ( /obj/docking_port/stationary{ dir = 2; @@ -1399,35 +686,6 @@ }, /turf/open/space, /area/solar/starboard/fore) -"acR" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"acS" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/door/airlock/glass{ - name = "Crew Quarters" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 1 - }, -/area/shuttle/abandoned) -"acT" = ( -/obj/machinery/vending/boozeomat, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned) -"acU" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 1 - }, -/area/shuttle/abandoned) "acV" = ( /obj/machinery/status_display{ pixel_x = -32 @@ -1492,19 +750,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"acZ" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/arrival) -"ada" = ( -/obj/structure/window/reinforced, -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/arrival) "adb" = ( /obj/machinery/status_display{ pixel_x = -32 @@ -1608,71 +853,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"adk" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 9 - }, -/area/shuttle/abandoned) -"adl" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 1 - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 1 - }, -/area/shuttle/abandoned) -"adm" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 5 - }, -/area/shuttle/abandoned) -"adn" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/table, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"ado" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/light/built{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"adp" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/table, -/obj/item/clothing/gloves/color/black, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) "adq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -1701,17 +881,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"adu" = ( -/turf/open/space/basic, -/area/space) -"adv" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/arrival) -"adw" = ( -/obj/structure/window/shuttle, -/obj/structure/grille, -/turf/open/floor/plating, -/area/shuttle/arrival) "adx" = ( /obj/structure/table/reinforced, /obj/item/device/analyzer{ @@ -1728,212 +897,6 @@ dir = 4 }, /area/construction/mining/aux_base) -"adz" = ( -/obj/structure/table/optable, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/defibrillator/loaded, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"adA" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/reagent_containers/spray/cleaner, -/turf/open/floor/plasteel/white, -/area/shuttle/abandoned) -"adB" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 4 - }, -/area/shuttle/abandoned) -"adC" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 8 - }, -/obj/structure/table, -/obj/item/clothing/suit/armor/vest, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"adD" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 4 - }, -/obj/structure/table, -/obj/item/gun/energy/e_gun/mini, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"adE" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/side, -/area/shuttle/abandoned) -"adF" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/robot_debris, -/turf/open/floor/plasteel/neutral/side, -/area/shuttle/abandoned) -"adG" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/bot, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/plasteel/neutral/corner{ - dir = 8 - }, -/area/shuttle/abandoned) -"adH" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned) -"adI" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/transport) -"adJ" = ( -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/structure/closet/crate/internals, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"adK" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/wardrobe/mixed, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"adL" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"adM" = ( -/obj/structure/table/reinforced, -/obj/structure/extinguisher_cabinet{ - pixel_y = 32 - }, -/obj/item/storage/firstaid/regular{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/firstaid/regular, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"adN" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/arrival) "adO" = ( /obj/structure/rack, /obj/item/storage/toolbox/emergency, @@ -1959,89 +922,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/construction/mining/aux_base) -"adS" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/frame/computer, -/obj/item/circuitboard/computer/operating, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"adT" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plasteel/white, -/area/shuttle/abandoned) -"adU" = ( -/obj/machinery/sleeper{ - icon_state = "sleeper-open"; - dir = 8 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/whiteblue/corner{ - dir = 4 - }, -/area/shuttle/abandoned) -"adV" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/arrival/corner{ - dir = 8 - }, -/area/shuttle/abandoned) -"adW" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/clothing/suit/armor/vest, -/obj/effect/decal/cleanable/blood/gibs/body, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"adX" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/crowbar/red, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"adY" = ( -/obj/machinery/door/airlock/titanium{ - cyclelinkeddir = 4; - glass = 1; - name = "Internal Airlock" - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 4 - }, -/area/shuttle/abandoned) -"adZ" = ( -/obj/machinery/door/airlock/titanium{ - cyclelinkeddir = 8; - name = "External Airlock" - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) "aea" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -2074,13 +954,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aed" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/shuttle/transport) "aee" = ( /obj/machinery/door/airlock/external{ cyclelinkeddir = 4; @@ -2094,33 +967,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aef" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Arrival Shuttle Airlock"; - req_access_txt = "0" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/shuttle/arrival) -"aeg" = ( -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/arrival) -"aeh" = ( -/turf/open/floor/plasteel/neutral, -/area/shuttle/arrival) -"aei" = ( -/turf/open/floor/plasteel/neutral/side{ - dir = 4 - }, -/area/shuttle/arrival) "aej" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -2153,100 +999,6 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"ael" = ( -/obj/machinery/iv_drip, -/obj/machinery/vending/wallmed{ - name = "Emergency NanoMed"; - pixel_x = -28; - req_access_txt = "0"; - use_power = 0 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"aem" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plasteel/white, -/area/shuttle/abandoned) -"aen" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/white, -/area/shuttle/abandoned) -"aeo" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = null; - name = "Infirmary"; - req_access_txt = "0" - }, -/turf/open/floor/plasteel/white, -/area/shuttle/abandoned) -"aep" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/arrival{ - dir = 8 - }, -/area/shuttle/abandoned) -"aeq" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"aer" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"aes" = ( -/obj/structure/grille, -/obj/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/abandoned) -"aet" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/transport) -"aeu" = ( -/turf/open/space/basic, -/area/space) -"aev" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/transport) "aew" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -2262,35 +1014,6 @@ }, /turf/open/floor/plasteel/neutral, /area/hallway/secondary/entry) -"aey" = ( -/obj/machinery/status_display{ - pixel_x = -32 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/arrival) -"aez" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"aeA" = ( -/obj/machinery/ai_status_display{ - pixel_x = 32 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 4 - }, -/area/shuttle/arrival) "aeB" = ( /obj/machinery/status_display, /turf/closed/wall, @@ -2352,92 +1075,6 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"aeI" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 10 - }, -/area/shuttle/abandoned) -"aeJ" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct, -/turf/open/floor/plasteel/whiteblue/side, -/area/shuttle/abandoned) -"aeK" = ( -/obj/structure/closet/secure_closet/medical2{ - req_access = null - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/clothing/glasses/hud/health/sunglasses, -/turf/open/floor/plasteel/whiteblue/side, -/area/shuttle/abandoned) -"aeL" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned) -"aeM" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/arrival/corner{ - dir = 1 - }, -/area/shuttle/abandoned) -"aeN" = ( -/obj/structure/sign/departments/engineering, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned) -"aeO" = ( -/obj/machinery/autolathe, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"aeP" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/tank_dispenser, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/abandoned) -"aeQ" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) "aeR" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -2455,16 +1092,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aeT" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/transport) -"aeU" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/pod/light, -/area/shuttle/transport) "aeV" = ( /obj/machinery/light{ dir = 1 @@ -2492,27 +1119,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"aeY" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"aeZ" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"afa" = ( -/obj/machinery/requests_console{ - department = "Arrival shuttle"; - name = "Arrivals Shuttle console" - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/arrival) "afb" = ( /obj/machinery/vending/snack/random, /obj/machinery/light{ @@ -2587,91 +1193,6 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"afl" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"afm" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/blood/gibs/down, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"afn" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"afo" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/closet/crate/science, -/obj/effect/decal/cleanable/leaper_sludge, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"afp" = ( -/obj/structure/closet/crate/engineering, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/rglass{ - amount = 20 - }, -/obj/item/stack/sheet/mineral/titanium/fifty, -/turf/open/floor/plasteel/yellow/corner, -/area/shuttle/abandoned) -"afq" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/rglass{ - amount = 20 - }, -/obj/item/clothing/head/welding, -/obj/structure/light_construct{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"afr" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/abandoned) -"afs" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) "aft" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, @@ -2686,10 +1207,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"afv" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/pod/light, -/area/shuttle/transport) "afw" = ( /obj/structure/chair{ dir = 4 @@ -2704,14 +1221,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"afy" = ( -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/lavendergrass, -/obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, -/obj/structure/window/shuttle, -/turf/open/floor/grass, -/area/shuttle/arrival) "afz" = ( /obj/machinery/vending/cola/random, /obj/effect/turf_decal/delivery, @@ -2780,113 +1289,6 @@ dir = 4 }, /area/construction/mining/aux_base) -"afH" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 9 - }, -/area/shuttle/abandoned) -"afI" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 1 - }, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 1 - }, -/area/shuttle/abandoned) -"afJ" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 1 - }, -/area/shuttle/abandoned) -"afK" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/purple/corner{ - dir = 8 - }, -/area/shuttle/abandoned) -"afL" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/paper/crumpled/bloody{ - info = "Your vessel will be transporting artifact E-395 to our nearby research station. Under no circumstances is the container to be opened. Half of the payment will be given now, rest upon completion. In the event of containment breach--" - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"afM" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"afN" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/yellow/side{ - dir = 4 - }, -/area/shuttle/abandoned) -"afO" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Storage" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 4 - }, -/area/shuttle/abandoned) -"afP" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/clothing/head/welding, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/abandoned) -"afQ" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/transport) -"afR" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/shuttle/transport) -"afS" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/pod/dark, -/area/shuttle/transport) "afT" = ( /obj/structure/chair{ dir = 4 @@ -2895,14 +1297,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"afU" = ( -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/lavendergrass, -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/window/shuttle, -/turf/open/floor/grass, -/area/shuttle/arrival) "afV" = ( /obj/item/device/radio/beacon, /obj/effect/turf_decal/delivery, @@ -2947,96 +1341,6 @@ /obj/structure/mining_shuttle_beacon, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"aga" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"agb" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/door/airlock/research{ - glass = 1; - name = "Research Lab" - }, -/turf/open/floor/plasteel/white, -/area/shuttle/abandoned) -"agc" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/purple/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"agd" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/clothing/gloves/color/black, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"age" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/greenglow, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"agf" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/airlock_painter, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel/yellow/corner{ - dir = 4 - }, -/area/shuttle/abandoned) -"agg" = ( -/obj/structure/closet/toolcloset, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"agh" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/stack/rods/twentyfive, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/abandoned) -"agi" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/structure/light_construct/small, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) "agj" = ( /obj/structure/closet/firecloset, /obj/effect/decal/cleanable/dirt, @@ -3144,75 +1448,6 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"agu" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/frame/computer, -/obj/item/stack/sheet/glass, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"agv" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/circuitboard/machine/circuit_imprinter, -/turf/open/floor/plasteel/white, -/area/shuttle/abandoned) -"agw" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/frame/machine, -/turf/open/floor/plasteel/whitepurple/corner, -/area/shuttle/abandoned) -"agx" = ( -/obj/structure/sign/departments/science, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned) -"agy" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 8 - }, -/turf/open/floor/plasteel/purple/corner{ - dir = 1 - }, -/area/shuttle/abandoned) -"agz" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"agA" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) "agB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -3233,12 +1468,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"agD" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/shuttle/transport) "agE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -3254,49 +1483,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"agG" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/arrival) -"agH" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/arrival) -"agI" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/toy/figure/assistant, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"agJ" = ( -/obj/machinery/vending/wallmed{ - name = "Emergency NanoMed"; - req_access_txt = "0"; - use_power = 0 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/arrival) -"agK" = ( -/obj/structure/table/reinforced, -/obj/item/folder, -/obj/item/storage/pill_bottle/dice, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"agL" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 4 - }, -/area/shuttle/arrival) "agM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/yellow/side{ @@ -3323,34 +1509,6 @@ }, /turf/open/space, /area/space/nearstation) -"agP" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/frame/machine, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"agQ" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/frame/machine, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 4 - }, -/area/shuttle/abandoned) -"agR" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plating, -/area/shuttle/abandoned) "agS" = ( /obj/docking_port/stationary{ dir = 8; @@ -3369,16 +1527,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"agU" = ( -/obj/machinery/door/airlock/external, -/turf/open/floor/pod/light, -/area/shuttle/transport) -"agV" = ( -/obj/machinery/computer/shuttle/ferry/request{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/shuttle/transport) "agW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -3386,12 +1534,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"agX" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/arrival) "agY" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -3448,134 +1590,6 @@ dir = 4 }, /area/construction/mining/aux_base) -"ahd" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 10 - }, -/area/shuttle/abandoned) -"ahe" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/plasteel/whitepurple/side, -/area/shuttle/abandoned) -"ahf" = ( -/obj/structure/closet/crate/science{ - name = "spare circuit boards crate" - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/item/circuitboard/machine/protolathe, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/reagent_containers/glass/beaker/sulphuric, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 6 - }, -/area/shuttle/abandoned) -"ahg" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/light/built, -/turf/open/floor/plasteel/blue/side, -/area/shuttle/abandoned) -"ahh" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/blue/corner{ - dir = 8 - }, -/area/shuttle/abandoned) -"ahi" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/closet/crate, -/obj/effect/spawner/lootdrop/maintenance, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plasteel, -/area/shuttle/abandoned) -"ahj" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 1 - }, -/area/shuttle/abandoned) -"ahk" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/turf_decal/bot, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/plasteel/neutral/corner{ - dir = 1 - }, -/area/shuttle/abandoned) -"ahl" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/pod/light, -/area/shuttle/transport) -"ahm" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"ahn" = ( -/obj/structure/closet/wardrobe/black, -/turf/open/floor/plasteel/neutral/side, -/area/shuttle/arrival) -"aho" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/plasteel/blue/corner, -/area/shuttle/arrival) -"ahp" = ( -/turf/open/floor/plasteel/blue/side, -/area/shuttle/arrival) -"ahq" = ( -/obj/structure/closet/wardrobe/yellow, -/turf/open/floor/plasteel/blue/corner{ - dir = 8 - }, -/area/shuttle/arrival) -"ahr" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/plasteel/neutral, -/area/shuttle/arrival) -"ahs" = ( -/obj/structure/table/reinforced, -/obj/item/storage/briefcase{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/secure/briefcase, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/arrival) "aht" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering{ @@ -3618,17 +1632,6 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"ahy" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - welded = 1 - }, -/turf/open/floor/plasteel/neutral/side, -/area/shuttle/abandoned) "ahz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -3637,27 +1640,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"ahA" = ( -/obj/machinery/status_display, -/turf/closed/wall/mineral/titanium, -/area/shuttle/arrival) -"ahB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/machinery/door/airlock/shuttle{ - name = "Arrival Shuttle Airlock"; - req_access_txt = "0" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/arrival) -"ahC" = ( -/obj/machinery/ai_status_display, -/turf/closed/wall/mineral/titanium, -/area/shuttle/arrival) "ahD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/newscaster{ @@ -3711,77 +1693,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"ahI" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/cobweb, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/turf/open/floor/plasteel/blue/side{ - dir = 9 - }, -/area/shuttle/abandoned) -"ahJ" = ( -/obj/structure/closet/crate, -/obj/item/paper_bin, -/obj/item/stack/sheet/metal/twenty, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/clothing/under/gimmick/rank/captain/suit, -/turf/open/floor/plasteel/blue/corner{ - dir = 1 - }, -/area/shuttle/abandoned) -"ahK" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/device/megaphone, -/turf/open/floor/plasteel/blue/corner{ - dir = 4 - }, -/area/shuttle/abandoned) -"ahL" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/light/built{ - dir = 1 - }, -/turf/open/floor/plasteel/blue/side{ - dir = 1 - }, -/area/shuttle/abandoned) -"ahM" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/table, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plasteel/blue/corner{ - dir = 4 - }, -/area/shuttle/abandoned) -"ahN" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/table, -/obj/item/device/camera, -/turf/open/floor/plasteel/blue/side{ - dir = 5 - }, -/area/shuttle/abandoned) "ahO" = ( /obj/machinery/status_display{ pixel_x = -32 @@ -3813,11 +1724,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"ahQ" = ( -/obj/structure/window/shuttle, -/obj/structure/grille, -/turf/open/floor/plating, -/area/shuttle/transport) "ahR" = ( /obj/machinery/status_display{ pixel_x = -32 @@ -3849,28 +1755,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"ahT" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/blue/side{ - dir = 8 - }, -/area/shuttle/arrival) -"ahU" = ( -/obj/structure/chair/office/dark, -/turf/open/floor/plasteel/blue/side{ - dir = 1 - }, -/area/shuttle/arrival) -"ahV" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/blue/side{ - dir = 4 - }, -/area/shuttle/arrival) "ahW" = ( /obj/machinery/status_display{ pixel_x = -32 @@ -3921,47 +1805,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) -"ahZ" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 8 - }, -/obj/item/phone, -/turf/open/floor/plasteel/blue/side{ - dir = 8 - }, -/area/shuttle/abandoned) -"aia" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/effect/decal/cleanable/blood/gibs/torso, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"aib" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/shard, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"aic" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/light_construct{ - dir = 4 - }, -/turf/open/floor/plasteel/blue/side{ - dir = 4 - }, -/area/shuttle/abandoned) "aid" = ( /obj/docking_port/stationary{ dir = 1; @@ -3974,18 +1817,6 @@ }, /turf/open/space/basic, /area/space) -"aie" = ( -/obj/structure/frame/computer{ - dir = 1 - }, -/turf/open/floor/plasteel/blue, -/area/shuttle/arrival) -"aif" = ( -/obj/structure/frame/computer{ - dir = 1 - }, -/turf/open/floor/plasteel/blue/side, -/area/shuttle/arrival) "aig" = ( /turf/closed/wall, /area/maintenance/starboard/fore) @@ -4075,59 +1906,6 @@ /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/vault, /area/maintenance/starboard/fore) -"ait" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/blue/side{ - dir = 10 - }, -/area/shuttle/abandoned) -"aiu" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/pen/fountain/captain, -/turf/open/floor/plasteel/neutral/side{ - dir = 5 - }, -/area/shuttle/abandoned) -"aiv" = ( -/obj/structure/chair/comfy/black, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/abandoned) -"aiw" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 9 - }, -/area/shuttle/abandoned) -"aix" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/storage/photo_album, -/turf/open/floor/plasteel/blue/corner, -/area/shuttle/abandoned) -"aiy" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/blue/side{ - dir = 6 - }, -/area/shuttle/abandoned) "aiz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -4206,63 +1984,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aiK" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/item/storage/fancy/cigarettes/cigars/cohiba, -/turf/open/floor/plasteel/blue/side{ - dir = 10 - }, -/area/shuttle/abandoned) -"aiL" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 1; - x_offset = -7; - y_offset = -8 - }, -/turf/open/floor/plasteel/blue/side, -/area/shuttle/abandoned) -"aiM" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/table, -/obj/item/device/pda/clear, -/turf/open/floor/plasteel/blue/side, -/area/shuttle/abandoned) -"aiN" = ( -/obj/machinery/computer/shuttle/white_ship{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/blue/side, -/area/shuttle/abandoned) -"aiO" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/obj/structure/table, -/obj/item/device/radio, -/turf/open/floor/plasteel/blue/side, -/area/shuttle/abandoned) -"aiP" = ( -/obj/effect/decal/cleanable/dirt{ - desc = "A thin layer of dust coating the floor."; - name = "dust" - }, -/turf/open/floor/plasteel/blue/side, -/area/shuttle/abandoned) "aiQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -11403,9 +9124,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/storage) -"ayF" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/supply) "ayG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -11889,42 +9607,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/storage) -"azH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"azI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"azJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"azK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"azL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) "azM" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -12372,28 +10054,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/storage) -"aAL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"aAM" = ( -/turf/open/space/basic, -/area/space) -"aAN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"aAO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) "aAP" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -13006,28 +10666,6 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) -"aCe" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "cargounload" - }, -/obj/machinery/door/poddoor{ - id = "cargounload"; - name = "supply dock unloading door" - }, -/turf/open/floor/plating, -/area/shuttle/supply) -"aCf" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"aCg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) "aCh" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -13558,12 +11196,6 @@ }, /turf/open/space/basic, /area/space) -"aDj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) "aDk" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice/catwalk, @@ -13935,37 +11567,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/storage) -"aEj" = ( -/obj/machinery/button/door{ - dir = 2; - id = "cargounload"; - name = "Loading Doors"; - pixel_x = -24; - pixel_y = 8 - }, -/obj/machinery/button/door{ - id = "cargoload"; - name = "Loading Doors"; - pixel_x = -24; - pixel_y = -8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"aEk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) "aEl" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -15234,17 +12835,6 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) -"aGG" = ( -/obj/machinery/door/poddoor{ - id = "cargoload"; - name = "supply dock loading door" - }, -/obj/machinery/conveyor{ - dir = 4; - id = "cargoload" - }, -/turf/open/floor/plating, -/area/shuttle/supply) "aGH" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/light/small{ @@ -15948,28 +13538,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/storage) -"aHY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"aHZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"aIa" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"aIb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/shuttle/supply) "aIc" = ( /obj/structure/cable/white{ icon_state = "0-4" @@ -16689,15 +14257,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aJw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/shuttle/supply) -"aJx" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/shuttle/supply) "aJy" = ( /obj/machinery/hydroponics/constructable, /obj/item/seeds/glowshroom, @@ -17343,23 +14902,6 @@ }, /turf/open/floor/plasteel/neutral, /area/quartermaster/storage) -"aKT" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/shuttle/engine/heater, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/supply) -"aKU" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/shuttle/engine/heater, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/supply) "aKV" = ( /turf/closed/wall, /area/security/prison) @@ -17867,21 +15409,6 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) -"aLZ" = ( -/obj/structure/shuttle/engine/propulsion/burst/left, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/supply) -"aMa" = ( -/obj/structure/shuttle/engine/propulsion, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/supply) -"aMb" = ( -/obj/structure/shuttle/engine/propulsion/burst/right, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/supply) "aMc" = ( /obj/machinery/shower{ dir = 4 @@ -26092,13 +23619,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/miningoffice) -"bcH" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"bcI" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/mining) "bcJ" = ( /obj/structure/table/reinforced, /obj/item/folder/red, @@ -26832,40 +24352,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/miningoffice) -"bem" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) -"ben" = ( -/obj/machinery/computer/shuttle/mining, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) -"beo" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar/red, -/obj/item/wrench, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/gas, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) "bep" = ( /obj/machinery/door/poddoor/preopen{ id = "brigprison"; @@ -27417,26 +24903,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/miningoffice) -"bfK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) -"bfL" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel/neutral, -/area/shuttle/mining) -"bfM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) "bfN" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -28023,22 +25489,6 @@ }, /turf/open/space/basic, /area/space) -"bgV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) -"bgW" = ( -/turf/open/space/basic, -/area/space) -"bgX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) "bgZ" = ( /turf/closed/wall/r_wall, /area/security/brig) @@ -28682,39 +26132,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/miningoffice) -"biv" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) -"biw" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) -"bix" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) "biy" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -29552,115 +26969,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/miningoffice) -"bkg" = ( -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/structure/closet/crate/internals, -/obj/effect/decal/cleanable/dirt, -/obj/item/pickaxe/emergency, -/obj/item/pickaxe/emergency, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) -"bkh" = ( -/obj/structure/shuttle/engine/heater, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/mining) -"bki" = ( -/obj/structure/ore_box, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/mining) "bkj" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -30527,15 +27835,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) -"bmb" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/mining) "bmc" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, @@ -33021,13 +30320,6 @@ dir = 4 }, /area/hallway/primary/central) -"brc" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/labor) -"brd" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/labor) "bre" = ( /obj/machinery/light{ dir = 8 @@ -34015,27 +31307,6 @@ "bsW" = ( /turf/closed/wall, /area/hallway/primary/central) -"bsX" = ( -/obj/machinery/computer/shuttle/labor{ - dir = 4 - }, -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = -31 - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/labor) -"bsY" = ( -/obj/structure/chair/office/dark{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/labor) -"bsZ" = ( -/obj/item/folder/red, -/obj/item/restraints/handcuffs, -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/labor) "bta" = ( /obj/structure/cable/white{ icon_state = "0-4" @@ -34769,48 +32040,6 @@ "but" = ( /turf/closed/wall/r_wall, /area/security/nuke_storage) -"buu" = ( -/obj/structure/grille, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/labor) -"buv" = ( -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/labor) -"buw" = ( -/obj/machinery/button/flasher{ - id = "gulagshuttleflasher"; - name = "Flash Control"; - pixel_y = -26; - req_access_txt = "1" - }, -/obj/machinery/light, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/labor) -"bux" = ( -/obj/machinery/mineral/labor_claim_console{ - machinedir = 2; - pixel_x = 30; - pixel_y = 30 - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/labor) -"buy" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Labor Shuttle Airlock"; - req_access_txt = "2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/shuttle/labor) "buz" = ( /obj/machinery/door/airlock/external{ cyclelinkeddir = 4; @@ -35496,29 +32725,6 @@ dir = 4 }, /area/security/nuke_storage) -"bvU" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Labor Shuttle Airlock"; - req_access_txt = "2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plasteel/white, -/area/shuttle/labor) -"bvV" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/labor) -"bvW" = ( -/obj/machinery/mineral/stacking_machine/laborstacker{ - input_dir = 2; - output_dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plasteel/white, -/area/shuttle/labor) "bvX" = ( /obj/structure/closet/emcloset, /obj/structure/cable/white{ @@ -36199,33 +33405,6 @@ dir = 5 }, /area/security/nuke_storage) -"bxj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/shuttle/labor) -"bxk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/labor) -"bxl" = ( -/obj/machinery/mineral/labor_claim_console{ - machinedir = 1; - pixel_x = 30 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/shuttle/labor) "bxm" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -36842,32 +34021,6 @@ dir = 5 }, /area/security/nuke_storage) -"byA" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/shuttle/labor) -"byB" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/shuttle/labor) -"byC" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/flasher{ - id = "gulagshuttleflasher"; - pixel_x = 25 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/shuttle/labor) "byD" = ( /obj/machinery/gulag_item_reclaimer{ pixel_y = 28 @@ -37624,96 +34777,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/circuit/green, /area/security/nuke_storage) -"bzZ" = ( -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/structure/closet/crate/internals, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/shuttle/labor) -"bAa" = ( -/turf/open/space/basic, -/area/space) -"bAb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plasteel, -/area/shuttle/labor) "bAc" = ( /obj/docking_port/stationary{ dir = 8; @@ -38681,15 +35744,6 @@ dir = 8 }, /area/security/nuke_storage) -"bBX" = ( -/obj/structure/shuttle/engine/heater, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/labor) "bBY" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -39877,11 +36931,6 @@ dir = 4 }, /area/hallway/primary/central) -"bDU" = ( -/obj/structure/shuttle/engine/propulsion, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/shuttle/labor) "bDV" = ( /turf/closed/wall, /area/security/execution/transfer) @@ -85915,12 +82964,6 @@ dir = 8 }, /area/science/explab) -"duB" = ( -/obj/effect/turf_decal/bot_white, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/science/explab) "duC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -87460,13 +84503,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"dxC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/crew_quarters/abandoned_gambling_den) "dxD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -92398,15 +89434,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/neutral, /area/medical/morgue) -"dHG" = ( -/obj/structure/bodycontainer/morgue, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/medical/morgue) "dHH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -96776,18 +93803,6 @@ /obj/item/device/radio/beacon, /turf/open/floor/plasteel/neutral, /area/hallway/primary/aft) -"dQS" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/escape) -"dQT" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/escape) "dQU" = ( /obj/structure/sink{ dir = 8; @@ -97403,16 +94418,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dRY" = ( -/obj/structure/window/reinforced, -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "dRZ" = ( /obj/structure/closet/l3closet/virology, /obj/structure/sign/warning/biohazard{ @@ -97844,17 +94849,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"dSV" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"dSW" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"dSX" = ( -/obj/structure/window/shuttle, -/obj/structure/grille, -/turf/open/floor/plating, -/area/shuttle/escape) "dSY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/whitegreen/corner{ @@ -98137,129 +95131,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"dTK" = ( -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/tank/internals/emergency_oxygen/double{ - pixel_x = 3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat"; - pixel_y = 9 - }, -/obj/structure/closet/crate/internals, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"dTL" = ( -/turf/open/floor/plasteel/neutral/side{ - dir = 1 - }, -/area/shuttle/escape) -"dTM" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 1 - }, -/area/shuttle/escape) -"dTN" = ( -/obj/item/defibrillator/loaded, -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) -"dTO" = ( -/obj/machinery/computer/operating, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) -"dTP" = ( -/obj/structure/table/optable, -/obj/item/surgical_drapes, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) -"dTQ" = ( -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/item/retractor{ - pixel_x = 4 - }, -/obj/item/hemostat{ - pixel_x = -4 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) "dTR" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -26 @@ -98569,94 +95440,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"dUC" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/escape) -"dUD" = ( -/turf/open/space/basic, -/area/space) -"dUE" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 4 - }, -/area/shuttle/escape) -"dUF" = ( -/obj/machinery/status_display, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"dUG" = ( -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = 6 - }, -/obj/item/reagent_containers/glass/bottle/charcoal{ - pixel_x = -3 - }, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/reagent_containers/glass/bottle/charcoal{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = 4; - pixel_y = 1 - }, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = 2; - pixel_y = 8 - }, -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) -"dUH" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) -"dUI" = ( -/obj/item/device/radio/intercom{ - name = "Station Intercom"; - pixel_x = 26; - pixel_y = 58 - }, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) -"dUJ" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) "dUK" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -98882,60 +95665,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"dVm" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"dVn" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"dVo" = ( -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/lavendergrass, -/obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/leafybush, -/obj/structure/window/shuttle, -/turf/open/floor/grass, -/area/shuttle/escape) -"dVp" = ( -/obj/machinery/computer/med_data{ - dir = 4 - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 1 - }, -/area/shuttle/escape) -"dVq" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 1 - }, -/area/shuttle/escape) -"dVr" = ( -/turf/open/floor/plasteel/whiteblue/side{ - dir = 1 - }, -/area/shuttle/escape) -"dVs" = ( -/obj/item/storage/firstaid/toxin, -/obj/item/storage/firstaid/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 5 - }, -/area/shuttle/escape) "dVt" = ( /obj/structure/table/glass, /obj/structure/cable/white{ @@ -99264,43 +95993,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"dWh" = ( -/obj/machinery/ai_status_display, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"dWi" = ( -/obj/machinery/status_display, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"dWj" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"dWk" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = null; - name = "Escape Shuttle Infirmary"; - req_access_txt = "0" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"dWl" = ( -/obj/item/storage/firstaid/fire, -/obj/item/storage/firstaid/regular{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 4 - }, -/area/shuttle/escape) "dWm" = ( /obj/structure/reagent_dispensers/virusfood{ pixel_x = -32 @@ -99591,34 +96283,6 @@ }, /turf/open/floor/plasteel/neutral, /area/hallway/secondary/exit/departure_lounge) -"dWX" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/item/device/radio/intercom{ - name = "Station Intercom"; - pixel_x = -26 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"dWY" = ( -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/lavendergrass, -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/genericbush, -/obj/structure/window/shuttle, -/turf/open/floor/grass, -/area/shuttle/escape) -"dWZ" = ( -/obj/machinery/shower{ - dir = 8; - name = "emergency shower" - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 4 - }, -/area/shuttle/escape) "dXa" = ( /obj/structure/cable/white{ icon_state = "2-4" @@ -100033,40 +96697,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/neutral, /area/hallway/secondary/exit/departure_lounge) -"dXP" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/shuttle/escape) -"dXQ" = ( -/obj/structure/extinguisher_cabinet, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"dXR" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/turf/open/floor/plasteel/whiteblue/side, -/area/shuttle/escape) -"dXS" = ( -/turf/open/floor/plasteel/whiteblue/side, -/area/shuttle/escape) -"dXT" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/whiteblue/side{ - dir = 6 - }, -/area/shuttle/escape) "dXU" = ( /obj/structure/table/glass, /obj/machinery/airalarm{ @@ -100407,38 +97037,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"dYK" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock"; - req_access_txt = "0" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/shuttle/escape) -"dYL" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"dYM" = ( -/obj/machinery/sleeper{ - dir = 4 - }, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) -"dYN" = ( -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) -"dYO" = ( -/obj/machinery/sleeper{ - dir = 8 - }, -/turf/open/floor/plasteel/cmo, -/area/shuttle/escape) "dYP" = ( /obj/structure/table/glass, /obj/structure/cable/white{ @@ -100744,41 +97342,6 @@ /obj/structure/sign/warning/vacuum, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"dZs" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) -"dZt" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"dZu" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"dZv" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = null; - name = "Escape Shuttle Infirmary"; - req_access_txt = "0" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "dZw" = ( /obj/structure/cable/white, /obj/structure/cable/white{ @@ -101081,41 +97644,6 @@ }, /turf/open/space/basic, /area/space) -"eac" = ( -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/lavendergrass, -/obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, -/obj/structure/window/shuttle, -/turf/open/floor/grass, -/area/shuttle/escape) -"ead" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -26 - }, -/obj/machinery/shieldgen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"eae" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_y = -1 - }, -/obj/item/storage/toolbox/emergency{ - pixel_x = 3; - pixel_y = -5 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "eaf" = ( /obj/structure/sign/nanotrasen{ pixel_y = -32 @@ -101341,53 +97869,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"eaG" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/item/device/radio/intercom{ - name = "Station Intercom"; - pixel_x = -26 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"eaH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"eaI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"eaJ" = ( -/obj/structure/closet/crate/medical{ - name = "medical crate" - }, -/obj/item/storage/firstaid/regular, -/obj/item/storage/firstaid/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/firstaid/toxin{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/device/healthanalyzer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/lazarus_injector, -/obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/medbot{ - name = "\improper emergency medibot"; - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "eaK" = ( /obj/structure/cable/white, /obj/effect/spawner/structure/window/reinforced, @@ -101658,51 +98139,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"ebn" = ( -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/lavendergrass, -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/window/shuttle, -/turf/open/floor/grass, -/area/shuttle/escape) -"ebo" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"ebp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"ebq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"ebr" = ( -/obj/structure/closet/crate{ - name = "emergency supplies crate" - }, -/obj/item/storage/toolbox/emergency, -/obj/item/storage/toolbox/emergency, -/obj/item/device/flashlight/flare{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/device/flashlight/flare{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/item/crowbar, -/obj/item/wrench, -/obj/item/device/radio, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) "ebs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -102048,30 +98484,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"ecd" = ( -/obj/machinery/vending/wallmed{ - name = "Emergency NanoMed"; - req_access_txt = "0"; - use_power = 0 - }, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) -"ece" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Cargo" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"ecf" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) "ecg" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 1 @@ -102480,30 +98892,6 @@ }, /turf/open/floor/plasteel/neutral, /area/hallway/secondary/exit/departure_lounge) -"edc" = ( -/obj/structure/rack, -/obj/item/clothing/suit/fire/firefighter, -/obj/item/tank/internals/oxygen/red, -/obj/item/clothing/mask/gas, -/obj/item/clothing/head/hardhat/red, -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"edd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"ede" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "edf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset, @@ -102867,38 +99255,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"edE" = ( -/turf/open/floor/plasteel/neutral/side, -/area/shuttle/escape) -"edF" = ( -/obj/machinery/flasher{ - id = "shuttleflash"; - pixel_y = -26 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/neutral/side, -/area/shuttle/escape) -"edG" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/folder/yellow, -/obj/item/pen, -/obj/item/hand_labeler_refill, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"edH" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"edI" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) "edJ" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/metal{ @@ -103157,26 +99513,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/checkpoint/escape) -"eel" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Holding Area"; - req_access_txt = "2" - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"eem" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Cockpit"; - req_access_txt = "19" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "een" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/emergency, @@ -103505,72 +99841,6 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/escape) -"eeV" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock"; - req_access_txt = "2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/shuttle/escape) -"eeW" = ( -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"eeX" = ( -/obj/structure/chair, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"eeY" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"eeZ" = ( -/obj/machinery/button/flasher{ - id = "shuttleflash"; - pixel_x = -26; - pixel_y = 24 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/red/corner{ - dir = 1 - }, -/area/shuttle/escape) -"efa" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/neutral/corner{ - dir = 4 - }, -/area/shuttle/escape) -"efb" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/toy/figure/ninja, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"efc" = ( -/obj/structure/chair, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"efd" = ( -/obj/structure/chair, -/obj/machinery/status_display{ - pixel_y = 32 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/shuttle/escape) "efe" = ( /obj/structure/cable{ icon_state = "0-2" @@ -103858,62 +100128,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/checkpoint/escape) -"efH" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"efI" = ( -/turf/open/floor/plasteel/red/corner{ - dir = 1 - }, -/area/shuttle/escape) -"efJ" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/neutral/corner{ - dir = 4 - }, -/area/shuttle/escape) -"efK" = ( -/turf/open/floor/plasteel, -/area/shuttle/escape) -"efL" = ( -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"efM" = ( -/turf/open/floor/plasteel/neutral/corner, -/area/shuttle/escape) -"efN" = ( -/obj/item/device/radio/intercom{ - name = "Station Intercom"; - pixel_y = 58 - }, -/turf/open/floor/plasteel/neutral/side, -/area/shuttle/escape) -"efO" = ( -/turf/open/floor/plasteel/neutral/corner{ - dir = 8 - }, -/area/shuttle/escape) -"efP" = ( -/obj/machinery/door/airlock/external{ - name = "Emergency Recovery Airlock" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) "efQ" = ( /obj/structure/cable{ icon_state = "2-4" @@ -104210,61 +100424,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/checkpoint/escape) -"egt" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/status_display{ - pixel_x = -32 - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"egu" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"egv" = ( -/obj/structure/table/reinforced, -/obj/item/storage/lockbox/loyalty, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"egw" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/turf/open/floor/plasteel/red/corner{ - dir = 8 - }, -/area/shuttle/escape) -"egx" = ( -/obj/structure/fireaxecabinet{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/neutral/corner, -/area/shuttle/escape) -"egy" = ( -/obj/machinery/door/airlock/external{ - name = "Emergency Recovery Airlock" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"egz" = ( -/turf/open/floor/plasteel/neutral/corner{ - dir = 4 - }, -/area/shuttle/escape) -"egA" = ( -/turf/open/floor/plasteel/neutral/corner{ - dir = 1 - }, -/area/shuttle/escape) "egB" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -104317,244 +100476,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/checkpoint/escape) -"egI" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"egJ" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"egK" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/zipties, -/obj/item/device/radio/intercom{ - name = "Station Intercom"; - pixel_y = -26 - }, -/turf/open/floor/mineral/plastitanium/brig, -/area/shuttle/escape) -"egL" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/red/corner{ - dir = 8 - }, -/area/shuttle/escape) -"egM" = ( -/turf/open/floor/plasteel/blue/side, -/area/shuttle/escape) -"egN" = ( -/obj/machinery/door/airlock/command{ - name = "Emergency Recovery Airlock"; - req_access = null; - req_access_txt = "19" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"egO" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/shuttle/escape) -"egP" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/shuttle/escape) "egQ" = ( /obj/item/stack/cable_coil, /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/aft) -"egR" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/turf/open/floor/plasteel/vault{ - dir = 4 - }, -/area/shuttle/escape) -"egS" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/shuttle/escape) -"egT" = ( -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/shuttle/escape) -"egU" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/plasteel/vault{ - dir = 4 - }, -/area/shuttle/escape) "egV" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/xeno_spawn, /turf/open/space, /area/solar/port/aft) -"egW" = ( -/obj/machinery/computer/security{ - dir = 4 - }, -/turf/open/floor/plasteel/darkred/side{ - dir = 9 - }, -/area/shuttle/escape) -"egX" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/shuttle/escape) -"egY" = ( -/obj/item/device/radio/intercom{ - name = "Station Intercom"; - pixel_x = 26; - pixel_y = 58 - }, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/shuttle/escape) -"egZ" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/shuttle/escape) -"eha" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/turf/open/floor/plasteel/darkyellow/side{ - dir = 5 - }, -/area/shuttle/escape) -"ehb" = ( -/obj/machinery/computer/secure_data{ - dir = 4 - }, -/turf/open/floor/plasteel/darkred/side{ - dir = 10 - }, -/area/shuttle/escape) -"ehc" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, -/turf/open/floor/plasteel/vault, -/area/shuttle/escape) -"ehd" = ( -/obj/structure/chair/office/dark, -/turf/open/floor/plasteel/vault, -/area/shuttle/escape) -"ehe" = ( -/obj/structure/table/reinforced, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/vault, -/area/shuttle/escape) -"ehf" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue, -/obj/item/pen, -/turf/open/floor/plasteel/vault, -/area/shuttle/escape) -"ehg" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/turf/open/floor/plasteel/vault, -/area/shuttle/escape) -"ehh" = ( -/obj/machinery/computer/atmos_alert{ - dir = 8 - }, -/turf/open/floor/plasteel/darkyellow/side{ - dir = 6 - }, -/area/shuttle/escape) -"ehi" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/vault{ - dir = 4 - }, -/area/shuttle/escape) -"ehj" = ( -/obj/structure/table/reinforced, -/obj/item/folder/red, -/obj/item/restraints/handcuffs, -/obj/item/device/assembly/flash/handheld, -/turf/open/floor/plasteel/vault, -/area/shuttle/escape) -"ehk" = ( -/obj/machinery/computer/crew{ - dir = 1 - }, -/turf/open/floor/plasteel/darkblue/side, -/area/shuttle/escape) -"ehl" = ( -/obj/machinery/computer/med_data{ - dir = 1 - }, -/turf/open/floor/plasteel/darkblue/side{ - dir = 6 - }, -/area/shuttle/escape) -"ehm" = ( -/obj/machinery/computer/emergency_shuttle{ - dir = 1 - }, -/turf/open/floor/plasteel/darkblue/side{ - dir = 10 - }, -/area/shuttle/escape) -"ehn" = ( -/obj/machinery/computer/communications{ - dir = 1 - }, -/turf/open/floor/plasteel/darkblue/side, -/area/shuttle/escape) -"eho" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plasteel/vault, -/area/shuttle/escape) -"ehp" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/turf/open/floor/plasteel/vault{ - dir = 4 - }, -/area/shuttle/escape) "ehq" = ( /obj/structure/cable{ icon_state = "0-2" @@ -104673,148 +100604,20 @@ }, /turf/open/floor/plasteel/dark, /area/library) -"QNf" = ( -/obj/machinery/autolathe, -/obj/machinery/door/window/southleft{ - name = "Research Lab Desk"; - req_access_txt = "7" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab1"; - name = "Research and Development Shutter" - }, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 4 - }, -/area/science/lab) -"QNg" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/plasteel/whitepurple/corner, -/area/science/research) -"QNh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/neutral/side, -/area/maintenance/port) -"QNi" = ( -/turf/closed/wall, -/area/science/circuit) -"QNl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/science/circuit) -"QNm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/science/circuit) -"QNo" = ( -/obj/structure/table/reinforced, -/obj/machinery/camera{ - c_tag = "Science - Experimentation Lab"; - dir = 2; - name = "science camera"; - network = list("SS13","RD") - }, -/obj/machinery/requests_console{ - department = "Circuitry Lab"; - name = "Circuitry Lab RC"; - pixel_y = 32; - receive_ore_updates = 1 - }, -/obj/item/device/integrated_circuit_printer/upgraded, -/turf/open/floor/plasteel/white/side, -/area/science/circuit) -"QNp" = ( -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/turf/open/floor/plasteel/white/side, -/area/science/circuit) -"QNq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"QNt" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/circuit) -"QNu" = ( -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/circuit) -"QNv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/circuit) -"QNz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"QNA" = ( +"eCM" = ( /obj/structure/cable/white{ icon_state = "4-8" }, /turf/open/floor/plasteel/whitepurple/side, /area/science/misc_lab) -"QNC" = ( -/obj/structure/table/reinforced, -/obj/item/device/integrated_electronics/analyzer, -/obj/item/device/integrated_electronics/debugger, -/obj/item/device/integrated_electronics/wirer, -/turf/open/floor/plasteel/white/side{ - dir = 10 +"eMD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "1-2" }, -/area/science/circuit) -"QND" = ( -/turf/open/floor/plasteel/white/side{ - dir = 10 - }, -/area/science/circuit) -"QNE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Science - Lab Access"; - dir = 8; - name = "science camera"; - network = list("SS13","RD") - }, -/obj/structure/sign/departments/science{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"QNF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/table/glass, -/turf/open/floor/plasteel/whitepurple/side{ - dir = 8 - }, -/area/science/misc_lab) -"QNG" = ( +/turf/open/floor/plating, +/area/science/research/abandoned) +"faI" = ( /obj/structure/cable/white{ icon_state = "1-2" }, @@ -104832,39 +100635,175 @@ dir = 4 }, /area/science/misc_lab) -"QNI" = ( +"fGq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/science/circuit) +"fRT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"gmj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/science/circuit) +"gKr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/circuit/green, +/area/science/research/abandoned) +"gNw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/glass, +/turf/open/floor/plasteel/whitepurple/side{ + dir = 8 + }, +/area/science/misc_lab) +"gQS" = ( +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/science/circuit) +"gSi" = ( +/turf/closed/wall/r_wall, +/area/science/misc_lab) +"gUH" = ( +/obj/machinery/light, +/obj/structure/table/reinforced, +/obj/machinery/computer/libraryconsole/bookmanagement, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/science/circuit) +"hic" = ( /obj/structure/table/reinforced, /obj/item/device/integrated_electronics/analyzer, /obj/item/device/integrated_electronics/debugger, /obj/item/device/integrated_electronics/wirer, /turf/open/floor/plasteel/white/side{ - dir = 9 + dir = 10 }, /area/science/circuit) -"QNJ" = ( +"hNZ" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, /turf/open/floor/plasteel/white/side{ dir = 9 }, /area/science/circuit) -"QNK" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/science/circuit) -"QNM" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/science/circuit) -"QNO" = ( -/turf/open/floor/plasteel/white/side{ +"iQh" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/medical/morgue) +"jeu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/science/research/abandoned) +"jjN" = ( +/obj/structure/table/reinforced, +/obj/machinery/camera{ + c_tag = "Science - Experimentation Lab"; + dir = 2; + name = "science camera"; + network = list("SS13","RD") + }, +/obj/machinery/requests_console{ + department = "Circuitry Lab"; + name = "Circuitry Lab RC"; + pixel_y = 32; + receive_ore_updates = 1 + }, +/obj/item/device/integrated_circuit_printer, +/turf/open/floor/plasteel/white/side, /area/science/circuit) -"QNP" = ( +"jBE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/neutral, +/area/medical/morgue) +"kwx" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plasteel/whitepurple/corner, +/area/science/research) +"kyo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/neutral/side{ + dir = 8 + }, +/area/maintenance/port) +"lak" = ( /turf/open/floor/plasteel/white/side{ dir = 10 }, -/area/science/misc_lab) -"QNQ" = ( +/area/science/circuit) +"loI" = ( +/obj/machinery/autolathe, +/obj/machinery/door/window/southleft{ + name = "Research Lab Desk"; + req_access_txt = "7" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rndlab1"; + name = "Research and Development Shutter" + }, +/turf/open/floor/plasteel/whitepurple/side{ + dir = 4 + }, +/area/science/lab) +"lEl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/research/abandoned) +"lEm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/neutral/side, +/area/maintenance/port) +"lKu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"lOY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, @@ -104873,37 +100812,124 @@ dir = 6 }, /area/science/circuit) -"QNS" = ( -/obj/structure/table/reinforced, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/item/device/integrated_circuit_printer/upgraded, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/science/circuit) -"QNT" = ( +"lXM" = ( /obj/structure/target_stake, /turf/open/floor/plasteel/white/side{ dir = 1 }, /area/science/circuit) -"QNU" = ( -/obj/machinery/light, +"mvm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/neutral, +/area/science/research/abandoned) +"mxm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/circuit/green, +/area/science/research/abandoned) +"pmQ" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/obj/item/device/integrated_circuit_printer, /turf/open/floor/plasteel/white/side{ dir = 1 }, /area/science/circuit) -"QNV" = ( +"psi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/medical/morgue) +"ptI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/research/abandoned) +"pQm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/neutral, +/area/science/research/abandoned) +"qhc" = ( +/obj/structure/table/reinforced, +/obj/item/device/integrated_electronics/analyzer, +/obj/item/device/integrated_electronics/debugger, +/obj/item/device/integrated_electronics/wirer, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/science/circuit) +"qpq" = ( +/turf/open/floor/plasteel/white/side{ + dir = 5 + }, +/area/science/circuit) +"rhO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/science/circuit) +"rCv" = ( +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/science/circuit) +"saw" = ( +/turf/closed/wall, +/area/science/circuit) +"tmi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"tCh" = ( +/turf/closed/wall, +/area/science/misc_lab) +"tMk" = ( +/turf/open/floor/plasteel/white/side{ + dir = 10 + }, +/area/science/misc_lab) +"upw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/light, /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel/whitepurple/side, /area/science/misc_lab) -"QNW" = ( +"vqd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/medical/morgue) +"wei" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/science/circuit) +"wAA" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/r_wall, +/area/science/circuit) +"wBO" = ( /obj/structure/cable/white{ icon_state = "1-2" }, @@ -104913,13 +100939,40 @@ }, /turf/open/floor/plasteel/whitepurple/corner, /area/science/misc_lab) -"QNX" = ( -/turf/closed/wall/r_wall, -/area/science/misc_lab) -"QNZ" = ( -/turf/closed/wall, -/area/science/misc_lab) -"QOb" = ( +"xwK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Science - Lab Access"; + dir = 8; + name = "science camera"; + network = list("SS13","RD") + }, +/obj/structure/sign/departments/science{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"xze" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research/abandoned) +"xMn" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel/white/side, +/area/science/circuit) +"yjc" = ( /obj/machinery/power/apc{ areastring = "/area/science/research/abandoned"; dir = 1; @@ -104931,137 +100984,6 @@ }, /turf/open/floor/plating, /area/science/research/abandoned) -"QOc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/science/research/abandoned) -"QOd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/science/research/abandoned) -"QOe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/research/abandoned) -"QOf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/research/abandoned) -"QOg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/neutral/side{ - dir = 8 - }, -/area/maintenance/port) -"QOh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/circuit/green, -/area/science/research/abandoned) -"QOi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/science/research/abandoned) -"QOj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/circuit/green, -/area/science/research/abandoned) -"QOk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/neutral, -/area/science/research/abandoned) -"QOl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/neutral, -/area/science/research/abandoned) -"QOm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"QOn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/medical/morgue) -"QOo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/medical/morgue) -"QOp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/neutral, -/area/medical/morgue) -"QOq" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/medical/morgue) -"QOr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/medical/morgue) (1,1,1) = {" aaa @@ -129644,14 +125566,14 @@ cLs cJT caE caE -QNi -QNi -QNi -QNi -QNi -QNi -QNi -QNi +saw +saw +saw +saw +saw +saw +saw +saw dhQ dhQ dhQ @@ -130159,12 +126081,12 @@ ddP deW cKk dhR -QNo -QNt -QNC -QNI +jjN +hNZ +hic +qhc dpX -QNS +pmQ dhR djs dlf @@ -130417,10 +126339,10 @@ cCM dgm dhR djp -QNu +qpq dmt doh -QNO +rCv drA dhR dum @@ -130671,19 +126593,19 @@ cNd cNd cMY cLO -QNh -QNl +lEm +gmj djq -QNv -QND -QNJ -QNP +rhO +lak +gQS +tMk drB dhR -QOb -QOc -QOh -QOj +yjc +jeu +mxm +gKr dxJ dBV dlg @@ -130931,14 +126853,14 @@ deX dgn dhR djr -QNu +qpq dmv doj -QNQ -QNT +lOY +lXM dhR dun -QOd +lEl dxK dzg dAr @@ -131187,7 +127109,7 @@ cMY deX dgo dhR -QNp +xMn dok dmw dok @@ -131196,8 +127118,8 @@ drC dhR duo dmu -QOi -QOk +eMD +pQm dxM doi dun @@ -131452,9 +127374,9 @@ dqb drD dhR dup -QOe +ptI dxL -QOl +mvm dAs dpY dDi @@ -131704,9 +127626,9 @@ dhR dju dlj dlj -QNK +wei dqc -QNU +gUH dhR duq dlh @@ -131961,12 +127883,12 @@ dhR djv dlj dlj -QNK +wei dqb drE dhR dur -QOf +xze dxN dzj don @@ -132215,9 +128137,9 @@ cMY deX dgo dhR -QNq -QNz -QNE +lKu +tmi +xwK doo dqd drF @@ -132471,11 +128393,11 @@ dce cMY dfa dgp -QNm -QNm +fGq +fGq dll dhR -QNM +wAA dqe dhR dhR @@ -132731,11 +128653,11 @@ dgq dhT djx dlm -QNF +gNw dop dqf drG -QNZ +tCh dhQ dhS dhQ @@ -132987,16 +128909,16 @@ cMY cMY cMY djy -QNA +eCM dmA doq dqg -QNV +upw dtd duu -QOg +kyo djw -QOm +fRT dAu caE aaa @@ -133245,10 +129167,10 @@ cNd cMY djz dln -QNG +faI dor dqh -QNW +wBO dhT duv dwc @@ -133505,8 +129427,8 @@ djA djA dos dqi -QNX -QNX +gSi +gSi djA djA djA @@ -143001,8 +138923,8 @@ cQQ cSw cUl cQP -QNg -QNf +kwx +loI daV dcJ dei @@ -145850,10 +141772,10 @@ dzR dAU dCA dDM -QOp +jBE dGl dHH -QOq +iQh dCy dKZ dMy @@ -146106,7 +142028,7 @@ dym dzS dAV dCB -QOn +vqd dEV dGm dHH @@ -146367,7 +142289,7 @@ dDN dEW dGl dHH -QOr +psi dCy dKX dMA @@ -146620,7 +142542,7 @@ dyo dzU dAX dCB -QOn +vqd dEW dGn dHI diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 56b25bc4ac..a7e14b7ba4 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -77254,8 +77254,8 @@ /area/maintenance/aft) "gRS" = ( /obj/structure/table/reinforced, -/obj/item/device/integrated_circuit_printer/upgraded, /obj/item/device/integrated_electronics/analyzer, +/obj/item/device/integrated_circuit_printer, /turf/open/floor/plasteel/white, /area/science/circuit) "hfJ" = ( @@ -77359,7 +77359,7 @@ /area/science/circuit) "llb" = ( /obj/structure/table/reinforced, -/obj/item/device/integrated_circuit_printer/upgraded, +/obj/item/device/integrated_circuit_printer, /turf/open/floor/plasteel/white, /area/science/circuit) "lsv" = ( diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index f17744faae..61223047eb 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "circuit_printer" w_class = WEIGHT_CLASS_BULKY - var/upgraded = TRUE // When hit with an upgrade disk, will turn true, allowing it to print the higher tier circuits. + var/upgraded = FALSE // When hit with an upgrade disk, will turn true, allowing it to print the higher tier circuits. var/can_clone = FALSE // Same for above, but will allow the printer to duplicate a specific assembly. var/current_category = null var/list/program // Currently loaded save, in form of list @@ -136,6 +136,9 @@ if(!CONFIG_GET(flag/ic_printing)) to_chat(usr, "CentCom has disabled printing of custom circuitry due to recent allegations of copyright infringement.") return + if(!can_clone) // Copying and printing ICs is cloning + to_chat(usr, "This printer does not have the cloning upgrade.") + return switch(href_list["print"]) if("load") var/input = input("Put your code there:", "loading", null, null) as message | null From 0a4608e81c4ace25070e50283ace178b973fff16 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 21:09:54 -0600 Subject: [PATCH 100/108] Automatic changelog generation for PR #5473 [ci skip] --- html/changelogs/AutoChangeLog-pr-5473.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5473.yml diff --git a/html/changelogs/AutoChangeLog-pr-5473.yml b/html/changelogs/AutoChangeLog-pr-5473.yml new file mode 100644 index 0000000000..e702a232cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5473.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "Chasms no longer eat shuttle docking ports, rendering them unusable and unresponsive" From e526719a9e83a85c9a6feeaaf28c71b7246c01f4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 22:10:35 -0600 Subject: [PATCH 101/108] Automatic changelog generation for PR #5477 [ci skip] --- html/changelogs/AutoChangeLog-pr-5477.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5477.yml diff --git a/html/changelogs/AutoChangeLog-pr-5477.yml b/html/changelogs/AutoChangeLog-pr-5477.yml new file mode 100644 index 0000000000..ecafe93d22 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5477.yml @@ -0,0 +1,5 @@ +author: "Dax Dupont" +delete-after: True +changes: + - bugfix: "Integrated circuits no longer start upgraded." + - balance: "The IC printers that are available on round start in the IC labs are no longer upgraded by default. You will need to research these as was intended" From 5d18ffef44319edb0ade2e49e12405e302c241db Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 13 Feb 2018 22:11:48 -0600 Subject: [PATCH 102/108] Automatic changelog generation for PR #5451 [ci skip] --- html/changelogs/AutoChangeLog-pr-5451.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5451.yml diff --git a/html/changelogs/AutoChangeLog-pr-5451.yml b/html/changelogs/AutoChangeLog-pr-5451.yml new file mode 100644 index 0000000000..05ec2a27e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5451.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - code_imp: "Synced with upstream. Again. For the hundredth time probably. Check the github for more details." From 9b4770f855c002a0d3f9bfeb6968d1f2a57fb4aa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Feb 2018 05:36:15 -0600 Subject: [PATCH 103/108] [MIRROR] Mining tools now use tool system (#5462) * Mining tools now use tool system * Update hydroponics.dm --- code/__DEFINES/tools.dm | 2 ++ code/datums/components/archaeology.dm | 24 ++++++-------- code/game/gamemodes/meteor/meteors.dm | 4 +-- code/game/objects/structures/mineral_doors.dm | 7 ++-- code/game/turfs/simulated/minerals.dm | 20 ++++++------ code/modules/hydroponics/hydroponics.dm | 28 ++++++++-------- code/modules/mining/equipment/mining_tools.dm | 32 +++++++++---------- code/modules/mining/ores_coins.dm | 2 +- 8 files changed, 56 insertions(+), 63 deletions(-) diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index b332766517..202008a212 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -5,6 +5,8 @@ #define TOOL_WIRECUTTER "wirecutter" #define TOOL_WRENCH "wrench" #define TOOL_WELDER "welder" +#define TOOL_MINING "mining" +#define TOOL_SHOVEL "shovel" // If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm index 30bf107ad0..5b5d52b0b4 100644 --- a/code/datums/components/archaeology.dm +++ b/code/datums/components/archaeology.dm @@ -19,28 +19,22 @@ for(var/I in other_archdrops) _archdrops[I] += other_archdrops[I] -/datum/component/archaeology/proc/Dig(obj/item/W, mob/living/user) +/datum/component/archaeology/proc/Dig(obj/item/I, mob/living/user) if(dug) to_chat(user, "Looks like someone has dug here already.") return - - var/digging_speed - if (istype(W, /obj/item/shovel)) - var/obj/item/shovel/S = W - digging_speed = S.digspeed - else if (istype(W, /obj/item/pickaxe)) - var/obj/item/pickaxe/P = W - digging_speed = P.digspeed - - if (digging_speed && isturf(user.loc)) - to_chat(user, "You start digging...") - playsound(parent, 'sound/effects/shovel_dig.ogg', 50, 1) - if(do_after(user, digging_speed, target = parent)) + if(!isturf(user.loc)) + return + + if(I.tool_behaviour == TOOL_SHOVEL || I.tool_behaviour == TOOL_MINING) + to_chat(user, "You start digging...") + + if(I.use_tool(parent, user, 40, volume=50)) to_chat(user, "You dig a hole.") gets_dug() dug = TRUE - SSblackbox.record_feedback("tally", "pick_used_mining", 1, W.type) + SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type) return COMPONENT_NO_AFTERATTACK /datum/component/archaeology/proc/gets_dug() diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 8d83c646c2..c717b815e9 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -173,8 +173,8 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event #undef METEOR_MEDAL -/obj/effect/meteor/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/pickaxe)) +/obj/effect/meteor/attackby(obj/item/I, mob/user, params) + if(I.tool_behaviour == TOOL_MINING) make_debris() qdel(src) else diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 259c72647d..35d1008474 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -124,11 +124,10 @@ else icon_state = initial_state -/obj/structure/mineral_door/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/pickaxe)) - var/obj/item/pickaxe/digTool = W +/obj/structure/mineral_door/attackby(obj/item/I, mob/user, params) + if(I.tool_behaviour == TOOL_MINING) to_chat(user, "You start digging the [name]...") - if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src) + if(I.use_tool(src, user, 40, volume=50)) to_chat(user, "You finish digging.") deconstruct(TRUE) else if(user.a_intent != INTENT_HARM) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 6e3c1d66f3..b9d9202190 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -46,26 +46,26 @@ return ..() -/turf/closed/mineral/attackby(obj/item/pickaxe/P, mob/user, params) +/turf/closed/mineral/attackby(obj/item/I, mob/user, params) if (!user.IsAdvancedToolUser()) to_chat(usr, "You don't have the dexterity to do this!") return - if (istype(P, /obj/item/pickaxe)) + if(I.tool_behaviour == TOOL_MINING) var/turf/T = user.loc if (!isturf(T)) return - if(last_act+P.digspeed > world.time)//prevents message spam + if(last_act + (40 * I.toolspeed) > world.time)//prevents message spam return last_act = world.time to_chat(user, "You start picking...") - if(do_after(user,P.digspeed, target = src)) + if(I.use_tool(src, user, 40, volume=50)) if(ismineralturf(src)) to_chat(user, "You finish cutting into the rock.") gets_drilled(user) - SSblackbox.record_feedback("tally", "pick_used_mining", 1, P.type) + SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type) else return attack_hand(user) @@ -90,7 +90,7 @@ /turf/closed/mineral/attack_alien(mob/living/carbon/alien/M) to_chat(M, "You start digging into the rock...") playsound(src, 'sound/effects/break_stone.ogg', 50, 1) - if(do_after(M,40, target = src)) + if(do_after(M, 40, target = src)) to_chat(M, "You tunnel into the rock.") gets_drilled(M) @@ -98,14 +98,14 @@ ..() if(ishuman(AM)) var/mob/living/carbon/human/H = AM - var/obj/item/I = H.is_holding_item_of_type(/obj/item/pickaxe) + var/obj/item/I = H.is_holding_tool_quality(TOOL_MINING) if(I) - attackby(I,H) + attackby(I, H) return else if(iscyborg(AM)) var/mob/living/silicon/robot/R = AM - if(istype(R.module_active, /obj/item/pickaxe)) - attackby(R.module_active,R) + if(R.module_active && R.module_active.tool_behaviour == TOOL_MINING) + attackby(R.module_active, R) return else return diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 5277a25991..2bcf03c595 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -829,21 +829,19 @@ if(!myseed && !weedlevel) to_chat(user, "[src] doesn't have any plants or weeds!") return - user.visible_message("[user] starts digging out [src]'s plants...", "You start digging out [src]'s plants...") - O.play_tool_sound(src) - if(!do_after(user, 50, target = src) || (!myseed && !weedlevel)) - return - user.visible_message("[user] digs out the plants in [src]!", "You dig out all of [src]'s plants!") - O.play_tool_sound(src) - if(myseed) //Could be that they're just using it as a de-weeder - age = 0 - plant_health = 0 - if(harvest) - harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it - qdel(myseed) - myseed = null - weedlevel = 0 //Has a side effect of cleaning up those nasty weeds - update_icon() + user.visible_message("[user] starts digging out [src]'s plants...", + "You start digging out [src]'s plants...") + if(O.use_tool(src, user, 50, volume=50) || (!myseed && !weedlevel)) + user.visible_message("[user] digs out the plants in [src]!", "You dig out all of [src]'s plants!") + if(myseed) //Could be that they're just using it as a de-weeder + age = 0 + plant_health = 0 + if(harvest) + harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it + qdel(myseed) + myseed = null + weedlevel = 0 //Has a side effect of cleaning up those nasty weeds + update_icon() else return ..() diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 1038d8c267..581c47b83f 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -12,16 +12,16 @@ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' w_class = WEIGHT_CLASS_BULKY materials = list(MAT_METAL=2000) //one sheet, but where can you make them? - var/digspeed = 40 + tool_behaviour = TOOL_MINING + toolspeed = 1 usesound = list('sound/effects/picaxe1.ogg', 'sound/effects/picaxe2.ogg', 'sound/effects/picaxe3.ogg') attack_verb = list("hit", "pierced", "sliced", "attacked") /obj/item/pickaxe/suicide_act(mob/living/user) user.visible_message("[user] begins digging into their chest! It looks like [user.p_theyre()] trying to commit suicide!") - if(do_after(user,30, target = user)) - play_tool_sound(user) + if(use_tool(user, user, 30, volume=50)) return BRUTELOSS - user.visible_message("[user] couldn't do it!") + user.visible_message("[user] couldn't do it!") return SHAME /obj/item/pickaxe/mini @@ -38,7 +38,7 @@ name = "silver-plated pickaxe" icon_state = "spickaxe" item_state = "spickaxe" - digspeed = 20 //mines faster than a normal pickaxe, bought from mining vendor + toolspeed = 0.5 //mines faster than a normal pickaxe, bought from mining vendor desc = "A silver-plated pickaxe that mines slightly faster than standard-issue." force = 17 @@ -46,7 +46,7 @@ name = "diamond-tipped pickaxe" icon_state = "dpickaxe" item_state = "dpickaxe" - digspeed = 14 + toolspeed = 0.3 desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt." force = 19 @@ -55,7 +55,7 @@ icon_state = "handdrill" item_state = "jackhammer" slot_flags = SLOT_BELT - digspeed = 25 //available from roundstart, faster than a pickaxe. + toolspeed = 0.6 //available from roundstart, faster than a pickaxe. usesound = 'sound/weapons/drill.ogg' hitsound = 'sound/weapons/drill.ogg' desc = "An electric mining drill for the especially scrawny." @@ -68,19 +68,19 @@ /obj/item/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" icon_state = "diamonddrill" - digspeed = 7 + toolspeed = 0.2 desc = "Yours is the drill that will pierce the heavens!" /obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version! name = "diamond-tipped cyborg mining drill" //To inherit the NODROP_1 flag, and easier to change borg specific drill mechanics. icon_state = "diamonddrill" - digspeed = 7 + toolspeed = 0.2 /obj/item/pickaxe/drill/jackhammer name = "sonic jackhammer" icon_state = "jackhammer" item_state = "jackhammer" - digspeed = 5 //the epitome of powertools. extremely fast mining, laughs at puny walls + toolspeed = 0.1 //the epitome of powertools. extremely fast mining, laughs at puny walls usesound = 'sound/weapons/sonic_jackhammer.ogg' hitsound = 'sound/weapons/sonic_jackhammer.ogg' desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls." @@ -95,7 +95,8 @@ flags_1 = CONDUCT_1 slot_flags = SLOT_BELT force = 8 - var/digspeed = 20 + tool_behaviour = TOOL_SHOVEL + toolspeed = 1 usesound = 'sound/effects/shovel_dig.ogg' throwforce = 4 item_state = "shovel" @@ -103,13 +104,12 @@ materials = list(MAT_METAL=50) attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") sharpness = IS_SHARP - + /obj/item/shovel/suicide_act(mob/living/user) user.visible_message("[user] begins digging their own grave! It looks like [user.p_theyre()] trying to commit suicide!") - if(do_after(user,30, target = user)) - play_tool_sound(user) + if(use_tool(user, user, 30, volume=50)) return BRUTELOSS - user.visible_message("[user] couldn't do it!") + user.visible_message("[user] couldn't do it!") return SHAME /obj/item/shovel/spade @@ -121,4 +121,4 @@ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' force = 5 throwforce = 7 - w_class = WEIGHT_CLASS_SMALL + w_class = WEIGHT_CLASS_SMALL \ No newline at end of file diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 56020b5407..5ce6abc73d 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -198,7 +198,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ wires.interact(user) return - if(istype(I, /obj/item/pickaxe) || istype(I, /obj/item/resonator) || I.force >= 10) + if(I.tool_behaviour == TOOL_MINING || istype(I, /obj/item/resonator) || I.force >= 10) GibtoniteReaction(user) return if(primed) From 1309f0a22fa81bb31fabb0b0def6f8dc12a28e41 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 14 Feb 2018 08:19:45 -0800 Subject: [PATCH 104/108] Disables emagging Centcom Ferry (#35579) --- code/modules/shuttle/ferry.dm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index 07103088d1..c44cf69f95 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -6,14 +6,17 @@ possible_destinations = "ferry_home;ferry_away" req_access = list(ACCESS_CENT_GENERAL) - var/aiControlDisabled = 1 + var/aiControlDisabled = TRUE + var/allow_emag = FALSE -/obj/machinery/computer/shuttle/ferry/proc/canAIControl(mob/user) - return ((aiControlDisabled != 1)); +/obj/machinery/computer/shuttle/ferry/emag_act(mob/user) + if(!allow_emag) + to_chat(user, "[src]'s security firewall is far too powerful for you to bypass.") + return FALSE + return ..() -/obj/machinery/computer/shuttle/ferry/attack_ai(mob/user) - if(!src.canAIControl(user)) - return +/obj/machinery/computer/shuttle/ferry/attack_ai() + return aiControlDisabled? FALSE : ..() /obj/machinery/computer/shuttle/ferry/request name = "ferry console" From e0ab14134171f2d4861d256a42ac8a845eaf6eeb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Feb 2018 10:54:58 -0600 Subject: [PATCH 106/108] [MIRROR] Updates die to use the roll() proc + initialize() (#5480) * Merge pull request #35564 from praisenarsie/patch-29 Updates die to use the roll() proc + initialize() * Updates die to use the roll() proc + initialize() --- code/game/objects/items/dice.dm | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index e14363a1c1..0ea5fe1b03 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -4,8 +4,8 @@ icon = 'icons/obj/dice.dmi' icon_state = "dicebag" -/obj/item/storage/pill_bottle/dice/New() - ..() +/obj/item/storage/pill_bottle/dice/Initialize() + . = ..() var/special_die = pick("1","2","fudge","space","00","8bd20","4dd6","100") if(special_die == "1") new /obj/item/dice/d1(src) @@ -46,10 +46,10 @@ var/can_be_rigged = TRUE var/rigged = FALSE -/obj/item/dice/New() - result = rand(1, sides) +/obj/item/dice/Initialize() + . = ..() + result = roll(sides) update_icon() - ..() /obj/item/dice/suicide_act(mob/user) user.visible_message("[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!") @@ -85,8 +85,8 @@ desc = "A die with six sides. 6 TIMES 255 TIMES 255 TILE TOTAL EXISTENCE, SQUARE YOUR MIND OF EDUCATED STUPID: 2 DOES NOT EXIST." icon_state = "spaced6" -/obj/item/dice/d6/space/New() - ..() +/obj/item/dice/d6/space/Initialize() + . = ..() if(prob(10)) name = "spess cube" @@ -131,6 +131,7 @@ name = "d100" desc = "A die with one hundred sides! Probably not fairly weighted..." icon_state = "d100" + w_class = WEIGHT_CLASS_SMALL sides = 100 /obj/item/dice/d100/update_icon() @@ -164,14 +165,14 @@ . = ..() /obj/item/dice/proc/diceroll(mob/user) - result = rand(1, sides) + result = roll(sides) if(rigged && result != rigged) if(prob(CLAMP(1/(sides - 1) * 100, 25, 80))) result = rigged - var/fake_result = rand(1, sides)//Daredevil isn't as good as he used to be + var/fake_result = roll(sides)//Daredevil isn't as good as he used to be var/comment = "" if(sides == 20 && result == 20) - comment = "Nat 20!" + comment = "NAT 20!" else if(sides == 20 && result == 1) comment = "Ouch, bad luck." update_icon() From 283a0418a3d55cc736ff0625b05ca2120f7b1e13 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Feb 2018 10:55:47 -0600 Subject: [PATCH 107/108] [MIRROR] Makes the kinetic crusher's damage on examine a little more accurate (#5481) * Merge pull request #35617 from ChangelingRain/crusherdescfix Makes the kinetic crusher's damage on examine a little more accurate * Makes the kinetic crusher's damage on examine a little more accurate --- .../mining/equipment/kinetic_crusher.dm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index b455e55db9..95f979dc3b 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -25,6 +25,8 @@ var/list/trophies = list() var/charged = TRUE var/charge_time = 15 + var/detonation_damage = 50 + var/backstab_bonus = 30 /obj/item/twohanded/required/kinetic_crusher/Destroy() QDEL_LIST(trophies) @@ -32,8 +34,8 @@ /obj/item/twohanded/required/kinetic_crusher/examine(mob/living/user) ..() - to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do 50 damage.") - to_chat(user, "Does 80 damage if the target is backstabbed, instead of 50.") + to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage.") + to_chat(user, "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") for(var/t in trophies) var/obj/item/crusher_trophy/T = t to_chat(user, "It has \a [T] attached, which causes [T.effect_desc()].") @@ -101,13 +103,13 @@ var/def_check = L.getarmor(type = "bomb") if((user.dir & backstab_dir) && (L.dir & backstab_dir)) if(!QDELETED(C)) - C.total_damage += 80 //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item - L.apply_damage(80, BRUTE, blocked = def_check) + C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item + L.apply_damage(detonation_damage + backstab_bonus, BRUTE, blocked = def_check) playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong else if(!QDELETED(C)) - C.total_damage += 50 - L.apply_damage(50, BRUTE, blocked = def_check) + C.total_damage += detonation_damage + L.apply_damage(detonation_damage, BRUTE, blocked = def_check) /obj/item/twohanded/required/kinetic_crusher/proc/Recharge() if(!charged) @@ -323,7 +325,7 @@ var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) /obj/item/crusher_trophy/demon_claws/effect_desc() - return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1]; this effect is increased by 500% during mark detonation" + return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1], with 5X effect on mark detonation" /obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user) . = ..() @@ -331,6 +333,7 @@ H.force += bonus_value * 0.2 H.force_unwielded += bonus_value * 0.2 H.force_wielded += bonus_value * 0.2 + H.detonation_damage += bonus_value * 0.8 /obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user) . = ..() @@ -338,12 +341,12 @@ H.force -= bonus_value * 0.2 H.force_unwielded -= bonus_value * 0.2 H.force_wielded -= bonus_value * 0.2 + H.detonation_damage -= bonus_value * 0.8 /obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user) user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order) /obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user) - target.adjustBruteLoss(bonus_value * 0.8) user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order) //colossus From 44d275992146fcf20d135c43202acf6dc566e09d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Feb 2018 10:56:19 -0600 Subject: [PATCH 108/108] [MIRROR] Fixes near_camera runtime (#5482) * Merge pull request #35624 from ShizCalev/near_camera-runtime-fix Fixes near_camera runtime * Fixes near_camera runtime --- code/game/machinery/camera/tracking.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index db8479a413..4386c73ef6 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -118,14 +118,14 @@ /proc/near_camera(mob/living/M) if (!isturf(M.loc)) - return 0 + return FALSE if(issilicon(M)) var/mob/living/silicon/S = M - if((!QDELETED(S.builtInCamera) || !S.builtInCamera.can_use()) && !GLOB.cameranet.checkCameraVis(M)) - return 0 + if((QDELETED(S.builtInCamera) || !S.builtInCamera.can_use()) && !GLOB.cameranet.checkCameraVis(M)) + return FALSE else if(!GLOB.cameranet.checkCameraVis(M)) - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) if (!istype(user))