From d2e66e641059dd921af6b920b989d2b0096c65a8 Mon Sep 17 00:00:00 2001 From: CHOMPStation2 <58959929+CHOMPStation2@users.noreply.github.com> Date: Wed, 4 Oct 2023 15:37:41 -0700 Subject: [PATCH] [MIRROR] Refactors tool typechecks, refactors transforming tools, makes Altevian wrench into one (#7062) Co-authored-by: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Co-authored-by: Nadyr <41974248+Darlantanis@users.noreply.github.com> --- .../components/binary_devices/circulator.dm | 2 +- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pipeturbine.dm | 4 +- .../components/binary_devices/pump.dm | 2 +- .../components/omni_devices/omni_base.dm | 2 +- .../components/portables_connector.dm | 2 +- .../trinary_devices/trinary_base.dm | 2 +- code/ATMOSPHERICS/components/tvalve.dm | 2 +- .../components/unary/heat_exchanger.dm | 2 +- .../components/unary/outlet_injector.dm | 2 +- .../components/unary/vent_pump.dm | 6 +- .../components/unary/vent_scrubber.dm | 2 +- code/ATMOSPHERICS/components/valve.dm | 2 +- code/ATMOSPHERICS/pipes/pipe_base.dm | 2 +- code/__defines/misc.dm | 1 + code/_helpers/unsorted.dm | 10 +- .../components/crafting/tool_quality.dm | 4 + .../helper_datums/construction_datum.dm | 33 ++-- code/datums/wires/wires.dm | 8 +- code/game/machinery/CableLayer.dm | 2 +- code/game/machinery/airconditioner_vr.dm | 6 +- code/game/machinery/atm_ret_field.dm | 12 +- code/game/machinery/atmoalter/canister.dm | 6 +- code/game/machinery/atmoalter/meter.dm | 2 +- .../atmoalter/portable_atmospherics.dm | 4 +- code/game/machinery/atmoalter/pump_vr.dm | 6 +- code/game/machinery/atmoalter/scrubber.dm | 10 +- code/game/machinery/autolathe.dm | 2 +- code/game/machinery/camera/camera.dm | 7 +- code/game/machinery/camera/camera_assembly.dm | 15 +- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/clawmachine.dm | 2 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/ai_core.dm | 24 +-- code/game/machinery/computer/aifixer.dm | 8 +- .../game/machinery/computer/buildandrepair.dm | 20 +- code/game/machinery/computer/message.dm | 18 +- code/game/machinery/computer/pod.dm | 2 +- code/game/machinery/constructable_frame.dm | 8 +- code/game/machinery/deployable.dm | 2 +- code/game/machinery/doorbell_vr.dm | 2 +- code/game/machinery/doors/airlock.dm | 10 +- code/game/machinery/doors/door.dm | 6 +- code/game/machinery/doors/door_vr.dm | 6 +- code/game/machinery/doors/firedoor.dm | 16 +- .../game/machinery/doors/firedoor_assembly.dm | 8 +- code/game/machinery/doors/windowdoor.dm | 6 +- code/game/machinery/exonet_node.dm | 4 +- code/game/machinery/flasher.dm | 6 +- code/game/machinery/floodlight.dm | 4 +- code/game/machinery/floor_light.dm | 6 +- code/game/machinery/floorlayer.dm | 6 +- code/game/machinery/frame.dm | 12 +- code/game/machinery/holoposter.dm | 2 +- code/game/machinery/igniter.dm | 2 +- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/jukebox.dm | 6 +- code/game/machinery/machinery.dm | 12 +- code/game/machinery/navbeacon.dm | 2 +- code/game/machinery/nuclear_bomb.dm | 20 +- code/game/machinery/oxygen_pump.dm | 2 +- code/game/machinery/pda_multicaster.dm | 4 +- code/game/machinery/pipe/construction.dm | 4 +- code/game/machinery/pipe/pipe_dispenser.dm | 6 +- code/game/machinery/pipe/pipelayer.dm | 4 +- code/game/machinery/pointdefense.dm | 4 +- code/game/machinery/portable_turret.dm | 28 +-- code/game/machinery/recharger.dm | 2 +- code/game/machinery/spaceheater.dm | 4 +- .../machinery/suit_storage/suit_cycler.dm | 4 +- .../machinery/suit_storage/suit_storage.dm | 2 +- code/game/machinery/supplybeacon.dm | 2 +- code/game/machinery/syndicatebeacon.dm | 2 +- code/game/machinery/wall_frames.dm | 2 +- code/game/machinery/washing_machine.dm | 2 +- code/game/mecha/mecha.dm | 10 +- code/game/mecha/mecha_construction_paths.dm | 72 +++---- code/game/mecha/mecha_wreckage.dm | 8 +- .../micro/mecha_construction_paths_vr.dm | 18 +- code/game/objects/effects/alien/aliens.dm | 4 +- .../game/objects/effects/decals/contraband.dm | 2 +- .../objects/effects/decals/posters/posters.dm | 2 +- code/game/objects/effects/mines.dm | 6 +- code/game/objects/effects/spiders.dm | 4 +- code/game/objects/items.dm | 3 + code/game/objects/items/bells.dm | 2 +- code/game/objects/items/bodybag.dm | 4 +- code/game/objects/items/devices/defib.dm | 2 +- code/game/objects/items/devices/flash.dm | 2 +- code/game/objects/items/devices/hacktool.dm | 6 +- .../objects/items/devices/laserpointer.dm | 2 +- code/game/objects/items/devices/multitool.dm | 3 - .../devices/personal_shield_generator_vr.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 +- .../objects/items/devices/radio/headset.dm | 4 +- .../objects/items/devices/radio/intercom.dm | 6 +- .../game/objects/items/devices/radio/radio.dm | 6 +- code/game/objects/items/devices/spy_bug.dm | 2 +- .../objects/items/devices/suit_cooling.dm | 4 +- .../objects/items/devices/taperecorder.dm | 2 +- code/game/objects/items/shooting_range.dm | 4 +- .../objects/items/stacks/tiles/tile_types.dm | 4 +- code/game/objects/items/uav.dm | 2 +- code/game/objects/items/weapons/RMS_vr.dm | 2 +- code/game/objects/items/weapons/candle.dm | 4 +- .../circuitboards/computer/research.dm | 2 +- .../circuitboards/machinery/research.dm | 2 +- code/game/objects/items/weapons/explosives.dm | 4 +- .../objects/items/weapons/flamethrower.dm | 4 +- .../objects/items/weapons/gift_wrappaper.dm | 4 +- .../items/weapons/grenades/chem_grenade.dm | 2 +- .../objects/items/weapons/grenades/grenade.dm | 2 +- .../items/weapons/implants/implantcircuits.dm | 2 +- .../items/weapons/improvised_components.dm | 2 +- code/game/objects/items/weapons/inducer_vr.dm | 2 +- .../items/weapons/material/gravemarker.dm | 4 +- .../items/weapons/material/material_armor.dm | 8 +- .../objects/items/weapons/material/shards.dm | 4 +- .../objects/items/weapons/melee/energy.dm | 2 +- .../objects/items/weapons/melee/misc_vr.dm | 20 +- .../objects/items/weapons/storage/belt.dm | 4 +- .../objects/items/weapons/storage/secure.dm | 2 +- .../objects/items/weapons/storage/toolbox.dm | 4 +- .../items/weapons/storage/uplink_kits.dm | 1 - .../objects/items/weapons/storage/wallets.dm | 1 - code/game/objects/items/weapons/syndie.dm | 2 +- .../game/objects/items/weapons/tanks/tanks.dm | 4 +- .../objects/items/weapons/tools/crowbar.dm | 56 +++--- .../objects/items/weapons/tools/crowbar_vr.dm | 31 --- .../items/weapons/tools/screwdriver.dm | 38 +--- .../items/weapons/tools/transforming.dm | 182 ++++++++++++++++++ .../items/weapons/tools/weldingtool.dm | 22 +++ .../items/weapons/tools/wirecutters.dm | 33 +--- .../objects/items/weapons/tools/wrench.dm | 31 +-- code/game/objects/items/weapons/traps.dm | 2 +- code/game/objects/random/misc.dm | 8 +- code/game/objects/structures/artstuff.dm | 2 +- code/game/objects/structures/catwalk.dm | 6 +- .../structures/crates_lockers/__closets.dm | 10 +- .../crates_lockers/closets/egg_vr.dm | 2 +- .../closets/secure/secure_closets.dm | 4 +- .../structures/crates_lockers/crates.dm | 4 +- .../structures/crates_lockers/largecrate.dm | 4 +- .../crates_lockers/largecrate_vr.dm | 2 +- .../structures/crates_lockers/vehiclecage.dm | 4 +- code/game/objects/structures/curtains.dm | 2 +- code/game/objects/structures/dancepole_vr.dm | 4 +- code/game/objects/structures/door_assembly.dm | 12 +- code/game/objects/structures/droppod.dm | 14 +- code/game/objects/structures/electricchair.dm | 2 +- code/game/objects/structures/extinguisher.dm | 2 +- code/game/objects/structures/fence.dm | 2 +- code/game/objects/structures/fitness.dm | 2 +- code/game/objects/structures/girders.dm | 10 +- code/game/objects/structures/gravemarker.dm | 4 +- code/game/objects/structures/grille.dm | 4 +- code/game/objects/structures/janicart.dm | 2 +- code/game/objects/structures/lattice.dm | 8 +- code/game/objects/structures/low_wall.dm | 2 +- .../objects/structures/medical_stand_vr.dm | 2 +- code/game/objects/structures/mirror.dm | 4 +- code/game/objects/structures/plasticflaps.dm | 2 +- code/game/objects/structures/railing.dm | 8 +- code/game/objects/structures/salvageable.dm | 2 +- code/game/objects/structures/signs.dm | 4 +- code/game/objects/structures/simple_doors.dm | 4 +- .../structures/stool_bed_chair_nest/bed.dm | 8 +- .../structures/stool_bed_chair_nest/chairs.dm | 4 +- .../structures/stool_bed_chair_nest/stools.dm | 4 +- .../stool_bed_chair_nest/wheelchair.dm | 2 +- .../game/objects/structures/tank_dispenser.dm | 2 +- code/game/objects/structures/watercloset.dm | 4 +- .../objects/structures/windoor_assembly.dm | 14 +- code/game/objects/structures/window.dm | 10 +- code/game/turfs/simulated/floor_attackby.dm | 14 +- code/game/turfs/simulated/wall_attacks.dm | 40 ++-- code/modules/assembly/assembly.dm | 2 +- code/modules/assembly/holder.dm | 2 +- code/modules/assembly/shock_kit.dm | 4 +- code/modules/casino/slots.dm | 4 +- code/modules/clothing/clothing.dm | 2 +- code/modules/clothing/gloves/boxing.dm | 2 +- code/modules/clothing/masks/hailer.dm | 6 +- code/modules/clothing/spacesuits/breaches.dm | 4 +- .../clothing/spacesuits/rig/rig_attackby.dm | 10 +- .../clothing/spacesuits/void/ert_vr.dm | 2 +- code/modules/clothing/spacesuits/void/void.dm | 2 +- .../clothing/spacesuits/void/void_vr.dm | 4 +- code/modules/economy/cash_register.dm | 2 +- code/modules/economy/coins.dm | 2 +- code/modules/economy/vending.dm | 6 +- code/modules/fishing/fishing_rod.dm | 2 +- .../kitchen/cooking_machines/_appliance.dm | 4 +- .../food/kitchen/cooking_machines/oven.dm | 2 +- code/modules/food/kitchen/microwave.dm | 8 +- .../food/kitchen/smartfridge/smartfridge.dm | 4 +- code/modules/games/dice.dm | 2 +- code/modules/holodeck/HolodeckObjects.dm | 10 +- .../modules/hydroponics/beekeeping/beehive.dm | 6 +- code/modules/hydroponics/seed_machines.dm | 2 +- code/modules/hydroponics/seed_storage.dm | 8 +- .../hydroponics/spreading/spreading.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 4 +- .../integrated_electronics/core/assemblies.dm | 8 +- .../core/assemblies/device.dm | 2 +- .../integrated_electronics/core/tools.dm | 1 - code/modules/library/lib_items.dm | 6 +- code/modules/materials/sheets/metals/rods.dm | 4 +- code/modules/mining/drilling/drill.dm | 2 +- code/modules/mining/shelter_atoms_vr.dm | 4 +- code/modules/mob/living/bot/SLed209bot.dm | 6 +- code/modules/mob/living/bot/bot.dm | 6 +- code/modules/mob/living/bot/ed209bot.dm | 6 +- code/modules/mob/living/bot/edCLNbot.dm | 6 +- code/modules/mob/living/bot/secbot.dm | 4 +- .../species/station/traits_vr/weaver_objs.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 2 +- .../mob/living/silicon/robot/drone/drone.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 22 +-- .../subtypes/humanoid/mercs/mercs_altevian.dm | 2 +- .../computers/modular_computer/interaction.dm | 8 +- .../computers/subtypes/dev_telescreen.dm | 2 +- code/modules/multiz/ladder_assembly_vr.dm | 6 +- code/modules/nifsoft/nif.dm | 4 +- .../organs/internal/augment/armmounted.dm | 6 +- code/modules/organs/organ.dm | 2 +- code/modules/overmap/disperser/disperser.dm | 2 +- code/modules/overmap/overmap_shuttle.dm | 4 +- .../overmap/ships/computers/sensors.dm | 4 +- code/modules/paperwork/faxmachine.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 4 +- code/modules/paperwork/papershredder.dm | 2 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/persistence/graffiti.dm | 4 +- code/modules/persistence/noticeboard.dm | 8 +- code/modules/power/antimatter/control.dm | 2 +- code/modules/power/apc.dm | 14 +- code/modules/power/batteryrack_vr.dm | 2 +- code/modules/power/cable.dm | 2 +- code/modules/power/cable_ender.dm | 2 +- code/modules/power/cable_heavyduty.dm | 2 +- .../fusion/fuel_assembly/fuel_injector.dm | 2 +- code/modules/power/generator.dm | 2 +- code/modules/power/gravitygenerator_vr.dm | 12 +- code/modules/power/grid_checker.dm | 6 +- code/modules/power/lighting.dm | 12 +- code/modules/power/lightswitch_vr.dm | 8 +- code/modules/power/pacman2.dm | 6 +- code/modules/power/port_gen.dm | 2 +- code/modules/power/singularity/collector.dm | 4 +- code/modules/power/singularity/emitter.dm | 6 +- .../power/singularity/field_generator.dm | 6 +- code/modules/power/singularity/generator.dm | 4 +- .../particle_accelerator.dm | 24 +-- .../particle_accelerator/particle_smasher.dm | 2 +- code/modules/power/smes.dm | 6 +- code/modules/power/smes_construction.dm | 2 +- code/modules/power/smes_vr.dm | 2 +- code/modules/power/solar.dm | 12 +- .../modules/power/tesla/telsa_construction.dm | 2 +- code/modules/power/tracker.dm | 2 +- code/modules/projectiles/ammunition.dm | 2 +- .../projectiles/ammunition/smartmag.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- .../projectiles/guns/energy/bsharpoon_vr.dm | 2 +- .../projectiles/guns/energy/special.dm | 2 +- .../projectiles/guns/launcher/crossbow.dm | 8 +- .../projectiles/guns/launcher/pneumatic.dm | 6 +- .../modules/projectiles/guns/magnetic/bore.dm | 2 +- .../projectiles/guns/magnetic/magnetic.dm | 2 +- .../guns/magnetic/magnetic_construction.dm | 6 +- code/modules/projectiles/guns/modular_guns.dm | 4 +- code/modules/reagents/hoses/connector.dm | 2 +- .../machinery/dispenser/dispenser2.dm | 6 +- .../machinery/dispenser/reagent_tank.dm | 9 +- code/modules/reagents/machinery/pump.dm | 12 +- .../reagents/reagent_containers/glass.dm | 2 +- code/modules/recycling/conveyor2.dm | 4 +- .../recycling/disposal-construction.dm | 6 +- code/modules/recycling/disposal.dm | 20 +- code/modules/recycling/sortingmachinery.dm | 6 +- code/modules/research/designs/engineering.dm | 4 +- .../security levels/keycard authentication.dm | 2 +- code/modules/shieldgen/emergency_shield.dm | 4 +- code/modules/shieldgen/sheldwallgen.dm | 2 +- code/modules/shieldgen/shield_capacitor.dm | 2 +- code/modules/shieldgen/shield_gen.dm | 2 +- code/modules/shieldgen/shield_generator.dm | 4 +- code/modules/surgery/surgery.dm | 8 +- code/modules/tables/tables.dm | 12 +- code/modules/vehicles/cargo_train.dm | 2 +- code/modules/vehicles/construction.dm | 8 +- code/modules/vehicles/vehicle.dm | 8 +- code/modules/virus2/centrifuge.dm | 2 +- code/modules/virus2/diseasesplicer.dm | 2 +- .../vore/weight/fitness_machines_vr.dm | 2 +- code/modules/xenoarcheaology/finds/finds.dm | 4 +- .../tools/suspension_generator.dm | 2 +- .../xenobio2/machinery/core_extractor.dm | 4 +- code/modules/xenobio2/machinery/injector.dm | 4 +- .../xenobio2/machinery/slime_replicator.dm | 4 +- icons/inventory/back/mob.dmi | Bin 139025 -> 143618 bytes icons/mob/items/lefthand_melee_vr.dmi | Bin 11348 -> 17874 bytes icons/mob/items/righthand_melee_vr.dmi | Bin 11509 -> 17967 bytes icons/obj/weapons_vr.dmi | Bin 8672 -> 9700 bytes maps/expedition_vr/alienship/alienship.dmm | 4 +- .../beach/submaps/quarantineshuttle.dmm | 2 +- .../debris_field/ship_sup_exploded.dmm | 8 +- .../mountains/quarantineshuttle.dmm | 2 +- vorestation.dme | 2 +- 310 files changed, 1035 insertions(+), 944 deletions(-) delete mode 100644 code/game/objects/items/weapons/tools/crowbar_vr.dm create mode 100644 code/game/objects/items/weapons/tools/transforming.dm diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index c5fe955523..04856958cc 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -92,7 +92,7 @@ return 1 /obj/machinery/atmospherics/binary/circulator/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 75, 1) anchored = !anchored user.visible_message("[user.name] [anchored ? "secures" : "unsecures"] the bolts holding [src.name] to the floor.", \ diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 686efa6508..364e7eda9f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -279,7 +279,7 @@ add_fingerprint(usr) /obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() if (unlocked) to_chat(user, "You cannot unwrench \the [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm index da5f37ff0c..6b0f40b8b4 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm @@ -82,7 +82,7 @@ add_overlay(image('icons/obj/pipeturbine.dmi', "hi-turb")) /obj/machinery/atmospherics/pipeturbine/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, W.usesound, 50, 1) to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.") @@ -256,7 +256,7 @@ add_avail(power_generated) /obj/machinery/power/turbinemotor/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, W.usesound, 50, 1) turbine = null diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 514216e7fa..d979f9decf 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -239,7 +239,7 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() if (!(stat & NOPOWER) && use_power) to_chat(user, "You cannot unwrench this [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index f0c5498fb3..77a35c8eae 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -80,7 +80,7 @@ update_icon() /obj/machinery/atmospherics/omni/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if(!W.is_wrench()) + if(!W.has_tool_quality(TOOL_WRENCH)) return ..() if(!can_unwrench()) diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 31f61ae55b..84b39b95c3 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -147,7 +147,7 @@ /obj/machinery/atmospherics/portables_connector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() if (connected_device) to_chat(user, "You cannot unwrench \the [src], dettach \the [connected_device] first.") diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index eaae718b2e..c548e956cc 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -52,7 +52,7 @@ update_icon() /obj/machinery/atmospherics/trinary/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() if(!can_unwrench()) to_chat(user, "You cannot unwrench \the [src], it too exerted due to internal pressure.") diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index acbf9f6ba2..5edf696696 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -327,7 +327,7 @@ go_to_side() /obj/machinery/atmospherics/tvalve/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() if(!can_unwrench()) to_chat(user, "You cannot unwrench \the [src], it too exerted due to internal pressure.") diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index 91616f8d8f..ee759c897c 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -67,7 +67,7 @@ return 1 /obj/machinery/atmospherics/unary/heat_exchanger/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() var/turf/T = src.loc if (level==1 && isturf(T) && !T.is_plating()) diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index b4991c0e5d..fa3c9073d8 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -164,7 +164,7 @@ update_icon() /obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() playsound(src, W.usesound, 50, 1) diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 4b8970fd94..31f1e33fc9 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -390,8 +390,8 @@ return /obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if (WT.remove_fuel(0,user)) to_chat(user, "Now welding the vent.") if(do_after(user, 20 * WT.toolspeed)) @@ -429,7 +429,7 @@ update_icon() /obj/machinery/atmospherics/unary/vent_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() if (!(stat & NOPOWER) && use_power) to_chat(user, "You cannot unwrench \the [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index fe3e68130f..477ae9c552 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -270,7 +270,7 @@ update_icon() /obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() if (!(stat & NOPOWER) && use_power) to_chat(user, "You cannot unwrench \the [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 9273b3b8d5..303e84b78c 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -288,7 +288,7 @@ open() /obj/machinery/atmospherics/valve/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() if (istype(src, /obj/machinery/atmospherics/valve/digital) && !src.allowed(user)) to_chat(user, "Access denied.") diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm index 0d687b8db0..d06b192a1a 100644 --- a/code/ATMOSPHERICS/pipes/pipe_base.dm +++ b/code/ATMOSPHERICS/pipes/pipe_base.dm @@ -116,7 +116,7 @@ if(istype(W,/obj/item/device/pipe_painter)) return 0 - if (!W.is_wrench()) + if (!W.has_tool_quality(TOOL_WRENCH)) return ..() var/turf/T = src.loc if (level==1 && isturf(T) && !T.is_plating()) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 413d06718c..59de4cb649 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -278,6 +278,7 @@ GLOBAL_LIST_EMPTY(##LIST_NAME);\ #define IS_CROWBAR "crowbar" #define IS_WIRECUTTER "wirecutter" #define IS_WRENCH "wrench" +#define IS_WELDER "welder" // Diagonal movement diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index da5c48a1ac..2d3a312563 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1074,7 +1074,7 @@ var/global/list/common_tools = list( /proc/is_wire_tool(obj/item/I) - if(istype(I, /obj/item/device/multitool) || I.is_wirecutter()) + if(istype(I, /obj/item/device/multitool) || I.has_tool_quality(TOOL_WIRECUTTER)) return TRUE if(istype(I, /obj/item/device/assembly/signaler)) return TRUE @@ -1088,6 +1088,12 @@ var/global/list/common_tools = list( return 3800 else return 0 + if(/obj/item/weapon/tool/transforming) + var/obj/item/weapon/tool/transforming/TT = W + if(TT.possible_tooltypes[TT.current_tooltype] == TOOL_WELDER) + return 3800 + else + return 0 if(/obj/item/weapon/flame/lighter) if(W:lit) return 1500 @@ -1135,7 +1141,7 @@ var/global/list/common_tools = list( if(W.sharp) return TRUE return ( \ - W.is_screwdriver() || \ + W.has_tool_quality(TOOL_SCREWDRIVER) || \ istype(W, /obj/item/weapon/pen) || \ istype(W, /obj/item/weapon/weldingtool) || \ istype(W, /obj/item/weapon/flame/lighter/zippo) || \ diff --git a/code/datums/components/crafting/tool_quality.dm b/code/datums/components/crafting/tool_quality.dm index 119469310a..5950cf72f4 100644 --- a/code/datums/components/crafting/tool_quality.dm +++ b/code/datums/components/crafting/tool_quality.dm @@ -27,3 +27,7 @@ /// DEPRECATED PROC: DO NOT USE IN NEW CODE /obj/item/proc/is_multitool() return has_tool_quality(TOOL_MULTITOOL) + +/// DEPRECATED PROC: DO NOT USE IN NEW CODE +/obj/item/proc/is_welder() + return has_tool_quality(TOOL_WELDER) diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index e2d3dbdfd4..d60db6e25c 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -41,16 +41,19 @@ var/list/L = steps[steps.len] switch(L["key"]) if(IS_SCREWDRIVER) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) return steps.len if(IS_CROWBAR) - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) return steps.len if(IS_WIRECUTTER) - if(I.is_wirecutter()) + if(I.has_tool_quality(TOOL_WIRECUTTER)) return steps.len if(IS_WRENCH) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) + return steps.len + if(IS_WELDER) + if(I.has_tool_quality(IS_WELDER)) return steps.len if(istype(I, L["key"])) @@ -108,30 +111,36 @@ switch(L["key"]) if(IS_SCREWDRIVER) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) return FORWARD if(IS_CROWBAR) - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) return FORWARD if(IS_WIRECUTTER) - if(I.is_wirecutter()) + if(I.has_tool_quality(TOOL_WIRECUTTER)) return FORWARD if(IS_WRENCH) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) + return FORWARD + if(IS_WELDER) + if(I.has_tool_quality(IS_WELDER)) return FORWARD switch(L["backkey"]) if(IS_SCREWDRIVER) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) return BACKWARD if(IS_CROWBAR) - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) return BACKWARD if(IS_WIRECUTTER) - if(I.is_wirecutter()) + if(I.has_tool_quality(TOOL_WIRECUTTER)) return BACKWARD if(IS_WRENCH) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) + return BACKWARD + if(IS_WELDER) + if(I.has_tool_quality(IS_WELDER)) return BACKWARD if(istype(I, L["key"])) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 9a411c60ee..b366ac43a9 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -168,8 +168,8 @@ switch(action) // Toggles the cut/mend status. if("cut") - // if(!I.is_wirecutter() && !user.can_admin_interact()) - if(!istype(I) || !I.is_wirecutter()) + // if(!I.has_tool_quality(TOOL_WIRECUTTER) && !user.can_admin_interact()) + if(!istype(I) || !I.has_tool_quality(TOOL_WIRECUTTER)) to_chat(user, "You need wirecutters!") return @@ -179,8 +179,8 @@ // Pulse a wire. if("pulse") - // if(!I.is_multitool() && !user.can_admin_interact()) - if(!istype(I) || !I.is_multitool()) + // if(!I.has_tool_quality(TOOL_MULTITOOL) && !user.can_admin_interact()) + if(!istype(I) || !I.has_tool_quality(TOOL_MULTITOOL)) to_chat(user, "You need a multitool!") return diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 20677bb0ff..b64f04d16f 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -34,7 +34,7 @@ to_chat(user, "You load [result] lengths of cable into [src].") return - if(O.is_wirecutter()) + if(O.has_tool_quality(TOOL_WIRECUTTER)) if(cable && cable.get_amount()) var/m = round(input(usr, "Please specify the length of cable to cut", "Cut cable", min(cable.get_amount(), 30)) as num, 1) m = min(m, cable.get_amount()) diff --git a/code/game/machinery/airconditioner_vr.dm b/code/game/machinery/airconditioner_vr.dm index 364d4bf377..60104c83c8 100644 --- a/code/game/machinery/airconditioner_vr.dm +++ b/code/game/machinery/airconditioner_vr.dm @@ -30,13 +30,13 @@ . += "There is a small display that reads \"[convert_k2c(target_temp)]C\"." /obj/machinery/power/thermoregulator/attackby(obj/item/I, mob/user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(default_deconstruction_screwdriver(user,I)) return - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) if(default_deconstruction_crowbar(user,I)) return - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) anchored = !anchored visible_message("\The [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") playsound(src, I.usesound, 75, 1) diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm index 603e6615be..853550b9d4 100644 --- a/code/game/machinery/atm_ret_field.dm +++ b/code/game/machinery/atm_ret_field.dm @@ -41,11 +41,11 @@ field_type = /obj/structure/atmospheric_retention_field/impassable /obj/machinery/atmospheric_field_generator/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_crowbar() && isactive) + if(W.has_tool_quality(TOOL_CROWBAR) && isactive) if(!src) return to_chat(user, "You can't open the ARF-G whilst it's running!") return - if(W.is_crowbar() && !isactive) + if(W.has_tool_quality(TOOL_CROWBAR) && !isactive) if(!src) return to_chat(user, "You [hatch_open? "close" : "open"] \the [src]'s access hatch.") hatch_open = !hatch_open @@ -53,21 +53,21 @@ if(alwaysactive && wires_intact) generate_field() return - if(hatch_open && W.is_multitool()) + if(hatch_open && W.has_tool_quality(TOOL_MULTITOOL)) if(!src) return to_chat(user, "You toggle \the [src]'s activation behavior to [alwaysactive? "emergency" : "always-on"].") alwaysactive = !alwaysactive update_icon() return - if(hatch_open && W.is_wirecutter()) + if(hatch_open && W.has_tool_quality(TOOL_WIRECUTTER)) if(!src) return to_chat(user, "You [wires_intact? "cut" : "mend"] \the [src]'s wires!") wires_intact = !wires_intact update_icon() return - if(hatch_open && istype(W,/obj/item/weapon/weldingtool)) + if(hatch_open && W.has_tool_quality(TOOL_WELDER)) if(!src) return - var/obj/item/weapon/weldingtool/WT = W + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.isOn()) return if(WT.get_fuel() < 5) // uses up 5 fuel. to_chat(user, "You need more fuel to complete this task.") diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index bb0858a79e..a7f8a40eeb 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -239,8 +239,8 @@ update_flag ..() /obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if(istype(W, /obj/item/weapon/weldingtool)) //Vorestart: Deconstructable Canisters - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) //Vorestart: Deconstructable Canisters + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") return @@ -255,7 +255,7 @@ update_flag qdel(src) return //Voreend - if(!W.is_wrench() && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda)) + if(!W.has_tool_quality(TOOL_WRENCH) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda)) visible_message("\The [user] hits \the [src] with \a [W]!") src.health -= W.force src.add_fingerprint(user) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 25f5e12567..c8b36e6138 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -105,7 +105,7 @@ return ..() /obj/machinery/meter/attackby(var/obj/item/W, var/mob/user) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src]...") if(do_after(user, 40 * W.toolspeed)) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 6bdf71c525..a07d0054c3 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -117,7 +117,7 @@ update_icon() return - else if (W.is_wrench()) + else if (W.has_tool_quality(TOOL_WRENCH)) if(connected_port) disconnect() to_chat(user, "You disconnect \the [src] from the port.") @@ -173,7 +173,7 @@ power_change() return - if(I.is_screwdriver() && removeable_cell) + if(I.has_tool_quality(TOOL_SCREWDRIVER) && removeable_cell) if(!cell) to_chat(user, "There is no power cell installed.") return diff --git a/code/game/machinery/atmoalter/pump_vr.dm b/code/game/machinery/atmoalter/pump_vr.dm index 2c3b5c14d9..fb4acbe9f6 100644 --- a/code/game/machinery/atmoalter/pump_vr.dm +++ b/code/game/machinery/atmoalter/pump_vr.dm @@ -83,7 +83,7 @@ update_connected_network() /obj/machinery/portable_atmospherics/powered/pump/huge/attackby(var/obj/item/I, var/mob/user) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) if(on) to_chat(user, "Turn \the [src] off first!") return @@ -97,7 +97,7 @@ //doesn't use power cells if(istype(I, /obj/item/weapon/cell)) return - if (I.is_screwdriver()) + if (I.has_tool_quality(TOOL_SCREWDRIVER)) return //doesn't hold tanks @@ -111,7 +111,7 @@ name = "Stationary Air Pump" /obj/machinery/portable_atmospherics/powered/pump/huge/stationary/attackby(var/obj/item/I, var/mob/user) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) to_chat(user, "The bolts are too tight for you to unscrew!") return diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 7ab58e2c88..f27b8983e3 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -109,7 +109,7 @@ data["on"] = on ? 1 : 0 data["connected"] = connected_port ? 1 : 0 data["pressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0) - + data["rate"] = round(volume_rate) data["minrate"] = round(minrate) data["maxrate"] = round(maxrate) @@ -201,7 +201,7 @@ update_use_power(new_use_power) if(!on) return - + var/power_draw = -1 var/datum/gas_mixture/environment = loc.return_air() @@ -218,7 +218,7 @@ update_connected_network() /obj/machinery/portable_atmospherics/powered/scrubber/huge/attackby(var/obj/item/I as obj, var/mob/user as mob) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) if(on) to_chat(user, "Turn \the [src] off first!") return @@ -232,7 +232,7 @@ //doesn't use power cells if(istype(I, /obj/item/weapon/cell)) return - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) return //doesn't hold tanks @@ -250,7 +250,7 @@ desc += "This one seems to be tightly secured with large bolts." /obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/attackby(var/obj/item/I as obj, var/mob/user as mob) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) to_chat(user, "The bolts are too tight for you to unscrew!") return diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 236f6d6837..e14d919569 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -125,7 +125,7 @@ if(panel_open) //Don't eat multitools or wirecutters used on an open lathe. - if(O.is_multitool() || O.is_wirecutter()) + if(O.has_tool_quality(TOOL_MULTITOOL) || O.has_tool_quality(TOOL_WIRECUTTER)) wires.Interact(user) return diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 85f23cb1db..796415d0f3 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -159,7 +159,7 @@ /obj/machinery/camera/attackby(obj/item/W as obj, mob/living/user as mob) update_coverage() // DECONSTRUCTION - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) //to_chat(user, "You start to [panel_open ? "close" : "open"] the camera's panel.") //if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown panel_open = !panel_open @@ -167,10 +167,10 @@ "You screw the camera's panel [panel_open ? "open" : "closed"].") playsound(src, W.usesound, 50, 1) - else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open) + else if((W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/device/multitool)) && panel_open) interact(user) - else if(istype(W, /obj/item/weapon/weldingtool) && (wires.CanDeconstruct() || (stat & BROKEN))) + else if(W.has_tool_quality(TOOL_WELDER) && (wires.CanDeconstruct() || (stat & BROKEN))) if(weld(W, user)) if(assembly) assembly.loc = src.loc @@ -372,6 +372,7 @@ return null /obj/machinery/camera/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/user) + WT = WT.get_welder() if(busy) return 0 diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index a73eb6fe91..6db595dad4 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -29,7 +29,7 @@ if(0) // State 0 - if(W.is_wrench() && isturf(src.loc)) + if(W.has_tool_quality(TOOL_WRENCH) && isturf(src.loc)) playsound(src, W.usesound, 50, 1) to_chat(user, "You wrench the assembly into place.") anchored = TRUE @@ -40,14 +40,14 @@ if(1) // State 1 - if(istype(W, /obj/item/weapon/weldingtool)) + if(W.has_tool_quality(TOOL_WELDER)) if(weld(W, user)) to_chat(user, "You weld the assembly securely into place.") anchored = TRUE state = 2 return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 50, 1) to_chat(user, "You unattach the assembly from its place.") anchored = FALSE @@ -66,7 +66,7 @@ to_chat(user, "You need 2 coils of wire to wire the assembly.") return - else if(istype(W, /obj/item/weapon/weldingtool)) + else if(W.has_tool_quality(TOOL_WELDER)) if(weld(W, user)) to_chat(user, "You unweld the assembly from its place.") @@ -77,7 +77,7 @@ if(3) // State 3 - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) var/input = sanitize(tgui_input_text(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT)) @@ -115,7 +115,7 @@ break return - else if(W.is_wirecutter()) + else if(W.has_tool_quality(TOOL_WIRECUTTER)) new/obj/item/stack/cable_coil(get_turf(src), 2) playsound(src, W.usesound, 50, 1) @@ -132,7 +132,7 @@ return // Taking out upgrades - else if(W.is_crowbar() && upgrades.len) + else if(W.has_tool_quality(TOOL_CROWBAR) && upgrades.len) var/obj/U = locate(/obj) in upgrades if(U) to_chat(user, "You unattach an upgrade from the assembly.") @@ -154,6 +154,7 @@ ..() /obj/item/weapon/camera_assembly/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/user) + WT = WT.get_welder() if(busy) return 0 diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 8439c9ff15..38ceea9f4b 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -74,7 +74,7 @@ user.visible_message("[user] inserts [charging] into [src].", "You insert [charging] into [src].") chargelevel = -1 update_icon() - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(charging) to_chat(user, "Remove [charging] first!") return diff --git a/code/game/machinery/clawmachine.dm b/code/game/machinery/clawmachine.dm index 1896d37b97..08af125e20 100644 --- a/code/game/machinery/clawmachine.dm +++ b/code/game/machinery/clawmachine.dm @@ -100,7 +100,7 @@ if(busy) to_chat(user,"The claw machine is currently running. ") return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 100, 1) if(anchored) user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 49c917f312..4f5a37f68d 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -250,7 +250,7 @@ user.drop_item() W.forceMove(src) return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(locked && (anchored || occupant)) to_chat(user, "Can not do that while [src] is in use.") else diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 6dbe833b29..10b8aa1fa8 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -15,14 +15,14 @@ switch(state) if(0) - if(P.is_wrench()) + if(P.has_tool_quality(TOOL_WRENCH)) playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You wrench the frame into place.") anchored = TRUE state = 1 - if(istype(P, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = P + if(P.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = P.get_welder() if(!WT.isOn()) to_chat(user, "The welder must be on for this task.") return @@ -33,7 +33,7 @@ new /obj/item/stack/material/plasteel( loc, 4) qdel(src) if(1) - if(P.is_wrench()) + if(P.has_tool_quality(TOOL_WRENCH)) playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You unfasten the frame.") @@ -46,12 +46,12 @@ circuit = P user.drop_item() P.loc = src - if(P.is_screwdriver() && circuit) + if(P.has_tool_quality(TOOL_SCREWDRIVER) && circuit) playsound(src, P.usesound, 50, 1) to_chat(user, "You screw the circuit board into place.") state = 2 icon_state = "2" - if(P.is_crowbar() && circuit) + if(P.has_tool_quality(TOOL_CROWBAR) && circuit) playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the circuit board.") state = 1 @@ -59,7 +59,7 @@ circuit.loc = loc circuit = null if(2) - if(P.is_screwdriver() && circuit) + if(P.has_tool_quality(TOOL_SCREWDRIVER) && circuit) playsound(src, P.usesound, 50, 1) to_chat(user, "You unfasten the circuit board.") state = 1 @@ -78,7 +78,7 @@ to_chat(user, "You add cables to the frame.") return if(3) - if(P.is_wirecutter()) + if(P.has_tool_quality(TOOL_WIRECUTTER)) if (brain) to_chat(user, "Get that brain out of there first") else @@ -145,7 +145,7 @@ to_chat(usr, "Added [P].") icon_state = "3b" - if(P.is_crowbar() && brain) + if(P.has_tool_quality(TOOL_CROWBAR) && brain) playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the brain.") brain.loc = loc @@ -153,7 +153,7 @@ icon_state = "3" if(4) - if(P.is_crowbar()) + if(P.has_tool_quality(TOOL_CROWBAR)) playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the glass panel.") state = 3 @@ -164,7 +164,7 @@ new /obj/item/stack/material/glass/reinforced( loc, 2 ) return - if(P.is_screwdriver()) + if(P.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, P.usesound, 50, 1) to_chat(user, "You connect the monitor.") if(!brain) @@ -232,7 +232,7 @@ GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactiva else to_chat(user, "ERROR: Unable to locate artificial intelligence.") return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(anchored) user.visible_message("\The [user] starts to unbolt \the [src] from the plating...") playsound(src, W.usesound, 50, 1) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 3ec9e2c841..923dd620a2 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -6,7 +6,7 @@ icon_keyboard = "tech_key" icon_screen = "ai-fixer" light_color = LIGHT_COLOR_PINK - + active_power_usage = 1000 /// Variable containing transferred AI @@ -15,7 +15,7 @@ var/restoring = FALSE /obj/machinery/computer/aifixer/attackby(obj/item/I, mob/living/user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(occupier) if(stat & (NOPOWER|BROKEN)) to_chat(user, "The screws on [name]'s screen won't budge.") @@ -85,10 +85,10 @@ return TRUE if(!occupier) restoring = FALSE - + if(action) playsound(src, "terminal_type", 50, 1) - + switch(action) if("PRG_beginReconstruction") if(occupier?.health < 100) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 5f4ff28e05..33d8ae2e86 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -13,14 +13,14 @@ /obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob) switch(state) if(0) - if(P.is_wrench()) + if(P.has_tool_quality(TOOL_WRENCH)) playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You wrench the frame into place.") src.anchored = TRUE src.state = 1 - if(istype(P, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = P + if(P.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = P.get_welder() if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") return @@ -31,7 +31,7 @@ new /obj/item/stack/material/steel( src.loc, 5 ) qdel(src) if(1) - if(P.is_wrench()) + if(P.has_tool_quality(TOOL_WRENCH)) playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You unfasten the frame.") @@ -48,12 +48,12 @@ P.loc = src else to_chat(user, "This frame does not accept circuit boards of this type!") - if(P.is_screwdriver() && circuit) + if(P.has_tool_quality(TOOL_SCREWDRIVER) && circuit) playsound(src, P.usesound, 50, 1) to_chat(user, "You screw the circuit board into place.") src.state = 2 src.icon_state = "2" - if(P.is_crowbar()) && circuit) + if(P.has_tool_quality(TOOL_CROWBAR)) && circuit) playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the circuit board.") src.state = 1 @@ -61,7 +61,7 @@ circuit.loc = src.loc src.circuit = null if(2) - if(P.is_screwdriver() && circuit) + if(P.has_tool_quality(TOOL_SCREWDRIVER) && circuit) playsound(src, P.usesound, 50, 1) to_chat(user, "You unfasten the circuit board.") src.state = 1 @@ -79,7 +79,7 @@ state = 3 icon_state = "3" if(3) - if(P.is_wirecutter()) + if(P.has_tool_quality(TOOL_WIRECUTTER)) playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the cables.") src.state = 2 @@ -100,13 +100,13 @@ src.state = 4 src.icon_state = "4" if(4) - if(P.is_crowbar()) + if(P.has_tool_quality(TOOL_CROWBAR)) playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the glass panel.") src.state = 3 src.icon_state = "3" new /obj/item/stack/material/glass( src.loc, 2 ) - if(P.is_screwdriver()) + if(P.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, P.usesound, 50, 1) to_chat(user, "You connect the monitor.") var/B = new src.circuit.build_path ( src.loc ) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 27009d097b..a5dad720ec 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -34,7 +34,7 @@ return if(!istype(user)) return - if(O.is_screwdriver() && emag) + if(O.has_tool_quality(TOOL_SCREWDRIVER) && emag) //Stops people from just unscrewing the monitor and putting it back to get the console working again. to_chat(user, "It is too hot to mess with!") return @@ -101,7 +101,7 @@ if(linkedServer && auth) data["linkedServer"]["active"] = linkedServer.active data["linkedServer"]["broke"] = linkedServer.stat & (NOPOWER|BROKEN) - + var/list/pda_msgs = list() for(var/datum/data_pda_msg/pda in linkedServer.pda_msgs) pda_msgs.Add(list(list( @@ -111,7 +111,7 @@ "message" = pda.message, ))) data["linkedServer"]["pda_msgs"] = pda_msgs - + var/list/rc_msgs = list() for(var/datum/data_rc_msg/rc in linkedServer.rc_msgs) rc_msgs.Add(list(list( @@ -182,7 +182,7 @@ /obj/machinery/computer/message_monitor/tgui_act(action, params) if(..()) return TRUE - + switch(action) if("cleartemp") temp = null @@ -218,14 +218,14 @@ spawn(100*length(linkedServer.decryptkey)) if(src && linkedServer && usr) BruteForce(usr) - + if(!auth) return - + if(!linkedServer || linkedServer.stat & (NOPOWER|BROKEN)) temp = noserver return TRUE - + switch(action) //Turn the server on/off. if("active") @@ -277,7 +277,7 @@ var/obj/item/device/pda/P = locate(ref) if(!istype(P) || !P.owner || P.hidden) return FALSE - + var/datum/data/pda/app/messenger/M = P.find_program(/datum/data/pda/app/messenger) if(!M || M.toff) return FALSE @@ -316,7 +316,7 @@ //Sender is faking as someone who exists else linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]") - + var/datum/data/pda/app/messenger/M = customrecepient.find_program(/datum/data/pda/app/messenger) if(M) M.receive_message(list("sent" = 0, "owner" = "[PDARec.owner]", "job" = "[customjob]", "message" = "[custommessage]", "target" = "\ref[PDARec]"), "\ref[PDARec]") diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index f37f0f6c97..c074256475 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -50,7 +50,7 @@ /* /obj/machinery/computer/pod/attackby(I as obj, user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) if(do_after(user, 20)) if(stat & BROKEN) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 6a61f01502..bf6d5080d7 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -41,7 +41,7 @@ state = 2 icon_state = "box_1" else - if(P.is_wrench()) + if(P.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 75, 1) to_chat(user, "You dismantle the frame") new /obj/item/stack/material/steel(src.loc, 5) @@ -76,7 +76,7 @@ else to_chat(user, "This frame does not accept circuit boards of this type!") else - if(P.is_wirecutter()) + if(P.has_tool_quality(TOOL_WIRECUTTER)) playsound(src, P.usesound, 50, 1) to_chat(user, "You remove the cables.") state = 1 @@ -85,7 +85,7 @@ A.amount = 5 if(3) - if(P.is_crowbar()) + if(P.has_tool_quality(TOOL_CROWBAR)) playsound(src, P.usesound, 50, 1) state = 2 circuit.loc = src.loc @@ -101,7 +101,7 @@ components = null icon_state = "box_1" else - if(P.is_screwdriver()) + if(P.has_tool_quality(TOOL_SCREWDRIVER)) var/component_check = 1 for(var/R in req_components) if(req_components[R] > 0) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index a72d814c79..63beb67797 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -47,7 +47,7 @@ Deployable items visible_message("BZZzZZzZZzZT") return return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(health < maxhealth) health = maxhealth emagged = 0 diff --git a/code/game/machinery/doorbell_vr.dm b/code/game/machinery/doorbell_vr.dm index 906c41ea6d..fbcc58b79e 100644 --- a/code/game/machinery/doorbell_vr.dm +++ b/code/game/machinery/doorbell_vr.dm @@ -136,7 +136,7 @@ var/obj/item/device/multitool/M = W M.connectable = src to_chat(user, "You save the data in \the [M]'s buffer.") - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) to_chat(user, "You start to unwrench \the [src].") playsound(src, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 15) && !QDELETED(src)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 0843af99f7..66e8c84623 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1145,8 +1145,8 @@ About the new airlock wires panel: if(istype(C, /mob/living)) ..() return - if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) - var/obj/item/weapon/weldingtool/W = C + if(!repairing && C.has_tool_quality(TOOL_WELDER) && !( src.operating > 0 ) && src.density) + var/obj/item/weapon/weldingtool/W = C.get_welder() if(W.remove_fuel(0,user)) if(!src.welded) src.welded = 1 @@ -1157,7 +1157,7 @@ About the new airlock wires panel: return else return - else if(C.is_screwdriver()) + else if(C.has_tool_quality(TOOL_SCREWDRIVER)) if (src.p_open) if (stat & BROKEN) to_chat(usr, "The panel is broken and cannot be closed.") @@ -1171,7 +1171,7 @@ About the new airlock wires panel: playsound(src, C.usesound, 50, 1) src.update_icon() return src.attack_hand(user) - else if(C.is_wirecutter()) + else if(C.has_tool_quality(TOOL_WIRECUTTER)) return src.attack_hand(user) else if(istype(C, /obj/item/device/multitool)) return src.attack_hand(user) @@ -1180,7 +1180,7 @@ About the new airlock wires panel: else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE var/obj/item/weapon/pai_cable/cable = C cable.plugin(src, user) - else if(!repairing && C.is_crowbar()) + else if(!repairing && C.has_tool_quality(TOOL_CROWBAR)) if(can_remove_electronics()) playsound(src, C.usesound, 75, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ad3212fa49..aa5d9c0990 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -260,12 +260,12 @@ return - if(repairing && istype(I, /obj/item/weapon/weldingtool)) + if(repairing && I.has_tool_quality(TOOL_WELDER)) if(!density) to_chat(user, "\The [src] must be closed before you can repair it.") return - var/obj/item/weapon/weldingtool/welder = I + var/obj/item/weapon/weldingtool/welder = I.get_welder() if(welder.remove_fuel(0,user)) to_chat(user, "You start to fix dents and weld \the [get_material_name()] into place.") playsound(src, welder.usesound, 50, 1) @@ -276,7 +276,7 @@ repairing = 0 return - if(repairing && I.is_crowbar()) + if(repairing && I.has_tool_quality(TOOL_CROWBAR)) var/datum/material/mat = get_material() var/obj/item/stack/material/repairing_sheet = mat.place_sheet(loc, repairing) repairing = 0 diff --git a/code/game/machinery/doors/door_vr.dm b/code/game/machinery/doors/door_vr.dm index 1a504065cc..7a2ba190cd 100644 --- a/code/game/machinery/doors/door_vr.dm +++ b/code/game/machinery/doors/door_vr.dm @@ -69,7 +69,7 @@ return TRUE - if(reinforcing && istype(I, /obj/item/weapon/weldingtool)) + if(reinforcing && I.has_tool_quality(TOOL_WELDER)) if(!density) to_chat(user, "\The [src] must be closed before you can reinforce it.") return TRUE @@ -78,7 +78,7 @@ to_chat(user, "You will need more plasteel to reinforce \the [src].") return TRUE - var/obj/item/weapon/weldingtool/welder = I + var/obj/item/weapon/weldingtool/welder = I.get_welder() if(welder.remove_fuel(0,user)) to_chat(user, "You start weld \the plasteel into place.") playsound(src, welder.usesound, 50, 1) @@ -89,7 +89,7 @@ reinforcing = 0 return TRUE - if(reinforcing && I.is_crowbar()) + if(reinforcing && I.has_tool_quality(TOOL_CROWBAR)) var/obj/item/stack/material/plasteel/reinforcing_sheet = new /obj/item/stack/material/plasteel(src.loc, reinforcing) reinforcing = 0 to_chat(user, "You remove \the [reinforcing_sheet].") diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 40d092f59e..140ad4ef16 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -59,7 +59,7 @@ if(F != src) log_debug("Duplicate firedoors at [x],[y],[z]") return INITIALIZE_HINT_QDEL - + var/area/A = get_area(src) ASSERT(istype(A)) @@ -82,7 +82,7 @@ /obj/machinery/door/firedoor/examine(mob/user) . = ..() - + if(!Adjacent(user)) return . @@ -251,10 +251,10 @@ return //Don't open the door if we're putting tape on it to tell people 'don't open the door'. if(operating) return//Already doing something. - if(istype(C, /obj/item/weapon/weldingtool) && !repairing) + if(C.has_tool_quality(TOOL_WELDER) && !repairing) if(prying) to_chat(user, "Someone's busy prying that [density ? "open" : "closed"]!") - var/obj/item/weapon/weldingtool/W = C + var/obj/item/weapon/weldingtool/W = C.get_welder() if(W.remove_fuel(0, user)) blocked = !blocked user.visible_message("\The [user] [blocked ? "welds" : "unwelds"] \the [src] with \a [W].",\ @@ -264,7 +264,7 @@ update_icon() return - if(density && C.is_screwdriver()) + if(density && C.has_tool_quality(TOOL_SCREWDRIVER)) hatch_open = !hatch_open playsound(src, C.usesound, 50, 1) user.visible_message("[user] has [hatch_open ? "opened" : "closed"] \the [src] maintenance hatch.", @@ -272,7 +272,7 @@ update_icon() return - if(blocked && C.is_crowbar() && !repairing) + if(blocked && C.has_tool_quality(TOOL_CROWBAR) && !repairing) if(!hatch_open) to_chat(user, "You must open the maintenance hatch first!") else @@ -306,7 +306,7 @@ if(operating) return - if(blocked && C.is_crowbar()) + if(blocked && C.has_tool_quality(TOOL_CROWBAR)) user.visible_message("\The [user] pries at \the [src] with \a [C], but \the [src] is welded in place!",\ "You try to pry \the [src] [density ? "open" : "closed"], but it is welded in place!",\ "You hear someone struggle and metal straining.") @@ -328,7 +328,7 @@ update_icon() playsound(src, C.usesound, 100, 1) if(do_after(user,30 * C.toolspeed)) - if(C.is_crowbar()) + if(C.has_tool_quality(TOOL_CROWBAR)) if(stat & (BROKEN|NOPOWER) || !density) user.visible_message("\The [user] forces \the [src] [density ? "open" : "closed"] with \a [C]!",\ "You force \the [src] [density ? "open" : "closed"] with \the [C]!",\ diff --git a/code/game/machinery/doors/firedoor_assembly.dm b/code/game/machinery/doors/firedoor_assembly.dm index 829cce4e7c..e6c37c7e51 100644 --- a/code/game/machinery/doors/firedoor_assembly.dm +++ b/code/game/machinery/doors/firedoor_assembly.dm @@ -31,7 +31,7 @@ wired = 1 to_chat(user, "You wire \the [src].") - else if(C.is_wirecutter() && wired ) + else if(C.has_tool_quality(TOOL_WIRECUTTER) && wired ) playsound(src, C.usesound, 100, 1) user.visible_message("[user] cuts the wires from \the [src].", "You start to cut the wires from \the [src].") @@ -54,14 +54,14 @@ qdel(src) else to_chat(user, "You must secure \the [src] first!") - else if(C.is_wrench()) + else if(C.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, C.usesound, 50, 1) user.visible_message("[user] has [anchored ? "" : "un" ]secured \the [src]!", "You have [anchored ? "" : "un" ]secured \the [src]!") update_icon() - else if((glass || !anchored) && istype(C, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = C + else if((glass || !anchored) && C.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = C.get_welder() if(WT.remove_fuel(0, user)) playsound(src, WT.usesound, 50, 1) if(glass) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 822e950d63..8175800373 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -189,8 +189,8 @@ if(istype(I)) // Fixing. - if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent == I_HELP) - var/obj/item/weapon/weldingtool/WT = I + if(I.has_tool_quality(TOOL_WELDER) && user.a_intent == I_HELP) + var/obj/item/weapon/weldingtool/WT = I.get_welder() if(health < maxhealth) if(WT.remove_fuel(1 ,user)) to_chat(user, "You begin repairing [src]...") @@ -215,7 +215,7 @@ return 1 //If it's opened/emagged, crowbar can pry it out of its frame. - if (!density && I.is_crowbar()) + if (!density && I.has_tool_quality(TOOL_CROWBAR)) playsound(src, I.usesound, 50, 1) user.visible_message("[user] begins prying the windoor out of the frame.", "You start to pry the windoor out of the frame.") if (do_after(user,40 * I.toolspeed)) diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm index 848601c679..a2380e3522 100644 --- a/code/game/machinery/exonet_node.dm +++ b/code/game/machinery/exonet_node.dm @@ -109,9 +109,9 @@ // Parameters: 2 (I - the item being whacked against the machine, user - the person doing the whacking) // Description: Handles deconstruction. /obj/machinery/exonet_node/attackby(obj/item/I, mob/user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) default_deconstruction_screwdriver(user, I) - else if(I.is_crowbar()) + else if(I.has_tool_quality(TOOL_CROWBAR)) default_deconstruction_crowbar(user, I) else ..() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 848108285b..6668d1cf39 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -35,7 +35,7 @@ //Don't want to render prison breaks impossible /obj/machinery/flasher/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) add_fingerprint(user) disable = !disable if(disable) @@ -107,7 +107,7 @@ flash() /obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) add_fingerprint(user) anchored = !anchored @@ -115,7 +115,7 @@ user.show_message(text("[src] can now be moved.")) cut_overlays() unsense_proximity(callback = /atom/proc/HasProximity) - + else if(anchored) user.show_message(text("[src] is now secured.")) add_overlay("[base_state]-s") diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index a5cc7d6750..3c4b3a7a13 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -102,7 +102,7 @@ update_icon() /obj/machinery/floodlight/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(!open) if(unlocked) unlocked = 0 @@ -111,7 +111,7 @@ unlocked = 1 to_chat(user, "You unscrew the battery panel.") - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) if(unlocked) if(open) open = 0 diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index a870245be9..1722510df0 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -23,11 +23,11 @@ var/list/floor_light_cache = list() anchored = TRUE /obj/machinery/floor_light/attackby(var/obj/item/W, var/mob/user) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) anchored = !anchored visible_message("\The [user] has [anchored ? "attached" : "detached"] \the [src].") - else if(istype(W, /obj/item/weapon/weldingtool) && (damaged || (stat & BROKEN))) - var/obj/item/weapon/weldingtool/WT = W + else if(W.has_tool_quality(TOOL_WELDER) && (damaged || (stat & BROKEN))) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.remove_fuel(0, user)) to_chat(user, "\The [src] must be on to complete this task.") return diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index dfbf3c38df..38da6b057f 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -34,7 +34,7 @@ return /obj/machinery/floorlayer/attackby(var/obj/item/W as obj, var/mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) var/m = tgui_input_list(usr, "Choose work mode", "Mode", mode) mode[m] = !mode[m] var/O = mode[m] @@ -47,7 +47,7 @@ TakeTile(T) return - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) if(!length(contents)) to_chat(user, "\The [src] is empty.") else @@ -58,7 +58,7 @@ T = null return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) T = tgui_input_list(usr, "Choose tile type.", "Tiles", contents) return ..() diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 43fd737eaf..3b6caffcf9 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -300,7 +300,7 @@ update_icon() /obj/structure/frame/attackby(obj/item/P as obj, mob/user as mob) - if(P.is_wrench()) + if(P.has_tool_quality(TOOL_WRENCH)) if(state == FRAME_PLACED && !anchored) to_chat(user, "You start to wrench the frame into place.") playsound(src, P.usesound, 50, 1) @@ -320,9 +320,9 @@ to_chat(user, "You unfasten the frame.") anchored = FALSE - else if(istype(P, /obj/item/weapon/weldingtool)) + else if(P.has_tool_quality(TOOL_WELDER)) if(state == FRAME_PLACED) - var/obj/item/weapon/weldingtool/WT = P + var/obj/item/weapon/weldingtool/WT = P.get_welder() if(WT.remove_fuel(0, user)) playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) @@ -353,7 +353,7 @@ to_chat(user, "This frame does not accept circuit boards of this type!") return - else if(P.is_screwdriver()) + else if(P.has_tool_quality(TOOL_SCREWDRIVER)) if(state == FRAME_UNFASTENED) if(need_circuit && circuit) playsound(src, P.usesound, 50, 1) @@ -448,7 +448,7 @@ qdel(src) return - else if(P.is_crowbar()) + else if(P.has_tool_quality(TOOL_CROWBAR)) if(state == FRAME_UNFASTENED) if(need_circuit && circuit) playsound(src, P.usesound, 50, 1) @@ -525,7 +525,7 @@ break to_chat(user, desc) - else if(P.is_wirecutter()) + else if(P.has_tool_quality(TOOL_WIRECUTTER)) if(state == FRAME_WIRED) if( \ frame_type.frame_class == FRAME_CLASS_COMPUTER || \ diff --git a/code/game/machinery/holoposter.dm b/code/game/machinery/holoposter.dm index a5174380d2..9b32fbb371 100644 --- a/code/game/machinery/holoposter.dm +++ b/code/game/machinery/holoposter.dm @@ -83,7 +83,7 @@ GLOBAL_LIST_EMPTY(holoposters) src.add_fingerprint(user) if(stat & (NOPOWER)) return - if (W.is_multitool()) + if (W.has_tool_quality(TOOL_MULTITOOL)) playsound(src, 'sound/items/penclick.ogg', 60, 1) icon_state = tgui_input_list(usr, "Available Posters", "Holographic Poster", postertypes + "random") if(!Adjacent(user)) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 060bd029fc..52b313497a 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -72,7 +72,7 @@ // sd_SetLuminosity(0) /obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) add_fingerprint(user) disable = !disable playsound(src, W.usesound, 50, 1) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index f3149dc78a..51a1f3fb98 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -66,7 +66,7 @@ update_icon() return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) to_chat(user, "You start to dismantle the IV drip.") if(do_after(user, 15)) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 122a8b3635..eb938f3881 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -108,11 +108,11 @@ return if(default_deconstruction_crowbar(user, W)) return - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) return wires.Interact(user) if(istype(W, /obj/item/device/multitool)) return wires.Interact(user) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) if(playing) StopPlaying() user.visible_message("[user] has [anchored ? "un" : ""]secured \the [src].", "You [anchored ? "un" : ""]secure \the [src].") @@ -271,7 +271,7 @@ return if(default_deconstruction_crowbar(user, W)) return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) if(playing) StopPlaying() user.visible_message("[user] has [anchored ? "un" : ""]secured \the [src].", "You [anchored ? "un" : ""]secure \the [src].") diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 6ceab53895..00010da9cc 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -365,7 +365,7 @@ Class Procs: // Default behavior for wrenching down machines. Supports both delay and instant modes. /obj/machinery/proc/default_unfasten_wrench(var/mob/user, var/obj/item/W, var/time = 0) - if(!W.is_wrench()) + if(!W.has_tool_quality(TOOL_WRENCH)) return FALSE if(panel_open) return FALSE // Close panel first! @@ -385,14 +385,14 @@ Class Procs: return TRUE /obj/machinery/proc/default_deconstruction_crowbar(var/mob/user, var/obj/item/C) - if(!C.is_crowbar()) + if(!C.has_tool_quality(TOOL_CROWBAR)) return 0 if(!panel_open) return 0 . = dismantle() /obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/obj/item/S) - if(!S.is_screwdriver()) + if(!S.has_tool_quality(TOOL_SCREWDRIVER)) return 0 playsound(src, S.usesound, 50, 1) panel_open = !panel_open @@ -401,7 +401,7 @@ Class Procs: return 1 /obj/machinery/proc/computer_deconstruction_screwdriver(var/mob/user, var/obj/item/S) - if(!S.is_screwdriver()) + if(!S.has_tool_quality(TOOL_SCREWDRIVER)) return 0 if(!circuit) return 0 @@ -416,7 +416,7 @@ Class Procs: . = dismantle() /obj/machinery/proc/alarm_deconstruction_screwdriver(var/mob/user, var/obj/item/S) - if(!S.is_screwdriver()) + if(!S.has_tool_quality(TOOL_SCREWDRIVER)) return 0 playsound(src, S.usesound, 50, 1) panel_open = !panel_open @@ -425,7 +425,7 @@ Class Procs: return 1 /obj/machinery/proc/alarm_deconstruction_wirecutters(var/mob/user, var/obj/item/W) - if(!W.is_wirecutter()) + if(!W.has_tool_quality(TOOL_WIRECUTTER)) return 0 if(!panel_open) return 0 diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index b0a1588b4d..79c8cdf738 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -72,7 +72,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w if(!T.is_plating()) return // prevent intraction when T-scanner revealed - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) open = !open playsound(src, I.usesound, 50, 1) user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 2c8ee75ca9..805cf96e81 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -56,7 +56,7 @@ var/bomb_set return /obj/machinery/nuclearbomb/attackby(obj/item/weapon/O as obj, mob/user as mob) - if(O.is_screwdriver()) + if(O.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, O.usesound, 50, 1) add_fingerprint(user) if(auth) @@ -79,7 +79,7 @@ var/bomb_set flick("nuclearbombc", src) return - if(O.is_wirecutter() || istype(O, /obj/item/device/multitool)) + if(O.has_tool_quality(TOOL_WIRECUTTER) || istype(O, /obj/item/device/multitool)) if(opened == 1) nukehack_win(user) return @@ -95,9 +95,9 @@ var/bomb_set if(anchored) switch(removal_stage) if(0) - if(istype(O,/obj/item/weapon/weldingtool)) + if(O.has_tool_quality(TOOL_WELDER)) - var/obj/item/weapon/weldingtool/WT = O + var/obj/item/weapon/weldingtool/WT = O.get_welder() if(!WT.isOn()) return if(WT.get_fuel() < 5) // uses up 5 fuel. to_chat(user, "You need more fuel to complete this task.") @@ -112,7 +112,7 @@ var/bomb_set return if(1) - if(O.is_crowbar()) + if(O.has_tool_quality(TOOL_CROWBAR)) user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [O]...") playsound(src, O.usesound, 50, 1) @@ -123,9 +123,9 @@ var/bomb_set return if(2) - if(istype(O,/obj/item/weapon/weldingtool)) + if(O.has_tool_quality(TOOL_WELDER)) - var/obj/item/weapon/weldingtool/WT = O + var/obj/item/weapon/weldingtool/WT = O.get_welder() if(!WT.isOn()) return if(WT.get_fuel() < 5) // uses up 5 fuel. to_chat(user, "You need more fuel to complete this task.") @@ -140,7 +140,7 @@ var/bomb_set return if(3) - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...") playsound(src, O.usesound, 50, 1) @@ -151,7 +151,7 @@ var/bomb_set return if(4) - if(O.is_crowbar()) + if(O.has_tool_quality(TOOL_CROWBAR)) user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...") playsound(src, O.usesound, 50, 1) @@ -263,7 +263,7 @@ var/bomb_set visible_message("The [src] emits a quiet whirling noise!") if(href_list["act"] == "wire") var/obj/item/I = usr.get_active_hand() - if(!I.is_wirecutter()) + if(!I.has_tool_quality(TOOL_WIRECUTTER)) to_chat(usr, "You need wirecutters!") else wires[temp_wire] = !wires[temp_wire] diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 1fcc99f755..c64aa88035 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -130,7 +130,7 @@ return 1 /obj/machinery/oxygen_pump/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) stat ^= MAINT user.visible_message("\The [user] [(stat & MAINT) ? "opens" : "closes"] \the [src].", "You [(stat & MAINT) ? "open" : "close"] \the [src].") icon_state = (stat & MAINT) ? icon_state_open : icon_state_closed diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm index 8d8b36eaa2..cfce91b572 100644 --- a/code/game/machinery/pda_multicaster.dm +++ b/code/game/machinery/pda_multicaster.dm @@ -61,9 +61,9 @@ icon_state = "[initial(icon_state)]_off" /obj/machinery/pda_multicaster/attackby(obj/item/I, mob/user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) default_deconstruction_screwdriver(user, I) - else if(I.is_crowbar()) + else if(I.has_tool_quality(TOOL_CROWBAR)) default_deconstruction_crowbar(user, I) else ..() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index f5f2532080..b86ed67519 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -166,7 +166,7 @@ Buildable meters return ..() /obj/item/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) return wrench_act(user, W) return ..() @@ -255,7 +255,7 @@ Buildable meters var/piping_layer = PIPING_LAYER_DEFAULT /obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) return wrench_act(user, W) return ..() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 8827dc8782..e9cb400746 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -78,11 +78,11 @@ if("p_layer") p_layer = text2num(params["p_layer"]) if("dispense_pipe") - if(!wait) + if(!wait) var/datum/pipe_recipe/recipe = locate(params["ref"]) if(!istype(recipe)) return - + var/target_dir = NORTH if(params["bent"]) target_dir = NORTHEAST @@ -116,7 +116,7 @@ user.drop_item() qdel(W) return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if (unwrenched==0) playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to unfasten \the [src] from the floor...") diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index bcc1f770a3..7a4951f065 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -81,12 +81,12 @@ return if(default_part_replacement(user, W)) return - if (!panel_open && W.is_wrench()) + if (!panel_open && W.has_tool_quality(TOOL_WRENCH)) P_type_t = tgui_input_list(usr, "Choose pipe type", "Pipe type", Pipes) P_type = Pipes[P_type_t] user.visible_message("[user] has set \the [src] to manufacture [P_type_t].", "You set \the [src] to manufacture [P_type_t].") return - if(!panel_open && W.is_crowbar()) + if(!panel_open && W.has_tool_quality(TOOL_CROWBAR)) a_dis = !a_dis user.visible_message("[user] has [!a_dis?"de":""]activated auto-dismantling.", "You [!a_dis?"de":""]activate auto-dismantling.") return diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index b0f7384b6f..ef29344f83 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -97,7 +97,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) return data /obj/machinery/pointdefense_control/attackby(var/obj/item/W, var/mob/user) - if(W?.is_multitool()) + if(W?.has_tool_quality(TOOL_MULTITOOL)) var/new_ident = tgui_input_text(user, "Enter a new ident tag.", "[src]", id_tag, MAX_NAME_LEN) new_ident = sanitize(new_ident,MAX_NAME_LEN) if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state)) @@ -178,7 +178,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) return PDC /obj/machinery/pointdefense/attackby(var/obj/item/W, var/mob/user) - if(W?.is_multitool()) + if(W?.has_tool_quality(TOOL_MULTITOOL)) var/new_ident = tgui_input_text(user, "Enter a new ident tag.", "[src]", id_tag, MAX_NAME_LEN) new_ident = sanitize(new_ident,MAX_NAME_LEN) if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state)) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index cc71d5983c..e880e12d2f 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -484,7 +484,7 @@ /obj/machinery/porta_turret/attackby(obj/item/I, mob/user) if(stat & BROKEN) - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) //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.") @@ -503,7 +503,7 @@ to_chat(user, "You remove the turret but did not manage to salvage anything.") qdel(src) // qdel - else if(I.is_wrench()) + else if(I.has_tool_quality(TOOL_WRENCH)) if(enabled || raised) to_chat(user, "You cannot unsecure an active turret!") return @@ -942,14 +942,14 @@ //this is a bit unwieldy but self-explanatory switch(build_step) if(0) //first step - if(I.is_wrench() && !anchored) + if(I.has_tool_quality(TOOL_WRENCH) && !anchored) playsound(src, I.usesound, 100, 1) to_chat(user, "You secure the external bolts.") anchored = TRUE build_step = 1 return - else if(I.is_crowbar() && !anchored) + else if(I.has_tool_quality(TOOL_CROWBAR) && !anchored) playsound(src, I.usesound, 75, 1) to_chat(user, "You dismantle the turret construction.") new /obj/item/stack/material/steel(loc, 5) @@ -967,7 +967,7 @@ to_chat(user, "You need two sheets of metal to continue construction.") return - else if(I.is_wrench()) + else if(I.has_tool_quality(TOOL_WRENCH)) playsound(src, I.usesound, 75, 1) to_chat(user, "You unfasten the external bolts.") anchored = FALSE @@ -975,14 +975,14 @@ return if(2) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) playsound(src, I.usesound, 100, 1) to_chat(user, "You bolt the metal armor into place.") build_step = 3 return - else if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = I + else if(I.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = I.get_welder() if(!WT.isOn()) return if(WT.get_fuel() < 5) //uses up 5 fuel. @@ -1015,7 +1015,7 @@ qdel(I) //delete the gun :( return - else if(I.is_wrench()) + else if(I.has_tool_quality(TOOL_WRENCH)) playsound(src, I.usesound, 100, 1) to_chat(user, "You remove the turret's metal armor bolts.") build_step = 2 @@ -1034,7 +1034,7 @@ //attack_hand() removes the gun if(5) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, I.usesound, 100, 1) build_step = 6 to_chat(user, "You close the internal access hatch.") @@ -1052,15 +1052,15 @@ to_chat(user, "You need two sheets of metal to continue construction.") return - else if(I.is_screwdriver()) + else if(I.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, I.usesound, 100, 1) build_step = 5 to_chat(user, "You open the internal access hatch.") return if(7) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = I + if(I.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = I.get_welder() if(!WT.isOn()) return if(WT.get_fuel() < 5) to_chat(user, "You need more fuel to complete this task.") @@ -1082,7 +1082,7 @@ qdel(src) // qdel - else if(I.is_crowbar()) + else if(I.has_tool_quality(TOOL_CROWBAR)) playsound(src, I.usesound, 75, 1) to_chat(user, "You pry off the turret's exterior armor.") new /obj/item/stack/material/steel(loc, 2) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 3d54c723e9..915f518ed2 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -126,7 +126,7 @@ update_icon() user.visible_message("[user] inserts [charging] into [src].", "You insert [charging] into [src].") - else if(portable && G.is_wrench()) + else if(portable && G.has_tool_quality(TOOL_WRENCH)) if(charging) to_chat(user, "Remove [charging] first!") return diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 6a271b81f4..a81b12da5c 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -15,7 +15,7 @@ light_range = 3 light_power = 1 light_on = FALSE - + var/obj/item/weapon/cell/cell var/cell_type = /obj/item/weapon/cell/high var/state = 0 @@ -96,7 +96,7 @@ else to_chat(user, "The hatch must be open to insert a power cell.") return - else if(I.is_screwdriver()) + else if(I.has_tool_quality(TOOL_SCREWDRIVER)) panel_open = !panel_open playsound(src, I.usesound, 50, 1) user.visible_message("[user] [panel_open ? "opens" : "closes"] the hatch on the [src].", "You [panel_open ? "open" : "close"] the hatch on the [src].") diff --git a/code/game/machinery/suit_storage/suit_cycler.dm b/code/game/machinery/suit_storage/suit_cycler.dm index 56a081737f..cdd6b45dc2 100644 --- a/code/game/machinery/suit_storage/suit_cycler.dm +++ b/code/game/machinery/suit_storage/suit_cycler.dm @@ -141,7 +141,7 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache) return //Hacking init. - if(istype(I, /obj/item/device/multitool) || I.is_wirecutter()) + if(istype(I, /obj/item/device/multitool) || I.has_tool_quality(TOOL_WIRECUTTER)) if(panel_open) attack_hand(user) return @@ -177,7 +177,7 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache) updateUsrDialog() return - else if(I.is_screwdriver()) + else if(I.has_tool_quality(TOOL_SCREWDRIVER)) panel_open = !panel_open playsound(src, I.usesound, 50, 1) diff --git a/code/game/machinery/suit_storage/suit_storage.dm b/code/game/machinery/suit_storage/suit_storage.dm index 334f5227d8..3134eee487 100644 --- a/code/game/machinery/suit_storage/suit_storage.dm +++ b/code/game/machinery/suit_storage/suit_storage.dm @@ -385,7 +385,7 @@ /obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob) if(!ispowered) return - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) panelopen = !panelopen playsound(src, I.usesound, 100, 1) to_chat(user, "You [panelopen ? "open up" : "close"] the unit's maintenance panel.") diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 377a02aa74..f3d4bb574f 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -45,7 +45,7 @@ drop_type = "supermatter" /obj/machinery/power/supply_beacon/attackby(var/obj/item/weapon/W, var/mob/user) - if(!use_power && W.is_wrench()) + if(!use_power && W.has_tool_quality(TOOL_WRENCH)) if(!anchored && !connect_to_network()) to_chat(user, "This device must be placed over an exposed cable.") return diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 3deb8452a0..ddc699983e 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -121,7 +121,7 @@ return /obj/machinery/power/singularity_beacon/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(active) to_chat(user, "You need to deactivate the beacon first!") return diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index be00cab96a..696b46af78 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -18,7 +18,7 @@ frame_types_wall = construction_frame_wall /obj/item/frame/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) new refund_type(get_turf(src.loc), refund_amt) qdel(src) return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 77c3187458..e3c6a90976 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -106,7 +106,7 @@ return if(default_unfasten_wrench(user, W, 40)) return - /*if(W.is_screwdriver()) + /*if(W.has_tool_quality(TOOL_SCREWDRIVER)) panel = !panel to_chat(user, "You [panel ? "open" : "close"] the [src]'s maintenance panel")*/ if(istype(W,/obj/item/weapon/pen/crayon) || istype(W,/obj/item/weapon/stamp)) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index ddab98d730..848eb7cc12 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1446,7 +1446,7 @@ to_chat(user, "Invalid ID: Access denied.") else to_chat(user, "Maintenance protocols disabled by operator.") - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(state==MECHA_BOLTS_SECURED) state = MECHA_PANEL_LOOSE to_chat(user, "You undo the securing bolts.") @@ -1454,7 +1454,7 @@ state = MECHA_BOLTS_SECURED to_chat(user, "You tighten the securing bolts.") return - else if(W.is_crowbar()) + else if(W.has_tool_quality(TOOL_CROWBAR)) if(state==MECHA_PANEL_LOOSE) state = MECHA_CELL_OPEN to_chat(user, "You open the hatch to the power unit") @@ -1487,7 +1487,7 @@ else to_chat(user, "There's not enough wire to finish the task.") return - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(hasInternalDamage(MECHA_INT_TEMP_CONTROL)) clearInternalDamage(MECHA_INT_TEMP_CONTROL) to_chat(user, "You repair the damaged temperature controller.") @@ -1526,8 +1526,8 @@ to_chat(user, "There's already a powercell installed.") return - else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HURT) - var/obj/item/weapon/weldingtool/WT = W + else if(W.has_tool_quality(TOOL_WELDER) && user.a_intent != I_HURT) + var/obj/item/weapon/weldingtool/WT = W.get_welder() var/obj/item/mecha_parts/component/hull/HC = internal_components[MECH_HULL] var/obj/item/mecha_parts/component/armor/AC = internal_components[MECH_ARMOR] if (WT.remove_fuel(0,user)) diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 0d8df0bb7a..f93b582fc2 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -3,19 +3,19 @@ //////////////////////////////// /datum/construction/mecha/custom_action(step, obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I - if (W.remove_fuel(0, user)) + if(I.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/W = I.get_welder() + if(W.remove_fuel(0, user)) playsound(holder, 'sound/items/Welder2.ogg', 50, 1) else return 0 - else if(I.is_wrench()) + else if(I.has_tool_quality(TOOL_WRENCH)) playsound(holder, 'sound/items/Ratchet.ogg', 50, 1) - else if(I.is_screwdriver()) + else if(I.has_tool_quality(TOOL_SCREWDRIVER)) playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1) - else if(I.is_wirecutter()) + else if(I.has_tool_quality(TOOL_WIRECUTTER)) playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1) else if(istype(I, /obj/item/stack/cable_coil)) @@ -35,19 +35,19 @@ return 1 /datum/construction/reversible/mecha/custom_action(index as num, diff as num, obj/item/I, mob/user as mob) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I - if (W.remove_fuel(0, user)) + if(I.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/W = I.get_welder() + if(W.remove_fuel(0, user)) playsound(holder, 'sound/items/Welder2.ogg', 50, 1) else return 0 - else if(I.is_wrench()) + else if(I.has_tool_quality(TOOL_WRENCH)) playsound(holder, 'sound/items/Ratchet.ogg', 50, 1) - else if(I.is_screwdriver()) + else if(I.has_tool_quality(TOOL_SCREWDRIVER)) playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1) - else if(I.is_wirecutter()) + else if(I.has_tool_quality(TOOL_WIRECUTTER)) playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1) else if(istype(I, /obj/item/stack/cable_coil)) @@ -102,7 +102,7 @@ result = "/obj/mecha/working/ripley" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -111,10 +111,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 @@ -310,7 +310,7 @@ result = "/obj/mecha/combat/gygax" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -319,10 +319,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/mecha_parts/part/gygax_armour, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 @@ -592,7 +592,7 @@ result = "/obj/mecha/combat/gygax/serenity" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -601,10 +601,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 @@ -876,7 +876,7 @@ result = "/obj/mecha/working/ripley/firefighter" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -889,10 +889,10 @@ "desc"="External armor is being installed."), //4 list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //5 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //6 @@ -1096,7 +1096,7 @@ result = "/obj/mecha/combat/durand" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -1105,10 +1105,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/mecha_parts/part/durand_armour, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 @@ -1378,7 +1378,7 @@ result = "/obj/mecha/medical/odysseus" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -1387,10 +1387,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 @@ -1587,7 +1587,7 @@ result = "/obj/mecha/combat/phazon" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -1596,10 +1596,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 @@ -1866,7 +1866,7 @@ result = "/obj/mecha/combat/phazon/janus" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_CROWBAR, "desc"="External armor is installed."), //2 @@ -1875,10 +1875,10 @@ "desc"="External armor is attached."), //3 list("key"=/obj/item/stack/material/morphium, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded"), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_CROWBAR, "desc"="Internal armor is wrenched"), //5 diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 5dbee5556b..01b5987112 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -31,8 +31,8 @@ /obj/effect/decal/mecha_wreckage/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(salvage_num <= 0) to_chat(user, "You don't see anything that can be cut with [W].") return @@ -49,7 +49,7 @@ else to_chat(user, "You need more welding fuel to complete this task.") return - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) if(salvage_num <= 0) to_chat(user, "You don't see anything that can be cut with [W].") return @@ -61,7 +61,7 @@ salvage_num-- else to_chat(user, "You failed to salvage anything valuable from [src].") - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) if(!isemptylist(crowbar_salvage)) var/obj/S = pick(crowbar_salvage) if(S) diff --git a/code/game/mecha/micro/mecha_construction_paths_vr.dm b/code/game/mecha/micro/mecha_construction_paths_vr.dm index 646cf7bc3e..0de51ca27d 100644 --- a/code/game/mecha/micro/mecha_construction_paths_vr.dm +++ b/code/game/mecha/micro/mecha_construction_paths_vr.dm @@ -33,7 +33,7 @@ result = "/obj/mecha/micro/sec/polecat" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -42,10 +42,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/mecha_parts/micro/part/polecat_armour, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 @@ -312,7 +312,7 @@ result = "/obj/mecha/micro/utility/gopher" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -321,10 +321,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 @@ -518,7 +518,7 @@ result = "/obj/mecha/micro/sec/weasel" steps = list( //1 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="External armor is wrenched."), //2 @@ -527,10 +527,10 @@ "desc"="External armor is installed."), //3 list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, + "backkey"=IS_WELDER, "desc"="Internal armor is welded."), //4 - list("key"=/obj/item/weapon/weldingtool, + list("key"=IS_WELDER, "backkey"=IS_WRENCH, "desc"="Internal armor is wrenched"), //5 diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index aa6560d149..1fc1e505d8 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -192,8 +192,8 @@ var/damage = W.force / 4.0 - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) damage = 15 diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 2915213d8a..0b298f2224 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -180,7 +180,7 @@ poster_set = TRUE /obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) playsound(src, W.usesound, 100, 1) if(ruined) to_chat(user, "You remove the remnants of the poster.") diff --git a/code/game/objects/effects/decals/posters/posters.dm b/code/game/objects/effects/decals/posters/posters.dm index 1a9710a566..74624bcb0d 100644 --- a/code/game/objects/effects/decals/posters/posters.dm +++ b/code/game/objects/effects/decals/posters/posters.dm @@ -165,7 +165,7 @@ flick("poster_being_set", src) /obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) playsound(src, W.usesound, 100, 1) if(ruined) to_chat(user, "You remove the remnants of the poster.") diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index aba53f81bc..7941a0fbbc 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -100,7 +100,7 @@ explode(M) /obj/effect/mine/attackby(obj/item/W as obj, mob/living/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) panel_open = !panel_open user.visible_message("[user] very carefully screws the mine's panel [panel_open ? "open" : "closed"].", "You very carefully screw the mine's panel [panel_open ? "open" : "closed"].") @@ -109,7 +109,7 @@ // Panel open, stay uncloaked, or uncloak if already cloaked. If you don't cloak on place, ignore it and just be normal alpha. alpha = camo_net ? (panel_open ? 255 : 50) : 255 - else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open) + else if((W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/device/multitool)) && panel_open) interact(user) else ..() @@ -308,7 +308,7 @@ return /obj/item/weapon/mine/attackby(obj/item/W as obj, mob/living/user as mob) - if(W.is_screwdriver() && trap) + if(W.has_tool_quality(TOOL_SCREWDRIVER) && trap) to_chat(user, "You begin removing \the [trap].") if(do_after(user, 10 SECONDS)) to_chat(user, "You finish disconnecting the mine's trigger.") diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 9f8ab64d80..0f211ffd94 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -30,8 +30,8 @@ var/damage = W.force / 4.0 - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) damage = 15 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7645988415..2fafbe7d27 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1022,3 +1022,6 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen /obj/item/proc/on_holder_escape(var/obj/item/weapon/holder/H) return + +/obj/item/proc/get_welder() + return \ No newline at end of file diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index e9219957e4..0dce9e0223 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -87,7 +87,7 @@ /obj/item/weapon/deskbell/attackby(obj/item/W, mob/user, params) if(!istype(W)) return - if(W.is_wrench() && isturf(loc)) + if(W.has_tool_quality(TOOL_WRENCH) && isturf(loc)) if(do_after(5)) if(!src) return to_chat(user, "You dissasemble the desk bell") diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 806056810e..f82d0f2448 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -67,7 +67,7 @@ src.name = "body bag" //..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri return - else if(W.is_wirecutter()) + else if(W.has_tool_quality(TOOL_WIRECUTTER)) to_chat(user, "You cut the tag off the bodybag") src.name = "body bag" cut_overlays() @@ -264,7 +264,7 @@ inject_occupant(H) break - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(syringe) if(used) to_chat(user,"The injector cannot be removed now that the stasis bag has been used!") diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 4fa7e7d983..981a48e8ed 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -96,7 +96,7 @@ to_chat(user, "You install a cell in \the [src].") update_icon() - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(bcell) bcell.update_icon() bcell.forceMove(get_turf(src.loc)) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 0b987e04c7..4e692b3347 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -37,7 +37,7 @@ power_supply = new cell_type(src) /obj/item/device/flash/attackby(var/obj/item/W, var/mob/user) - if(W.is_screwdriver() && broken) + if(W.has_tool_quality(TOOL_SCREWDRIVER) && broken) if(repairing) to_chat(user, "\The [src] is already being repaired!") return diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm index a374f19d8d..223ac5a1c4 100644 --- a/code/game/objects/items/devices/hacktool.dm +++ b/code/game/objects/items/devices/hacktool.dm @@ -9,7 +9,7 @@ var/list/known_targets var/list/supported_types var/datum/tgui_state/default/must_hack/hack_state - + /obj/item/device/multitool/hacktool/override hackspeed = 0.75 max_level = 5 @@ -31,7 +31,7 @@ return ..() /obj/item/device/multitool/hacktool/attackby(var/obj/item/W, var/mob/user) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) in_hack_mode = !in_hack_mode playsound(src, W.usesound, 50, 1) else @@ -78,7 +78,7 @@ if(D.security_level > max_level) to_chat(user, "\icon[src][bicon(src)] Target's electronic security is too complex.") return 0 - + var/found = known_targets.Find(D) if(found) known_targets.Swap(1, found) // Move the last hacked item first diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 784fb4ced3..0112b25dd3 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -54,7 +54,7 @@ else to_chat(user, "[src] already has a diode.") - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(diode) to_chat(user, "You remove the [diode.name] from the [src].") diode.loc = get_turf(src.loc) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 6fe9aea398..4a249cae00 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -66,9 +66,6 @@ return -/obj/item/device/multitool/is_multitool() - return TRUE - /obj/item/device/multitool/cyborg name = "multitool" desc = "Optimised and stripped-down version of a regular multitool." diff --git a/code/game/objects/items/devices/personal_shield_generator_vr.dm b/code/game/objects/items/devices/personal_shield_generator_vr.dm index ec398bcc83..82f71ff969 100644 --- a/code/game/objects/items/devices/personal_shield_generator_vr.dm +++ b/code/game/objects/items/devices/personal_shield_generator_vr.dm @@ -179,7 +179,7 @@ to_chat(user, "You install a cell in \the [src].") update_icon() - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(bcell) if(istype(bcell, /obj/item/weapon/cell/device/shield_generator/parry)) //CHOMPedit: Cannot remove the cell from Parry shields. to_chat(user,"You cannot remove the cell from this device.") //CHOMPedit: No cell removal. diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 339b57f055..9ed57621d2 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -30,7 +30,7 @@ ..() /obj/item/device/powersink/attackby(var/obj/item/I, var/mob/user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(mode == 0) var/turf/T = loc if(isturf(T) && !!T.is_plating()) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 6e6d6e132c..8f00890473 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -338,10 +338,10 @@ /obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob) // ..() user.set_machine(src) - if(!(W.is_screwdriver() || istype(W, /obj/item/device/encryptionkey))) + if(!(W.has_tool_quality(TOOL_SCREWDRIVER) || istype(W, /obj/item/device/encryptionkey))) return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(keyslot1 || keyslot2) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index b62033865a..5c272ce464 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -138,12 +138,12 @@ /obj/item/device/radio/intercom/attackby(obj/item/W as obj, mob/user as mob) add_fingerprint(user) - if(W.is_screwdriver()) // Opening the intercom up. + if(W.has_tool_quality(TOOL_SCREWDRIVER)) // Opening the intercom up. wiresexposed = !wiresexposed to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") playsound(src, W.usesound, 50, 1) update_icon() - else if(wiresexposed && W.is_wirecutter()) + else if(wiresexposed && W.has_tool_quality(TOOL_WIRECUTTER)) user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") playsound(src, W.usesound, 50, 1) new/obj/item/stack/cable_coil(get_turf(src), 5) @@ -180,7 +180,7 @@ /obj/item/device/radio/intercom/update_icon() var/area/A = get_area(src) on = A?.powered(EQUIP) - + cut_overlays() if(!on) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 07f86f7aee..011317edae 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -614,7 +614,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) /obj/item/device/radio/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() user.set_machine(src) - if (!W.is_screwdriver()) + if (!W.has_tool_quality(TOOL_SCREWDRIVER)) return b_stat = !( b_stat ) if(!istype(src, /obj/item/device/radio/beacon)) @@ -666,10 +666,10 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) /obj/item/device/radio/borg/attackby(obj/item/weapon/W as obj, mob/user as mob) // ..() user.set_machine(src) - if (!(W.is_screwdriver() || istype(W, /obj/item/device/encryptionkey))) + if (!(W.has_tool_quality(TOOL_SCREWDRIVER) || istype(W, /obj/item/device/encryptionkey))) return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(keyslot) diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index a92bf815b8..5f6eed3327 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -110,7 +110,7 @@ else to_chat(user, "Error: The device is linked to another monitor.") - else if(W.is_wrench() && user.a_intent != I_HURT) + else if(W.has_tool_quality(TOOL_WRENCH) && user.a_intent != I_HURT) if(isturf(loc)) anchored = !anchored diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index dda476191b..1d073ab3fe 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -146,7 +146,7 @@ to_chat(user, "You switch \the [src] [on ? "on" : "off"].") /obj/item/device/suit_cooling_unit/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (W.is_screwdriver()) + if (W.has_tool_quality(TOOL_SCREWDRIVER)) if(cover_open) cover_open = 0 to_chat(user, "You screw the panel into place.") @@ -237,7 +237,7 @@ return cell /obj/item/device/suit_cooling_unit/emergency/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (W.is_screwdriver()) + if (W.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "This cooler's cell is permanently installed!") return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index d3923a478d..aa726314fe 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -418,7 +418,7 @@ /obj/item/device/tape/attackby(obj/item/I, mob/user, params) - if(ruined && I.is_screwdriver()) + if(ruined && I.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "You start winding the tape back in...") playsound(src, I.usesound, 50, 1) if(do_after(user, 120 * I.toolspeed, target = src)) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index bf132c7cf9..12423a91f3 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -33,8 +33,8 @@ /obj/item/target/attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if (W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) cut_overlays() to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.") diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 7bdba226a1..91626ec903 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -44,8 +44,8 @@ stacktype = material.stack_type /obj/item/stack/tile/attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if (W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(can_weld == FALSE) to_chat("You can't reform these into their original components.") diff --git a/code/game/objects/items/uav.dm b/code/game/objects/items/uav.dm index 2dc4cad3ee..20bb85d69b 100644 --- a/code/game/objects/items/uav.dm +++ b/code/game/objects/items/uav.dm @@ -118,7 +118,7 @@ visible_message("[user] pairs [I] to [nickname]") toggle_pairing() - else if(I.is_screwdriver() && cell) + else if(I.has_tool_quality(TOOL_SCREWDRIVER) && cell) if(do_after(user, 3 SECONDS, src)) to_chat(user, "You remove [cell] into [nickname].") playsound(src, I.usesound, 50, 1) diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS_vr.dm index 2e1cfc4b3d..98d8940640 100644 --- a/code/game/objects/items/weapons/RMS_vr.dm +++ b/code/game/objects/items/weapons/RMS_vr.dm @@ -250,7 +250,7 @@ return 1 /obj/item/weapon/rms/attackby(obj/item/W, mob/user) - if(W.is_multitool()) + if(W.has_tool_quality(TOOL_MULTITOOL)) overcharge = !overcharge if(overcharge) to_chat(user, "The Rapid Material Synthesizer quietly whirrs...") diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index 7663dfd7ff..8fc58d8664 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -26,8 +26,8 @@ /obj/item/weapon/flame/candle/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool light("\The [user] casually lights the [src] with [W].") else if(istype(W, /obj/item/weapon/flame/lighter)) diff --git a/code/game/objects/items/weapons/circuitboards/computer/research.dm b/code/game/objects/items/weapons/circuitboards/computer/research.dm index 8de61a2b91..43ea3d3cd6 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/research.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/research.dm @@ -7,7 +7,7 @@ build_path = /obj/machinery/computer/rdconsole/core /obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, I.usesound, 50, 1) user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") if(build_path == /obj/machinery/computer/rdconsole/core) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 4305ecf180..380de53fd2 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -12,7 +12,7 @@ /obj/item/weapon/stock_parts/scanning_module = 1) /obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, I.usesound, 50, 1) user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") if(build_path == /obj/machinery/r_n_d/server/core) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 0e9250611e..494984b170 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -29,11 +29,11 @@ return ..() /obj/item/weapon/plastique/attackby(var/obj/item/I, var/mob/user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) open_panel = !open_panel to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") playsound(src, I.usesound, 50, 1) - else if(I.is_wirecutter() || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) + else if(I.has_tool_quality(TOOL_WIRECUTTER) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) wires.Interact(user) else ..() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index b20a44650e..287a174fbf 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -69,7 +69,7 @@ /obj/item/weapon/flamethrower/attackby(obj/item/W as obj, mob/user as mob) if(user.stat || user.restrained() || user.lying) return - if(W.is_wrench() && !status)//Taking this apart + if(W.has_tool_quality(TOOL_WRENCH) && !status)//Taking this apart var/turf/T = get_turf(src) if(weldtool) weldtool.loc = T @@ -84,7 +84,7 @@ qdel(src) return - if(W.is_screwdriver() && igniter && !lit) + if(W.has_tool_quality(TOOL_SCREWDRIVER) && igniter && !lit) status = !status to_chat(user, "[igniter] is now [status ? "secured" : "unsecured"]!") update_icon() diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index c30b47a7f4..6e4379367f 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -49,7 +49,7 @@ /obj/effect/spresent/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() - if (!W.is_wirecutter()) + if (!W.has_tool_quality(TOOL_WIRECUTTER)) to_chat(user, "I need wirecutters for that.") return @@ -132,7 +132,7 @@ to_chat(user, "You MUST put the paper on a table!") if (W.w_class < ITEMSIZE_LARGE) var/obj/item/I = user.get_inactive_hand() - if(I.is_wirecutter()) + if(I.has_tool_quality(TOOL_WIRECUTTER)) var/a_used = 2 ** (src.w_class - 1) if (src.amount < a_used) to_chat(user, "You need more paper!") diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 1a19b98910..c0c08d94fc 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -78,7 +78,7 @@ icon_state = initial(icon_state) +"_ass" name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]" stage = 1 - else if(W.is_screwdriver() && path != 2) + else if(W.has_tool_quality(TOOL_SCREWDRIVER) && path != 2) if(stage == 1) path = 1 if(beakers.len) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 9bdf650c64..38565fea0d 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -92,7 +92,7 @@ /obj/item/weapon/grenade/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) switch(det_time) if (1) det_time = 10 diff --git a/code/game/objects/items/weapons/implants/implantcircuits.dm b/code/game/objects/items/weapons/implants/implantcircuits.dm index ffe6547fcb..9dcc4853a0 100644 --- a/code/game/objects/items/weapons/implants/implantcircuits.dm +++ b/code/game/objects/items/weapons/implants/implantcircuits.dm @@ -39,7 +39,7 @@ return IC.examine(user) /obj/item/weapon/implant/integrated_circuit/attackby(var/obj/item/O, var/mob/user) - if(O.is_crowbar() || istype(O, /obj/item/device/integrated_electronics) || istype(O, /obj/item/integrated_circuit) || O.is_screwdriver() || istype(O, /obj/item/weapon/cell/device) ) + if(O.has_tool_quality(TOOL_CROWBAR) || istype(O, /obj/item/device/integrated_electronics) || istype(O, /obj/item/integrated_circuit) || O.has_tool_quality(TOOL_SCREWDRIVER) || istype(O, /obj/item/weapon/cell/device) ) IC.attackby(O, user) else ..() diff --git a/code/game/objects/items/weapons/improvised_components.dm b/code/game/objects/items/weapons/improvised_components.dm index 928a7c1a5d..c4272a5e10 100644 --- a/code/game/objects/items/weapons/improvised_components.dm +++ b/code/game/objects/items/weapons/improvised_components.dm @@ -7,7 +7,7 @@ thrown_force_divisor = 0.1 /obj/item/weapon/material/butterflyconstruction/attackby(obj/item/W as obj, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "You finish the concealed blade weapon.") playsound(src, W.usesound, 50, 1) new /obj/item/weapon/material/butterfly(user.loc, material.name) diff --git a/code/game/objects/items/weapons/inducer_vr.dm b/code/game/objects/items/weapons/inducer_vr.dm index b5fceb0daf..f2f77593ea 100644 --- a/code/game/objects/items/weapons/inducer_vr.dm +++ b/code/game/objects/items/weapons/inducer_vr.dm @@ -77,7 +77,7 @@ /obj/item/weapon/inducer/attackby(obj/item/W, mob/user) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) if(!opened) to_chat(user, "You open the battery compartment.") diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm index 83d65a6c3b..0505e6a8e6 100644 --- a/code/game/objects/items/weapons/material/gravemarker.dm +++ b/code/game/objects/items/weapons/material/gravemarker.dm @@ -12,7 +12,7 @@ var/epitaph = "" //A quick little blurb /obj/item/weapon/material/gravemarker/attackby(obj/item/weapon/W, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) var/carving_1 = sanitizeSafe(tgui_input_text(user, "Who is \the [src.name] for?", "Gravestone Naming", null, MAX_NAME_LEN), MAX_NAME_LEN) if(carving_1) user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].") @@ -27,7 +27,7 @@ user.visible_message("[user] carves something into \the [src.name].", "You carve your message into \the [src.name].") epitaph += carving_2 update_icon() - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].") if(do_after(user, material.hardness * W.toolspeed)) material.place_dismantled_product(get_turf(src)) diff --git a/code/game/objects/items/weapons/material/material_armor.dm b/code/game/objects/items/weapons/material/material_armor.dm index 7fb5efad6e..7f16d57a1c 100644 --- a/code/game/objects/items/weapons/material/material_armor.dm +++ b/code/game/objects/items/weapons/material/material_armor.dm @@ -290,7 +290,7 @@ Protectiveness | Armor % unbreakable = FALSE name = "plate insert" desc = "used to craft armor plates for a plate carrier. Trim with a welder for light armor or add a second for heavy armor" - + /obj/item/weapon/material/armor_plating/attackby(var/obj/O, mob/user) if(istype(O, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/S = O @@ -323,12 +323,12 @@ Protectiveness | Armor % ..() //Make plating inserts for modular armour. -/obj/item/weapon/material/armor_plating/insert/attackby(var/obj/O, mob/user) +/obj/item/weapon/material/armor_plating/insert/attackby(var/obj/item/O, mob/user) . = ..() - if(istype(O, /obj/item/weapon/weldingtool)) - var /obj/item/weapon/weldingtool/S = O + if(O.has_tool_quality(TOOL_WELDER)) + var /obj/item/weapon/weldingtool/S = O.get_welder() if(S.remove_fuel(0,user)) if(!src || !S.isOn()) return to_chat(user, "You trim down the edges to size.") diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 59cc5f3edd..dbae1eead7 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -47,8 +47,8 @@ alpha = 255 /obj/item/weapon/material/shard/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/weldingtool) && material.shard_can_repair) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER) && material.shard_can_repair) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) material.place_sheet(loc) qdel(src) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 51ef157f61..e28f20019f 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -145,7 +145,7 @@ update_icon() else to_chat(user, "[src] already has a cell.") - else if(W.is_screwdriver() && bcell) + else if(W.has_tool_quality(TOOL_SCREWDRIVER) && bcell) bcell.update_icon() bcell.forceMove(get_turf(loc)) bcell = null diff --git a/code/game/objects/items/weapons/melee/misc_vr.dm b/code/game/objects/items/weapons/melee/misc_vr.dm index d06c4b82bf..b14a36e1f4 100644 --- a/code/game/objects/items/weapons/melee/misc_vr.dm +++ b/code/game/objects/items/weapons/melee/misc_vr.dm @@ -13,22 +13,4 @@ sharp = TRUE edge = FALSE attack_verb = list("stabbed", "lunged at", "dextrously struck", "sliced", "lacerated", "impaled", "diced", "charioted") - hitsound = 'sound/weapons/bladeslice.ogg' - -/obj/item/weapon/melee/altevian_wrench - name = "Hull Systems Multi-Wrench" - desc = "A wrench designed with a method to help secure and access bolts, hatches, and airlocks on altevian designed vessels. This operates as nothing more than a massive wrench when used for other purposes." - icon = 'icons/obj/weapons_vr.dmi' - icon_state = "altevian-wrench" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_melee_vr.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi', - ) - slot_flags = SLOT_BACK - force = 25 - throwforce = 15 - w_class = ITEMSIZE_HUGE - sharp = FALSE - edge = FALSE - attack_verb = list("whacked", "slammed", "bashed", "wrenched", "fixed", "bolted", "clonked", "bonked") - hitsound = 'sound/weapons/smash.ogg' \ No newline at end of file + hitsound = 'sound/weapons/bladeslice.ogg' \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index dd411e85c5..95b38bb5d8 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -158,8 +158,8 @@ /obj/item/weapon/storage/belt/utility/chief/full starts_with = list( - /obj/item/weapon/tool/screwdriver/power, - /obj/item/weapon/tool/crowbar/power, + /obj/item/weapon/tool/transforming/powerdrill, + /obj/item/weapon/tool/transforming/jawsoflife, /obj/item/weapon/weldingtool/experimental, /obj/item/device/multitool, /obj/item/stack/cable_coil/random_belt, diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 2fa1e33c03..ce0e105f01 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -43,7 +43,7 @@ playsound(src, "sparks", 50, 1) return - if (W.is_screwdriver()) + if (W.has_tool_quality(TOOL_SCREWDRIVER)) if (do_after(user, 20 * W.toolspeed)) src.open =! src.open playsound(src, W.usesound, 50, 1) diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 9c6795aa12..fdd28c1a0e 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -97,9 +97,9 @@ /obj/item/weapon/storage/toolbox/syndicate/powertools starts_with = list( /obj/item/clothing/gloves/yellow, - /obj/item/weapon/tool/screwdriver/power, + /obj/item/weapon/tool/transforming/powerdrill, /obj/item/weapon/weldingtool/experimental, - /obj/item/weapon/tool/crowbar/power, + /obj/item/weapon/tool/transforming/jawsoflife, /obj/item/device/multitool, /obj/item/stack/cable_coil/random_belt, /obj/item/device/analyzer diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 198eeda966..fc0bd1856d 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -328,7 +328,6 @@ description_antag = "This case will likely contain a charged fuel rod gun, and a few fuel rods to go with it. It can only hold the fuel rod gun, fuel rods, batteries, a screwdriver, and stock machine parts." force = 12 //Anti-rad lined i.e. Lead, probably gonna hurt a bit if you get bashed with it. can_hold = list(/obj/item/weapon/gun/magnetic/fuelrod, /obj/item/weapon/fuel_assembly, /obj/item/weapon/cell, /obj/item/weapon/stock_parts, /obj/item/weapon/tool/screwdriver) - cant_hold = list(/obj/item/weapon/tool/screwdriver/power) starts_with = list( /obj/item/weapon/gun/magnetic/fuelrod, /obj/item/weapon/fuel_assembly/deuterium, diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 050c1290f9..3124726e7c 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -39,7 +39,6 @@ /obj/item/weapon/makeover, /obj/item/pizzavoucher //VOREStation edit ) - cant_hold = list(/obj/item/weapon/tool/screwdriver/power) slot_flags = SLOT_ID var/obj/item/weapon/card/id/front_id = null diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index 0f70a805dd..5e519f8f4f 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -106,7 +106,7 @@ /obj/item/weapon/flame/lighter/zippo/c4detonator/attackby(obj/item/weapon/W, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) detonator_mode = !detonator_mode playsound(src, W.usesound, 50, 1) to_chat(user, "You unscrew the top panel of \the [src] revealing a button.") diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 7fbc4ff547..26ca107281 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -130,7 +130,7 @@ var/list/global/tank_gauge_cache = list() to_chat(user, "You attach the wires to the tank.") src.add_bomb_overlay() - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) if(wired && src.proxyassembly.assembly) to_chat(user, "You carefully begin clipping the wires that attach to the tank.") @@ -185,7 +185,7 @@ var/list/global/tank_gauge_cache = list() to_chat(user, "You need to wire the device up first.") - if(istype(W, /obj/item/weapon/weldingtool/)) + if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(1,user)) if(!valve_welded) diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 06c1e53e07..8d7c1add85 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -72,34 +72,40 @@ toolspeed = 0.5 /obj/item/weapon/tool/crowbar/power - name = "jaws of life" - desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head." - icon_state = "jaws_pry" - item_state = "jawsoflife" - matter = list(MAT_METAL=150, MAT_SILVER=50) - origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + name = "power pryer" + desc = "You shouldn't see this." usesound = 'sound/items/jaws_pry.ogg' force = 15 toolspeed = 0.25 - var/obj/item/weapon/tool/wirecutters/power/counterpart = null -/obj/item/weapon/tool/crowbar/power/New(newloc, no_counterpart = TRUE) - ..(newloc) - if(!counterpart && no_counterpart) - counterpart = new(src, FALSE) - counterpart.counterpart = src +/* + * Prybar + */ -/obj/item/weapon/tool/crowbar/power/Destroy() - if(counterpart) - counterpart.counterpart = null // So it can qdel cleanly. - QDEL_NULL(counterpart) - return ..() +/obj/item/weapon/tool/prybar + name = "pry bar" + desc = "A steel bar with a wedge, designed specifically for opening unpowered doors in an emergency. It comes in a variety of configurations - collect them all!" + icon = 'icons/obj/tools_vr.dmi' + icon_state = "prybar" + item_state = "crowbar" + slot_flags = SLOT_BELT + force = 4 + throwforce = 5 + pry = 1 + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_ENGINEERING = 1) + matter = list(MAT_STEEL = 30) + attack_verb = list("whapped", "smacked", "swatted", "thwacked", "hit") + usesound = 'sound/items/crowbar.ogg' + toolspeed = 1 + var/random_color = TRUE -/obj/item/weapon/tool/crowbar/power/attack_self(mob/user) - playsound(src, 'sound/items/change_jaws.ogg', 50, 1) - user.drop_item(src) - counterpart.forceMove(get_turf(src)) - counterpart.persist_storable = persist_storable - src.forceMove(counterpart) - user.put_in_active_hand(counterpart) - to_chat(user, "You attach the cutting jaws to [src].") +/obj/item/weapon/tool/prybar/red + icon_state = "prybar_red" + item_state = "crowbar_red" + random_color = FALSE + +/obj/item/weapon/tool/prybar/New() + if(random_color) + icon_state = "prybar[pick("","_green","_aubergine","_blue")]" + . = ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools/crowbar_vr.dm b/code/game/objects/items/weapons/tools/crowbar_vr.dm deleted file mode 100644 index b846a0e294..0000000000 --- a/code/game/objects/items/weapons/tools/crowbar_vr.dm +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Prybar - */ - -/obj/item/weapon/tool/prybar - name = "pry bar" - desc = "A steel bar with a wedge, designed specifically for opening unpowered doors in an emergency. It comes in a variety of configurations - collect them all!" - icon = 'icons/obj/tools_vr.dmi' - icon_state = "prybar" - item_state = "crowbar" - slot_flags = SLOT_BELT - force = 4 - throwforce = 5 - pry = 1 - w_class = ITEMSIZE_SMALL - origin_tech = list(TECH_ENGINEERING = 1) - matter = list(MAT_STEEL = 30) - attack_verb = list("whapped", "smacked", "swatted", "thwacked", "hit") - usesound = 'sound/items/crowbar.ogg' - toolspeed = 1 - var/random_color = TRUE - -/obj/item/weapon/tool/prybar/red - icon_state = "prybar_red" - item_state = "crowbar_red" - random_color = FALSE - -/obj/item/weapon/tool/prybar/New() - if(random_color) - icon_state = "prybar[pick("","_green","_aubergine","_blue")]" - . = ..() diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index 36096c104d..f2d4b7de77 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -106,42 +106,10 @@ toolspeed = 0.5 /obj/item/weapon/tool/screwdriver/power - name = "hand drill" - desc = "A simple powered hand drill. It's fitted with a screw bit." - icon_state = "drill_screw" - item_state = "drill" - matter = list(MAT_STEEL = 150, MAT_SILVER = 50) - origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) - slot_flags = SLOT_BELT + name = "power screwdriver" + desc = "You shouldn't see this." force = 8 - w_class = ITEMSIZE_SMALL - throwforce = 8 - throw_speed = 2 - throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far attack_verb = list("drilled", "screwed", "jabbed", "whacked") hitsound = 'sound/items/drill_hit.ogg' usesound = 'sound/items/drill_use.ogg' - toolspeed = 0.25 - random_color = FALSE - var/obj/item/weapon/tool/wrench/power/counterpart = null - -/obj/item/weapon/tool/screwdriver/power/New(newloc, no_counterpart = TRUE) - ..(newloc) - if(!counterpart && no_counterpart) - counterpart = new(src, FALSE) - counterpart.counterpart = src - -/obj/item/weapon/tool/screwdriver/power/Destroy() - if(counterpart) - counterpart.counterpart = null // So it can qdel cleanly. - QDEL_NULL(counterpart) - return ..() - -/obj/item/weapon/tool/screwdriver/power/attack_self(mob/user) - playsound(src,'sound/items/change_drill.ogg',50,1) - user.drop_item(src) - counterpart.forceMove(get_turf(src)) - counterpart.persist_storable = persist_storable - src.forceMove(counterpart) - user.put_in_active_hand(counterpart) - to_chat(user, "You attach the bolt driver bit to [src].") + toolspeed = 0.25 \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools/transforming.dm b/code/game/objects/items/weapons/tools/transforming.dm new file mode 100644 index 0000000000..0cd4c2c42c --- /dev/null +++ b/code/game/objects/items/weapons/tools/transforming.dm @@ -0,0 +1,182 @@ +/obj/item/weapon/tool/transforming + name = "transforming tool" + desc = "You should never see this..." + var/list/possible_tooltypes = list() + var/current_tooltype = 1 + var/obj/item/weapon/weldingtool/welder + var/weldertype = /obj/item/weapon/weldingtool/dummy + +/obj/item/weapon/tool/transforming/New(newloc, no_counterpart = TRUE) + ..(newloc) + if(TOOL_WELDER in possible_tooltypes) + welder = new weldertype(src) + on_tool_switch() + +/obj/item/weapon/tool/transforming/Destroy() + if(welder) + QDEL_NULL(welder) + ..() + +/obj/item/weapon/tool/transforming/get_welder() + return welder + +/obj/item/weapon/tool/transforming/attack_self(mob/user) + if(!possible_tooltypes.len || possible_tooltypes.len < 2) + return + if(current_tooltype == possible_tooltypes.len) + current_tooltype = 1 + else + current_tooltype++ + + on_tool_switch(user) + +/obj/item/weapon/tool/transforming/proc/on_tool_switch(var/mob/user) + return + +/obj/item/weapon/tool/transforming/jawsoflife + name = "jaws of life" + desc = "A set of jaws of life, compressed through the magic of science." + icon = 'icons/obj/tools.dmi' + icon_state = "jaws_pry" + item_state = "jawsoflife" + origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + matter = list(MAT_METAL=150, MAT_SILVER=50) + usesound = 'sound/items/jaws_pry.ogg' + force = 15 + toolspeed = 0.25 + sharp = TRUE + edge = TRUE + attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked", "pinched", "nipped") + possible_tooltypes = list(TOOL_CROWBAR,TOOL_WIRECUTTER) + +/obj/item/weapon/tool/transforming/jawsoflife/on_tool_switch(var/mob/user) + switch(possible_tooltypes[current_tooltype]) + if(TOOL_CROWBAR) + desc = initial(desc) + " It's fitted with a prying head." + icon_state = "jaws_pry" + usesound = 'sound/items/jaws_pry.ogg' + tool_qualities = list(TOOL_CROWBAR) + if(user) + playsound(src, 'sound/items/change_jaws.ogg', 50, 1) + to_chat(user, "You attach the pry jaws to [src].") + if(TOOL_WIRECUTTER) + desc = initial(desc) + " It's fitted with a cutting head." + icon_state = "jaws_cutter" + usesound = 'sound/items/jaws_cut.ogg' + tool_qualities = list(TOOL_WIRECUTTER) + if(user) + playsound(src, 'sound/items/change_jaws.ogg', 50, 1) + to_chat(user, "You attach the cutting jaws to [src].") + +/obj/item/weapon/tool/transforming/powerdrill + name = "hand drill" + desc = "A simple powered hand drill." + icon = 'icons/obj/tools.dmi' + icon_state = "drill_bolt" + item_state = "drill" + origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + matter = list(MAT_STEEL = 150, MAT_SILVER = 50) + hitsound = 'sound/items/drill_hit.ogg' + usesound = 'sound/items/drill_use.ogg' + force = 8 + throwforce = 8 + toolspeed = 0.25 + sharp = FALSE + edge = FALSE + attack_verb = list("drilled", "screwed", "jabbed", "whacked") + possible_tooltypes = list(TOOL_WRENCH,TOOL_SCREWDRIVER) + +/obj/item/weapon/tool/transforming/powerdrill/on_tool_switch(var/mob/user) + switch(possible_tooltypes[current_tooltype]) + if(TOOL_WRENCH) + desc = initial(desc) + " It's fitted with a bolt driver." + icon_state = "drill_bolt" + sharp = FALSE + tool_qualities = list(TOOL_WRENCH) + if(user) + playsound(src,'sound/items/change_drill.ogg',50,1) + to_chat(user, "You attach the bolt driver to [src].") + if(TOOL_SCREWDRIVER) + desc = initial(desc) + " It's fitted with a screw driver." + icon_state = "drill_screw" + sharp = TRUE + tool_qualities = list(TOOL_SCREWDRIVER) + if(user) + playsound(src,'sound/items/change_drill.ogg',50,1) + to_chat(user, "You attach the screw driver to [src].") + +/obj/item/weapon/tool/transforming/altevian + name = "Hull Systems Omni-Tool" + desc = "A big and bulky tool, used by altevians for exterior operations. Can take shape of any regular tool, scaled up to a comically large size." + icon = 'icons/obj/weapons_vr.dmi' + icon_state = "altevian-wrench" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi', + ) + slot_flags = SLOT_BACK + w_class = ITEMSIZE_HUGE + force = 25 + throwforce = 15 + toolspeed = 0.25 + sharp = FALSE + edge = FALSE + attack_verb = list("whacked", "slammed", "bashed", "wrenched", "fixed", "bolted", "clonked", "bonked") + hitsound = 'sound/weapons/smash.ogg' + possible_tooltypes = list(TOOL_WRENCH,TOOL_CROWBAR,TOOL_WIRECUTTER,TOOL_SCREWDRIVER,TOOL_MULTITOOL,TOOL_WELDER) + weldertype = /obj/item/weapon/weldingtool/dummy/altevian + +/obj/item/weapon/tool/transforming/altevian/on_tool_switch(var/mob/user) + switch(possible_tooltypes[current_tooltype]) + if(TOOL_WRENCH) + desc = initial(desc) + " It's currently in bolting mode." + icon_state = "altevian-wrench" + usesound = 'sound/items/ratchet.ogg' + tool_qualities = list(TOOL_WRENCH) + if(user) + playsound(src,'sound/items/ratchet.ogg',50,1) + to_chat(user, "You reconfigure [src] into bolting mode.") + if(TOOL_CROWBAR) + desc = initial(desc) + " It's currently in prying mode." + icon_state = "altevian-crowbar" + usesound = 'sound/items/crowbar.ogg' + tool_qualities = list(TOOL_CROWBAR) + if(user) + playsound(src,'sound/items/ratchet.ogg',50,1) + to_chat(user, "You reconfigure [src] into prying mode.") + if(TOOL_WIRECUTTER) + desc = initial(desc) + " It's currently in cutting mode." + icon_state = "altevian-wirecutter" + usesound = 'sound/items/wirecutter.ogg' + tool_qualities = list(TOOL_WIRECUTTER) + if(user) + playsound(src,'sound/items/ratchet.ogg',50,1) + to_chat(user, "You reconfigure [src] into cutting mode.") + if(TOOL_SCREWDRIVER) + desc = initial(desc) + " It's currently in screwing mode." + icon_state = "altevian-screwdriver" + usesound = 'sound/items/screwdriver.ogg' + tool_qualities = list(TOOL_SCREWDRIVER) + if(user) + playsound(src,'sound/items/ratchet.ogg',50,1) + to_chat(user, "You reconfigure [src] into screwing mode.") + if(TOOL_MULTITOOL) + desc = initial(desc) + " It's currently in pulsing mode." + icon_state = "altevian-pulser" + usesound = 'sound/items/screwdriver.ogg' + tool_qualities = list(TOOL_MULTITOOL) + if(user) + playsound(src,'sound/items/ratchet.ogg',50,1) + to_chat(user, "You reconfigure [src] into pulsing mode.") + if(TOOL_WELDER) + desc = initial(desc) + " It's currently in welding mode." + icon_state = "altevian-welder-on" + welder.usesound = 'sound/items/Welder2.ogg' + usesound = 'sound/items/Welder2.ogg' + tool_qualities = list(TOOL_WELDER) + if(user) + playsound(src,'sound/items/ratchet.ogg',50,1) + to_chat(user, "You reconfigure [src] into welding mode.") + +/obj/item/weapon/weldingtool/dummy/altevian + toolspeed = 0.25 \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 0f0195ffcd..a217e00baf 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -41,6 +41,7 @@ toolspeed = 1 drop_sound = 'sound/items/drop/weldingtool.ogg' pickup_sound = 'sound/items/pickup/weldingtool.ogg' + tool_qualities = list(TOOL_WELDER) /obj/item/weapon/weldingtool/Initialize() . = ..() @@ -58,6 +59,9 @@ STOP_PROCESSING(SSobj, src) return ..() +/obj/item/weapon/weldingtool/get_welder() + return src + /obj/item/weapon/weldingtool/examine(mob/user) . = ..() if(max_fuel && loc == user) @@ -690,4 +694,22 @@ else setWelding(FALSE, M.occupant) + +/obj/item/weapon/weldingtool/dummy + name = "dummy welding tool" + desc = "you shouldn't be reading this. Tell a dev!" + welding = TRUE + +/obj/item/weapon/weldingtool/dummy/process() + return + +/obj/item/weapon/weldingtool/dummy/get_fuel() + return get_max_fuel() + +/obj/item/weapon/weldingtool/dummy/remove_fuel(var/amount = 1, var/mob/M = null) + return TRUE + +/obj/item/weapon/weldingtool/dummy/isOn() + return TRUE + #undef WELDER_FUEL_BURN_INTERVAL diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index 035cb2300c..e071de2a33 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -98,35 +98,8 @@ reach = 2 /obj/item/weapon/tool/wirecutters/power - name = "jaws of life" - desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head." - icon_state = "jaws_cutter" - item_state = "jawsoflife" - origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) - matter = list(MAT_METAL=150, MAT_SILVER=50) + name = "power cutters" + desc = "You shouldn't see this." usesound = 'sound/items/jaws_cut.ogg' force = 15 - toolspeed = 0.25 - random_color = FALSE - var/obj/item/weapon/tool/crowbar/power/counterpart = null - -/obj/item/weapon/tool/wirecutters/power/New(newloc, no_counterpart = TRUE) - ..(newloc) - if(!counterpart && no_counterpart) - counterpart = new(src, FALSE) - counterpart.counterpart = src - -/obj/item/weapon/tool/wirecutters/power/Destroy() - if(counterpart) - counterpart.counterpart = null // So it can qdel cleanly. - QDEL_NULL(counterpart) - return ..() - -/obj/item/weapon/tool/wirecutters/power/attack_self(mob/user) - playsound(src, 'sound/items/change_jaws.ogg', 50, 1) - user.drop_item(src) - counterpart.forceMove(get_turf(src)) - counterpart.persist_storable = persist_storable - src.forceMove(counterpart) - user.put_in_active_hand(counterpart) - to_chat(user, "You attach the pry jaws to [src].") + toolspeed = 0.25 \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 8745e65a1c..2b1a3e30a8 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -74,37 +74,10 @@ origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5) /obj/item/weapon/tool/wrench/power - name = "hand drill" - desc = "A simple powered hand drill. It's fitted with a bolt bit." - icon_state = "drill_bolt" - item_state = "drill" + name = "power wrench" + desc = "You shouldn't see this." usesound = 'sound/items/drill_use.ogg' - matter = list(MAT_STEEL = 150, MAT_SILVER = 50) - origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) force = 8 - w_class = ITEMSIZE_SMALL throwforce = 8 attack_verb = list("drilled", "screwed", "jabbed") toolspeed = 0.25 - var/obj/item/weapon/tool/screwdriver/power/counterpart = null - -/obj/item/weapon/tool/wrench/power/New(newloc, no_counterpart = TRUE) - ..(newloc) - if(!counterpart && no_counterpart) - counterpart = new(src, FALSE) - counterpart.counterpart = src - -/obj/item/weapon/tool/wrench/power/Destroy() - if(counterpart) - counterpart.counterpart = null // So it can qdel cleanly. - QDEL_NULL(counterpart) - return ..() - -/obj/item/weapon/tool/wrench/power/attack_self(mob/user) - playsound(src,'sound/items/change_drill.ogg',50,1) - user.drop_item(src) - counterpart.forceMove(get_turf(src)) - counterpart.persist_storable = persist_storable - src.forceMove(counterpart) - user.put_in_active_hand(counterpart) - to_chat(user, "You attach the screw driver bit to [src].") diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index c183bc5c76..7bc406166c 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -244,7 +244,7 @@ var/inc_damage = W.force - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) if(!shock(user, 100, pick(BP_L_HAND, BP_R_HAND))) playsound(src, W.usesound, 100, 1) inc_damage *= 3 diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index e7360d409b..5e64329517 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -25,8 +25,8 @@ /obj/random/tool/powermaint/item_to_spawn() return pick(prob(320);/obj/random/tool, - prob(1);/obj/item/weapon/tool/screwdriver/power, - prob(1);/obj/item/weapon/tool/wirecutters/power, + prob(1);/obj/item/weapon/tool/transforming/powerdrill, + prob(1);/obj/item/weapon/tool/transforming/jawsoflife, prob(15);/obj/item/weapon/weldingtool/electric, prob(5);/obj/item/weapon/weldingtool/experimental) @@ -36,8 +36,8 @@ icon_state = "tool_2" /obj/random/tool/power/item_to_spawn() - return pick(/obj/item/weapon/tool/screwdriver/power, - /obj/item/weapon/tool/wirecutters/power, + return pick(/obj/item/weapon/tool/transforming/powerdrill, + /obj/item/weapon/tool/transforming/jawsoflife, /obj/item/weapon/weldingtool/electric, /obj/item/weapon/weldingtool/experimental) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index e6e22df11c..63b28f5646 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -394,7 +394,7 @@ frame_canvas(user, I) else if(current_canvas && current_canvas.painting_name == initial(current_canvas.painting_name) && istype(I,/obj/item/weapon/pen)) try_rename(user) - else if(current_canvas && I.is_wirecutter()) + else if(current_canvas && I.has_tool_quality(TOOL_WIRECUTTER)) unframe_canvas(user) else return ..() diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index ae5dc0c666..ffed750917 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -87,12 +87,12 @@ qdel(src) /obj/structure/catwalk/attackby(obj/item/C as obj, mob/user as mob) - if(istype(C, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = C + if(C.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = C.get_welder() if(WT.isOn() && WT.remove_fuel(0, user)) deconstruct(user) return - if(C.is_crowbar() && plated_tile) + if(C.has_tool_quality(TOOL_CROWBAR) && plated_tile) hatch_open = !hatch_open if(hatch_open) playsound(src, 'sound/items/Crowbar.ogg', 100, 2) diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm index 05661ccedb..f56c0269a4 100644 --- a/code/game/objects/structures/crates_lockers/__closets.dm +++ b/code/game/objects/structures/crates_lockers/__closets.dm @@ -271,7 +271,7 @@ return /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) if(opened) if(anchored) user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") @@ -291,8 +291,8 @@ return 0 if(istype(W,/obj/item/tk_grab)) return 0 - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.remove_fuel(0,user)) if(!WT.isOn()) return @@ -326,8 +326,8 @@ else if(seal_tool) if(istype(W, seal_tool)) var/obj/item/weapon/S = W - if(istype(S, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = S + if(S.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = S.get_welder() if(!WT.remove_fuel(0,user)) if(!WT.isOn()) return diff --git a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm index 19d3f8b452..eb69ff63b5 100644 --- a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm @@ -24,7 +24,7 @@ icon_state = icon_closed /obj/structure/closet/secure_closet/egg/attackby(obj/item/weapon/W, mob/user as mob) //This also prevents crew from welding the eggs and making them unable to be opened. - if(istype(W, /obj/item/weapon/weldingtool)) + if(W.has_tool_quality(TOOL_WELDER)) src.dump_contents() qdel(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 990ef239ff..b514802323 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -55,7 +55,7 @@ to_chat(user, "Access Denied") /obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) if(opened) if(anchored) user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") @@ -91,7 +91,7 @@ spark_system.start() playsound(src, 'sound/weapons/blade1.ogg', 50, 1) playsound(src, "sparks", 50, 1) - else if(istype(W,/obj/item/weapon/packageWrap) || istype(W,/obj/item/weapon/weldingtool)) + else if(istype(W,/obj/item/weapon/packageWrap) || W.has_tool_quality(TOOL_WELDER)) return ..(W,user) else togglelock(user) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index e193276d09..ba8fb51d85 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -90,7 +90,7 @@ src.set_dir(turn(src.dir, 90)) /obj/structure/closet/crate/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench() && istype(src,/obj/structure/closet/crate/bin)) + if(W.has_tool_quality(TOOL_WRENCH) && istype(src,/obj/structure/closet/crate/bin)) return ..() else if(opened) if(isrobot(user)) @@ -117,7 +117,7 @@ user.drop_item() W.forceMove(src) return - else if(W.is_wirecutter()) + else if(W.has_tool_quality(TOOL_WIRECUTTER)) if(rigged) to_chat(user , "You cut away the wiring.") playsound(src, W.usesound, 100, 1) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 6b338895e3..fdb658daac 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -25,7 +25,7 @@ var/turf/T = get_turf(src) if(!T) to_chat(user, "You can't open this here!") - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) new /obj/item/stack/material/wood(src) for(var/atom/movable/AM in contents) @@ -55,7 +55,7 @@ icon_state = "vehiclecrate" /obj/structure/largecrate/hoverpod/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) var/obj/item/mecha_parts/mecha_equipment/ME var/obj/mecha/working/hoverpod/H = new (loc) diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm index 6c7ed8ee2b..873a04b65a 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm @@ -3,7 +3,7 @@ desc = "You hear chirping and cawing inside the crate. It sounds like there are a lot of birds in there..." /obj/structure/largecrate/birds/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) new /obj/item/stack/material/wood(src) new /mob/living/simple_mob/animal/passive/bird(src) new /mob/living/simple_mob/animal/passive/bird/parrot/kea(src) diff --git a/code/game/objects/structures/crates_lockers/vehiclecage.dm b/code/game/objects/structures/crates_lockers/vehiclecage.dm index c3a04e9267..944da792f8 100644 --- a/code/game/objects/structures/crates_lockers/vehiclecage.dm +++ b/code/game/objects/structures/crates_lockers/vehiclecage.dm @@ -31,11 +31,11 @@ var/turf/T = get_turf(src) if(!T) to_chat(user, "You can't open this here!") - if(W.is_wrench() && do_after(user, 60 * W.toolspeed, src)) + if(W.has_tool_quality(TOOL_WRENCH) && do_after(user, 60 * W.toolspeed, src)) playsound(src, W.usesound, 50, 1) disassemble(W, user) user.visible_message("[user] begins loosening \the [src]'s bolts.") - if(W.is_wirecutter() && do_after(user, 70 * W.toolspeed, src)) + if(W.has_tool_quality(TOOL_WIRECUTTER) && do_after(user, 70 * W.toolspeed, src)) playsound(src, W.usesound, 50, 1) disassemble(W, user) user.visible_message("[user] begins cutting \the [src]'s bolts.") diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index 60eb576db3..63ef20566a 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -38,7 +38,7 @@ layer = OBJ_LAYER /obj/structure/curtain/attackby(obj/item/P, mob/user) - if(P.is_wirecutter()) + if(P.has_tool_quality(TOOL_WIRECUTTER)) playsound(src, P.usesound, 50, 1) to_chat(user, "You start to cut the shower curtains.") if(do_after(user, 10)) diff --git a/code/game/objects/structures/dancepole_vr.dm b/code/game/objects/structures/dancepole_vr.dm index 3a548f1133..9d5ec53223 100644 --- a/code/game/objects/structures/dancepole_vr.dm +++ b/code/game/objects/structures/dancepole_vr.dm @@ -8,14 +8,14 @@ anchored = TRUE /obj/structure/dancepole/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.is_screwdriver()) + if(O.has_tool_quality(TOOL_SCREWDRIVER)) anchored = !anchored playsound(src, O.usesound, 50, 1) if(anchored) to_chat(user, "You secure \the [src].") else to_chat(user, "You unsecure \the [src].") - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 50, 1) to_chat(user, "Now disassembling \the [src]...") if(do_after(user, 30 * O.toolspeed)) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index a484aa3efe..6ca92a3b37 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -170,8 +170,8 @@ rename_door(user) return - if(istype(W, /obj/item/weapon/weldingtool) && ( (istext(glass)) || (glass == 1) || (!anchored) )) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER) && ( (istext(glass)) || (glass == 1) || (!anchored) )) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if (WT.remove_fuel(0, user)) playsound(src, WT.usesound, 50, 1) if(istext(glass)) @@ -200,7 +200,7 @@ to_chat(user, "You need more welding fuel.") return - else if(W.is_wrench() && state == 0) + else if(W.has_tool_quality(TOOL_WRENCH) && state == 0) playsound(src, W.usesound, 100, 1) if(anchored) user.visible_message("[user] begins unsecuring the airlock assembly from the floor.", "You starts unsecuring the airlock assembly from the floor.") @@ -223,7 +223,7 @@ src.state = 1 to_chat(user, "You wire the airlock.") - else if(W.is_wirecutter() && state == 1 ) + else if(W.has_tool_quality(TOOL_WIRECUTTER) && state == 1 ) playsound(src, W.usesound, 100, 1) user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.") @@ -245,7 +245,7 @@ src.state = 2 src.electronics = W - else if(W.is_crowbar() && state == 2 ) + else if(W.has_tool_quality(TOOL_CROWBAR) && state == 2 ) //This should never happen, but just in case I guess if (!electronics) to_chat(user, "There was nothing to remove.") @@ -287,7 +287,7 @@ to_chat(user, "You installed [material_display_name(material_name)] plating into the airlock assembly.") glass = material_name - else if(W.is_screwdriver() && state == 2 ) + else if(W.has_tool_quality(TOOL_SCREWDRIVER) && state == 2 ) playsound(src, W.usesound, 100, 1) to_chat(user, "Now finishing the airlock.") diff --git a/code/game/objects/structures/droppod.dm b/code/game/objects/structures/droppod.dm index 551b7f6527..78c5d8a65a 100644 --- a/code/game/objects/structures/droppod.dm +++ b/code/game/objects/structures/droppod.dm @@ -27,15 +27,15 @@ if(!T) warning("Drop pod wasn't spawned on a turf") return - + moveToNullspace() icon_state = "[initial(icon_state)]_falling" - + // Show warning on 3x3 area centred on our drop spot var/list/turfs_nearby = block(get_step(T, SOUTHWEST), get_step(T, NORTHEAST)) for(var/turf/TN in turfs_nearby) new /obj/effect/temporary_effect/shuttle_landing(TN) - + // Wait a minute sleep(4 SECONDS) @@ -54,7 +54,7 @@ T.hotspot_expose(900) sleep(1 SECOND) filters = null - + // CRONCH playsound(src, 'sound/effects/meteorimpact.ogg', 50, 1) if(!polite) @@ -65,7 +65,7 @@ else for(var/turf/simulated/floor/F in view(1, T)) F.burn_tile(900) - + for(var/obj/O in T) if(O == src) continue @@ -76,7 +76,7 @@ // Landed! Simmer plane = initial(plane) icon_state = "[initial(icon_state)]" - + if(auto_open) sleep(2 SECONDS) open_pod() @@ -105,7 +105,7 @@ user.visible_message("[user] opens \the [src]!","You open \the [src]!") /obj/structure/drop_pod/attackby(obj/item/O, mob/user) - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) if(finished) to_chat(user, "You start breaking down \the [src].") if(do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE)) diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index cccde21044..ff37f1b40b 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -12,7 +12,7 @@ return /obj/structure/bed/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) var/obj/structure/bed/chair/C = new /obj/structure/bed/chair(loc) playsound(src, W.usesound, 50, 1) C.set_dir(dir) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index a0c01e52cd..8318392b49 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -31,7 +31,7 @@ to_chat(user, "You place [O] in [src].") else opened = !opened - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) if(!has_extinguisher) to_chat(user, "You start to unwrench the extinguisher cabinet.") playsound(src, O.usesound, 50, 1) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index a3133b264a..1bb1b4e71e 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -69,7 +69,7 @@ return ..() /obj/structure/fence/attackby(obj/item/W, mob/user) - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) if(!cuttable) to_chat(user, span("warning", "This section of the fence can't be cut.")) return diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm index f84c9508e7..eb2f1e37bc 100644 --- a/code/game/objects/structures/fitness.dm +++ b/code/game/objects/structures/fitness.dm @@ -34,7 +34,7 @@ var/list/qualifiers = list("with ease", "without any trouble", "with great effort") /obj/structure/fitness/weightlifter/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, 'sound/items/Deconstruct.ogg', 75, 1) weight = ((weight) % qualifiers.len) + 1 to_chat(user, "You set the machine's weight level to [weight].") diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index ee471b9f00..82dc5adb94 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -146,7 +146,7 @@ reinforce_girder() /obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob) - if(W.is_wrench() && state == 0) + if(W.has_tool_quality(TOOL_WRENCH) && state == 0) if(anchored && !reinf_material) playsound(src, W.usesound, 100, 1) to_chat(user, "Now disassembling the girder...") @@ -172,7 +172,7 @@ to_chat(user, "You drill through the girder!") dismantle() - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(state == 2) playsound(src, W.usesound, 100, 1) to_chat(user, "Now unsecuring support struts...") @@ -185,7 +185,7 @@ reinforcing = !reinforcing to_chat(user, "\The [src] can now be [reinforcing? "reinforced" : "constructed"]!") - else if(W.is_wirecutter() && state == 1) + else if(W.has_tool_quality(TOOL_WIRECUTTER) && state == 1) playsound(src, W.usesound, 100, 1) to_chat(user, "Now removing support struts...") if(do_after(user,40 * W.toolspeed)) @@ -195,7 +195,7 @@ reinf_material = null reset_girder() - else if(W.is_crowbar() && state == 0 && anchored) + else if(W.has_tool_quality(TOOL_CROWBAR) && state == 0 && anchored) playsound(src, W.usesound, 100, 1) to_chat(user, "Now dislodging the girder...") if(do_after(user, 40 * W.toolspeed)) @@ -339,7 +339,7 @@ qdel(src) /obj/structure/girder/cult/attackby(obj/item/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 100, 1) to_chat(user, "Now disassembling the girder...") if(do_after(user,40 * W.toolspeed)) diff --git a/code/game/objects/structures/gravemarker.dm b/code/game/objects/structures/gravemarker.dm index 381401b352..a93c57144a 100644 --- a/code/game/objects/structures/gravemarker.dm +++ b/code/game/objects/structures/gravemarker.dm @@ -51,7 +51,7 @@ return TRUE /obj/structure/gravemarker/attackby(obj/item/weapon/W, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) var/carving_1 = sanitizeSafe(tgui_input_text(user, "Who is \the [src.name] for?", "Gravestone Naming", null, MAX_NAME_LEN), MAX_NAME_LEN) if(carving_1) user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].") @@ -67,7 +67,7 @@ epitaph += carving_2 update_icon() return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) user.visible_message("[user] starts taking down \the [src.name].", "You start taking down \the [src.name].") if(do_after(user, material.hardness * W.toolspeed)) user.visible_message("[user] takes down \the [src.name].", "You take down \the [src.name].") diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 0f23bec24c..271e52b114 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -94,12 +94,12 @@ return if(istype(W, /obj/item/weapon/rcd)) // To stop us from hitting the grille when building windows, because grilles don't let parent handle it properly. return FALSE - else if(W.is_wirecutter()) + else if(W.has_tool_quality(TOOL_WIRECUTTER)) if(!shock(user, 100)) playsound(src, W.usesound, 100, 1) new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2) qdel(src) - else if((W.is_screwdriver()) && (istype(loc, /turf/simulated) || anchored)) + else if((W.has_tool_quality(TOOL_SCREWDRIVER)) && (istype(loc, /turf/simulated) || anchored)) if(!shock(user, 90)) playsound(src, W.usesound, 100, 1) anchored = !anchored diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 43aeed44c1..20b496291e 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -176,7 +176,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) //This prevents dumb stuff like splashing the cart with the contents of a container, after putting said container into trash else if (!has_items) - if (I.is_wrench()) + if (I.has_tool_quality(TOOL_WRENCH)) if (do_after(user, 5 SECONDS, src)) dismantle(user) return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index d5fcf7e8d1..6107f25f6c 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -55,19 +55,19 @@ /obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob) - if (istype(C, /obj/item/stack/tile/floor)) + if(istype(C, /obj/item/stack/tile/floor)) var/turf/T = get_turf(src) T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead return - if (istype(C, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = C + if(C.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = C.get_welder() if(WT.welding == 1) if(WT.remove_fuel(0, user)) to_chat(user, "Slicing lattice joints ...") new /obj/item/stack/rods(src.loc) qdel(src) return - if (istype(C, /obj/item/stack/rods)) + if(istype(C, /obj/item/stack/rods)) var/obj/item/stack/rods/R = C if(R.get_amount() < 2) to_chat(user, "You need at least two rods to form a catwalk here.") diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm index 168ebb33ca..848444c64d 100644 --- a/code/game/objects/structures/low_wall.dm +++ b/code/game/objects/structures/low_wall.dm @@ -86,7 +86,7 @@ return // Dismantling the half wall - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) for(var/obj/structure/S in loc) if(istype(S, /obj/structure/window)) to_chat(user, "There is still a window on the low wall!") diff --git a/code/game/objects/structures/medical_stand_vr.dm b/code/game/objects/structures/medical_stand_vr.dm index e2eca967ff..63b6f365f5 100644 --- a/code/game/objects/structures/medical_stand_vr.dm +++ b/code/game/objects/structures/medical_stand_vr.dm @@ -295,7 +295,7 @@ to_chat(user, "Close the valve first.") return if (tank) - if(!W.is_wrench()) + if(!W.has_tool_quality(TOOL_WRENCH)) return if (!is_loosen) is_loosen = TRUE diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 8cb6749823..8aff413305 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -50,7 +50,7 @@ ..() /obj/structure/mirror/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) if(!glass) playsound(src, I.usesound, 50, 1) if(do_after(user, 20 * I.toolspeed)) @@ -58,7 +58,7 @@ new /obj/item/frame/mirror( src.loc ) qdel(src) return - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) if(shattered && glass) to_chat(user, "The broken glass falls out.") icon_state = "mirror_frame" diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index bd7e7836f6..ae26157f39 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -17,7 +17,7 @@ ) /obj/structure/plasticflaps/attackby(obj/item/P, mob/user) - if(P.is_wirecutter()) + if(P.has_tool_quality(TOOL_WIRECUTTER)) playsound(src, P.usesound, 50, 1) to_chat(user, "You start to cut the plastic flaps.") if(do_after(user, 10 * P.toolspeed)) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 3efd7091b0..3b357d9fd5 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -202,7 +202,7 @@ /obj/structure/railing/attackby(obj/item/W as obj, mob/user as mob) // Dismantle - if(W.is_wrench() && !anchored) + if(W.has_tool_quality(TOOL_WRENCH) && !anchored) playsound(src, W.usesound, 50, 1) if(do_after(user, 20, src)) user.visible_message("\The [user] dismantles \the [src].", "You dismantle \the [src].") @@ -211,8 +211,8 @@ return // Repair - if(health < maxhealth && istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/F = W + if(health < maxhealth && W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/F = W.get_welder() if(F.welding) playsound(src, F.usesound, 50, 1) if(do_after(user, 20, src)) @@ -221,7 +221,7 @@ return // Install - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) user.visible_message(anchored ? "\The [user] begins unscrewing \the [src]." : "\The [user] begins fasten \the [src]." ) playsound(src, W.usesound, 75, 1) if(do_after(user, 10, src)) diff --git a/code/game/objects/structures/salvageable.dm b/code/game/objects/structures/salvageable.dm index 7153dbca4d..18f24df214 100644 --- a/code/game/objects/structures/salvageable.dm +++ b/code/game/objects/structures/salvageable.dm @@ -14,7 +14,7 @@ return /obj/structure/salvageable/attackby(obj/item/I, mob/user) - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) playsound(src, I.usesound, 50, 1) var/actual_time = I.toolspeed * 170 user.visible_message( \ diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 67715dfbe1..9d59891ebd 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -11,7 +11,7 @@ qdel(src) /obj/structure/sign/attackby(obj/item/tool, mob/user) //deconstruction - if(tool.is_screwdriver() && !istype(src, /obj/structure/sign/scenery) && !istype(src, /obj/structure/sign/double)) + if(tool.has_tool_quality(TOOL_SCREWDRIVER) && !istype(src, /obj/structure/sign/scenery) && !istype(src, /obj/structure/sign/double)) playsound(src, tool.usesound, 50, 1) unfasten(user) else ..() @@ -36,7 +36,7 @@ var/original_type /obj/item/sign/attackby(obj/item/tool as obj, mob/user as mob) //construction - if(tool.is_screwdriver() && isturf(user.loc)) + if(tool.has_tool_quality(TOOL_SCREWDRIVER) && isturf(user.loc)) var/direction = tgui_input_list(usr, "In which direction?", "Select direction.", list("North", "East", "South", "West", "Cancel")) if(direction == "Cancel") return var/target_type = original_type || /obj/structure/sign diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index dcdaf74e05..62b8bc1703 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -183,8 +183,8 @@ else playsound(src, 'sound/weapons/smash.ogg', 50, 1) CheckHardness() - else if(istype(W,/obj/item/weapon/weldingtool) && breakable) - var/obj/item/weapon/weldingtool/WT = W + else if(W.has_tool_quality(TOOL_WELDER) && breakable) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(material.ignition_point && WT.remove_fuel(0, user)) TemperatureAct(150) else diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 2248893882..5a934a7e0e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -88,7 +88,7 @@ return /obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 50, 1) dismantle() qdel(src) @@ -123,7 +123,7 @@ add_padding(padding_type) return - else if(W.is_wirecutter()) + else if(W.has_tool_quality(TOOL_WIRECUTTER)) if(!padding_material) to_chat(user, "\The [src] has no padding to remove.") return @@ -223,7 +223,7 @@ return /obj/structure/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench() || istype(W,/obj/item/stack) || W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WRENCH) || istype(W,/obj/item/stack) || W.has_tool_quality(TOOL_WIRECUTTER)) return else if(istype(W,/obj/item/roller_holder)) if(has_buckled_mobs()) @@ -373,7 +373,7 @@ buckle_lying = 1 /obj/structure/dirtybed/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 100, 1) if(anchored) user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 08b059888a..903346fe95 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -207,7 +207,7 @@ return /obj/structure/bed/chair/office/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/stack) || W.is_wirecutter()) + if(istype(W,/obj/item/stack) || W.has_tool_quality(TOOL_WIRECUTTER)) return ..() @@ -273,7 +273,7 @@ return /obj/structure/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/stack) || W.is_wirecutter()) + if(istype(W,/obj/item/stack) || W.has_tool_quality(TOOL_WIRECUTTER)) return ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index 5f77d31022..c1e343a42d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -110,7 +110,7 @@ var/global/list/stool_cache = list() //haha stool qdel(src) /obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 50, 1) dismantle() qdel(src) @@ -144,7 +144,7 @@ var/global/list/stool_cache = list() //haha stool to_chat(user, "You add padding to \the [src].") add_padding(padding_type) return - else if (W.is_wirecutter()) + else if (W.has_tool_quality(TOOL_WIRECUTTER)) if(!padding_material) to_chat(user, "\The [src] has no padding to remove.") return diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 142cd8928e..3214128eec 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -55,7 +55,7 @@ L.set_dir(dir) /obj/structure/bed/chair/wheelchair/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench() || W.is_wirecutter() || istype(W,/obj/item/stack)) + if(W.has_tool_quality(TOOL_WRENCH) || W.has_tool_quality(TOOL_WIRECUTTER) || istype(W,/obj/item/stack)) return ..() diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 1af54a1b4e..fcbfe98230 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -73,7 +73,7 @@ phorontanks++ else full = TRUE - else if(I.is_wrench()) + else if(I.has_tool_quality(TOOL_WRENCH)) if(anchored) to_chat(user, "You lean down and unwrench [src].") anchored = FALSE diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index b13c8c2a24..ba73a8faf8 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -44,7 +44,7 @@ icon_state = "[initial(icon_state)][open][cistern]" /obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob) - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"].") playsound(src, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(do_after(user, 30)) @@ -200,7 +200,7 @@ /obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob) if(I.type == /obj/item/device/analyzer) to_chat(user, "The water temperature seems to be [watertemp].") - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) var/newtemp = tgui_input_list(user, "What setting would you like to set the temperature valve to?", "Water Temperature Valve", temperature_settings) to_chat(user, "You begin to adjust the temperature valve with \the [I].") playsound(src, I.usesound, 50, 1) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 855e7fac11..44bb6e45a7 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -87,8 +87,8 @@ switch(state) if("01") - if(istype(W, /obj/item/weapon/weldingtool) && !anchored ) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER) && !anchored) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if (WT.remove_fuel(0,user)) user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly.") playsound(src, WT.usesound, 50, 1) @@ -106,7 +106,7 @@ return //Wrenching an unsecure assembly anchors it in place. Step 4 complete - if(W.is_wrench() && !anchored) + if(W.has_tool_quality(TOOL_WRENCH) && !anchored) playsound(src, 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.") @@ -117,7 +117,7 @@ step = 0 //Unwrenching an unsecure assembly un-anchors it. Step 4 undone - else if(W.is_wrench() && anchored) + else if(W.has_tool_quality(TOOL_WRENCH) && anchored) playsound(src, 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.") @@ -143,7 +143,7 @@ if("02") //Removing wire from the assembly. Step 5 undone. - if(W.is_wirecutter() && !src.electronics) + if(W.has_tool_quality(TOOL_WIRECUTTER) && !src.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 airlock assembly.") @@ -172,7 +172,7 @@ W.loc = src.loc //Screwdriver to remove airlock electronics. Step 6 undone. - else if(W.is_screwdriver() && src.electronics) + else if(W.has_tool_quality(TOOL_SCREWDRIVER) && src.electronics) playsound(src, W.usesound, 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.") @@ -185,7 +185,7 @@ ae.loc = src.loc //Crowbar to complete the assembly, Step 7 complete. - else if(W.is_crowbar()) + else if(W.has_tool_quality(TOOL_CROWBAR)) if(!src.electronics) to_chat(usr,"The assembly is missing electronics.") return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d953cc7dd9..b1608043bb 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -223,8 +223,8 @@ if(!istype(W)) return//I really wish I did not need this // Fixing. - if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent == I_HELP) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER) && user.a_intent == I_HELP) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(health < maxhealth) if(WT.remove_fuel(1 ,user)) to_chat(user, "You begin repairing [src]...") @@ -265,7 +265,7 @@ if(W.flags & NOBLUDGEON) return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(reinf && state >= 1) state = 3 - state update_nearby_icons() @@ -285,11 +285,11 @@ update_verbs() playsound(src, W.usesound, 75, 1) to_chat(user, "You have [anchored ? "" : "un"]fastened the window [anchored ? "to" : "from"] the floor.") - else if(W.is_crowbar() && reinf && state <= 1) + else if(W.has_tool_quality(TOOL_CROWBAR) && reinf && state <= 1) state = 1 - state playsound(src, W.usesound, 75, 1) to_chat(user, "You have pried the window [state ? "into" : "out of"] the frame.") - else if(W.is_wrench() && !anchored && (!state || !reinf)) + else if(W.has_tool_quality(TOOL_WRENCH) && !anchored && (!state || !reinf)) if(!glasstype) to_chat(user, "You're not sure how to dismantle \the [src] properly.") else diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index 8bcc1cf8df..919ffa7ede 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -123,8 +123,8 @@ playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) return // Plating repairs and removal - else if(istype(C, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/welder = C + else if(C.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/welder = C.get_welder() if(welder.isOn()) // Needs repairs if(broken || burnt) @@ -154,7 +154,7 @@ do_remove_plating(C, user, base_type) /turf/simulated/floor/proc/try_deconstruct_tile(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) if(broken || burnt) to_chat(user, "You remove the broken [flooring.descriptor].") make_plating() @@ -168,14 +168,14 @@ return 0 playsound(src, W.usesound, 80, 1) return 1 - else if(W.is_screwdriver() && (flooring.flags & TURF_REMOVE_SCREWDRIVER)) + else if(W.has_tool_quality(TOOL_SCREWDRIVER) && (flooring.flags & TURF_REMOVE_SCREWDRIVER)) if(broken || burnt) return 0 to_chat(user, "You unscrew and remove the [flooring.descriptor].") make_plating(1) playsound(src, W.usesound, 80, 1) return 1 - else if(W.is_wrench() && (flooring.flags & TURF_REMOVE_WRENCH)) + else if(W.has_tool_quality(TOOL_WRENCH) && (flooring.flags & TURF_REMOVE_WRENCH)) to_chat(user, "You unwrench and remove the [flooring.descriptor].") make_plating(1) playsound(src, W.usesound, 80, 1) @@ -209,8 +209,8 @@ return TRUE /turf/simulated/floor/proc/do_remove_plating(obj/item/weapon/W, mob/user, base_type) - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.remove_fuel(5,user)) to_chat(user, "You don't have enough fuel in [WT] finish cutting through [src].") return diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 8c6eb32ae3..e6a810e9a6 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -132,7 +132,7 @@ user.setClickCooldown(user.get_attack_speed(W)) /* -//As with the floors, only this time it works AND tries pushing the wall after it's done. +//As with the floors, only this time it works AND tries pushing the wall after it's done. if(!construction_stage && user.a_intent == I_HELP) if(try_graffiti(user,W)) return @@ -185,8 +185,8 @@ if(locate(/obj/effect/overlay/wallrot) in src) - if(istype(W, /obj/item/weapon/weldingtool) ) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if( WT.remove_fuel(0,user) ) to_chat(user, "You burn away the fungi with \the [WT].") playsound(src, WT.usesound, 10, 1) @@ -200,8 +200,8 @@ //THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects if(thermite) - if( istype(W, /obj/item/weapon/weldingtool) ) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if( WT.remove_fuel(0,user) ) thermitemelt(user) return @@ -223,9 +223,9 @@ var/turf/T = user.loc //get user's location for delay checks - if(damage && istype(W, /obj/item/weapon/weldingtool)) + if(damage && W.has_tool_quality(TOOL_WELDER)) - var/obj/item/weapon/weldingtool/WT = W + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.isOn()) return @@ -250,8 +250,8 @@ var/dismantle_verb var/dismantle_sound - if(istype(W,/obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.isOn()) return if(!WT.remove_fuel(0,user)) @@ -292,7 +292,7 @@ else switch(construction_stage) if(6) - if (W.is_wirecutter()) + if (W.has_tool_quality(TOOL_WIRECUTTER)) playsound(src, W.usesound, 100, 1) construction_stage = 5 user.update_examine_panel(src) @@ -300,7 +300,7 @@ update_icon() return if(5) - if (W.is_screwdriver()) + if (W.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "You begin removing the support lines.") playsound(src, W.usesound, 100, 1) if(!do_after(user,40 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 5) @@ -310,7 +310,7 @@ update_icon() to_chat(user, "You unscrew the support lines.") return - else if (W.is_wirecutter()) + else if (W.has_tool_quality(TOOL_WIRECUTTER)) construction_stage = 6 user.update_examine_panel(src) to_chat(user, "You mend the outer grille.") @@ -319,8 +319,8 @@ return if(4) var/cut_cover - if(istype(W,/obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.isOn()) return if(WT.remove_fuel(0,user)) @@ -340,7 +340,7 @@ update_icon() to_chat(user, "You press firmly on the cover, dislodging it.") return - else if (W.is_screwdriver()) + else if (W.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "You begin screwing down the support lines.") playsound(src, W.usesound, 100, 1) if(!do_after(user,40 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 4) @@ -351,7 +351,7 @@ to_chat(user, "You screw down the support lines.") return if(3) - if (W.is_crowbar()) + if (W.has_tool_quality(TOOL_CROWBAR)) to_chat(user, "You struggle to pry off the cover.") playsound(src, W.usesound, 100, 1) if(!do_after(user,100 * W.toolspeed) || !istype(src, /turf/simulated/wall) || construction_stage != 3) @@ -362,7 +362,7 @@ to_chat(user, "You pry off the cover.") return if(2) - if (W.is_wrench()) + if (W.has_tool_quality(TOOL_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) || !istype(src, /turf/simulated/wall) || construction_stage != 2) @@ -374,8 +374,8 @@ return if(1) var/cut_cover - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if( WT.remove_fuel(0,user) ) cut_cover=1 else @@ -394,7 +394,7 @@ to_chat(user, "You slice through the support rods.") return if(0) - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_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) || !istype(src, /turf/simulated/wall) || !user || !W || !T ) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 1a0b58bdc9..5ad969bda0 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -70,7 +70,7 @@ if((!A.secured) && (!secured)) attach_assembly(A,user) return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(toggle_secure()) to_chat(user, "\The [src] is ready!") else diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index f4d544f040..52ab8e67cb 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -103,7 +103,7 @@ ..() /obj/item/device/assembly_holder/attackby(var/obj/item/weapon/W, var/mob/user) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(!a_left || !a_right) to_chat(user, " BUG:Assembly part missing, please report this!") return diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index d3f518bbc8..8dab46f163 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -14,7 +14,7 @@ return /obj/item/assembly/shock_kit/attackby(var/obj/item/weapon/W, var/mob/user) - if(W.is_wrench() && !status) + if(W.has_tool_quality(TOOL_WRENCH) && !status) var/turf/T = loc if(ismob(T)) T = T.loc @@ -26,7 +26,7 @@ part2 = null qdel(src) return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) status = !status to_chat(user, "[src] is now [status ? "secured" : "unsecured"]!") playsound(src, W.usesound, 50, 1) diff --git a/code/modules/casino/slots.dm b/code/modules/casino/slots.dm index 40c7e5af61..654d872b0e 100644 --- a/code/modules/casino/slots.dm +++ b/code/modules/casino/slots.dm @@ -61,7 +61,7 @@ if(busy) to_chat(user,"The slot machine is currently running. ") return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 100, 1) if(anchored) user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") @@ -291,7 +291,7 @@ if(busy) to_chat(user,"The slot machine is currently running. ") return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 100, 1) if(anchored) user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 0d9160eed2..7e10ec5589 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -342,7 +342,7 @@ return 0 // return 1 to cancel attack_hand() /*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) - if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) + if(W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/weapon/scalpel)) if (clipped) to_chat(user, "The [src] have already been clipped!") update_icon() diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index 9316c8f64f..3ed26e4126 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -6,7 +6,7 @@ /* /obj/item/clothing/gloves/boxing/attackby(obj/item/weapon/W, mob/user) - if(W.is_wirecutter() || istype(W, /obj/item/weapon/surgical/scalpel)) + if(W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/weapon/surgical/scalpel)) to_chat(user, "That won't work.") //Nope return ..() diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index a3a37772b3..4b12f8382e 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -102,7 +102,7 @@ return /obj/item/clothing/mask/gas/sechailer/attackby(obj/item/I, mob/user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) switch(aggressiveness) if(1) to_chat(user, "You set the aggressiveness restrictor to the second position.") @@ -122,11 +122,11 @@ phrase = 1 if(5) to_chat(user, "You adjust the restrictor but nothing happens, probably because its broken.") - if(I.is_wirecutter()) + if(I.has_tool_quality(TOOL_WIRECUTTER)) if(aggressiveness != 5) to_chat(user, "You broke it!") aggressiveness = 5 - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) if(!hailer) to_chat(user, "This mask has an integrated hailer, you can't remove it!") else diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index 6f23f2b57f..c12caa2e02 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -203,7 +203,7 @@ var/global/list/breach_burn_descriptors = list( repair_breaches(BURN, use_amt * repair_power, user) return - else if(istype(W, /obj/item/weapon/weldingtool)) + else if(W.has_tool_quality(TOOL_WELDER)) if(istype(src.loc,/mob/living)) to_chat(user, "How do you intend to patch a hardsuit while someone is wearing it?") @@ -213,7 +213,7 @@ var/global/list/breach_burn_descriptors = list( to_chat(user, "There is no structural damage on \the [src] to repair.") return - var/obj/item/weapon/weldingtool/WT = W + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.remove_fuel(5)) to_chat(user, "You need more welding fuel to repair this suit.") return diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index ac94952825..fcb86f53f5 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -7,7 +7,7 @@ return // Pass repair items on to the chestpiece. - if(chest && (istype(W,/obj/item/stack/material) || istype(W, /obj/item/weapon/weldingtool))) + if(chest && (istype(W,/obj/item/stack/material) || W.has_tool_quality(TOOL_WELDER))) return chest.attackby(W,user) // Lock or unlock the access panel. @@ -30,7 +30,7 @@ to_chat(user, "You [locked ? "lock" : "unlock"] \the [src] access panel.") return - else if(W.is_crowbar()) + else if(W.has_tool_quality(TOOL_CROWBAR)) if(!open && locked) to_chat(user, "The access panel is locked shut.") return @@ -41,7 +41,7 @@ if(open) // Hacking. - if(W.is_wirecutter() || istype(W, /obj/item/device/multitool)) + if(W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/device/multitool)) if(open) wires.Interact(user) else @@ -102,7 +102,7 @@ src.cell = W return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(!air_supply) to_chat(user, "There is no tank to remove.") @@ -116,7 +116,7 @@ air_supply = null return - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) var/list/current_mounts = list() if(cell) current_mounts += "cell" diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm index 7f253ddfe8..8b147a4dc3 100644 --- a/code/modules/clothing/spacesuits/void/ert_vr.dm +++ b/code/modules/clothing/spacesuits/void/ert_vr.dm @@ -77,7 +77,7 @@ to_chat(user, "You cannot modify \the [src] while it is being worn.") return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(boots || tank || cooler) var/choice = tgui_input_list(usr, "What component would you like to remove?", "Remove Component", list(boots,tank,cooler)) if(!choice) return diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 91ee803760..79b54e431f 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -241,7 +241,7 @@ to_chat(user, "You cannot modify \the [src] while it is being worn.") return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(helmet || boots || tank) var/choice = tgui_input_list(usr, "What component would you like to remove?", "Remove Component", list(helmet,boots,tank,cooler)) if(!choice) return diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 57774c8d2d..9222a4ca9c 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -10,7 +10,7 @@ /obj/item/clothing/suit/space/void species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - + /obj/item/clothing/head/helmet/space/void/heck name = "\improper H.E.C.K. helmet" desc = "Hostile Environiment Cross-Kinetic Helmet: A helmet designed to withstand the wide variety of hazards from \[REDACTED\]. It wasn't enough for its last owner." @@ -114,7 +114,7 @@ to_chat(user, "You cannot modify \the [src] while it is being worn.") return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(boots || tank || cooler) var/choice = tgui_input_list(usr, "What component would you like to remove?", "Remove Component", list(boots,tank,cooler)) if(!choice) return diff --git a/code/modules/economy/cash_register.dm b/code/modules/economy/cash_register.dm index ae649a8f4d..8c799597ea 100644 --- a/code/modules/economy/cash_register.dm +++ b/code/modules/economy/cash_register.dm @@ -190,7 +190,7 @@ scan_cash(SC) else if(istype(O, /obj/item/weapon/card/emag)) return ..() - else if(O.is_wrench()) + else if(O.has_tool_quality(TOOL_WRENCH)) var/obj/item/weapon/tool/wrench/W = O toggle_anchors(W, user) // Not paying: Look up price and add it to transaction_amount diff --git a/code/modules/economy/coins.dm b/code/modules/economy/coins.dm index 51438cc101..87056deecd 100644 --- a/code/modules/economy/coins.dm +++ b/code/modules/economy/coins.dm @@ -81,7 +81,7 @@ else to_chat(user, "This cable coil appears to be empty.") return - else if(W.is_wirecutter()) + else if(W.has_tool_quality(TOOL_WIRECUTTER)) if(!string_attached) ..() return diff --git a/code/modules/economy/vending.dm b/code/modules/economy/vending.dm index e17d5c951f..be0303a41f 100644 --- a/code/modules/economy/vending.dm +++ b/code/modules/economy/vending.dm @@ -216,7 +216,7 @@ GLOBAL_LIST_EMPTY(vending_products) else to_chat(user, "You cannot refill [src] with [RC].") return - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") playsound(src, W.usesound, 50, 1) @@ -228,7 +228,7 @@ GLOBAL_LIST_EMPTY(vending_products) SStgui.update_uis(src) // Speaker switch is on the main UI, not wires UI return - else if(istype(W, /obj/item/device/multitool) || W.is_wirecutter()) + else if(istype(W, /obj/item/device/multitool) || W.has_tool_quality(TOOL_WIRECUTTER)) if(panel_open) attack_hand(user) return @@ -240,7 +240,7 @@ GLOBAL_LIST_EMPTY(vending_products) to_chat(user, "You insert \the [W] into \the [src].") SStgui.update_uis(src) return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 100, 1) if(anchored) user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 8f5bffa804..b29eb65bc1 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -51,7 +51,7 @@ update_icon() /obj/item/weapon/material/fishing_rod/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_wirecutter() && strung) + if(I.has_tool_quality(TOOL_WIRECUTTER) && strung) strung = FALSE to_chat(user, "You cut \the [src]'s string!") update_icon() diff --git a/code/modules/food/kitchen/cooking_machines/_appliance.dm b/code/modules/food/kitchen/cooking_machines/_appliance.dm index 7f71133f3a..07d812f8b5 100644 --- a/code/modules/food/kitchen/cooking_machines/_appliance.dm +++ b/code/modules/food/kitchen/cooking_machines/_appliance.dm @@ -242,7 +242,7 @@ else if(istype(check, /obj/item/weapon/disk/nuclear)) to_chat(user, "You can't cook that.") return 0 - else if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/weapon/storage/part_replacer)) // You can't cook tools, dummy. + else if(I.has_tool_quality(TOOL_CROWBAR) || I.has_tool_quality(TOOL_SCREWDRIVER) || istype(I, /obj/item/weapon/storage/part_replacer)) // You can't cook tools, dummy. return 0 else if(!istype(check) && !istype(check, /obj/item/weapon/holder)) to_chat(user, "That's not edible.") @@ -606,7 +606,7 @@ /obj/machinery/appliance/attack_hand(var/mob/user) if(..()) return - + if(cooking_objs.len) removal_menu(user) diff --git a/code/modules/food/kitchen/cooking_machines/oven.dm b/code/modules/food/kitchen/cooking_machines/oven.dm index 30f8e9388d..2fd34c5c55 100644 --- a/code/modules/food/kitchen/cooking_machines/oven.dm +++ b/code/modules/food/kitchen/cooking_machines/oven.dm @@ -110,7 +110,7 @@ /obj/machinery/appliance/cooker/oven/proc/manip(var/obj/item/I) // check if someone's trying to manipulate the machine - if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/weapon/storage/part_replacer)) + if(I.has_tool_quality(TOOL_CROWBAR) || I.has_tool_quality(TOOL_SCREWDRIVER) || istype(I, /obj/item/weapon/storage/part_replacer)) return TRUE else return FALSE diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index 834095efd7..f7b718ed1a 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -77,7 +77,7 @@ /obj/machinery/microwave/attackby(var/obj/item/O as obj, var/mob/user as mob) if(src.broken > 0) - if(src.broken == 2 && O.is_screwdriver()) // If it's broken and they're using a screwdriver + if(src.broken == 2 && O.has_tool_quality(TOOL_SCREWDRIVER)) // If it's broken and they're using a screwdriver user.visible_message( \ "\The [user] starts to fix part of the microwave.", \ "You start to fix part of the microwave." \ @@ -89,7 +89,7 @@ "You have fixed part of the microwave." \ ) src.broken = 1 // Fix it a bit - else if(src.broken == 1 && O.is_wrench()) // If it's broken and they're doing the wrench + else if(src.broken == 1 && O.has_tool_quality(TOOL_WRENCH)) // If it's broken and they're doing the wrench user.visible_message( \ "\The [user] starts to fix part of the microwave.", \ "You start to fix part of the microwave." \ @@ -190,10 +190,10 @@ var/obj/item/weapon/grab/G = O to_chat(user, "This is ridiculous. You can not fit \the [G.affecting] in this [src].") return 1 - else if(O.is_screwdriver()) + else if(O.has_tool_quality(TOOL_SCREWDRIVER)) default_deconstruction_screwdriver(user, O) return - else if(O.is_crowbar()) + else if(O.has_tool_quality(TOOL_CROWBAR)) if(default_deconstruction_crowbar(user, O)) return else diff --git a/code/modules/food/kitchen/smartfridge/smartfridge.dm b/code/modules/food/kitchen/smartfridge/smartfridge.dm index d81c69a1be..b2b353dca5 100644 --- a/code/modules/food/kitchen/smartfridge/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge/smartfridge.dm @@ -115,7 +115,7 @@ add_overlay("[icon_base]-[icon_contents]3") /obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.is_screwdriver()) + if(O.has_tool_quality(TOOL_SCREWDRIVER)) panel_open = !panel_open user.visible_message("[user] [panel_open ? "opens" : "closes"] the maintenance panel of \the [src].", "You [panel_open ? "open" : "close"] the maintenance panel of \the [src].") playsound(src, O.usesound, 50, 1) @@ -125,7 +125,7 @@ if(wrenchable && default_unfasten_wrench(user, O, 20)) return - if(istype(O, /obj/item/device/multitool) || O.is_wirecutter()) + if(istype(O, /obj/item/device/multitool) || O.has_tool_quality(TOOL_WIRECUTTER)) if(panel_open) attack_hand(user) return diff --git a/code/modules/games/dice.dm b/code/modules/games/dice.dm index b91fb73d1e..2d2b2dbaf9 100644 --- a/code/modules/games/dice.dm +++ b/code/modules/games/dice.dm @@ -16,7 +16,7 @@ /obj/item/weapon/dice/attackby(obj/item/weapon/W, mob/user) ..() - if(istype(W, /obj/item/weapon/weldingtool) || istype(W, /obj/item/weapon/flame/lighter)) + if(W.has_tool_quality(TOOL_WELDER) || istype(W, /obj/item/weapon/flame/lighter)) if(cheater) to_chat(user, "Wait, this [name] is already weighted!") else if(tamper_proof) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index cf2a19f46a..5ae93bfd9c 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -206,11 +206,11 @@ if(W.flags & NOBLUDGEON) return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "It's a holowindow, you can't unfasten it!") - else if(W.is_crowbar() && reinf && state <= 1) + else if(W.has_tool_quality(TOOL_CROWBAR) && reinf && state <= 1) to_chat(user, "It's a holowindow, you can't pry it!") - else if(W.is_wrench() && !anchored && (!state || !reinf)) + else if(W.has_tool_quality(TOOL_WRENCH) && !anchored && (!state || !reinf)) to_chat(user, "It's a holowindow, you can't dismantle it!") else if(W.damtype == BRUTE || W.damtype == BURN) @@ -267,12 +267,12 @@ qdel(src) /obj/structure/bed/chair/holochair/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) to_chat(user, "It's a holochair, you can't dismantle it!") return //VOREStation Add /obj/structure/bed/holobed/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) to_chat(user, "It's a holochair, you can't dismantle it!") return //VOREStation Add End diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 20d544f701..126232754b 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -36,12 +36,12 @@ . += "The lid is open." /obj/machinery/beehive/attackby(var/obj/item/I, var/mob/user) - if(I.is_crowbar()) + if(I.has_tool_quality(TOOL_CROWBAR)) closed = !closed user.visible_message(SPAN_NOTICE("[user] [closed ? "closes" : "opens"] \the [src]."), SPAN_NOTICE("You [closed ? "close" : "open"] \the [src].")) update_icon() return - else if(I.is_wrench()) + else if(I.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, I.usesound, 50, 1) user.visible_message(SPAN_NOTICE("[user] [anchored ? "wrenches" : "unwrenches"] \the [src]."), SPAN_NOTICE("You [anchored ? "wrench" : "unwrench"] \the [src].")) @@ -107,7 +107,7 @@ if(smoked) to_chat(user, "The hive is smoked.") return 1 - else if(I.is_screwdriver()) + else if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(bee_count) to_chat(user, SPAN_NOTICE("You can't dismantle \the [src] with these bees inside.")) return diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 8919b4ede5..128c1dc745 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -96,7 +96,7 @@ if(default_deconstruction_screwdriver(user, W)) return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 100, 1) to_chat(user, "You [anchored ? "un" : ""]secure \the [src].") anchored = !anchored diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 749f6e4920..0ad03d2826 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -245,7 +245,7 @@ /obj/machinery/seed_storage/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - + if(smart) scanner = list("stats", "produce", "soil", "temperature", "light", "pressure") else @@ -402,18 +402,18 @@ else to_chat(user, "There are no seeds in \the [O.name].") return - else if(O.is_wrench()) + else if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - else if(O.is_screwdriver()) + else if(O.has_tool_quality(TOOL_SCREWDRIVER)) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") playsound(src, O.usesound, 50, 1) cut_overlays() if(panel_open) add_overlay("[initial(icon_state)]-panel") - else if((O.is_wirecutter() || istype(O, /obj/item/device/multitool)) && panel_open) + else if((O.has_tool_quality(TOOL_WIRECUTTER) || istype(O, /obj/item/device/multitool)) && panel_open) wires.Interact(user) /obj/machinery/seed_storage/emag_act(var/remaining_charges, var/mob/user) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index bc3774284a..8375b84b40 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -252,7 +252,7 @@ user.setClickCooldown(user.get_attack_speed(W)) SSplants.add_plant(src) - if(W.is_wirecutter() || istype(W, /obj/item/weapon/surgical/scalpel)) + if(W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/weapon/surgical/scalpel)) if(sampled) to_chat(user, "\The [src] has already been sampled recently.") return diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index ca3ded0d22..1f9d58af56 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -507,7 +507,7 @@ if(O.is_open_container()) return 0 - if(O.is_wirecutter() || istype(O, /obj/item/weapon/surgical/scalpel)) + if(O.has_tool_quality(TOOL_WIRECUTTER) || istype(O, /obj/item/weapon/surgical/scalpel)) if(!seed) to_chat(user, "There is nothing to take a sample from in \the [src].") @@ -602,7 +602,7 @@ qdel(O) check_health() - else if(mechanical && O.is_wrench()) + else if(mechanical && O.has_tool_quality(TOOL_WRENCH)) //If there's a connector here, the portable_atmospherics setup can handle it. if(locate(/obj/machinery/atmospherics/portables_connector/) in loc) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 287977f095..d0a33e674b 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -273,7 +273,7 @@ visible_message("\The [user] waves \the [src] around [target].") /obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user) - if(can_anchor && I.is_wrench()) + if(can_anchor && I.has_tool_quality(TOOL_WRENCH)) anchored = !anchored to_chat(user, span("notice", "You've [anchored ? "" : "un"]secured \the [src] to \the [get_turf(src)].")) if(anchored) @@ -292,14 +292,14 @@ tgui_interact(user) return TRUE - else if(I.is_crowbar()) + else if(I.has_tool_quality(TOOL_CROWBAR)) playsound(src, 'sound/items/Crowbar.ogg', 50, 1) opened = !opened to_chat(user, "You [opened ? "opened" : "closed"] \the [src].") update_icon() return TRUE - else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || I.is_screwdriver()) + else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || I.has_tool_quality(TOOL_SCREWDRIVER)) if(opened) tgui_interact(user) return TRUE @@ -399,4 +399,4 @@ // Returns TRUE if I is something that could/should have a valid interaction. Used to tell circuitclothes to hit the circuit with something instead of the clothes /obj/item/device/electronic_assembly/proc/is_valid_tool(var/obj/item/I) - return I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/integrated_circuit) || istype(I, /obj/item/weapon/cell/device) || istype(I, /obj/item/device/integrated_electronics) + return I.has_tool_quality(TOOL_CROWBAR) || I.has_tool_quality(TOOL_SCREWDRIVER) || istype(I, /obj/item/integrated_circuit) || istype(I, /obj/item/weapon/cell/device) || istype(I, /obj/item/device/integrated_electronics) diff --git a/code/modules/integrated_electronics/core/assemblies/device.dm b/code/modules/integrated_electronics/core/assemblies/device.dm index 8500f4dafc..d23446dceb 100644 --- a/code/modules/integrated_electronics/core/assemblies/device.dm +++ b/code/modules/integrated_electronics/core/assemblies/device.dm @@ -12,7 +12,7 @@ ..() /obj/item/device/assembly/electronic_assembly/attackby(obj/item/I as obj, mob/user as mob) - if (I.is_crowbar()) + if (I.has_tool_quality(TOOL_CROWBAR)) toggle_open(user) else if (opened) EA.attackby(I, user) diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index c65e6fe14b..d539e72b0e 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -277,7 +277,6 @@ /obj/item/device/integrated_electronics/debugger, //CHOMP Edit, /obj/item/device/integrated_electronics/detailer, //CHOMP Edit, ) - cant_hold = list(/obj/item/weapon/tool/screwdriver/power) //CHOMPAdd, this whole proc. Emp'ing this one bag causes a recursion loop of over 700 emp_act's, //Which is enough to trigger byond's recursion level protection diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index a4ebf411da..0b11c0ef15 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -38,11 +38,11 @@ return else name = ("bookcase ([newname])") - else if(O.is_wrench()) + else if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 100, 1) to_chat(user, (anchored ? "You unfasten \the [src] from the floor." : "You secure \the [src] to the floor.")) anchored = !anchored - else if(O.is_screwdriver()) + else if(O.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, O.usesound, 75, 1) to_chat(user, "You begin dismantling \the [src].") if(do_after(user,25 * O.toolspeed)) @@ -281,7 +281,7 @@ Book Cart End return scanner.computer.inventory.Add(src) to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'") - else if(istype(W, /obj/item/weapon/material/knife) || W.is_wirecutter()) + else if(istype(W, /obj/item/weapon/material/knife) || W.has_tool_quality(TOOL_WIRECUTTER)) if(carved) return to_chat(user, "You begin to carve out [title].") if(do_after(user, 30)) diff --git a/code/modules/materials/sheets/metals/rods.dm b/code/modules/materials/sheets/metals/rods.dm index 9ebd0fd92f..dbb30c19d9 100644 --- a/code/modules/materials/sheets/metals/rods.dm +++ b/code/modules/materials/sheets/metals/rods.dm @@ -43,8 +43,8 @@ var/global/list/datum/stack_recipe/rods_recipes = list( \ new/datum/stack_recipe("catwalk", /obj/structure/catwalk, 2, time = 80, one_per_turf = 1, on_floor = 1)) /obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(get_amount() < 2) to_chat(user, "You need at least two rods to do this.") diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index e12b667047..b413ac8ee5 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -445,7 +445,7 @@ if(default_part_replacement(user,W)) return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) if(istype(get_turf(src), /turf/space)) to_chat(user, "You can't anchor something to empty space. Idiot.") diff --git a/code/modules/mining/shelter_atoms_vr.dm b/code/modules/mining/shelter_atoms_vr.dm index 7159859672..66e24d0635 100644 --- a/code/modules/mining/shelter_atoms_vr.dm +++ b/code/modules/mining/shelter_atoms_vr.dm @@ -234,7 +234,7 @@ GLOBAL_LIST_EMPTY(unique_deployable) pixel_y = -32 /obj/item/device/gps/computer/attackby(obj/item/I, mob/living/user) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) user.visible_message("[user] disassembles [src].", "You start to disassemble [src]...", "You hear clanking and banging noises.") if(do_after(user,4 SECONDS,src)) @@ -310,7 +310,7 @@ GLOBAL_LIST_EMPTY(unique_deployable) qdel(src) /obj/structure/fans/attackby(obj/item/I, mob/living/user) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) user.visible_message("[user] disassembles [src].", "You start to disassemble [src]...", "You hear clanking and banging noises.") if(do_after(user,4 SECONDS,src)) diff --git a/code/modules/mob/living/bot/SLed209bot.dm b/code/modules/mob/living/bot/SLed209bot.dm index f016bc55f2..a32a88973e 100644 --- a/code/modules/mob/living/bot/SLed209bot.dm +++ b/code/modules/mob/living/bot/SLed209bot.dm @@ -99,8 +99,8 @@ icon_state = "ed209_shell" if(3) - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) build_step++ name = "shielded frame assembly" @@ -150,7 +150,7 @@ qdel(W) if(8) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 100, 1) var/turf/T = get_turf(user) to_chat(user, "Now attaching the gun to the frame...") diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 069e599141..6f76699734 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -124,7 +124,7 @@ else to_chat(user, "Access denied.") return - else if(O.is_screwdriver()) + else if(O.has_tool_quality(TOOL_SCREWDRIVER)) if(!locked) open = !open to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].") @@ -132,7 +132,7 @@ else to_chat(user, "You need to unlock the controls first.") return - else if(istype(O, /obj/item/weapon/weldingtool)) + else if(O.has_tool_quality(TOOL_WELDER)) if(health < getMaxHealth()) if(open) if(getBruteLoss() < 10) @@ -164,7 +164,7 @@ to_chat(user, span_notice("You slot the card into \the [initial(src.name)].")) else to_chat(user, span_notice("You must open the panel first!")) - else if(O.is_crowbar()) + else if(O.has_tool_quality(TOOL_CROWBAR)) if(open && paicard) to_chat(user, span_notice("You are attempting to remove the pAI..")) if(do_after(user,10 * O.toolspeed)) diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index f699191a66..bca6624512 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -119,8 +119,8 @@ icon_state = "ed209_shell" if(3) - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) build_step++ name = "shielded frame assembly" @@ -188,7 +188,7 @@ qdel(W) if(8) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 100, 1) var/turf/T = get_turf(user) to_chat(user, "Now attaching the gun to the frame...") diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm index ffdcdb1f44..3a8265f352 100644 --- a/code/modules/mob/living/bot/edCLNbot.dm +++ b/code/modules/mob/living/bot/edCLNbot.dm @@ -153,8 +153,8 @@ icon_state = "edCLN_bucket" if(3) - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) build_step++ name = "bucketed frame assembly" @@ -194,7 +194,7 @@ qdel(W) if(7) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 100, 1) var/turf/T = get_turf(user) to_chat(user, "Attatching the mop to the frame...") diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 8ca61e50c8..1c8bd6e7d9 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -437,8 +437,8 @@ /obj/item/weapon/secbot_assembly/attackby(var/obj/item/W, var/mob/user) ..() - if(istype(W, /obj/item/weapon/weldingtool) && !build_step) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER) && !build_step) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) build_step = 1 add_overlay("hs_hole") diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm index 785cd5a34b..eb53459598 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm @@ -74,7 +74,7 @@ return /obj/structure/bed/double/weaversilk_nest/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench() || istype(W,/obj/item/stack) || W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WRENCH) || istype(W,/obj/item/stack) || W.has_tool_quality(TOOL_WIRECUTTER)) return ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 145706af41..b365f18c58 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -772,7 +772,7 @@ var/list/ai_verbs_default = list( var/obj/item/device/aicard/card = W card.grab_ai(src, user) - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(user == deployed_shell) to_chat(user, "The shell's subsystems resist your efforts to tamper with your bolts.") return diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 7cfa78b731..fadd1fbf13 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -231,7 +231,7 @@ var/list/mob_hat_cache = list() to_chat(user, "\The [src] is not compatible with \the [W].") return - else if (W.is_crowbar()) + else if (W.has_tool_quality(TOOL_CROWBAR)) to_chat(user, "\The [src] is hermetically sealed. You can't open the case.") return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 9bef2bfce1..a8bd76764c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -553,16 +553,16 @@ M.install(src, user) return - if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HURT) - if (src == user) + if(W.has_tool_quality(TOOL_WELDER) && user.a_intent != I_HURT) + if(src == user) to_chat(user, "You lack the reach to be able to repair yourself.") return - if (!getBruteLoss()) + if(!getBruteLoss()) to_chat(user, "Nothing to fix here!") return - var/obj/item/weapon/weldingtool/WT = W - if (WT.remove_fuel(0)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() + if(WT.remove_fuel(0)) user.setClickCooldown(user.get_attack_speed(WT)) adjustBruteLoss(-30) updatehealth() @@ -574,7 +574,7 @@ return else if(istype(W, /obj/item/stack/cable_coil) && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) - if (!getFireLoss()) + if(!getFireLoss()) to_chat(user, "Nothing to fix here!") return var/obj/item/stack/cable_coil/coil = W @@ -585,7 +585,7 @@ for(var/mob/O in viewers(user, null)) O.show_message("[user] has fixed some of the burnt wires on [src]!", 1) - else if (W.is_crowbar() && user.a_intent != I_HURT) // crowbar means open or close the cover + else if(W.has_tool_quality(TOOL_CROWBAR) && user.a_intent != I_HURT) // crowbar means open or close the cover if(opened) if(cell) to_chat(user, "You close the cover.") @@ -662,26 +662,26 @@ C.brute_damage = 0 C.electronics_damage = 0 - else if (W.is_wirecutter() || istype(W, /obj/item/device/multitool)) + else if (W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/device/multitool)) if (wiresexposed) wires.Interact(user) else to_chat(user, "You can't reach the wiring.") - else if(W.is_screwdriver() && opened && !cell) // haxing + else if(W.has_tool_quality(TOOL_SCREWDRIVER) && opened && !cell) // haxing wiresexposed = !wiresexposed to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") playsound(src, W.usesound, 50, 1) update_icon() - else if(W.is_screwdriver() && opened && cell) // radio + else if(W.has_tool_quality(TOOL_SCREWDRIVER) && opened && cell) // radio if(radio) radio.attackby(W,user)//Push it to the radio to let it handle everything else to_chat(user, "Unable to locate a radio.") update_icon() - else if(W.is_wrench() && opened && !cell) + else if(W.has_tool_quality(TOOL_WRENCH) && opened && !cell) if(bolt) to_chat(user,"You begin removing \the [bolt].") diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_altevian.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_altevian.dm index b623e850b3..114be552cd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_altevian.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_altevian.dm @@ -62,7 +62,7 @@ attacktext = list("whacked", "slammed", "bashed", "clonked", "bonked") attack_sound = 'sound/weapons/smash.ogg' - loot_list = list(/obj/item/weapon/melee/altevian_wrench = 100) + loot_list = list(/obj/item/weapon/tool/transforming/altevian = 100) /mob/living/simple_mob/humanoid/merc/altevian/ranged desc = "Altevian Naval Salvage Guard, adorned in the top of the line Heartbreaker suit. Armed with a small energy gun." diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 8da94c7199..face9bfa3c 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -146,7 +146,7 @@ try_install_component(user, C) else to_chat(user, "This component is too large for \the [src].") - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) var/list/components = get_all_components() if(components.len) to_chat(user, "Remove all components from \the [src] before disassembling it.") @@ -155,8 +155,8 @@ src.visible_message("\The [src] has been disassembled by [user].") qdel(src) return - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.isOn()) to_chat(user, "\The [W] is off.") return @@ -171,7 +171,7 @@ to_chat(user, "You repair \the [src].") return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) var/list/all_components = get_all_components() if(!all_components.len) to_chat(user, "This device doesn't have any components installed.") diff --git a/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm b/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm index f1ae59c80c..5d701ef5f0 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm @@ -25,7 +25,7 @@ name = "telescreen" /obj/item/modular_computer/telescreen/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) if(anchored) shutdown_computer() anchored = FALSE diff --git a/code/modules/multiz/ladder_assembly_vr.dm b/code/modules/multiz/ladder_assembly_vr.dm index b6e5bddf7e..377a956227 100644 --- a/code/modules/multiz/ladder_assembly_vr.dm +++ b/code/modules/multiz/ladder_assembly_vr.dm @@ -24,7 +24,7 @@ else if(istype(get_area(src), /area/shuttle)) to_chat(user, "\The [src] cannot be constructed on a shuttle.") return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) switch(state) if(CONSTRUCTION_UNANCHORED) state = CONSTRUCTION_WRENCHED @@ -44,8 +44,8 @@ to_chat(user, "\The [src] needs to be unwelded.") return - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() switch(state) if(CONSTRUCTION_UNANCHORED) to_chat(user, "The refinforcing bolts need to be secured.") diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm index e734ad1b11..267b6a6e20 100644 --- a/code/modules/nifsoft/nif.dm +++ b/code/modules/nifsoft/nif.dm @@ -224,7 +224,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable //Attackby proc, for maintenance /obj/item/device/nif/attackby(obj/item/weapon/W, mob/user as mob) - if(open == 0 && W.is_screwdriver()) + if(open == 0 && W.has_tool_quality(TOOL_SCREWDRIVER)) if(do_after(user, 4 SECONDS, src) && open == 0) user.visible_message("[user] unscrews and pries open \the [src].","You unscrew and pry open \the [src].") playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) @@ -250,7 +250,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable user.visible_message("[user] resets several circuits in \the [src].","You find and repair any faulty circuits in \the [src].") open = 3 update_icon() - else if(open == 3 && W.is_screwdriver()) + else if(open == 3 && W.has_tool_quality(TOOL_SCREWDRIVER)) if(do_after(user, 3 SECONDS, src) && open == 3) user.visible_message("[user] closes up \the [src].","You re-seal \the [src] for use once more.") playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) diff --git a/code/modules/organs/internal/augment/armmounted.dm b/code/modules/organs/internal/augment/armmounted.dm index 932f4cf646..85b9f4aa5a 100644 --- a/code/modules/organs/internal/augment/armmounted.dm +++ b/code/modules/organs/internal/augment/armmounted.dm @@ -21,7 +21,7 @@ integrated_object_type = /obj/item/weapon/gun/energy/laser/mounted/augment /obj/item/organ/internal/augment/armmounted/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) switch(organ_tag) if(O_AUG_L_FOREARM) organ_tag = O_AUG_R_FOREARM @@ -66,7 +66,7 @@ integrated_object_type = /obj/item/weapon/portable_scanner /obj/item/organ/internal/augment/armmounted/hand/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) switch(organ_tag) if(O_AUG_L_HAND) organ_tag = O_AUG_R_HAND @@ -110,7 +110,7 @@ integrated_object_type = null /obj/item/organ/internal/augment/armmounted/shoulder/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) switch(organ_tag) if(O_AUG_L_UPPERARM) organ_tag = O_AUG_R_UPPERARM diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 718234893e..925a9226c2 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -485,7 +485,7 @@ var/list/organ_cache = list() return TRUE if(robotic >= ORGAN_ROBOT) - if(O.is_screwdriver()) + if(O.has_tool_quality(TOOL_SCREWDRIVER)) return TRUE else diff --git a/code/modules/overmap/disperser/disperser.dm b/code/modules/overmap/disperser/disperser.dm index c7a5efd130..005ee3719e 100644 --- a/code/modules/overmap/disperser/disperser.dm +++ b/code/modules/overmap/disperser/disperser.dm @@ -22,7 +22,7 @@ to_chat(user, "The maintenance panel is open.") /obj/machinery/disperser/attackby(obj/item/I, mob/user) - if(I && I.is_wrench()) + if(I && I.has_tool_quality(TOOL_WRENCH)) if(panel_open) user.visible_message("\The [user] rotates \the [src] with \the [I].", "You rotate \the [src] with \the [I].") diff --git a/code/modules/overmap/overmap_shuttle.dm b/code/modules/overmap/overmap_shuttle.dm index c827835fb9..95f95f6950 100644 --- a/code/modules/overmap/overmap_shuttle.dm +++ b/code/modules/overmap/overmap_shuttle.dm @@ -78,7 +78,7 @@ var/list/waypoints = S.get_waypoints(name) for(var/obj/effect/shuttle_landmark/LZ in waypoints) if(LZ.is_valid(src)) - res["[waypoints[LZ]] - [LZ.name]"] = LZ + res["[waypoints[LZ]] - [LZ.name]"] = LZ return res /datum/shuttle/autodock/overmap/get_location_name() @@ -167,7 +167,7 @@ ..() /obj/structure/fuel_port/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) if(opened) to_chat(user, "You tightly shut \the [src] door.") playsound(src, 'sound/effects/locker_close.ogg', 25, 0, -3) diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index 21cd9654ee..18c0e36196 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -145,9 +145,9 @@ /obj/machinery/shipsensors/attackby(obj/item/weapon/W, mob/user) var/damage = max_health - health - if(damage && istype(W, /obj/item/weapon/weldingtool)) + if(damage && W.has_tool_quality(TOOL_WELDER)) - var/obj/item/weapon/weldingtool/WT = W + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.isOn()) return diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 1d9592f2f7..eae964edb8 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -248,7 +248,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins user.drop_from_inventory(O) O.forceMove(src) scan = O - else if(O.is_multitool() && panel_open) + else if(O.has_tool_quality(TOOL_MULTITOOL) && panel_open) var/input = sanitize(tgui_input_text(usr, "What Department ID would you like to give this fax machine?", "Multitool-Fax Machine Interface", department)) if(!input) to_chat(usr, "No input found. Please hang up and try your call again.") diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 396390a650..e4f262b2ae 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -38,11 +38,11 @@ P.loc = src open_animation() SStgui.update_uis(src) - else if(P.is_wrench()) + else if(P.has_tool_quality(TOOL_WRENCH)) playsound(src, P.usesound, 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - else if(P.is_screwdriver()) + else if(P.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "You begin taking the [name] apart.") playsound(src, P.usesound, 50, 1) if(do_after(user, 10 * P.toolspeed)) diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 19a0994699..4360344029 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -35,7 +35,7 @@ if(istype(W, /obj/item/weapon/storage)) empty_bin(user, W) return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index ae9bb2f509..5ce9eacd99 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -166,7 +166,7 @@ to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.") flick("photocopier_notoner", src) playsound(loc, 'sound/machines/buzz-two.ogg', 75, 1) - else if(O.is_wrench()) + else if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") diff --git a/code/modules/persistence/graffiti.dm b/code/modules/persistence/graffiti.dm index e9a031bc8e..feb561f482 100644 --- a/code/modules/persistence/graffiti.dm +++ b/code/modules/persistence/graffiti.dm @@ -43,8 +43,8 @@ . += "\n It reads \"[message]\"." /obj/effect/decal/writing/attackby(var/obj/item/thing, var/mob/user) - if(istype(thing, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/welder = thing + if(thing.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/welder = thing.get_welder() if(welder.isOn() && welder.remove_fuel(0,user) && do_after(user, 5, src) && !QDELETED(src)) playsound(src.loc, welder.usesound, 50, 1) user.visible_message("\The [user] clears away some graffiti.") diff --git a/code/modules/persistence/noticeboard.dm b/code/modules/persistence/noticeboard.dm index c187225fa1..54f07d2a58 100644 --- a/code/modules/persistence/noticeboard.dm +++ b/code/modules/persistence/noticeboard.dm @@ -55,7 +55,7 @@ icon_state = "[base_icon_state][LAZYLEN(notices)]" /obj/structure/noticeboard/attackby(obj/item/I, mob/user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) var/choice = tgui_input_list(usr, "Which direction do you wish to place the noticeboard?", "Noticeboard Offset", list("North", "South", "East", "West", "No Offset")) if(choice && Adjacent(user) && I.loc == user && !user.incapacitated()) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) @@ -75,7 +75,7 @@ if("No Offset") return return - else if(I.is_wrench()) + else if(I.has_tool_quality(TOOL_WRENCH)) visible_message("[user] begins dismantling [src].") playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 50, src)) @@ -114,8 +114,8 @@ /obj/structure/noticeboard/tgui_data(mob/user) var/list/data = ..() - - + + var/list/tgui_notices = list() for(var/obj/item/I in src.notices) tgui_notices.Add(list(list( diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 8f3c3db009..189f029501 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -140,7 +140,7 @@ /obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user) if(!istype(W) || !user) return - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) if(!anchored) playsound(src, W.usesound, 75, 1) user.visible_message("[user.name] secures the [src.name] to the floor.", \ diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 3420ce2429..7273ad62eb 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -467,7 +467,7 @@ GLOBAL_LIST_EMPTY(apcs) if(issilicon(user) && get_dist(src,user) > 1) return attack_hand(user) add_fingerprint(user) - if(W.is_crowbar() && opened) + if(W.has_tool_quality(TOOL_CROWBAR) && opened) if(has_electronics == APC_HAS_ELECTRONICS_WIRED) if(terminal) to_chat(user, "Disconnect the wires first.") @@ -491,7 +491,7 @@ GLOBAL_LIST_EMPTY(apcs) else if(opened != 2) //cover isn't removed opened = 0 update_icon() - else if(W.is_crowbar() && !(stat & BROKEN) ) + else if(W.has_tool_quality(TOOL_CROWBAR) && !(stat & BROKEN) ) if(coverlocked && !(stat & MAINT)) to_chat(user, "The cover is locked and cannot be opened.") return @@ -517,7 +517,7 @@ GLOBAL_LIST_EMPTY(apcs) "You insert the power cell.") chargecount = 0 update_icon() - else if (W.is_screwdriver()) // haxing + else if (W.has_tool_quality(TOOL_SCREWDRIVER)) // haxing if(opened) if(cell) to_chat(user, "Remove the power cell first.") @@ -573,7 +573,7 @@ GLOBAL_LIST_EMPTY(apcs) "You add cables to the APC frame.") make_terminal() terminal.connect_to_network() - else if(W.is_wirecutter() && terminal && opened && has_electronics != APC_HAS_ELECTRONICS_SECURED) + else if(W.has_tool_quality(TOOL_WIRECUTTER) && terminal && opened && has_electronics != APC_HAS_ELECTRONICS_SECURED) var/turf/T = loc if(istype(T) && !T.is_plating()) to_chat(user, "You must remove the floor plating in front of the APC first.") @@ -605,8 +605,8 @@ GLOBAL_LIST_EMPTY(apcs) else if(istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics == APC_HAS_ELECTRONICS_NONE && ((stat & BROKEN))) to_chat(user, "The [src] is too broken for that. Repair it first.") return - else if(istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics == APC_HAS_ELECTRONICS_NONE && !terminal) - var/obj/item/weapon/weldingtool/WT = W + else if(W.has_tool_quality(TOOL_WELDER) && opened && has_electronics == APC_HAS_ELECTRONICS_NONE && !terminal) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.get_fuel() < 3) to_chat(user, "You need more welding fuel to complete this task.") return @@ -674,7 +674,7 @@ GLOBAL_LIST_EMPTY(apcs) else if(istype(user, /mob/living/silicon)) return attack_hand(user) - if(!opened && wiresexposed && (istype(W, /obj/item/device/multitool) || W.is_wirecutter() || istype(W, /obj/item/device/assembly/signaler))) + if(!opened && wiresexposed && (istype(W, /obj/item/device/multitool) || W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/device/assembly/signaler))) return attack_hand(user) //Placeholder until someone can do take_damage() for APCs or something. to_chat(user, "The [name] looks too sturdy to bash open with \the [W.name].") diff --git a/code/modules/power/batteryrack_vr.dm b/code/modules/power/batteryrack_vr.dm index 8cc2b2c636..f6c4f3d36a 100644 --- a/code/modules/power/batteryrack_vr.dm +++ b/code/modules/power/batteryrack_vr.dm @@ -11,7 +11,7 @@ insert_cell(newcell) /obj/item/weapon/module/power_control/attackby(var/obj/item/I, var/mob/user) - if(I.is_multitool()) + if(I.has_tool_quality(TOOL_MULTITOOL)) to_chat(user, SPAN_NOTICE("You begin tweaking the power control circuits to support a power cell rack.")) if(do_after(user, 50 * I.toolspeed)) var/obj/item/newcircuit = new/obj/item/weapon/circuitboard/batteryrack(get_turf(user)) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index de42f2ba06..0b06dfbf31 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -177,7 +177,7 @@ var/list/possible_cable_coil_colours = list( if(!T.is_plating()) return - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) var/obj/item/stack/cable_coil/CC if(d1 == UP || d2 == UP) to_chat(user, "You must cut this cable from above.") diff --git a/code/modules/power/cable_ender.dm b/code/modules/power/cable_ender.dm index 5a581e37be..ba6359be63 100644 --- a/code/modules/power/cable_ender.dm +++ b/code/modules/power/cable_ender.dm @@ -24,7 +24,7 @@ /obj/structure/cable/ender/attackby(obj/item/W, mob/user) src.add_fingerprint(user) - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) to_chat(user, " These cables are too tough to be cut with those [W.name].") return else if(istype(W, /obj/item/stack/cable_coil)) diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm index 692dcd73d9..e37a8755d6 100644 --- a/code/modules/power/cable_heavyduty.dm +++ b/code/modules/power/cable_heavyduty.dm @@ -17,7 +17,7 @@ if(!T.is_plating()) return - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) to_chat(usr, "These cables are too tough to be cut with those [W.name].") return else if(istype(W, /obj/item/stack/cable_coil)) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index 74a479e9b6..1f3ef01e1a 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -81,7 +81,7 @@ GLOBAL_LIST_EMPTY(fuel_injectors) //CHOMPEdit End return - if(W.is_wrench() || W.is_screwdriver() || W.is_crowbar() || istype(W, /obj/item/weapon/storage/part_replacer)) + if(W.has_tool_quality(TOOL_WRENCH) || W.has_tool_quality(TOOL_SCREWDRIVER) || W.has_tool_quality(TOOL_CROWBAR) || istype(W, /obj/item/weapon/storage/part_replacer)) if(injecting) to_chat(user, "Shut \the [src] off first!") return diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 20241cdc2c..30bb2c8df3 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -170,7 +170,7 @@ GLOBAL_LIST_EMPTY(all_turbines) attack_hand(user) /obj/machinery/power/generator/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 75, 1) anchored = !anchored user.visible_message("[user.name] [anchored ? "secures" : "unsecures"] the bolts holding [src.name] to the floor.", \ diff --git a/code/modules/power/gravitygenerator_vr.dm b/code/modules/power/gravitygenerator_vr.dm index 8b4b1ccb96..40d0fc93ef 100644 --- a/code/modules/power/gravitygenerator_vr.dm +++ b/code/modules/power/gravitygenerator_vr.dm @@ -96,7 +96,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) /obj/machinery/gravity_generator/main/station/Initialize() . = ..() setup_parts() - middle.add_overlay("activated") + middle.add_overlay("activated") // // Generator an admin can spawn @@ -204,7 +204,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) /obj/machinery/gravity_generator/main/attackby(obj/item/I, mob/user, params) switch(broken_state) if(GRAV_NEEDS_SCREWDRIVER) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "You secure the screws of the framework.") playsound(src, I.usesound, 75, 1) broken_state++ @@ -212,7 +212,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) return if(GRAV_NEEDS_WELDING) if(I.has_tool_quality(TOOL_WELDER)) - var/obj/item/weapon/weldingtool/W = I + var/obj/item/weapon/weldingtool/W = I.get_welder() if(W.remove_fuel(0,user)) to_chat(user, "You mend the damaged framework.") broken_state++ @@ -231,7 +231,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) to_chat(user, "You need 10 sheets of plasteel!") return if(GRAV_NEEDS_WRENCH) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) to_chat(user, "You secure the plating to the framework.") playsound(src, I.usesound, 75, 1) set_fix() @@ -408,7 +408,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) /obj/machinery/gravity_generator/main/proc/update_list() levels.Cut() var/my_z = get_z(src) - + //Actually doing it special this time instead of letting using_map decide if(using_map.use_overmap) var/obj/effect/overmap/visitable/S = get_overmap_sector(my_z) @@ -418,7 +418,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) levels = GetConnectedZlevels(my_z) else levels = GetConnectedZlevels(my_z) - + for(var/z in levels) if(!GLOB.gravity_generators["[z]"]) GLOB.gravity_generators["[z]"] = list() diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm index 4c302c2191..8c4903cd06 100644 --- a/code/modules/power/grid_checker.dm +++ b/code/modules/power/grid_checker.dm @@ -38,12 +38,12 @@ /obj/machinery/power/grid_checker/attackby(obj/item/W, mob/user) if(!user) return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) default_deconstruction_screwdriver(user, W) opened = !opened - else if(W.is_crowbar()) + else if(W.has_tool_quality(TOOL_CROWBAR)) default_deconstruction_crowbar(user, W) - else if(istype(W, /obj/item/device/multitool) || W.is_wirecutter()) + else if(istype(W, /obj/item/device/multitool) || W.has_tool_quality(TOOL_WIRECUTTER)) attack_hand(user) /obj/machinery/power/grid_checker/attack_hand(mob/user) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 044b0e2fa9..58babbe99b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -103,7 +103,7 @@ var/global/list/light_type_cache = list() add_fingerprint(user) return - if (W.is_wrench()) + if (W.has_tool_quality(TOOL_WRENCH)) if (src.stage == 1) playsound(src, W.usesound, 75, 1) to_chat(usr, "You begin deconstructing [src].") @@ -122,7 +122,7 @@ var/global/list/light_type_cache = list() to_chat(usr, "You have to unscrew the case first.") return - if(W.is_wirecutter()) + if(W.has_tool_quality(TOOL_WIRECUTTER)) if (src.stage != 2) return src.stage = 1 src.update_icon() @@ -142,7 +142,7 @@ var/global/list/light_type_cache = list() "You add wires to [src].") return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if (src.stage == 2) src.stage = 3 src.update_icon() @@ -667,7 +667,7 @@ var/global/list/light_type_cache = list() // attempt to stick weapon into light socket else if(status == LIGHT_EMPTY) - if(W.is_screwdriver()) //If it's a screwdriver open it. + if(W.has_tool_quality(TOOL_SCREWDRIVER)) //If it's a screwdriver open it. playsound(src, W.usesound, 75, 1) user.visible_message("[user.name] opens [src]'s casing.", \ "You open [src]'s casing.", "You hear a noise.") @@ -685,7 +685,7 @@ var/global/list/light_type_cache = list() electrocute_mob(user, get_area(src), src, rand(0.7,1.0)) /obj/machinery/light/flamp/attackby(obj/item/W, mob/user) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, W.usesound, 50, 1) to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") @@ -698,7 +698,7 @@ var/global/list/light_type_cache = list() return else - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 75, 1) user.visible_message("[user.name] removes [src]'s lamp shade.", \ "You remove [src]'s lamp shade.", "You hear a noise.") diff --git a/code/modules/power/lightswitch_vr.dm b/code/modules/power/lightswitch_vr.dm index d5fe4cd6ab..e3776ede28 100644 --- a/code/modules/power/lightswitch_vr.dm +++ b/code/modules/power/lightswitch_vr.dm @@ -83,9 +83,9 @@ /obj/structure/construction/attackby(obj/item/weapon/W as obj, mob/user as mob) add_fingerprint(user) - if(istype(W, /obj/item/weapon/weldingtool)) + if(W.has_tool_quality(TOOL_WELDER)) if(stage == FRAME_UNFASTENED) - var/obj/item/weapon/weldingtool/WT = W + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.remove_fuel(0, user)) to_chat(user, "\The [src] must be on to complete this task.") return @@ -106,7 +106,7 @@ to_chat(user, "You have to remove the wires first.") return - else if(W.is_wirecutter()) + else if(W.has_tool_quality(TOOL_WIRECUTTER)) if (stage == FRAME_WIRED) stage = FRAME_FASTENED user.update_examine_panel(src) @@ -129,7 +129,7 @@ update_icon() return - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if (stage == FRAME_UNFASTENED) stage = FRAME_FASTENED user.update_examine_panel(src) diff --git a/code/modules/power/pacman2.dm b/code/modules/power/pacman2.dm index 81f73be63d..27f86867ed 100644 --- a/code/modules/power/pacman2.dm +++ b/code/modules/power/pacman2.dm @@ -70,7 +70,7 @@ O.loc = src to_chat(user, "You add the phoron tank to the generator.") else if(!active) - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(anchored) @@ -78,14 +78,14 @@ else to_chat(user, "You unsecure the generator from the floor.") SSmachines.makepowernets() - else if(O.is_screwdriver()) + else if(O.has_tool_quality(TOOL_SCREWDRIVER)) open = !open playsound(src, O.usesound, 50, 1) if(open) to_chat(user, "You open the access panel.") else to_chat(user, "You close the access panel.") - else if(O.is_crowbar() && !open) + else if(O.has_tool_quality(TOOL_CROWBAR) && !open) playsound(src, O.usesound, 50, 1) var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc) for(var/obj/item/I in component_parts) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index a9f0cd0e28..9160636125 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -279,7 +279,7 @@ updateUsrDialog() return else if(!active) - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) if(!anchored) connect_to_network() to_chat(user, "You secure the generator to the floor.") diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 86a4d00edb..59abb2cca7 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -71,11 +71,11 @@ var/global/list/rad_collectors = list() W.loc = src update_icons() return 1 - else if(W.is_crowbar()) + else if(W.has_tool_quality(TOOL_CROWBAR)) if(P && !src.locked) eject() return 1 - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(P) to_chat(user, "Remove the phoron tank first.") return 1 diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index f578e42a9d..6c191479b8 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -158,7 +158,7 @@ /obj/machinery/power/emitter/attackby(obj/item/W, mob/user) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) if(active) to_chat(user, "Turn off [src] first.") return @@ -183,8 +183,8 @@ update_icon() // VOREStation Add return - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(active) to_chat(user, "Turn off [src] first.") return diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 758523b487..17c4d770e4 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -116,7 +116,7 @@ field_generator power level display if(active) to_chat(user, "The [src] needs to be off.") return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) switch(state) if(0) state = 1 @@ -135,8 +135,8 @@ field_generator power level display if(2) to_chat(user, "The [src.name] needs to be unwelded from the floor.") return - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + else if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() switch(state) if(0) to_chat(user, "The [src.name] needs to be wrenched to the floor.") diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 6e3a6d224d..ff2486d893 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -24,7 +24,7 @@ if(src) qdel(src) /obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, W.usesound, 75, 1) if(anchored) @@ -36,7 +36,7 @@ "You unsecure the [src.name] from the floor.", \ "You hear a ratchet.") return - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) panel_open = !panel_open playsound(src, W.usesound, 50, 1) visible_message("\The [user] adjusts \the [src]'s mechanisms.") diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index bf005048ca..4ef082b0ae 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -113,7 +113,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/structure/particle_accelerator/examine(mob/user) . = ..() - + switch(construction_state) if(0) . += "Looks like it's not attached to the flooring." @@ -204,14 +204,14 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps if(0) - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 75, 1) src.anchored = TRUE user.visible_message("[user.name] secures the [src.name] to the floor.", \ "You secure the external bolts.") temp_state++ if(1) - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 75, 1) src.anchored = FALSE user.visible_message("[user.name] detaches the [src.name] from the floor.", \ @@ -223,16 +223,16 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin "You add some wires.") temp_state++ if(2) - if(O.is_wirecutter())//TODO:Shock user if its on? + if(O.has_tool_quality(TOOL_WIRECUTTER))//TODO:Shock user if its on? user.visible_message("[user.name] removes some wires from the [src.name].", \ "You remove some wires.") temp_state-- - else if(O.is_screwdriver()) + else if(O.has_tool_quality(TOOL_SCREWDRIVER)) user.visible_message("[user.name] closes the [src.name]'s access panel.", \ "You close the access panel.") temp_state++ if(3) - if(O.is_screwdriver()) + if(O.has_tool_quality(TOOL_SCREWDRIVER)) user.visible_message("[user.name] opens the [src.name]'s access panel.", \ "You open the access panel.") temp_state-- @@ -292,7 +292,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/machinery/particle_accelerator/examine(mob/user) . = ..() - + switch(construction_state) if(0) . += "Looks like it's not attached to the flooring." @@ -338,14 +338,14 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin var/temp_state = src.construction_state switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps if(0) - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 75, 1) src.anchored = TRUE user.visible_message("[user.name] secures the [src.name] to the floor.", \ "You secure the external bolts.") temp_state++ if(1) - if(O.is_wrench()) + if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 75, 1) src.anchored = FALSE user.visible_message("[user.name] detaches the [src.name] from the floor.", \ @@ -357,16 +357,16 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin "You add some wires.") temp_state++ if(2) - if(O.is_wirecutter())//TODO:Shock user if its on? + if(O.has_tool_quality(TOOL_WIRECUTTER))//TODO:Shock user if its on? user.visible_message("[user.name] removes some wires from the [src.name].", \ "You remove some wires.") temp_state-- - else if(O.is_screwdriver()) + else if(O.has_tool_quality(TOOL_SCREWDRIVER)) user.visible_message("[user.name] closes the [src.name]'s access panel.", \ "You close the access panel.") temp_state++ if(3) - if(O.is_screwdriver()) + if(O.has_tool_quality(TOOL_SCREWDRIVER)) user.visible_message("[user.name] opens the [src.name]'s access panel.", \ "You open the access panel.") temp_state-- diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index 77c0858606..af901342d5 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -74,7 +74,7 @@ to_chat(user, "You add \the [reagent_container] to \the [src].") update_icon() return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, W.usesound, 75, 1) if(anchored) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 89162155d0..896e176bca 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -310,8 +310,8 @@ GLOBAL_LIST_EMPTY(smeses) to_chat(user, "You need to open access hatch on [src] first!") return FALSE - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W + if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.isOn()) to_chat(user, "Turn on \the [WT] first!") return FALSE @@ -342,7 +342,7 @@ GLOBAL_LIST_EMPTY(smeses) connect_to_network() return FALSE - else if(W.is_wirecutter() && !building_terminal) + else if(W.has_tool_quality(TOOL_WIRECUTTER) && !building_terminal) building_terminal = TRUE var/obj/machinery/power/terminal/term for(var/obj/machinery/power/terminal/T in get_turf(user)) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 44d3a748b5..47bd37f008 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -335,7 +335,7 @@ failure_probability = 0 // Crowbar - Disassemble the SMES. - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) if (terminals.len) to_chat(user, "You have to disassemble the terminal first!") return diff --git a/code/modules/power/smes_vr.dm b/code/modules/power/smes_vr.dm index fe46cae7f0..2612fab73b 100644 --- a/code/modules/power/smes_vr.dm +++ b/code/modules/power/smes_vr.dm @@ -6,7 +6,7 @@ var/overlay_icon = 'icons/obj/power_vr.dmi' /obj/machinery/power/smes/buildable/hybrid/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if(W.is_screwdriver() || W.is_wirecutter()) + if(W.has_tool_quality(TOOL_SCREWDRIVER) || W.has_tool_quality(TOOL_WIRECUTTER)) to_chat(user,"\The [src] full of weird alien technology that's best not messed with.") return 0 diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index f0c010c0f2..97d9ff488b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -58,7 +58,7 @@ GLOBAL_LIST_EMPTY(solars_list) /obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user) - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) playsound(src, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar panel.") if(do_after(user, 50)) @@ -123,7 +123,7 @@ GLOBAL_LIST_EMPTY(solars_list) return 0 //if there's no SSsun.sun or the panel is not linked to a solar control computer, no need to proceed if(!powernet || powernet != control.powernet) return 0 // We aren't connected to the controller - if(obscured) + if(obscured) return 0 //get no light from the SSsun.sun, so don't generate power return GLOB.solar_gen_rate * sunfrac @@ -207,13 +207,13 @@ GLOBAL_LIST_EMPTY(solars_list) if (!isturf(loc)) return 0 if(!anchored) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) anchored = TRUE user.visible_message("[user] wrenches the solar assembly into place.") playsound(src, W.usesound, 75, 1) return 1 else - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) anchored = FALSE user.visible_message("[user] unwrenches the solar assembly from it's place.") playsound(src, W.usesound, 75, 1) @@ -242,7 +242,7 @@ GLOBAL_LIST_EMPTY(solars_list) user.visible_message("[user] inserts the electronics into the solar assembly.") return 1 else - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) new /obj/item/weapon/tracker_electronics(src.loc) tracker = 0 user.visible_message("[user] takes out the electronics from the solar assembly.") @@ -412,7 +412,7 @@ GLOBAL_LIST_EMPTY(solars_list) return data /obj/machinery/power/solar_control/attackby(obj/item/I, user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, I.usesound, 50, 1) if(do_after(user, 20)) if (src.stat & BROKEN) diff --git a/code/modules/power/tesla/telsa_construction.dm b/code/modules/power/tesla/telsa_construction.dm index 655e2b3cb6..b3c865c47a 100644 --- a/code/modules/power/tesla/telsa_construction.dm +++ b/code/modules/power/tesla/telsa_construction.dm @@ -34,7 +34,7 @@ // SPECIAL BOARDS BELOW /obj/item/weapon/circuitboard/tesla_coil/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_multitool()) + if(I.has_tool_quality(TOOL_MULTITOOL)) var/result = tgui_input_list(user, "What do you want to reconfigure the board to?", "Multitool-Circuitboard interface", list("Standard", "Relay", "Prism", "Amplifier", "Recaster", "Collector")) switch(result) if("Standard") diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 0a301cba82..efd68308fb 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -53,7 +53,7 @@ /obj/machinery/power/tracker/attackby(var/obj/item/weapon/W, var/mob/user) - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) playsound(src, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar tracker.") if(do_after(user, 50)) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 5fa957d0a1..a09e7cfb61 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -31,7 +31,7 @@ update_icon() /obj/item/ammo_casing/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(!BB) to_chat(user, "There is no bullet in the casing to inscribe anything into.") return diff --git a/code/modules/projectiles/ammunition/smartmag.dm b/code/modules/projectiles/ammunition/smartmag.dm index c1a5fbbcd8..e72e78fb36 100644 --- a/code/modules/projectiles/ammunition/smartmag.dm +++ b/code/modules/projectiles/ammunition/smartmag.dm @@ -87,7 +87,7 @@ update_icon() return - else if(I.is_screwdriver()) + else if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(attached_cell) to_chat(user, "You begin removing \the [attached_cell] from \the [src].") if(do_after(user, 10)) // Faster than doing it by hand diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5623f104e2..0cc926e432 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -283,7 +283,7 @@ verbs += /obj/item/weapon/gun/verb/allow_dna return - if(A.is_screwdriver()) + if(A.has_tool_quality(TOOL_SCREWDRIVER)) if(dna_lock && attached_lock && !attached_lock.controller_lock) to_chat(user, "You begin removing \the [attached_lock] from \the [src].") playsound(src, A.usesound, 50, 1) diff --git a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm index bc2955d173..9de31a0c1d 100644 --- a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm +++ b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm @@ -42,7 +42,7 @@ if(!istype(user)) return - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(!scanmod) to_chat(user, "There's no scanner module installed!") return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 84a298ebbb..bb9dea543c 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -82,7 +82,7 @@ else to_chat(user, "[src] already has a laser.") - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(emitter) to_chat(user, "You remove the [emitter.name] from the [src].") emitter.loc = get_turf(src.loc) diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index 18c8d15597..ea6af4457a 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -167,7 +167,7 @@ else to_chat(user, "[src] already has a cell installed.") - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(cell) var/obj/item/C = cell C.loc = get_turf(user) @@ -237,9 +237,9 @@ else to_chat(user, "You need at least three rods to complete this task.") return - else if(istype(W, /obj/item/weapon/weldingtool)) + else if(W.has_tool_quality(TOOL_WELDER)) if(buildstate == 1) - var/obj/item/weapon/weldingtool/T = W + var/obj/item/weapon/weldingtool/T = W.get_welder() if(T.remove_fuel(0,user)) if(!src || !T.isOn()) return playsound(src, W.usesound, 50, 1) @@ -275,7 +275,7 @@ else to_chat(user, "You need at least three plastic sheets to complete this task.") return - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(buildstate == 5) to_chat(user, "You secure the crossbow's various parts.") playsound(src, W.usesound, 50, 1) diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 8372eb77b4..1e75a9b1d2 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -190,9 +190,9 @@ buildstate++ update_icon() return - else if(istype(W,/obj/item/weapon/weldingtool)) + else if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/T = W.get_welder() if(buildstate == 1) - var/obj/item/weapon/weldingtool/T = W if(T.remove_fuel(0,user)) if(!src || !T.isOn()) return playsound(src, W.usesound, 100, 1) @@ -200,7 +200,6 @@ buildstate++ update_icon() if(buildstate == 3) - var/obj/item/weapon/weldingtool/T = W if(T.remove_fuel(0,user)) if(!src || !T.isOn()) return playsound(src, W.usesound, 100, 1) @@ -208,7 +207,6 @@ buildstate++ update_icon() if(buildstate == 5) - var/obj/item/weapon/weldingtool/T = W if(T.remove_fuel(0,user)) if(!src || !T.isOn()) return playsound(src, W.usesound, 100, 1) diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index 66e89cb9eb..21077bb05a 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -88,7 +88,7 @@ . = ..() update_rating_mod() if(removable_components) - if(thing.is_crowbar()) + if(thing.has_tool_quality(TOOL_CROWBAR)) if(!manipulator) to_chat(user, "\The [src] has no manipulator installed.") return diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 54c0b2f0d5..0e228aa94e 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -155,7 +155,7 @@ update_icon() return - if(thing.is_screwdriver()) + if(thing.has_tool_quality(TOOL_SCREWDRIVER)) if(!capacitor) to_chat(user, "\The [src] has no capacitor installed.") return diff --git a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm index 9f81dbe4dc..da0212b520 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm @@ -33,8 +33,8 @@ increment_construction_stage() return - if(istype(thing, /obj/item/weapon/weldingtool) && construction_stage == 4) - var/obj/item/weapon/weldingtool/welder = thing + if(thing.has_tool_quality(TOOL_WELDER) && construction_stage == 4) + var/obj/item/weapon/weldingtool/welder = thing.get_welder() if(!welder.isOn()) to_chat(user, "Turn it on first!") @@ -66,7 +66,7 @@ increment_construction_stage() return - if(thing.is_screwdriver() && construction_stage >= 9) + if(thing.has_tool_quality(TOOL_SCREWDRIVER) && construction_stage >= 9) user.visible_message("\The [user] secures \the [src] and finishes it off.") playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) var/obj/item/weapon/gun/magnetic/coilgun = new(loc) diff --git a/code/modules/projectiles/guns/modular_guns.dm b/code/modules/projectiles/guns/modular_guns.dm index 2a18c10d11..7aec9084f6 100644 --- a/code/modules/projectiles/guns/modular_guns.dm +++ b/code/modules/projectiles/guns/modular_guns.dm @@ -51,12 +51,12 @@ FireModeModify() /obj/item/weapon/gun/energy/modular/attackby(obj/item/O, mob/user) - if(O.is_screwdriver()) + if(O.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "You [assembled ? "disassemble" : "assemble"] the gun.") assembled = !assembled playsound(src, O.usesound, 50, 1) return - if(O.is_crowbar()) + if(O.has_tool_quality(TOOL_CROWBAR)) if(assembled == 1) to_chat(user, "Disassemble the [src] first!") return diff --git a/code/modules/reagents/hoses/connector.dm b/code/modules/reagents/hoses/connector.dm index abf55d4fab..a11834e3cb 100644 --- a/code/modules/reagents/hoses/connector.dm +++ b/code/modules/reagents/hoses/connector.dm @@ -3,7 +3,7 @@ . = ..() if(locate(/obj/item/hose_connector) in src) - if(O.is_wirecutter()) + if(O.has_tool_quality(TOOL_WIRECUTTER)) var/list/available_sockets = list() for(var/obj/item/hose_connector/HC in src) diff --git a/code/modules/reagents/machinery/dispenser/dispenser2.dm b/code/modules/reagents/machinery/dispenser/dispenser2.dm index 2d229f73aa..bd9c85b24c 100644 --- a/code/modules/reagents/machinery/dispenser/dispenser2.dm +++ b/code/modules/reagents/machinery/dispenser/dispenser2.dm @@ -77,7 +77,7 @@ SStgui.update_uis(src) /obj/machinery/chemical_dispenser/attackby(obj/item/weapon/W, mob/user) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) playsound(src, W.usesound, 50, 1) to_chat(user, "You begin to [anchored ? "un" : ""]fasten \the [src].") if (do_after(user, 20 * W.toolspeed)) @@ -92,7 +92,7 @@ else if(istype(W, /obj/item/weapon/reagent_containers/chem_disp_cartridge)) add_cartridge(W, user) - else if(W.is_screwdriver()) + else if(W.has_tool_quality(TOOL_SCREWDRIVER)) var/label = tgui_input_list(user, "Which cartridge would you like to remove?", "Chemical Dispenser", cartridges) if(!label) return var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label) @@ -134,7 +134,7 @@ data["amount"] = amount data["isBeakerLoaded"] = container ? 1 : 0 data["glass"] = accept_drinking - + var/beakerContents[0] if(container && container.reagents && container.reagents.reagent_list.len) for(var/datum/reagent/R in container.reagents.reagent_list) diff --git a/code/modules/reagents/machinery/dispenser/reagent_tank.dm b/code/modules/reagents/machinery/dispenser/reagent_tank.dm index 7cbaa1a82b..c55c60c0cc 100644 --- a/code/modules/reagents/machinery/dispenser/reagent_tank.dm +++ b/code/modules/reagents/machinery/dispenser/reagent_tank.dm @@ -178,7 +178,7 @@ modded = FALSE /obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (W.is_wrench()) //can't wrench it shut, it's always open + if (W.has_tool_quality(TOOL_WRENCH)) //can't wrench it shut, it's always open return return ..() //VOREStation Add End @@ -202,7 +202,7 @@ /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob) src.add_fingerprint(user) - if (W.is_wrench()) + if (W.has_tool_quality(TOOL_WRENCH)) user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \ "You wrench [src]'s faucet [modded ? "closed" : "open"]") modded = modded ? 0 : 1 @@ -360,7 +360,7 @@ return 1 /obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) src.add_fingerprint(user) if(bottle) playsound(src, I.usesound, 50, 1) @@ -385,7 +385,7 @@ playsound(src, I.usesound, 50, 1) return - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(cupholder) playsound(src, I.usesound, 50, 1) to_chat(user, "You take the cup dispenser off.") @@ -522,4 +522,3 @@ /obj/structure/reagent_dispensers/bloodbarrel/Initialize() . = ..() reagents.add_reagent("blood", 1000, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"="O-","resistances"=null,"trace_chem"=null)) - diff --git a/code/modules/reagents/machinery/pump.dm b/code/modules/reagents/machinery/pump.dm index 6c9302d61e..0330547df2 100644 --- a/code/modules/reagents/machinery/pump.dm +++ b/code/modules/reagents/machinery/pump.dm @@ -57,7 +57,7 @@ src.reagents.trans_to_holder(R, src.reagents.total_volume) qdel(src.reagents) src.reagents = R - + /obj/machinery/pump/update_icon() ..() cut_overlays() @@ -81,7 +81,7 @@ /obj/machinery/pump/process() if(!on) return - + if(!anchored || !(cell?.use(active_power_usage))) set_state(FALSE) return @@ -141,18 +141,18 @@ /obj/machinery/pump/attackby(obj/item/weapon/W, mob/user) . = TRUE - if(W.is_screwdriver() && !open) + if(W.has_tool_quality(TOOL_SCREWDRIVER) && !open) to_chat(user, SPAN_NOTICE("You [unlocked ? "screw" : "unscrew"] the battery panel.")) unlocked = !unlocked - else if(W.is_crowbar() && unlocked) + else if(W.has_tool_quality(TOOL_CROWBAR) && unlocked) to_chat(user, open ? \ "You crowbar the battery panel in place." : \ "You remove the battery panel." \ ) open = !open - - else if(W.is_wrench()) + + else if(W.has_tool_quality(TOOL_WRENCH)) if(on) to_chat(user, "\The [src] is active. Turn it off before trying to move it!") return FALSE diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index d99bd24df2..c7427a97f5 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -299,7 +299,7 @@ user.drop_from_inventory(src) qdel(src) return - else if(D.is_wirecutter()) + else if(D.has_tool_quality(TOOL_WIRECUTTER)) to_chat(user, "You cut a big hole in \the [src] with \the [D]. It's kinda useless as a bucket now.") user.put_in_hands(new /obj/item/clothing/head/helmet/bucket) user.drop_from_inventory(src) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 90c1ee648e..db8b25891e 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -289,9 +289,9 @@ if(default_deconstruction_screwdriver(user, I)) return - if(istype(I, /obj/item/weapon/weldingtool)) + if(I.has_tool_quality(TOOL_WELDER)) if(panel_open) - var/obj/item/weapon/weldingtool/WT = I + var/obj/item/weapon/weldingtool/WT = I.get_welder() if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") return diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 551a251a50..f3ff511d4d 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -246,7 +246,7 @@ var/obj/structure/disposalpipe/CP = locate() in T // wrench: (un)anchor - if(I.is_wrench()) + if(I.has_tool_quality(TOOL_WRENCH)) if(anchored) anchored = FALSE if(ispipe) @@ -285,9 +285,9 @@ update() // weldingtool: convert to real pipe - else if(istype(I, /obj/item/weapon/weldingtool)) + else if(I.has_tool_quality(TOOL_WELDER)) if(anchored) - var/obj/item/weapon/weldingtool/W = I + var/obj/item/weapon/weldingtool/W = I.get_welder() if(W.remove_fuel(0,user)) playsound(src, W.usesound, 100, 1) to_chat(user, "Welding the [nicetype] in place.") diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 6c3671c192..b0110549af 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -56,7 +56,7 @@ src.add_fingerprint(user) if(mode<=0) // It's off - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(contents.len > 0) to_chat(user, "Eject the items first!") return @@ -70,11 +70,11 @@ playsound(src, I.usesound, 50, 1) to_chat(user, "You attach the screws around the power connection.") return - else if(istype(I, /obj/item/weapon/weldingtool) && mode==-1) + else if(I.has_tool_quality(TOOL_WELDER) && mode==-1) if(contents.len > 0) to_chat(user, "Eject the items first!") return - var/obj/item/weapon/weldingtool/W = I + var/obj/item/weapon/weldingtool/W = I.get_welder() if(W.remove_fuel(0,user)) playsound(src, W.usesound, 100, 1) to_chat(user, "You start slicing the floorweld off the disposal unit.") @@ -985,8 +985,8 @@ if(!T.is_plating()) return // prevent interaction with T-scanner revealed pipes src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I + if(I.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/W = I.get_welder() if(W.remove_fuel(0,user)) playsound(src, W.usesound, 50, 1) @@ -1460,8 +1460,8 @@ if(!T.is_plating()) return // prevent interaction with T-scanner revealed pipes src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I + if(I.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/W = I.get_welder() if(W.remove_fuel(0,user)) playsound(src, W.usesound, 100, 1) @@ -1582,7 +1582,7 @@ if(!I || !user) return src.add_fingerprint(user) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(mode==0) mode=1 to_chat(user, "You remove the screws around the power connection.") @@ -1593,8 +1593,8 @@ to_chat(user, "You attach the screws around the power connection.") playsound(src, I.usesound, 50, 1) return - else if(istype(I, /obj/item/weapon/weldingtool) && mode==1) - var/obj/item/weapon/weldingtool/W = I + else if(I.has_tool_quality(TOOL_WELDER) && mode==1) + var/obj/item/weapon/weldingtool/W = I.get_welder() if(W.remove_fuel(0,user)) playsound(src, W.usesound, 100, 1) to_chat(user, "You start slicing the floorweld off the disposal outlet.") diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 8fe9646ac9..caa4df13bc 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -437,13 +437,13 @@ if(!I || !user) return - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) c_mode = !c_mode playsound(src, I.usesound, 50, 1) to_chat(user, "You [c_mode ? "remove" : "attach"] the screws around the power connection.") return - if(istype(I, /obj/item/weapon/weldingtool) && c_mode==1) - var/obj/item/weapon/weldingtool/W = I + if(I.has_tool_quality(TOOL_WELDER) && c_mode==1) + var/obj/item/weapon/weldingtool/W = I.get_welder() if(!W.remove_fuel(0,user)) to_chat(user, "You need more welding fuel to complete this task.") return diff --git a/code/modules/research/designs/engineering.dm b/code/modules/research/designs/engineering.dm index 16a58ab395..7d57aa62df 100644 --- a/code/modules/research/designs/engineering.dm +++ b/code/modules/research/designs/engineering.dm @@ -19,7 +19,7 @@ id = "handdrill" req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) materials = list(MAT_STEEL = 300, MAT_SILVER = 100) - build_path = /obj/item/weapon/tool/screwdriver/power + build_path = /obj/item/weapon/tool/transforming/powerdrill sort_string = "NAAAB" /datum/design/item/tool/jaws_life @@ -28,7 +28,7 @@ id = "jawslife" req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) materials = list(MAT_STEEL = 300, MAT_SILVER = 100) - build_path = /obj/item/weapon/tool/crowbar/power + build_path = /obj/item/weapon/tool/transforming/jawsoflife sort_string = "NAAAC" // YW addition begins /datum/design/item/tool/rpd diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index daeae94946..effc14b222 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -42,7 +42,7 @@ event_triggered_by = usr broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) to_chat(user, "You begin removing the faceplate from the [src]") playsound(src, W.usesound, 50, 1) if(do_after(user, 10 * W.toolspeed)) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index d7d244bac4..a3908a6a55 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -280,7 +280,7 @@ return 1 /obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 100, 1) if(is_open) to_chat(user, "You close the panel.") @@ -300,7 +300,7 @@ to_chat(user, "You repair the [src]!") update_icon() - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(locked) to_chat(user, "The bolts are covered, unlocking this would retract the covers.") return diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index d03cd22c45..3f4b7c2922 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -157,7 +157,7 @@ /obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) if(active) to_chat(user, "Turn off the field generator first.") return diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 2bd6818d25..c32998a0a2 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -46,7 +46,7 @@ updateDialog() else to_chat(user, "Access denied.") - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) src.anchored = !src.anchored playsound(src, W.usesound, 75, 1) src.visible_message("\icon[src][bicon(src)] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index edfe05e5c4..c9c7ccbdd7 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -69,7 +69,7 @@ updateDialog() else to_chat(user, "Access denied.") - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) src.anchored = !src.anchored playsound(src, W.usesound, 75, 1) src.visible_message("\icon[src][bicon(src)] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].") diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm index 2158a53d02..3f0f23ed37 100644 --- a/code/modules/shieldgen/shield_generator.dm +++ b/code/modules/shieldgen/shield_generator.dm @@ -357,12 +357,12 @@ overloaded = 0 /obj/machinery/power/shield_generator/attackby(obj/item/O as obj, mob/user as mob) - if(panel_open && (O?.is_multitool() || O?.is_wirecutter())) + if(panel_open && (O?.has_tool_quality(TOOL_MULTITOOL) || O?.has_tool_quality(TOOL_WIRECUTTER))) wires.Interact(user) return TRUE if(default_deconstruction_screwdriver(user, O)) return - if(O?.is_crowbar() || O?.is_wrench() || istype(O, /obj/item/weapon/storage/part_replacer)) + if(O?.has_tool_quality(TOOL_CROWBAR) || O?.has_tool_quality(TOOL_WRENCH) || istype(O, /obj/item/weapon/storage/part_replacer)) if(offline_for) to_chat(user, "Wait until \the [src] cools down from emergency shutdown first!") return diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 8c13af59d3..a7df129617 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -41,16 +41,16 @@ for(var/P in allowed_procs) switch(P) if(IS_SCREWDRIVER) - if(tool.is_screwdriver()) + if(tool.has_tool_quality(TOOL_SCREWDRIVER)) return allowed_procs[P] if(IS_CROWBAR) - if(tool.is_crowbar()) + if(tool.has_tool_quality(TOOL_CROWBAR)) return allowed_procs[P] if(IS_WIRECUTTER) - if(tool.is_wirecutter()) + if(tool.has_tool_quality(TOOL_WIRECUTTER)) return allowed_procs[P] if(IS_WRENCH) - if(tool.is_wrench()) + if(tool.has_tool_quality(TOOL_WRENCH)) return allowed_procs[P] return 0 diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 62d089c037..698feefe2f 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -99,7 +99,7 @@ var/list/table_icon_cache = list() /obj/structure/table/attackby(obj/item/weapon/W, mob/user) - if(reinforced && W.is_screwdriver()) + if(reinforced && W.has_tool_quality(TOOL_SCREWDRIVER)) remove_reinforced(W, user) if(!reinforced) update_desc() @@ -107,7 +107,7 @@ var/list/table_icon_cache = list() update_material() return 1 - if(carpeted && W.is_crowbar()) + if(carpeted && W.has_tool_quality(TOOL_CROWBAR)) user.visible_message("\The [user] removes the carpet from \the [src].", "You remove the carpet from \the [src].") new carpeted_type(loc) @@ -127,7 +127,7 @@ var/list/table_icon_cache = list() else to_chat(user, "You don't have enough carpet!") - if(!reinforced && !carpeted && material && W.is_wrench()) + if(!reinforced && !carpeted && material && W.has_tool_quality(TOOL_WRENCH)) remove_material(W, user) if(!material) update_connections(1) @@ -138,12 +138,12 @@ var/list/table_icon_cache = list() update_material() return 1 - if(!carpeted && !reinforced && !material && W.is_wrench()) + if(!carpeted && !reinforced && !material && W.has_tool_quality(TOOL_WRENCH)) dismantle(W, user) return 1 - if(health < maxhealth && istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/F = W + if(health < maxhealth && W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/F = W.get_welder() if(F.welding) to_chat(user, "You begin reparing damage to \the [src].") playsound(src, F.usesound, 50, 1) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 3859d13212..57e2c0ac13 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -68,7 +68,7 @@ return ..() /obj/vehicle/train/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(open && W.is_wirecutter()) + if(open && W.has_tool_quality(TOOL_WIRECUTTER)) passenger_allowed = !passenger_allowed user.visible_message("[user] [passenger_allowed ? "cuts" : "mends"] a cable in [src].","You [passenger_allowed ? "cut" : "mend"] the load limiter cable.") else diff --git a/code/modules/vehicles/construction.dm b/code/modules/vehicles/construction.dm index 20adccd5f0..3c81ccc6ae 100644 --- a/code/modules/vehicles/construction.dm +++ b/code/modules/vehicles/construction.dm @@ -129,7 +129,7 @@ return if(7) - if(W.is_wrench() || W.is_screwdriver()) + if(W.has_tool_quality(TOOL_WRENCH) || W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) to_chat(user, "You begin your finishing touches on \the [src].") if(do_after(user, 20) && build_stage == 7) @@ -179,7 +179,7 @@ return if(2) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) to_chat(user, "You close up \the [src].") var/obj/vehicle/train/trolley/trailer/product = new(src) @@ -260,7 +260,7 @@ return if(6) - if(W.is_wrench() || W.is_screwdriver()) + if(W.has_tool_quality(TOOL_WRENCH) || W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) to_chat(user, "You begin your finishing touches on \the [src].") if(do_after(user, 20) && build_stage == 6) @@ -360,7 +360,7 @@ return if(7) - if(W.is_wrench() || W.is_screwdriver()) + if(W.has_tool_quality(TOOL_WRENCH) || W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) to_chat(user, "You begin your finishing touches on \the [src].") if(do_after(user, 20) && build_stage == 7) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 7df7d80914..663df629c5 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -102,19 +102,19 @@ if(istype(W, /obj/item/weapon/hand_labeler)) return if(mechanical) - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) if(!locked) open = !open update_icon() to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].") playsound(src, W.usesound, 50, 1) - else if(W.is_crowbar() && cell && open) + else if(W.has_tool_quality(TOOL_CROWBAR) && cell && open) remove_cell(user) else if(istype(W, /obj/item/weapon/cell) && !cell && open) insert_cell(W, user) - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/T = W + else if(W.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/T = W.get_welder() if(T.welding) if(health < maxhealth) if(open) diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm index ee2385d90d..4cfb570a8d 100644 --- a/code/modules/virus2/centrifuge.dm +++ b/code/modules/virus2/centrifuge.dm @@ -10,7 +10,7 @@ var/datum/disease2/disease/virus2 = null /obj/machinery/computer/centrifuge/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.is_screwdriver()) + if(O.has_tool_quality(TOOL_SCREWDRIVER)) return ..(O,user) if(default_unfasten_wrench(user, O, 20)) diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index fb682f51d1..263404ea1f 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -12,7 +12,7 @@ var/scanning = 0 /obj/machinery/computer/diseasesplicer/attackby(var/obj/item/I as obj, var/mob/user as mob) - if(I.is_screwdriver()) + if(I.has_tool_quality(TOOL_SCREWDRIVER)) return ..(I,user) if(default_unfasten_wrench(user, I, 20)) diff --git a/code/modules/vore/weight/fitness_machines_vr.dm b/code/modules/vore/weight/fitness_machines_vr.dm index ca6267ba49..2f09e9a36f 100644 --- a/code/modules/vore/weight/fitness_machines_vr.dm +++ b/code/modules/vore/weight/fitness_machines_vr.dm @@ -55,7 +55,7 @@ "A honk emits from the punching bag as you hit it") /obj/machinery/fitness/heavy/attackby(obj/item/W, mob/living/user) - if(W.is_wrench()) + if(W.has_tool_quality(TOOL_WRENCH)) add_fingerprint(user) user.visible_message("[user] has [anchored ? "un" : ""]secured \the [src].", "You [anchored ? "un" : ""]secure \the [src].") anchored = !anchored diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm index aa620393dd..de7b6382b0 100644 --- a/code/modules/xenoarcheaology/finds/finds.dm +++ b/code/modules/xenoarcheaology/finds/finds.dm @@ -41,8 +41,8 @@ qdel(src) return - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I + if(I.has_tool_quality(TOOL_WELDER)) + var/obj/item/weapon/weldingtool/W = I.get_welder() if(W.isOn()) if(W.get_fuel() >= 2) var/obj/item/inside = locate() in src diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm index bb7d714aa0..4449d85db5 100644 --- a/code/modules/xenoarcheaology/tools/suspension_generator.dm +++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm @@ -91,7 +91,7 @@ /obj/machinery/suspension_gen/attackby(obj/item/W as obj, mob/user as mob) if(!locked && !suspension_field && default_deconstruction_screwdriver(user, W)) return - else if(W.is_wrench()) + else if(W.has_tool_quality(TOOL_WRENCH)) if(!suspension_field) if(anchored) anchored = 0 diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index e2882001e1..8f55143be2 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -26,11 +26,11 @@ /obj/machinery/slime/extractor/attackby(var/obj/item/W, var/mob/user) //Let's try to deconstruct first. - if(W.is_screwdriver() && !inuse) + if(W.has_tool_quality(TOOL_SCREWDRIVER) && !inuse) default_deconstruction_screwdriver(user, W) return - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) default_deconstruction_crowbar(user, W) return diff --git a/code/modules/xenobio2/machinery/injector.dm b/code/modules/xenobio2/machinery/injector.dm index 3e31b54cd8..6b18e89073 100644 --- a/code/modules/xenobio2/machinery/injector.dm +++ b/code/modules/xenobio2/machinery/injector.dm @@ -88,11 +88,11 @@ /obj/machinery/xenobio2/manualinjector/attackby(var/obj/item/W, var/mob/user) //Let's try to deconstruct first. - if(W.is_screwdriver()) + if(W.has_tool_quality(TOOL_SCREWDRIVER)) default_deconstruction_screwdriver(user, W) return - if(W.is_crowbar() && !occupant) + if(W.has_tool_quality(TOOL_CROWBAR) && !occupant) default_deconstruction_crowbar(user, W) return diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index 30c3e372a5..c7b7b3c567 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -24,11 +24,11 @@ /obj/machinery/slime/replicator/attackby(var/obj/item/W, var/mob/user) //Let's try to deconstruct first. - if(W.is_screwdriver() && !inuse) + if(W.has_tool_quality(TOOL_SCREWDRIVER) && !inuse) default_deconstruction_screwdriver(user, W) return - if(W.is_crowbar()) + if(W.has_tool_quality(TOOL_CROWBAR)) default_deconstruction_crowbar(user, W) return diff --git a/icons/inventory/back/mob.dmi b/icons/inventory/back/mob.dmi index ce764ee6c5a7e035972943cd782b408c88c7f42a..f9c36d0277ef4058f595625276b9614ddec3e69d 100644 GIT binary patch delta 34229 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ýlH^FZ;!g)U5tQ=nul~J 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 bLd>5samL~z)WC;2VShh(qL6?8<=g)Qg@;Hi diff --git a/icons/mob/items/lefthand_melee_vr.dmi b/icons/mob/items/lefthand_melee_vr.dmi index 2cc11d8ed873c818188433c6ce701d042c944144..7d544733917bfabbcef9a4cb3f695a7ee91bbb26 100644 GIT binary patch literal 17874 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 ufUl0&Q-no<2NBl|_;CJzjA0Oo!+-@c#gl+~4;A literal 11348 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 ZeyH?42$L@g{2~}YK}O|e$@8~C{{xyv1Nr~} literal 11509 zcma)iby$?qw)Y_2Akw9zfHX*hN+}>nN_TfR3@9ljf`pWk(lEr(LkLJnN)9lDba&6( z7w22hqTi@065`R|fj}U_S1;u>Kp-?z;P(s%3ut-w ztI!{)Q2A@=ddgXOSh(A{dfK@-gFwESpT~dMckvNmA9&n6$Zf62+w?!R%8#YfKf`*i zoIE{P{k}{H4&Ud)aV)C|5V|=z#P-7nlHeqjXD<=g!8jVm5Tbl~< zK5<|1!Gn8*v=XYLy6*D|Ov&Zf26$F(xbdM*QV@xYdT|9 z(Rx&76uiMk^M^xEmN5xmWzN$1WI$wyNMQrnG`5-YG!n!(1Q1 z5`?|GHxHNYB@_*CW8t?mI*?uXRwj@YRIqun5mrHQTahIng}Nri*7p2!Kqiz-3^n+Z zV3-!@@F`f%F4q)M^uF@M`hYu=hg@r2KM1Y&(CMq*I4&~?^bqt)?zxt4=I(ruXYxd- z%)x%m;=72@5S(-j&1d)3Qys%9qN-Hxn{CcgimlR-DwckJ5uVIh`uLrYMdFs)S6jOu zA8PBBw1+zK=8fJ`;8MROLW<(&>wtx+qtZT6b}A=_w7d)q28T%u5(p;w`R%n13m)HQ z3StYS&jsWJtX~dgNeoLSs2dpIGcjrG?|X`bL_Id(4~dQvG6Rv3+I521n8w1;ROIq; z(bJ+{l40?YCbAKjGBLgO-*yJgbT!^u)h(l1D@(YQ&)vM4^X79^W^TWhFlg}Z5nL3c z8VksxylAv{Q}h!0+hEp~=eu)A$gIcpfW2(5$s9Yw3I^wF(65)KaCm7!+-N=YZHDTm zi<0pi^+6~)_Q9AkZ#p&+-J9QZ4i|ya9v25ouKLZp?GrM@BFXnEGM`Ew9)%ym{P;)w z1c*T+el4#(xK{A#!R&Pz5Vb+-s^N9PAn6>p#db7cbl3W^m^DQiWPVukIQBQ?cXVu` z#dMo&_1W`^%)PI(ZA%TP_E7X`;9uq>xS4FFGI##cc@bhvIMxp z@o;hqpofCKWMpL3BDd4(XZtLCCawndxsJnzs0^-<&FmyNiwTU9zGmw%%P0LnyQKHq zauY>~faS&`gnb_J#f#?mL2T(+*BN77tT@|0ae@mXzdC{2CQYQ9VeD)0Gv%J#KyUEy z*}B7Rytt5(Msp=KuAy+5=FMZLn@XC=%`{omV=;bo-<6&?9E^Lqb@t?VczAp^Lv){a zmGu5Z@~*C~Ds36n*?(s4kChL6Ru|Oe2EN=uGVov1yE+pBeGhtx8BUUi_x5oa^i0Qz zYj42UR(c!5GT>F6;@#lG>iJ+0m8)}H!D>Vb$JWTV#>SbQsY*tKwn9~jnmJY#4q|!P z9Jss(4<6{M=eUPHd!|1loiluMb39CngYm}D(9!R*ySp2p?E+{j;4R8VRWn~gU0wh52f^annziJ~h^(!xZOHJt zY*0{;`03*s+tFOp$d-%c7;9ja+NMD1oWzWbn5!#)At7BbU$Cq!`quU~(8P7yuvT3G zcQ6uj>Np((rV1Plc(g^d@PXH#S1u?>>c>?TR}rCw5p=5GQLQ954p!#vQdV*byO?$c z1D}DO_S)6Yy|7*6ftqokBNS}$`HFbyUT6q#jC5pepsIj#=acOzVo*L5{s9?H-M&3l zsp#S1!53%}bUNX=rOw9AjvYh6Ezmt=^Tj@;5}@?&mA`&lmb&1!Vh_Vv0;nF$I--T? zG7<%~%QJn`dH!+BRB8#@uBG9(cVO23RAuzW!-%i|xT^iPrVuUSSFS8#9`8g!6xbJm2oBd)@ZMGkq*pNsISU*OnJ`e*`a>>8aIZv9TO8% z0oYAN+m(H9OD?Fr|1(z{K!cXHwphu$xYVJ0y3O@*o!L@AZ(QlE`5A4?ajDcaGO!#m zWI`}~s-FsLYh(CN@;aoG2KR1X7jL^^?IagOz7!J^>)-k`qgZlzz(+4PNXEYg15prgbm+)-C#<6WX`QT9j6I@trv}^@;s{-PU1vC zcb1mqSAPrQVJNE45HM&tMx*`qR?fA5lisT~0KhYif#AhZ?BugnoFzsc-or2?TvHSt z-tP^qy=UUBhhn8$8mKU@tySX67K)KTr(hTMnf=VFRev3d&G1n_VXJLlav{RV%W1lv zxrGtB3-X?*n+c{U&YS1v=8k`oaUy8%;NS%fbqt|gRcTc*PEOM3{)^{~ouvN`+Ns** z%?f7clPx1vhu{ao20Z9-x*3v#-;*l2eHvg zcy4^8-Y#r*k`nV+i{)^JY;A08yqP5iBad?mev4QSQpGaLFaXyg>a%C45OKHWaF#@5 zW+vTTyG2hd8t7zluHvDZak|`VbNkXpqdG`u!Yr~{6qsC3OY6b$dFZotI&shM zPQ3R=iqsfaRuW{MqM82wu5O(p9rVP-!P%KdTwHt*P&}NQk!?ZO`o`8~X5Y}-pKx$= z*yIF7sL9+u$jZt(@NZq~iKBIrXzL?c+IDZ`Gyj2;oSghnM1(RtJUpV@y1h<99rG)v z5J;foa<^C<78L(oc3n5>z^l=a-$h*MK}#*>Qw*4U3# zWjuL-n4X^gj->o#BVAqFKWl5tYZ)#*-_`RL-5Uk0+30B6@)Y7ae~BRI2u#|ol}W6~ zLT0l-0*}LF-;r98WokxNRO1jL)bkWDT~f)(!*6%ONZJm2Xycwee8?S!_VqXeQQP$M zI}*8%Vn{V~kFGt!$H$Mmxd}{8O~vj#-l&)Na%SW?^s2kWjdfAKBRFkJB!I!Hs zvrJrJ*aTD|<{&Ess_nO)tGark-$0g+5~1l=iLiNRAHFbbLYgpKGB(q*ota;%cuT;d z9zZdT&+Hx+A5^wtpyn3pb<4^-eck~d7u59J^KJ#9wQnV>- zsRQ9D@k9hPLNEP|n8KtOh?SI-T*qIFm~}-EVvcduPe%~a-qpY5=VLG=u-jkUdx~%R z@G2frX(H3xa)pbm*UuR|kV3F)pi9r{>gokEZ4siggKF=Ix*=^O#>qRgR#(URD|Qi# zpkxfb5&F)6vz-nA=Bqty&dDkvkg)}H#uv3->qA*-qHavU4#U7O(Lp|Z2ccRanTwHO$3M+9U3phG0=G}PkHrjZ{ z3|nvu?3HK;`d__}jP)&EeB4V|VI>fx>;mmas!LNmQYNhUXi$rQzuJg&9hLrAGgkHN z;RSf=YZ|B8g-u;1mt;O%yk-D?E{?}8JA3q-er;BboK2NYt#<)d` zb%nM;c~lyB*c^1N1?7AMc`q`y-~P(KNi0O-xSdnw6U`z_mCtctBsVBJ5UzdTjKJ= z3y>{9u&mDA+TqYHzCUfO8weQeatekd2NX#C=C(>ZHQ!AC$TwL)K1?ad$<0iD68QXX z4>gm4^9P3RRmE9)T||7og`r9Ai#xTD~FvW*J^- z_hoH82TY{B{_cBarAQ^9nBb?4Np4sw^(@w%hryK)sc5`wEI^ZVQi8N1ct?VkJs}h} zcUU{Um*FZWH}mfQXJ`Kt82<~@)J0wekfB6onG)!mRD&? z|Md6oU8)wYsLtzO9hf{nnon!rm(&AuS#%7+gK>R7^R@Dj>o!wrne@)G5f|S#D=hB@f z&(r1)hfq)4PJkFd>SSTTw|v1jzOmGTY)deDL2Ck)@gHZqaJS_jxCJhXUX$fY;ud+i zM9uNf{}{Y({uP)<>ZCKHldg=uJy|XYOty0feG<|=wEjOqU5aS%vNw&DmGxq$X82&U zC?~h3Mzc?Klcd3$&t*YUvzw;M z9-W8+Bh4)nOSL89Dj48Xp6Y-H}z<(n5E6dHE{5 z^39#rSYOWr8URJ{ZeX=@rp9LJ)c+TNtHqUa!7zmHpG3vl-`uig)qX(f3BF0`b`_ke z<*?uTWKa8ncfiW$-I9z%$o0Awhu_luTb7uLV3X>T9KMr&j-So$oDs%im`Usl(K$D+ zX$4;SlIRr`6;JO}#JJF5D(nW6St0hBpP$&AvyajeS5&$yPzEiItI2ey@muf#n7IZJ zQUif#%qI2kpVJb{+_<_bzSV<%Hjn$&MJ(fJchUcyd59{o+@HX?Ie@1Jab$FI-9il- zx#*^z^FB8Od6j(mSPMm-1RPK9&zGP0`NQWu4&!nY$NEtUqc6E{k!vZWy61m_%+AY= z1BjlrT6yKyVN{!SVa<7tzvd%A2XOVZL?9+v~-WazCDHEs-dF8O` zWx(O?SVmwn05KK;^? zsOC6eaue{a@KCl`%$NfT+vT>eNn9gXBPRVP;AZo?Ez1E{)%)py91qaAQUPbC%Ri#0 z8$E1vvmlqZ!A@QVk7lQJ>DwUNRb5nps3G^vZM?AgHn2@&KO4*I(;do&5jDuh)_IOp z9X6`f3BA7MnyG&Bh5|`n`Sr@@SIT7KWZ8=y5()2}j}Q+n9UU5=1Ohq2>&syitMEE! zuAdCFIp(_jFB&RH!tWp1ksf2ru5F6Iq8$ctZPp}yJ{5gY1f2i&&JY@gGT}*xO zft+j5?|97&!1UR8yb&Yl-fn`tJbb6>)_W&F!q5A5#kv-iB*iL>ZrtQq{4D_Md$aRA zoH6D@{fyc5?)15L*P>T^e(FO=5O&q^S*dMC78GHxdf6%enBFPHsHnp2je2G6xcYsu zi5iFO-NQL_ZwdMWl3h!F$n2MwGJ20ZGqg?spb!Btzx;7zRMe**%J={8_UpfZ%)c>= zzu2nl{o>4*oiD}j{_2Ro)kI!y{LAC@;e>z}8|&EtLptmj3I78C=}A0^_YaMV?@nCZ=CL&D`U z>a6<4=AYo%+MTxo9bq7DjGYy|_lQ3;+%0K_AJaDY~=u#SwLQQKDV`UQJW-wN;Q7gzI$ z@5}z`iC+Dj2CMa99|8x)#|<*(0Eij=c{#cH$0sWnSy;_0KRHHf~vSUQ-^w~@g(XX(U14K7f>Rv^e?L&7jCfp zPig7A;VqYhtGh21YSlWd$o^s#csW{~N<)%JHU<{`sC(sLShFpz|5B_UI4t@V-m6y> z>9^UW4(*662=Oq=nYn_R!zSfwrwNgJGK=ak0Dsa5RDsS*QLeaL@*wwg@j+i#ZL#l= zC5bT`TL-n2)Y5yiU-j*uD|4Vi{mzxPeFo4k?$GIG z`p2EPwlf$CLX?y)0a0y-$tsPyIbGf2H|*}k>~rz*Y9i7w`ot*&8AjC*E$2iWt6&P- z-(&mc=4Mn_cW{&`Le&Jua2F1%Y4pTFBe!pLy zQ})|yIVvT%vgGPPdy(0B>v_c(o9MfZB8T8BO^#LA`5qXcEE~TwqU~znD+A;B`uGb> z?rH@lxJ8lsiu&k29k_M1$HEI{z|cNi0iKIJ1NRfbt|lr6ZBa!#?T2dd$*ee7F5WBg zsq+9+)JTSCgY}-vXNlM2x(=b8fAg%>^UiAO30-kX5VuNk2?8mK@yC}{;>a|w>9MZc z;>@#=7v&iqo5Z|FNF_*)MqPN1dZ4T-$4T)RgHF^BP!KpxWlq`2s3IfB?mwhJhMtv_ zlr=)}Im!Pj$p7$I|7AzarlzLlY=N301ev-uBnTuSl?k*AX7i-(o?p|$vgDE_mCLX9tw+wDC(mP9uV4SgZY4pZ2#Yi*Ih-xMCq== zUMfS?DR*|zo;ChUtryz%;17J=Try6dGWsSd16GrmjmW zRI<)-oUQE}93JjX@S(@S_oHS2&Oy)nmfZJD4Hf4Arx~gGnMAq*uli~6!HKgOiI-2) zIc4NSZyX#zvUf561c?0TO^V<$V()Np3Br6&70O*g$*R|uI68*(E&v5Gs}E3^JSy^S z)!A6=S7xTn6fFztz_k`-g#`RqLpU)B^qmMYZv;`Qv3Z(((DvDse1Gr z!wn#L>`_^>+NWX*z>l%!gg@SjA}}u+ieR2{l8ts!@(Pff>A#l-k==O0J9}8DBXejO zP0`*SPOSVX9T#4#cE6bGvs0{&B1?0EpOESd1(s_HATo5v0L$ne7}ACeN>7^%hD{9( zcS#64@yir=yXUYp#aR*)nBp;%BoRtDSNCtoaKL{@j3uxvqEG7_z}{Vf0F8XWZ*qvFR^#g zo>&eLxlE;3x*jY(mksl&kHt;onMD`P@b;|^Qj@-9A!3lUy*zCy8TYC%0hYA&>vwfkQX1Oa=qTyV4Ist`yQA*3pZXr{)E(IY+EcNrIyE`l^~ z&eW=;?=kPlllJJyYs=qKTXpe__S3tHk0k1*)_nxs}>-c{9apHp!Vg@<)Dz16pG&y6W^MeX3I)S zJ{@tAiEoRy`lK@(_n9YB$0JI9YTj=H9c+iAN>~EXzSh-Ekks&!*EmzlHETy!PMmJh z#cW~9jy8bt+a!O#b4fPL89@Z*{qYa<`;HlR4gKohF;crtY34sOaubGJgM7Obg@75c zOoTbVT?Mdfe8({Z>B53r(LBMTl)Ke;xP>UT>pH=nDiXfHCT0-AQ=LlR{|y=^+YT^@ znhQ=}nm)f;?Wv?hmWthWoI*-)lzb$UCT3^t0av4>Y)m5;rf*oH^}1Z{dQbMlA>!vwRG_n zvB+fJ_MgPCt%OFbCt(bPXohrya&pOE7!uGKL|wmjjIc66j9)mkgKXO5mL#yZ!M8WZDjIMKz7?&^KibjE#Wyii#Q-qEar-R2X7E)~4>~AKQ=$5gf&SJG8IUnhcVmOEEO_$pZSyv^K!NVDLgF@vZ8GCzsm4x2+ z#;yKhg}h?OCBPP4ArO5%ciCA0XH?C=b-Npp)CE#S_i1z0IgQlxei08AjRzl5wR0>F zQ4Vb(tFBdl-mRxbh%Sl=jO*JXZr%%{L%GtSejmya<7C$)uMV1HMRF0HuN_<@qDN%?FItj$KK@vltCyZw*;Bt zR>Fsz#6N=ypq*bLi_*g1o^-~_8{|W4HeFM9INuc_MrhyYnmmpNd(xp!SnIIn5W*xA z_z}5oD2fvwLOFO_0zpsRi=f7qqZwDaloqFRL$sTF}wwO4uofk1*Evxu<-g6(q zAIzy!E6Dv@e9kF`cV#nB;II$nxLa~l$DmP=-;Fr}KWM&w&@*~M2bK~Dy3xEMQ8jee z)0t)+aNey(CufZRZdpWZo*A;TPauiM6t5C+U(;O_IrF;vLh$YZYKf9R>c6KVuoUx} z<3NWqt=9fDym_;T1ribxTCAHg(Y|`#eJ3}-YcMEeZA~Xra;CV2P)=_1B}WL_B7guw zB0eY?_FgOPfcq&)D=$1e9ICkG{ zLCt@D+;i!A{YA+56%In$BSp+^%oo%S2-*7q;=2jPfC=2PC1;|~&f*s}LO8#90hK;# zK2ov!u&C!i-UP8M^S?-;_$yPE@*p2CukPD-F9Gpk`t+?AI7gU+t3mMR-i_PYv^Yr}Ez|h|kHCyc5@AIEXQJ?fKfHE#05AcFWGv* zIRB0D8NYn4=OMy!&AR3Y7FCo>aXlgMJ?^*bw=P7t4hpfV+|kyiC$&NwK==LCrKzIb zG40u)EH4ZS*%Ud^(Px}V=v`UT(4t7EP{~-uRgxj{Z^(^Dl{fE)KJnTsBB;ia zv>2sW-G-?K2q63iFsy>|fmr_#y9M?RZm-N!?V#f&+n2Z|&&CLRdvduI#+NE${RVhm z=+0?PZ2#7qDw!A{c=r0*YU+`9+b1>Ch916Dv~6aF_Pz4@Ug$B&JrJ2^)*t*xT|JT@UYbaBJgh<_`a1J0?EVWl{gwH0 zt+1=$gFKIMOy`p1|=Jv->LDLM^Efo_^lqw@~ZZ_5L=aX3;{e%y?*?)kZwlOXf^7(r6({pTmCM^7xZ9r*f_pef|X zRl;Bu`r>t^zBz@CVSML@0ZmS|n{u2(-P4bT3<ebG@NIM`4!uXV*ppp4JDplHt_M&F>q4;e+k!i%I36etPPb;wQat z)>iIg6sQdPcMs!(f49z!Xn8!yplyEd+w*b})5quH!|A;4k9`x@96YScwI2K$GxfH4 zy;eHe^cX=?r5P!oCw$n=k&D?93w*7OJSQ@!j+r%uuM>i}4#t5p7iP1uiSy?!S+F0m zPp@Nc4hTV$Exr%RvtLc`fMrB!dvq`1pE>mg_>&u{+LM!IT9EZ(e)^dAl!J*}D)2?U z@P2xQW3Hzt^LDEhYA;GXq{{BQ|416>5!~t^V*T)tm4JTCD1K>_aVA=sBsrPbXSXN7 zz#ilo8Qu`R`mV7&^&Tj=HIS7}t#l*1<0;!)McoS?6Wp)ObCv_@eI=_@47Z6!z{0h_ zK%#5C!6SXCq<81#`mKXh+3+cnN0|hqZCxJMG|K?@Ab*-dVgmMbO|!3dg62GW?|E$B zuv%}FK?B6rIssT)Rlr{YuBd~U;qIQDfgKy3mF}+HUE?WZI@^2E8duzRpYGE{Wvuh^ z8%QPb`B`Er*$2n>jdOy+uul%=+OP_>(=t+9a^75K(1!NOY!R6(c7AqIcBYDC9Bk

8Q_vJ*ll`bh-5&R~Qz*MPEhqP@S{ktX0K~|5wsXlAS-r@r@DM@H0|4pOG4{qLB zY>&hxhg+R|#g>rA(LA4a_57eFC6v1K0TLMGTtChUt1fx5W zk8)Dr6}*q{GBxs@fPG~0-*>%6D4O;SzYiS)m;+%~*7L`X{Bfh1A>Xrcv#A4e;0~e# zPI@ne_kk0b76(WB4b$UOwNXa^9P;X5*DVZaz98Zm3>!B)KloftN4C9@K+TLM)WqV1 zd&jobAN-*1~RafwIHLAvr79cERw0p(R?*tktv;;$?ICTmIeO98Yf4 z&+!-B3Jeq={2?4>%d$l#ye8C7uLrEn#jI;kK^QM4eV7rrVG*uRNEN{tsjk4Sj%XcA z<8kqnVQN}0((tkV;8?njoI>b$r=@&Xrdy%CT+;vZ#aA+emXrW7at$0grQy&;LgFUx z_QzINEETEyOVF9nqAI{Yo4EravX#t;;>%sk2A$y>UX;}0nCYF~n67b0l&z-OE|rc0 z{heg?5;MoF^MLfAJ@osR2kp*Ubu-aHNrW$KJ|;SpsFH3Ql1gPM>UIz2lqDr9lMr;D zM3ZDQ`Q0Kzn@7m~>Uw519 z;wRPzsDao!@k*TZR&GmNPnNFszYL!Wi!o{=U$va0;VV$YAY8nmq#8wf%Ico6C~p8`+Z_i)}WAbFnGETuyVcLz9RFp|O0xouJU^FiNG)-?OK0p6q{ z?E??Ij1_{kck9zx-dkGdcI1K|MW)DG?#nZ+KLBC@QLB`0%Yh8!mL>$IorjUZW|mhI z{@vbA&MG_ZGOGJYBf_o_UY_S9Ae#sk$ftRQqVvC`-wEyqVOJjcX=30JnR=%{rb5{G zYDHf*tjdUYGr1hFF7zJG2)k;$M^j10{A7gAF5G~nlFXXfR+tq{)t;}drSU zru*9D$8n?8E({lZBI^IIjDWC2Aicek%oE8{ZtL?Jp;>XU;>d!kp zD^sQ+WRRSG`Nypo8RzSmn-Kj(;>$?y>F))(ftYiVK0_kT#H%sxnxZp>W#OgA88b{F o907nhWw;UkbL#5q?8(x0us{QozmS%OM`Td4#}~N!8d;2 z^?iSw?Oe~!d*4sLvGZMBRi2oDmH+?%5GyLkXrRB>(N`B94*HWJz8HA@!X7B>M}32g^(H>44!rjfy5V{s-zHZF|2iP%|hS^c?{;-9B2Ajx9fOK1g| zGkNQq!Nzdo;V0D=^@8lD*&qM)gxYq+50&1$y4BX?kxy)&L~waoT(AG$A*)0DYuF)M1^k~xS)32cMJ%K4vH^b)NNju__ z8ZUw7a~bKUa0XQUu5vT@c>BbQ%(!@r6X{iqWexx^0TgAVw7k-fGrYYtwL4&)Y5H-i zr?&4#3Z%KM0a9IO7}q`Sasyjl!sCN@))Sv0xHK~A=^OnyJ4~)Fl4K!LIEP+tSZBVB zZS)LAGyx5G)@=X{trw0wVRi3#6;t)&8oK=M@x&Gsrv;PR=NA>{cE6n0DNg&$uX_7l zAS*_UBFaijF<4%44ROtCAC|e*jdbH>FxL@IfaVXB%KFAbDRmNt&%m(?imD|fU7y)R z3QX7|4RC@H(V`hqRQK@_FZ0Bs?cEEsd!);G{S0sKY-IV?#)`&Qd@5~dX=yDgIF#m3 zBVvdZQv329RGL?=l0Q|!)~uEZVQY`#YW68(COMGT$6HH_i)K2V;GXZ0bk(9QcTolo z%Ya*EL2V^7Za{WTk4DAx{>?Cfa{Z0_8cd#F`##(7TfmpIeyS2V#zh1s`A?wlv}*IT zI`G%fTew)@bG0{TLAvcs88}mOq*(n$**S8xAHIK6>Tf(BNcGF+Y@yPM)ODkKHH3_o zW(Urzwys$>yu6qU@_;5OcNP>_c8$;42uQsidfEf&E=(K^x(u_rfNpR9#U*7-pP2Wq zH12eoKfLncV<+OqUTO7o7QUBYqPtE^ynL0#iTJXQlQ#JmXweXTwea%!piC?KR?C(o9Lro=COWTA;|jCQ56eI zOJ-_{XB`xUuCR9$hz2CWY>+h`jZm^YHYy)(BbX(Z7a&*g*3?hp6~&{NjEo;gnT$j< zLL>k_i(4-X*d>#g7#$5hKIiDT{9Lu^gpB|&g^v~UWTlnL-QE3fjU{279?uhABl_V1 zqAVgSl==jKpw4a}Z-(?<% znVXvs8yov)G|foC+SF9f?#|AG5kqh|bz(ZvXC(r!B8mySSb`?dgdMPmA~BwlNLf|x zAdGx)bX3O4=>)<~B!c0zP=hTiD~nb}xfn!Fneg~Y629|KG&}o_FC^Z6Y59~(Ki=Re z(J22mhu+w3G~NFGIzPXudKnOqBufgg(JhNj&5YWS>i+o529v-M{8Fz%C$YgqTvz+x zWUS4DHsNui9Ww%caEiROO@cd-$R|546z}GKe%kOTjO_vl@M3J6#N&tX)8i6Cbh=Q> zL;yLKE?n!tY+}y*%*JI`LO^zLF`j4!iC%@^-)I7S=BxB%7!c5u$He6;N0d5FDhPN2 zxaI?Ml&eywjXf!R!!ng^2)Es*6BC8RQv$k(0phs>KhjP&G&Eld42}~oLVo=C@uB_e zYdd>;AfQMsD@3)Zw?Bd^5LFywVq9Ki{4BNcO8&|)UZFBet80$e9!#Wpw;e#2x z+Q@0+S6kyo;sspaE2zi3*V0GuG9svWHC}_>p_P{+jq0R{&2As7l|;vpDe(Gi${ zx}toh7read<0QKttTS_SZ;Pgb5#&-EOTAn&QWr7WC$O9A_*XsFD8yA;@5Xv6I4DCK>QjD3KYv2VyBo=5 zjM8j~8%MXdt{pKWQb9dvPUH64vzc#(t8B;IO3X6`0y#jt8R#P_4n{*i)8?$kC z4(&IS@-%1BXladgJE0E&i4z=iS22-8Jmy~zfxl8JuK7j8pE$V*3HF%%>N4TWZf^e4 zHM9_(g};?K>pJa&>3UpeeI2R7%Ff>6-}vEqwO)m*BG=osEPRD4!Ks;f8vz4lWkNkY zJ(E`{23Dh^LB7kvmy}PQN>|9KnKB=3{qFvm5PW^@k*vaAS63%lHIM6NEi;HSV^^PU z;0O*N_C{uETt5WMTNVs@=BcYa@{&fsYW_2%Y*YXF6WAd-tFIG)HhZV5?P>gJW9=%{ zCfyiMck(K#CT*JL=5*@n>vP)M85|uQZS3s>$sxTPkl3x|Dtv!uM@QnDhWzTM*#;#= zU8lRc+OU=i1xoz(OW&vY3yH+d?B<78Un|?%=%G;P-=;xsY zRuV_w!0s-40a~A{S=}bo^%4+}Cgl8^fBa2gU7f%JH`vh^_(QID{|XVXxNz3J8dG*7 zm<>rP@mUJY-OYFEa~I9n+uM_rm&YX+r$yid24so4KLf1yeW&n39yf|~O|!?*Eh0K> z1ZbVI<*TzwZt!es8$#+jBF3JbV!WGV1O^Xk8XHF^CO)ySuyBEty<<-+{&uNIeo$&- z;6DyE%ifc7r3tr*g1m)-#J|?*LOEoO5o}-{XmIF1gPW`lBN$BLl{`7MX+Fr#*kUf8BTDxHK>qD54 zfyfpAt5;1F9IEQyeFFB75mvJx-A}%<;>NYlh*gJLS-9LkC-(Kp7&TGIP~&lkP)g}% zJ?V(8tlITOVMfY>eY71R5o$iM^&yCuWy`WT=AWnq!k^M3q#SUHA zol2nv|1(jHSJacLeRV*ZNSh#x13I?}YbXTAQ3Qm1GHgs&OKW=;bEycZ{p_(jg(|h< zTfJ}iyr+M=RR+Tp5d5Ht0X`WcBS!!8ZN=mK}6P2?_6M#Lj*|ltF0)$uH?~ z^1wK+KoikGpd=T&&zAub2_X(#z(o1HIW+w7jLOZ;Ry2(6hw&Ha{HgaM zT}4d_q~WeK%W+fl#O)f%c(MD;0qJj_s{vNWcnz8u*Fsk-(aB+z{SB99;rjMa9N-ND zfBw6s&xe}n!UPzV#R}Yy8iWwWSX`QEloW`HiaU-rYwNgXhR6m#e=Kte6G(Hm(yNW( z$K1jzgx)vl`f@;kmZI%Mdv)l%cxzBNzHi>BWQl3rKCdY1#{1vq^3ZRu#;d4Yt9yW7lt;1iH$AzKzQR%h1#bDnt47`2X^+z zvA%Xs=&xUIF^CwzF4(8E?re5fDDo&cgo(qPdnkxow|xE2ynC00THsJ7j`kE-3f9B; z6zT=5P$Hr+*t>eTc{BxpP-V7brrxFu4rO7#yHlZ5GlW2+u{)R*n&^f9y};qH`YKLB z@0FB%7ebsDYbZdIn#(o#A~n+6dNq3OxiV8BFIgoVLgqB6ts$yZ_U>jRSlMOQm((QY z7yj2W3ZWK;8)y$3;Ljk};SNeV@87UL&(+uC0hYE)Ryl@)OM#WJnAtgf#;PX7` z1lYhXXj4>Ub~9VC)_>0150EHdELgh=eR|;dhL5dDpkOP(G)m`+w5K@nPCa_%@(=+D z)X}q!L+X%xLT47_FfJ?9{99(#G_H@@a=`|98E>*GU(U@He{-7fFF5;0&){+v_9L;) ze)ja2<{`){K{3h2ptp-(niWaqtvO!Y!U)T)sJ}XqhWr!GcVD*=6R3$S&(7Is!zer z!xN~i{Fx`;&c(}!g9h9A@jGlEn_hc^w2oNWw{joeTxVqg0kqf4%*}8B%@a$#d%1)p ze8s}tj`obVtnrIM$2=aLq#6@*LbN~pK$C^W9o6wd!jJ)@n@8;Sq>t1pwkgyq;_F_F zw7jr^_h?8+A0x!MfnM8eqJ+5}Fy#Gut!v$&N@Q=cd=_yTQQhf4UIp)H_hmbaR1-zO z3<~0U=xls|Ppfv~F}u{K$^E5d(GR1Bca%GMV*Q_tJS`r3dV^2VWcoJr@wj2GVz z%gIpr0?e`QQp6h&>0Hl2%b(53lG_rT-auAY`8)Oz!Hqy@Sh9@q&z6%oTjW0=cBbFM?JK90_3-6>O0b#1tq zsP3-_pY`jG`k=__9lH{sm9nWuMrzh)M$K3E;}KP7DT|W;26^Lb9@h+&oQ)&$U z^~kO~UKacTv6vOz;5S3_;GEkaZ>!$FtKYU~0#37|EKvFJZf+tDF2eNH3l0hz13Bf~ z*awkb`O#x@hnX!Hz z>wXp(Rnso&&~!^qj*@&|0|(%vHzJ1j9dG5wg5J_Z9`o$k%(HabU`(FJ%&gVcr`M+F znZ9huUODJOVw0e8s|{ZEejOqLC7Nn_thndo-h zKXa0ZO{`09;d1} zHU-A^RL7Sks`G_l+Tt16lVSh%BD%oPmc#;(fXwPgkGd;dGn;h#*X2Po&;N=oE`y?k*5$j_HUep;<5EulsnnN zdNerg9?}CY-M)OKg_hqYo=WTnU)JvUh%13^U%y8w2!hD0=wjp+wcp>dg8gJj{_Ok) z0@7*fU3x5W+~2>s4Efx&8pEXzJ$0(wy*KZ!svgjhl{Fr{duM<1EAQN-b^%>ySE(*5 z(@@FA-dRE}dFZLF=*T!%JDp$}@$20~?{`g!`rxTC+#nNlw-CG0dM8m|cX(v@>1KHX z&pxB<{hImV?}uK#|K>L)a+;B=uqPjgUX>7YUVaT1(-T#}$uG3b?zLe0=}|vdpFJ@5<4fSh zuX_Zk0w^3LpGX4Zlu<}ed>pimk_-@ zz|YpbWSRU!p`iw7&&^s!Orlp=L4qdT$@mImqx-K{WlN76;SK)33Ae0S*o=bFJf>}C zT}6$+((ZHPQ0FLy?aupYQ-StRL|e`b#4B~!d`2(VwY^_kji7-W~GMpp)vg*-o0KPNe;cVfB(DwS+6B z#-=uPsxT3WG{r_~sn(*kJ7bjsY^_(*r2$wPUrD$eV-& z1bu#$EtQ?X;HZ*l@uU>JSRJ8F(+x@ z<$>DDNIXJFt&yLKjj529C!+nK9kWbFi?XiE z{ZYz;#l3U;lJ4%W?~c#3`xbrnzuU2vY)x3yY-&UdiEm3{FdvT&4NHzSi_#-=e~WK3 zactsU))rlpsfj`7bT5BW_QV9PZ1ffP=ughh%8vR#Mj)`&eLba|yHIw3{ zg`w@UJGA@nSm*cNt-giO8oF@2OxgH>-9D^Se=-Ye+p2%2KujbwY>TK({UuDR6qy-V zbKWT#pOxjZ6>IY?F}N7*P8K`MmMPxl;P`9Zx`Rfa(7iBp{5j@>Ekbj$7VNzvXHk%Q zjjQY3I_r?cb9{s@KdLnma)8Ux1-}yt-L(WMTgi_vr?qD3~C}wWStuIuFFkhQq8cq-C*j$4A`h771 z+5(a>Y*A=lb*H@nm}T&oF&e$f!hPd?)&EU`pD9o(HcV0K|Mt*$4+3&4Nx8mU?=$HG z@7N&1_n3>v9!6F3^0$iSO@BRR6|eLT{9u5DRShm?E6GJ-6=m$^EyYWw zV@s^ugzjl}&DpG%akn#)Y|Q=eq!q}h&*X?BRad2T@}QlhRmWb42OS@6%-Dlmt-L5( zgDC=-0;i7bidjaBh%{uR37(grC4)I=JubF*~`2bKuyl zv+$%o^nhRei6{=QMe~?RK4N0@JUr^-mhA`t>K*ejV@xUq7l_`Q(!`{Y-mI^KZ$>KE z%@QCxLY>(alo!*I2N$3kG?Bqfx=3JZ995W&W9z}T?-JuurRW!p_g!n-yEOdTeR{uIcwNPj)PKF8EA0WmJ-1g@nzOzIoh;z25)WPdhWbx2;6x5~ypbmI59@ z-8K-eJB{Sc)6{%j)iS$Mi@E^0VOi{4gjir<89Y|qLwUc|e5*qBPX=;0phiA>6>LRX zJ+s?sj5)QM^nz*>@O~BfAPsVC;fz-|%I3w?CQl1#6T-k=_|9VFUjiekrdO1#hndLvy@- zIrjkkR0u<&xiuVlG$IXvgcqF_F~aRsjU>lX_>=i8iB`SsK@Zmhpb+;p1yAUQEUcC_ z@ve$Yp@deyTgoVUk8g5VmpqunL8?qs2-nPe;5>FgJ2(yO(~4Rv{~LW?A04;ErIT;` z`5fa6kI3uynhvz2*npI6Z#=mq*F!B=YhbMk*x%Y`QEZ6J^Sy>L+p%kD5ImFV{Pqcq z1IRT7U_3-Z4@VuNF4~v?C9wplgIQmM#(YDVZ~J;ua1R8+R>pk4Zu5}>h}Y74{ZElB z2})!mJDBSSKiGt^wjwBZ*POBP+rj!wZxDkNC$FaX0FJ(LZWG)XhzK7gR(>Hmz{Kh@ zZ5$$UugkG3G--5K-;VD6o1QC!l2|o}M}JYpco<1r2(!)U_!FX(<^?aCZkCs2XxTCj z<+aQ-rR{zKJD!bv_VtcV8?x$Dod=WU{LBt>YLWUSC8ORyJhcC^ys04}cigz(F7Yin z^+{_PT;>(x9IOYg;%m-PWZ)f_b<&xuPb~vi@u=hXU6n0}tWl zhIB0Kv(`as{`25m;$n1B7%A#&wIhhfF}pTDrMIdK>Cc__7FjoC3Q$|{Vmj6i)cA4E zgP&tgWkwWHUcfVN+{K>3VTBpL6Y_9~vN8j><)K21>%PBsdmxy^nFL%e*-{-!`)XON zDDCU=Zx|gFIZ}yRB)bTCH!LlTD!<-~P3JcN&W?Zhm2SO<+aMbNNr|Cmq}A13a!ftY z#2cp5N##A88@YNvW75SjGIy?#?84-m4Wj}utt3e@ApkDTy+hJ+7ua7>Y08CC-UU;K z_q}?Le>naD8i?r49@aNwx2xTi%F-lnxtK)tGJij5VMw^${6sJ0I$zuVY%KuCM6niO z1t&6!ZpQvO2rJ`_H=WHTBFb7tGRxB7i28M11$&|?qE!-jl?g8qAdRy3Z>&WblV4NE zg?4P*X%LJ+9Q=jX;g2ns(a0wh&+?@@b|`f3)Do|v2y!-0%?NMZoH7 zC_GE8bC!fmiKQo;FrNj;gT8zlA03nP{>;5o#NN!!xUMMXS{Ci?d#F4swSH;_gEc3K zrQiONmOncTJ&oH=y(&2MCc#QoF3j=z;|73GzPDxa6mfV72c2_k1Xc&@096=90+sG;3m`<^n$Uf&xQ$ z-TbY{71GS2G`u%`|Mr1V`lTroA~dx?$cPW&N+N}oR|Vxh+Zq|*bDb}g7$Kj;$xpx_ zq+-^+Ocj1?_aX&n*=Ia4X|8!#$Xb-Q9v`(&c+3m#kYi(Z`uXj2Nn^Z<}ant}qi1Q5)})$L{P# z`|ZZc1P2=k;8uCnTS;=@BRuLdWG^t2ve!86PvfJX z6I8|yk3KUmoP}0_v^XO9;3*!Ld1DVwj1WpRUs}9sf0o5ZbvFDSvq760Q11D94%DIM z;j2Lro#1iH`WuNeh2~r4hvMA9^0^DKX}<)9LwDOs+MLqU7NlIp`%U1{SIgpZp z)(1&97z!Un5K|m>62T1MPZ#h#%oi8HE@^0nl48VLGqH;4=v z?50VL!NdUU-#}I#L=y~|E8T%B177#$sp1y-Smr0+q6bWAxM04W9GU&x3uf%jw z73flU{ospcv-X!~CxfOOe!pNbGf;e``)HnX*|k|Uuo{{N^>-qA&k`S+O89Jax#^fA zuEY=xONSsAr_zdA{jjm!DAcIYexm{wykrr@Q2KGRjkyg&nInD`fhNh-mCVlmQ*{*b z?|Fv&;RD=k^q$yefuu0}Gd&5@>+g$7f6!yEKGKn8T4LB9FLYg+>t;RtYk+5u`HGs- z6el0AVit>fI6#3T@=;^?)8^b%u&=4M2-#ngq-!{priMn3kdRPbLqnnxO?)A53DEX5 znyR?NAVLYdly|wC_o~96o4)hdo8|0yC1}|C*9QOucW`yMP{vo0NWt5`&E&H4qdo~e z82e&X4YDRKDGSDS*;kgSMg#))c47_Hv<={wU&U$Z=yGQ5%#FYfm^iKA)N0NOEv&rz zu|-z^B!2C#`v5&<_Qdw8+9A5eMCvXES2P#op)A+f*%qj3G1G4=pm%l{v#?Sh%1it3 zQ{45Ir1!%O)|>;*$W_jSTL@?KIk(gUaxGZTzqN0$gja@9a&eEU*zesLiu#S?t4a`< ztptuSOErqC;D3wCxg4&-LRI5#_O5_<3~;8XihSpzvwF~xWaE)$LO?jqrzVmvZjetO zJ?ngQ85jj|?)V(jxxBH>>nRLZORRwI7O|T~^#;I86qEHKX%W9#Y+j^ES z2BBA)kFKq`$6JjX2&lvEH0MtfE4BjBQ4Q<+&%&=#d8Yn?j}QW*@;?B%YeO-2cl=#KZ5HKDSr1d zno!+ueqA{EzUcblHx@X+wUAt-%G&3@kS)7|{J;1RX8(WUR=+Hq$OP0vvfrAFH+t~h zx;)6YZa$(%?y;&h)hthLvIK)Kli)*aylK?ilp|-&a$3N2(;QW#eX8i^JLXlAKdd|r z-}eqHKpW!gNf&e7Z;e2&rHjFMVaI6Tj))KCXeD=5?{69VdFaM3haQzZ_&@M@nUJf% zLur?h0tC4I%MWW&KpKoUKZZevh*1a;j_e)yl6ZTw^@X4<`t2=%qO7V+G)^?c>x3;@2_AKtb*phT#Y2geNs`yL3njg$*_6)YzW!Kh;E8D6WD&a98udGn3tvp2Nd7D-XfeGd=V0*-nu+B%(I#e@l#Th3&rbG2 zIEL<~cy(>MD07@nmGXzzT0`csU4D_w&}^jvKsr5bqIfie@u~O|JW{qU|%| zW4X;x0U2?dWHg&iYEmoB2MEbG_mtyPGJ|_G?I22DO-~z4+XrGDzA(iZ70xF&K@1;8 z<*zh1${M;-a4?d%LybTACBq;-?UXI-$Yc{aW5&lTP@ZzE(y2n{`f6hOCvNG~o|bgn z<6RwnmK;nt@uv27KHIAi0o9`%i$Ir@7=83%pS!Na(M0ZeHLQM!gL3hP3AFozL*8*a z0B`~7$_o0v**iIYzO)lfSFKiBf>Q^fD=LXjPzp)xkN1Sm3}q5D*{csF`d8$HNWQ2C z5pgJzXevGpDi-~wlRs3QPNkvtYNYx|j#7Q3_?10Pwfa|bk}UN}CkSnIlAy`>ZnDI{ zUrN8_{sSsRUk{(t|uABtSwUaBEVrgA@61N!1iNO|ED{*dC{x5UtyHbC}RSeDz z%)tyS;#)6v-tV5Kto}$9X!%282p^!}5`VuesP%p1^!+)mZO}G|^KwwU@A)E~UV+)k zU$pM~_wR3i*XC@=I6k*~WxWjtOsYqwc2mn-1CCkZ(!T){hdEPb0(Go29^jx?` zQ$&*Wp%Yd83a3`yTQFgiY+#fEnG^TgK~re8%*A#c$or-zlQW%&VATBM)WTT6jq#5Ts!xMVO zljqNB%UrmT z1wpN44Gjzzx-#gswL5XKaY3?;wXs#Te1tR!-IU4-P)|?8Mq0ui9F97eQG&hG`97G9-5iaCmsM1BbtkYEOl;Mdw-Z!iz#XRjvfs*UKUoLGqDeBwVf7w2j{M=e z!c_S6tEFcNu(T>-&4`eAVF?LFKR>^(xRdGR%*+@p78`9QMrxSnL0Rp#^oWj*&U~pm z!IYAk25(ci&XBgl8iQ6JobqFi3HIXMFI_&%d+~gGx?fmfZSA0p$-IP@RckhadaBPD zq-SOi&vQ!MJm1vCzQTnapXT|_*&ph!)Do}DU^rEvi%H1LD3d2*Er`d0OaTA z1H@q<|L=06N^YSf@RDUD1h{-D&kK*36b<6~rBFS+L$S6+`dCen`I=q)BW{CA)0p?~ zS%9{Ukx~m0CfDlA>X#DwZ_+wJ#mu+OY6ga?uc4B5Y^bf6Xm_VvDb6n5lZ_ zVCCo6r9|mlmtj3giyBuE)w|5OJiAl+W9gS2nXQx=d>Ug$B9Vl1Y(;H3KhuTd9I$~K zQFUxA4<0-aVIsRWNxPVgmhgPE*#er!w?yq`AU{7pRD0yMfWVD%gNn`L|IpoojdDB? z-=zczb8!}2!C(j&@|De2@7~z?Wtt#AMaF`KKj`k!bIHR~xt{f0KFdlDG4z|;QaOqC z;w%JhSME|d;e!H;?U>RTo(cU-0fmH0<EaGxTas2-cI*JvEhGB}sU+bcNpV>{xN%zjKEKhm6;QE-@p z^A=L!IN?{mi@Dm*Ko!AMsy@#Q_G_31oE|?iR{ut>C~&Ms|OBP#dS?NLW02VUu&19dLQ-GG&RFCJ}kb_)Pk3fY1G!$xvl=n zeEEnseCe=)lb!+~WcJ$gMI66`E3?RLe4KUqqjx|31AmTVrMYgjx#SQcDLqPk*t2#=2=&% zoX|Pyu2Q5y`G-VK*gcJ(FghI4`0&#k{*RZ&ICDFa$P{;P`;T{f#_YwzpOgGFjizzu z*LQ-~K%F-(0?=qQGLdgXL479~n9iFKcKQRVDBd)LeqL?>ySjY+MXo}MOezKgZNo*X^gMd=?0r)5 z{{G+Ab@q;a!`{9KfElofMkap-m+A8l=a?Tbu|B#zRqb`*-9=*gE~!L;m6a9pAbfj! zyLzqI!^5Mm?=8=QtK|H#|M2hMp(!aek5|8i1t3&(VZ0arof=v8QVdN_s(DJ~*iBYj zsN;4<#>Q4ev-;H+q(EZOv{+iFS!B-gx+egIKtxd|!O*}ih6z1^p@@jXe@35>1pQW92GPv)yXss^Up0f7v z?YrgN4?Q~RjM5KbJih;>RTw>b@`VJvJL2TIZyRp8Rdv?xpW^?nXp3>IeNVG>o;gyXy( zWJ-DQ>*UIipaTn4&BPTLoE&&c4lf=5DWNJbf3n+POZkUV7l zp{4bm+w&(aGI~H{X)*AK`#q1=9=rLXvbDH4;4k|pN5}qc3J?X>_x9HMul?YICLik0 ztg_FRJ%Hf%BP4V5p+&{rP;m>LH}I|=x;=grrj*mJSai8Q0b*fgRoBs>_&qX`oRSu4 z^5n^o*5jey;=JEEUTx6wYHG@+b@%Bn$&iJv2#{=hbj_>6 zV?ssN?9rnpmOv4um*oCpvh26H!3Om#%;EF=TXmwq`!R>&52YwNMu=%EM@;Q`atf`W z*|&G3Y_y$LeI8jcNmik5J{y>sxtaCksLQWzaA%iSuSm{~lv*j|p=z2p*noj2blHF) z;_5rfkN~kaBH}3xD$&V_9UawwT=ma>sULPam-m@7WaPl;Rtdu<117mMQ7YqG$Lxv<`W03c#y&7yClDRhHV>WCup)qR4OQ54@%8%9bLA;#O@=AFe zhdti2Z@J7;0Zl)|Rnj6v_%<)Da1U;BI`&c|?Rpm8xkCiVgP6MgMeASJO(!q7w)J{c zYViH15R9jK<;noeCkk=}bc9EzZ3JK9;W()Fw4noXC6sa>chC#=nymNX z)c}MGlB7wbfa?yAxfxG}s4W??9!&u73MPDB5W}vu&;a#tC)&GQLT14%^5*WfpO!+^ zz<}-Gr7qA9cUpQyH8Vame+BzcLB0=&1NWP+y1`6yN=_I_w{KXYhihOBfX#=D66)iM9 zH^nR&-{1Ynm`YzvV>3j>D=nQ>Yb0pz;GpQ?A%?GG@pQr&0CDZ2h(hdi#$beaP$V_? zm(gfyq_T#=H@oJf?``a#Kk&Z!esFip`XRq;NGJ1eCWIS7R{v_vlv6eSDAWInJzv9j z<_%L$4F;m|dD>lh{NQZ)UOislhP4{Qx#BZu)O%K0I5J$(373|ZCTC`vv`j9VT!`(n z>Yd>y8wD@XA4-w7xqV8pHiqq4zuGysK=(z9%WspxYwm5 z>{PYzu3b#1Srb*4J3Y|LTEbFibTBJ$4YZ%Q++)4Vva z_6QS9it)jOHjV|xRY%pkv`C@ic9kQi-#52$VJr&Qs`t;ind6&C^CGBj7 ztAt(Nekl*H4Ho@@csLuur=;n@z1?rSOs~c8MMiP+@0_Vl(`yDv6PDra!u^Rr7CgBD zM~bhT>;RD9MSy2C^UzzSTUQ`*%u)7o{RK$5%}aGmEX`%h#CP^eW3sJS=m>p;u4qPeoe4)JeM-#Khlp7 zqy4bs>k=FM-2iL;ecb|)Z5c$2ck1u^p4Adr!(+n~&Hb^Ji6US6*nVLn+w)w zdWKDk4}m9mT^Xgf&C@}^@B98V6MtThXG~nL8&mfw92rZD z*f4c z*|vZ)o)S6Wo!1AecT(gMPWODLrRB4vlT=eX$kWm5CbDolf#q%BiHPq*%LrMmM#?ke zmM_%C1;t=pc7Z>pJ!9ELGpft>nEr0gb#%dYB9D_-=zM4iE|C&VkX=JJ+_q| zA5U$+sEd#PaTEc&o5d=;GpPxZS2Y>b(hcsWblnEM^s^yrXiX(0rGr9unLeV5Lp55k zvDLDO$vRm}&x?Q`>B%ugo|5TH0mem!CSc*f?y`Go;Zy#g7l!wJ#gN`l+0V~gdTOR$ z@Wsky;R8N-zsO_3yV;_)DL}|~%f4t>=fXAwb3X`C1U|~+yaduwZi<3SW-pOB#Wrg( z<2!lH5+I(>kG?v>U{*&PPW!Svie{MStva4TK7v}4?&b9}XvDJxJPxt$4 zDEoY>&iOG#l$XRxKV+EXf>~Yc%Uu^k&`bS|5i!6?= zY+{Ds&mU6Ntu|df%5=Qvo{I#792^|?PJ@F&vC`cOmHSIrOu%IeXZwiJ7x%U%UVKmN$u;fV z^7DN?W|>ko(y`->a{3!E&&r>Ij}SaCOEHq zP|GJRm9AsSy<^GkB7qYaF#U`why}N7G-hq8X}>1VNNa7lWC=PbQoYuZz(*kA(l5jUNZ)uy>I9iA~~CFb^yqJC}A z;%HJD;A%TN=h!1?8(fo3%zBx(IyuY@j=w4${7m)htmn-@#K*orj!2lPWQ2V3uR%Gg z6_gecI^v~inhqqyXkUBblu`cCm&n^+_a{a%9Mb-nqgU~L&Ghxh z6TS~FuVM42GO&RZTwH;WK;mgqAkxec2+sgeQX}g7T>g5{{r!be%YJlZ0Q=xEPCTqeiV& zYNbHG^&S{8V{k+Nc-mE6U{YyjpvOYoe|Bu^nhu+ego{-FJ+rvKh12ui%?pLo1o5yG3rf~L$u?bvfjeDY$PBc`MF+>K zSi`>`Nr$gknPc-An*5ha0(fzabx>-4$3-xmvlS z`}XtbZ28c;B>&tw1x$$Y@d*qT?uEKGbl#|pk=zd}*^icMF37F;` zDN$XqF}_${jCY?%zm?qsY-6{p?g=U{$UfcM*z~%@Zof6WA{b-bsvhz6Y{PCV-aI)3 zEmsOZ>tG?|DJ>~V@V;=-8Mkq$!L>5TS7<9^&a}40IU>sEK!3LP*X$UjJXpAbPM}R& zn#=A9n=5vdj5PvgyO?1e-;sQYf#ll73jn|y+y5W9E!0Txb#oSBp3Hxzyi%z&cFO)s zN$E)SOE3g439IiA)j^$y%C+7|{W7@#2EcV1b?SzZvxAr`a_0MN4XQd0KKeKOE;D_A+NQS2U`dL+NMA_D?}pe zni@VZ0H8-F`*_VRPtNOBVz3`E;979<=}JQwO$g&eOnLwPa{uPCO%<9^3p&bZy0*}? zw~jh}oCn8{fDi&`(>Bi2tHe5OOaNf(@HG8n#G@j7oY@SBX6eiF0Uwj_S zj1rZvImXGhHKHHPpFD2tn6ZwaKs5EmcHc#l3o7S25cd4Z(ojmfV zR^{<&f$gH!cqra^ipZbsLZ{_AmUyj~tru$ibd|pcwRs^HRf8YBDEq#dx5VhscH=CU z1UQSACtI%MoCBoU<|Vfdc>;BZ904cX1T7kcyOQP?g!jRCO%&d1 zo;YEf=t=_25oLMz;RWj`KGT5IsF8V;87{i$M`#f0t$r z|JIx7VT*3(Ho=MKku&S%rsBOTqAuzr{pWloOFVJ&EcZ3l6OB%KS=U00)1;z@f zDvk}W6}MF|f4j*|ROBgG5h#d%^550$O7#3W-lT1+qkDO%tuvpigKCd+bbw11jp!qRfNYiJL)K1x00 zY&wJ$Q}yB*7BZ*a+ob$kPBv)ESg`pdb>1e!hU(t3`4;~g>|iZeO%}0W_(o4)O{?^q z94tZ?wyzk^!26ZVvW<)&V%%^bSeF^mn;SgPsC*wRTH_q^HuUlrM8B{iCcWb?qX~>= z4fZ)8)M_Dj$d&5iG_FGUVe%QyLMS5Xun)q8af)`oM8U2e=g=!E+%zq87tIb;EY`!r z<2WxxK9?gM{tyQ$cTPWfdxj+SJ$gKwE(T@|1Gdl;;moc46Ty z%lnynPoHvYFyoQy!L3ceB~S?p2xiEi>pK7F9<#RoIDWbs`yj>rCQ2VUvOx$CK${a) zcQH?H-=d&$Ium{k)0oR~W0^=a60Oybb5!ko5Xe=1&~Gb-|IBpczmVI@>jVEt(*SPS zC%?JPzzL8F!{Z%ypdyz_h6t1cntOz+rX!c=n|E>TM8nki_k`fC zK%pP@EH>iomDXziAN-`-erjr#r8jUMql^1HvF+W#JJIxYhwzKQ7Tm7qEqN z+f!W`&Go->J=eY5%bDpjZ56R<8{I)Bd0rl>=Ib;n6uu3(;8v8}$9C@+?z}wMUmUY` zHolMN=`oTbD$NP%4l=5EWbvF&OGOO(G#|Lq;ra({@1cHFfxAC*v#8vMtbQScck{>{ z+YmlIKdUVJG+R4Gfv8V%l#_Xs|C5C^+ct!Wr`O`ORg_#wA+!9c9IM3lW$AO958*EV zCrAQbkf5;L)uF|)PJMB3#QBE|&td{@&3fKn!bDV)CNpUzg_Amf@=0vA4 zlUp#`_}0&K_2mLsp^M%pLUO%VM2YNjp&n+rn=9hUczkRAR-w|GmAVV+$R2WHZiaW6;*i*%!%YI(bbpThs6o(G(kApTWYI)R}t*7%<(EUy0rAovII?x?>& zd-qijuJviWnJvcsHpP11ObJtK;PHxvj1|^KoV@r>TuOu9zltF{#!A?hR=}?G+7a;o zxIaWKQzr|UrD5D#xwSMlhWU~`p8a@XmWB