diff --git a/_maps/RandomZLevels/away_mission/jungleresort.dmm b/_maps/RandomZLevels/away_mission/jungleresort.dmm index d4698fec9a..4afe638edb 100644 --- a/_maps/RandomZLevels/away_mission/jungleresort.dmm +++ b/_maps/RandomZLevels/away_mission/jungleresort.dmm @@ -14,7 +14,7 @@ "ai" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/closet/crate/secure/loot, -/obj/item/clothing/head/collectable/paper, +/obj/item/clothing/head/sombrero/shamebrero, /turf/open/floor/plating, /area/awaymission/jungleresort) "ak" = ( @@ -51,6 +51,10 @@ /obj/machinery/jukebox, /turf/open/floor/wood, /area/awaymission/jungleresort) +"az" = ( +/obj/structure/stone_tile/center, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "aA" = ( /obj/machinery/light, /obj/structure/chair/wood{ @@ -199,7 +203,7 @@ /area/awaymission/jungleresort) "cK" = ( /obj/structure/closet/crate, -/obj/item/clothing/head/collectable/tophat, +/obj/item/clothing/head/collectable/petehat/gang, /turf/open/floor/plating/rust, /area/awaymission/jungleresort) "cT" = ( @@ -217,6 +221,11 @@ /obj/structure/flora/rock, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) +"cY" = ( +/obj/structure/flora/grass/jungle/b, +/mob/living/simple_animal/hostile/gorilla/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) "dm" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/beer, @@ -274,7 +283,6 @@ dir = 9 }, /obj/structure/stone_tile/center/cracked, -/obj/item/ammo_casing/shotgun/buckshot, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) "eB" = ( @@ -405,10 +413,14 @@ /obj/item/toy/figure/chef, /turf/open/floor/wood, /area/awaymission/jungleresort) +"gC" = ( +/obj/item/clothing/head/rice_hat/cursed, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "gK" = ( /obj/structure/table/wood, -/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot, -/obj/item/ammo_box/magazine/toy/m762/riot, +/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted, +/obj/item/ammo_box/magazine/toy/smgm45, /turf/open/floor/wood, /area/awaymission/jungleresort) "gL" = ( @@ -580,6 +592,9 @@ dir = 1 }, /obj/structure/stone_tile/center/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) "iE" = ( @@ -660,6 +675,11 @@ }, /turf/open/floor/grass, /area/awaymission/jungleresort) +"jw" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "jy" = ( /obj/structure/flora/grass/jungle/b, /obj/effect/turf_decal/weather/dirt{ @@ -674,6 +694,16 @@ }, /turf/open/floor/grass, /area/awaymission/jungleresort) +"jD" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "jF" = ( /obj/structure/flora/tree/jungle, /obj/machinery/light, @@ -798,6 +828,11 @@ }, /turf/open/floor/wood, /area/awaymission/jungleresort) +"lF" = ( +/obj/structure/flora/junglebush, +/mob/living/simple_animal/hostile/gorilla/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) "lJ" = ( /obj/structure/flora/junglebush/c, /obj/machinery/light{ @@ -869,6 +904,8 @@ /obj/structure/cable{ icon_state = "2-4" }, +/obj/item/clothing/glasses/meson/engine, +/obj/item/storage/belt/utility, /turf/open/floor/plating, /area/awaymission/jungleresort) "mE" = ( @@ -986,6 +1023,10 @@ /obj/item/toy/crayon/spraycan, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) +"ou" = ( +/obj/item/clothing/glasses/meson, +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) "ow" = ( /obj/structure/flora/tree/jungle, /obj/effect/turf_decal/weather/dirt, @@ -993,7 +1034,7 @@ /area/awaymission/jungleresort) "oW" = ( /obj/effect/decal/remains/human, -/obj/item/clothing/head/collectable/petehat/gang, +/obj/item/clothing/head/collectable/tophat, /turf/open/floor/plating, /area/awaymission/jungleresort) "oX" = ( @@ -1075,7 +1116,7 @@ "qi" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/closet/crate/secure/loot, -/obj/item/clothing/head/collectable/beret, +/obj/item/clothing/head/rice_hat/cursed, /turf/open/floor/plating, /area/awaymission/jungleresort) "qr" = ( @@ -1255,6 +1296,15 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/awaymission/jungleresort) +"tm" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "tn" = ( /obj/structure/flora/rock/pile, /obj/machinery/light{ @@ -1478,6 +1528,15 @@ /obj/effect/turf_decal/weather/dirt, /turf/open/floor/grass, /area/awaymission/jungleresort) +"vz" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "vK" = ( /obj/structure/flora/ausbushes/stalkybush, /turf/open/floor/grass, @@ -1497,6 +1556,10 @@ }, /turf/open/floor/wood, /area/awaymission/jungleresort) +"wd" = ( +/obj/item/storage/bag/ore, +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) "wj" = ( /obj/machinery/light{ dir = 1 @@ -1535,7 +1598,7 @@ /area/awaymission/jungleresort) "ww" = ( /obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/hooded/wintercoat/captain, +/obj/item/clothing/suit/hooded/wintercoat/captain/jungle, /turf/open/floor/carpet/blue, /area/awaymission/jungleresort) "wF" = ( @@ -1655,6 +1718,10 @@ }, /turf/open/floor/grass, /area/awaymission/jungleresort) +"yw" = ( +/obj/item/pickaxe/mini, +/turf/open/floor/plating/asteroid, +/area/awaymission/jungleresort) "yx" = ( /obj/structure/flora/ausbushes/fullgrass, /obj/effect/turf_decal/weather/dirt{ @@ -1814,6 +1881,13 @@ /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/grass, /area/awaymission/jungleresort) +"Ad" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "Ag" = ( /obj/machinery/door/airlock/wood{ name = "Resort Office" @@ -2016,6 +2090,7 @@ /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/window/reinforced, /turf/open/floor/carpet, /area/awaymission/jungleresort) "CV" = ( @@ -2329,6 +2404,9 @@ /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 9 }, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) "GN" = ( @@ -2368,6 +2446,10 @@ }, /turf/open/floor/grass, /area/awaymission/jungleresort) +"Hr" = ( +/obj/structure/stone_tile/surrounding/cracked, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "Hs" = ( /obj/structure/flora/ausbushes/stalkybush, /obj/machinery/light, @@ -2410,6 +2492,10 @@ }, /turf/open/floor/grass, /area/awaymission/jungleresort) +"HT" = ( +/mob/living/simple_animal/hostile/gorilla/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) "Ih" = ( /turf/open/floor/plating, /area/awaymission/jungleresort) @@ -2897,6 +2983,15 @@ /obj/item/storage/book/bible, /turf/open/floor/carpet, /area/awaymission/jungleresort) +"ON" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/remains/human, +/obj/structure/stone_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle, +/area/awaymission/jungleresort) "OU" = ( /obj/effect/turf_decal/weather/dirt, /turf/open/floor/grass, @@ -3030,7 +3125,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 8 }, -/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/center/burnt, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) "QA" = ( @@ -3091,6 +3186,7 @@ /obj/item/stack/sheet/mineral/uranium, /obj/item/stack/sheet/mineral/uranium, /obj/item/clothing/glasses/meson/engine, +/obj/item/storage/belt/utility, /turf/open/floor/plating, /area/awaymission/jungleresort) "Rm" = ( @@ -3224,11 +3320,8 @@ /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, /obj/structure/stone_tile/surrounding/cracked, -/obj/item/gun/ballistic/shotgun/sc_pump, /obj/item/clothing/suit/armor/vest, /obj/item/clothing/head/helmet, -/obj/item/ammo_casing/shotgun/buckshot, -/obj/item/ammo_casing/shotgun/buckshot, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) "SV" = ( @@ -3246,6 +3339,7 @@ /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 5 }, +/obj/structure/stone_tile/burnt, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) "Ta" = ( @@ -3290,6 +3384,7 @@ /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 9 }, +/obj/structure/stone_tile/center, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) "TG" = ( @@ -3508,7 +3603,7 @@ /area/awaymission/jungleresort) "WD" = ( /obj/effect/decal/remains/human, -/obj/item/clothing/head/collectable/slime, +/obj/item/clothing/head/collectable/beret, /turf/open/floor/plating/rust, /area/awaymission/jungleresort) "WE" = ( @@ -3573,6 +3668,11 @@ }, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) +"Xu" = ( +/obj/structure/flora/junglebush/c, +/mob/living/simple_animal/hostile/gorilla/jungle, +/turf/open/floor/grass, +/area/awaymission/jungleresort) "Xz" = ( /turf/open/floor/carpet/red, /area/awaymission/jungleresort) @@ -3639,6 +3739,7 @@ "Ye" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/toy/figure/syndie, +/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted, /turf/open/floor/carpet/red, /area/awaymission/jungleresort) "Yf" = ( @@ -3748,6 +3849,9 @@ dir = 8 }, /obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, /turf/open/floor/plating/dirt/jungle, /area/awaymission/jungleresort) "ZH" = ( @@ -6362,8 +6466,8 @@ AR AR AR AR -AR oZ +jD aL fy Dr @@ -6513,8 +6617,8 @@ AR AR AR AR -AR -AR +oZ +Gk AC GD oZ @@ -6668,8 +6772,8 @@ AR oZ iv Qz -AR -AR +tm +oZ AR AR AR @@ -6819,6 +6923,7 @@ AR oZ wS SZ +Hr oZ AR AR @@ -6834,7 +6939,6 @@ AR AR AR AR -AR rd AF YQ @@ -6967,11 +7071,11 @@ AR AR AR AR -AR -AR -yJ oZ -AR +aL +yJ +TD +oZ AR AR AR @@ -7122,6 +7226,8 @@ AR AR oZ Yp +az +ON oZ AR AR @@ -7137,8 +7243,6 @@ AR AR AR AR -AR -AR YQ YM cn @@ -7166,7 +7270,7 @@ YQ YQ CN YQ -YQ +HT rd YQ YQ @@ -7274,6 +7378,8 @@ AR AR oZ TD +Ad +jw oZ AR AR @@ -7289,8 +7395,6 @@ AR AR AR AR -AR -AR YQ aP Wl @@ -7427,7 +7531,7 @@ AR oZ aL Xs -AR +oZ AR AR AR @@ -7579,7 +7683,7 @@ AR AR oZ tH -AR +vz AR AR AR @@ -8261,7 +8365,7 @@ YQ YQ MW CN -AF +lF Wl YQ YQ @@ -9006,7 +9110,7 @@ YQ CN YQ YQ -YQ +HT Wl aP YQ @@ -9807,7 +9911,7 @@ YQ YQ YQ YQ -YQ +HT YQ YQ YQ @@ -10950,7 +11054,7 @@ YQ YQ Fz wH -YQ +HT YQ YQ VU @@ -11390,9 +11494,9 @@ AR AR AR io -uh -pQ -pQ +VJ +AV +AV QA dF io @@ -11544,8 +11648,8 @@ AR AR AR AR -AR -pQ +io +VJ AV QA QA @@ -13724,7 +13828,7 @@ io du YF io -io +gC io io ia @@ -14218,7 +14322,7 @@ YQ cn ZV MW -YQ +HT rd aP vK @@ -15051,7 +15155,7 @@ Wl YQ YQ YQ -YQ +HT rd YQ YQ @@ -18177,8 +18281,8 @@ YQ YQ YQ AF -AR -AR +yw +ou AR AR AR @@ -18329,9 +18433,9 @@ YQ YM Wl Pg -AR -AR -AR +wd +Qp +Qp AR AR AR @@ -20699,7 +20803,7 @@ YQ YQ YQ MW -rd +cY Wl YQ YQ @@ -22732,7 +22836,7 @@ AF ZV YQ YQ -cn +Xu YQ YQ YQ @@ -23322,7 +23426,7 @@ YQ CN VU dY -YQ +HT YQ aP YQ @@ -23577,7 +23681,7 @@ YQ YQ YQ vK -YQ +HT kr YQ AF @@ -26562,3 +26666,4 @@ bG bG bG "} + diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3d041edfd2..8e0886a30d 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -191,6 +191,7 @@ #define TRAIT_MUSICIAN "musician" #define TRAIT_PERMABONER "permanent_arousal" #define TRAIT_NEVERBONER "never_aroused" +#define TRAIT_NYMPHO "nymphomaniac" #define TRAIT_MASO "masochism" #define TRAIT_HIGH_BLOOD "high_blood" #define TRAIT_PARA "paraplegic" diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 1f4a47c474..d85df8c010 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -45,8 +45,8 @@ /datum/crafting_recipe/bloodsucker/blackcoffin name = "Black Coffin" result = /obj/structure/closet/crate/coffin/blackcoffin - tools = list(/obj/item/weldingtool, - /obj/item/screwdriver) + tools = list(TOOL_WELDER, + TOOL_SCREWDRIVER) reqs = list(/obj/item/stack/sheet/cloth = 1, /obj/item/stack/sheet/mineral/wood = 5, /obj/item/stack/sheet/metal = 1) @@ -72,8 +72,8 @@ /datum/crafting_recipe/bloodsucker/metalcoffin name = "Metal Coffin" result =/obj/structure/closet/crate/coffin/metalcoffin - tools = list(/obj/item/weldingtool, - /obj/item/screwdriver) + tools = list(TOOL_WELDER, + TOOL_SCREWDRIVER) reqs = list(/obj/item/stack/sheet/metal = 5) time = 100 subcategory = CAT_FURNITURE @@ -84,9 +84,9 @@ name = "Persuasion Rack" //desc = "For converting crewmembers into loyal Vassals." result = /obj/structure/bloodsucker/vassalrack - tools = list(/obj/item/weldingtool, - //obj/item/screwdriver, - /obj/item/wrench + tools = list(TOOL_WELDER, + //TOOL_SCREWDRIVER, + TOOL_WRENCH ) reqs = list(/obj/item/stack/sheet/mineral/wood = 3, /obj/item/stack/sheet/metal = 2, @@ -108,8 +108,8 @@ name = "Candelabrum" //desc = "For converting crewmembers into loyal Vassals." result = /obj/structure/bloodsucker/candelabrum - tools = list(/obj/item/weldingtool, - /obj/item/wrench + tools = list(TOOL_WELDER, + TOOL_WRENCH ) reqs = list(/obj/item/stack/sheet/metal = 3, /obj/item/stack/rods = 1, diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index ca62a70ee5..01038c11d3 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -84,38 +84,37 @@ handles linking back and forth. _MakeLocal() /datum/component/remote_materials/proc/OnAttackBy(datum/source, obj/item/I, mob/user) - if (istype(I, /obj/item/multitool)) - var/obj/item/multitool/M = I - if (!QDELETED(M.buffer) && istype(M.buffer, /obj/machinery/ore_silo)) - if (silo == M.buffer) + if(I.tool_behaviour == TOOL_MULTITOOL) + if((I.buffer) && istype(I.buffer, /obj/machinery/ore_silo)) + if(silo == I.buffer) to_chat(user, "[parent] is already connected to [silo].") return COMPONENT_NO_AFTERATTACK - if (silo) + if(silo) silo.connected -= src silo.updateUsrDialog() - else if (mat_container) + else if(mat_container) mat_container.retrieve_all() qdel(mat_container) - silo = M.buffer + silo = I.buffer silo.connected += src silo.updateUsrDialog() mat_container = silo.GetComponent(/datum/component/material_container) to_chat(user, "You connect [parent] to [silo] from the multitool's buffer.") return COMPONENT_NO_AFTERATTACK - else if (silo && istype(I, /obj/item/stack)) - if (silo.remote_attackby(parent, user, I)) + else if(silo && istype(I, /obj/item/stack)) + if(silo.remote_attackby(parent, user, I)) return COMPONENT_NO_AFTERATTACK /datum/component/remote_materials/proc/on_hold() return silo && silo.holds["[get_area(parent)]/[category]"] /datum/component/remote_materials/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats) - if (silo) + if(silo) silo.silo_log(M || parent, action, amount, noun, mats) /datum/component/remote_materials/proc/format_amount() - if (mat_container) + if(mat_container) return "[mat_container.total_amount] / [mat_container.max_amount == INFINITY ? "Unlimited" : mat_container.max_amount] ([silo ? "remote" : "local"])" else return "0 / 0" diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 129faabdb7..b8d629273b 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -125,7 +125,7 @@ else if(!default_can_user_rotate(user, default_rotation_direction)) return - if(istype(I,/obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) BaseRot(user,default_rotation_direction) return COMPONENT_NO_AFTERATTACK diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 73813fd253..18d565ed5a 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -105,6 +105,22 @@ gain_text = "You desire to be hurt." lose_text = "Pain has become less exciting for you." +/datum/quirk/libido + name = "Nymphomaniac" + desc = "You are much more sensitive to arousal." + value = 0 + mob_trait = TRAIT_NYMPHO + gain_text = "You are feeling extra wild." + lose_text = "You don't feel that burning sensation anymore." + +/datum/quirk/libido/add() + var/mob/living/carbon/human/H = quirk_holder + H.arousal_rate = 3 * initial(H.arousal_rate) + +/datum/quirk/libido/remove() + var/mob/living/carbon/human/H = quirk_holder + H.arousal_rate = initial(H.arousal_rate) + /datum/quirk/alcohol_intolerance name = "Alcohol Intolerance" desc = "You take toxin damage from alcohol rather than getting drunk." diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 68c475f67b..1c9c14ee3e 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -265,11 +265,10 @@ reveal_wires = TRUE // Same for anyone with an abductor multitool. - else if(user.is_holding_item_of_type(/obj/item/multitool/abductor)) - reveal_wires = TRUE - // and advanced multitool - else if(user.is_holding_item_of_type(/obj/item/multitool/advanced)) - reveal_wires = TRUE + else if(user.is_holding_tool_quality(TOOL_MULTITOOL)) + var/obj/item/tool = user.is_holding_tool_quality(TOOL_MULTITOOL) + if(tool.show_wires) + reveal_wires = TRUE // Station blueprints do that too, but only if the wires are not randomized. else if(user.is_holding_item_of_type(/obj/item/areaeditor/blueprints) && !randomize) diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 02421b1e52..9c5a41de5d 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -134,6 +134,7 @@ if(status_effect_type) linked_status_effect = victim.apply_status_effect(status_effect_type, src) SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb) + victim.emote("pain") if(!victim.alerts["wound"]) // only one alert is shared between all of the wounds victim.throw_alert("wound", /obj/screen/alert/status_effect/wound) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5f6dfa7214..48250c9d5e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -992,7 +992,7 @@ return /atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) - if(!istype(I, /obj/item/multitool)) + if(!I.tool_behaviour == TOOL_MULTITOOL) if(user && !silent) to_chat(user, "[I] has no data buffer!") return FALSE diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 6bac63dff0..82209221ce 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -82,7 +82,7 @@ O.add_fingerprint(user) update_icon() - else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + else if(O.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) if(stat & BROKEN) if(!O.tool_start_check(user, amount=0)) return diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index 50b6180d62..6fdeae61a1 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -73,7 +73,7 @@ O.add_fingerprint(user) update_icon() - else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + else if(O.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) if(obj_integrity < max_integrity) if(!O.tool_start_check(user, amount=0)) return diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index b5031b68a1..0de76694c0 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -65,7 +65,7 @@ . += "button-board" /obj/machinery/button/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(panel_open || allowed(user)) default_deconstruction_screwdriver(user, "button-open", "[skin]",W) update_icon() @@ -93,7 +93,7 @@ req_access = board.accesses to_chat(user, "You add [W] to the button.") - if(!device && !board && istype(W, /obj/item/wrench)) + if(!device && !board && W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start unsecuring the button frame...") W.play_tool_sound(src) if(W.use_tool(src, user, 40)) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index b6af0600e4..ba54822140 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -39,7 +39,7 @@ switch(state) if(1) // State 1 - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You weld the assembly securely into place.") setAnchored(TRUE) @@ -56,7 +56,7 @@ return return - else if(istype(W, /obj/item/weldingtool)) + else if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You unweld the assembly from its place.") @@ -133,7 +133,9 @@ qdel(src) return TRUE -/obj/structure/camera_assembly/proc/weld(obj/item/weldingtool/W, mob/living/user) +/obj/structure/camera_assembly/proc/weld(obj/item/W, mob/living/user) + if(!W.tool_behaviour == TOOL_WELDER) + return if(!W.tool_start_check(user, amount=0)) return FALSE to_chat(user, "You start to weld \the [src]...") diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 60a310e9d5..e95543cffb 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -297,22 +297,20 @@ if(default_deconstruction_crowbar(W)) return - if(istype(W, /obj/item/multitool)) - var/obj/item/multitool/P = W - - if(istype(P.buffer, /obj/machinery/computer/cloning)) - if(get_area(P.buffer) != get_area(src)) + if(W.tool_behaviour == TOOL_MULTITOOL) + if(istype(W.buffer, /obj/machinery/computer/cloning)) + if(get_area(W.buffer) != get_area(src)) to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") - P.buffer = null + W.buffer = null return - to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") - var/obj/machinery/computer/cloning/comp = P.buffer + to_chat(user, "-% Successfully linked [W.buffer] with [src] %-") + var/obj/machinery/computer/cloning/comp = W.buffer if(connected) connected.DetachCloner(src) comp.AttachCloner(src) else - P.buffer = src - to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") + W.buffer = src + to_chat(user, "-% Successfully stored [REF(W.buffer)] [W.buffer] in buffer %-") return var/mob/living/mob_occupant = occupant diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 8ebb64097d..bd7ae64e16 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -10,8 +10,8 @@ var/mob/living/silicon/ai/occupier = null var/active = FALSE -/obj/machinery/computer/aifixer/attackby(obj/I, mob/user, params) - if(occupier && istype(I, /obj/item/screwdriver)) +/obj/machinery/computer/aifixer/attackby(obj/item/I, mob/user, params) + if(occupier && I.tool_behaviour == TOOL_SCREWDRIVER) if(stat & (NOPOWER|BROKEN)) to_chat(user, "The screws on [name]'s screen won't budge.") else diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index a21ebbeccf..280348368d 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -7,14 +7,14 @@ add_fingerprint(user) switch(state) if(0) - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start wrenching the frame into place...") if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") setAnchored(TRUE) state = 1 return - if(istype(P, /obj/item/weldingtool)) + if(P.tool_behaviour == TOOL_WELDER) if(!P.tool_start_check(user, amount=0)) return @@ -26,7 +26,7 @@ qdel(src) return if(1) - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start to unfasten the frame...") if(P.use_tool(src, user, 20, volume=50) && state == 1) to_chat(user, "You unfasten the frame.") @@ -46,13 +46,13 @@ else if(istype(P, /obj/item/circuitboard) && !circuit) to_chat(user, "This frame does not accept circuit boards of this type!") return - if(istype(P, /obj/item/screwdriver) && circuit) + if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) P.play_tool_sound(src) to_chat(user, "You screw [circuit] into place.") state = 2 icon_state = "2" return - if(istype(P, /obj/item/crowbar) && circuit) + if(P.tool_behaviour == TOOL_CROWBAR && circuit) P.play_tool_sound(src) to_chat(user, "You remove [circuit].") state = 1 @@ -62,7 +62,7 @@ circuit = null return if(2) - if(istype(P, /obj/item/screwdriver) && circuit) + if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) P.play_tool_sound(src) to_chat(user, "You unfasten the circuit board.") state = 1 @@ -78,7 +78,7 @@ icon_state = "3" return if(3) - if(istype(P, /obj/item/wirecutters)) + if(P.tool_behaviour == TOOL_WIRECUTTER) P.play_tool_sound(src) to_chat(user, "You remove the cables.") state = 2 @@ -98,7 +98,7 @@ src.icon_state = "4" return if(4) - if(istype(P, /obj/item/crowbar)) + if(P.tool_behaviour == TOOL_CROWBAR) P.play_tool_sound(src) to_chat(user, "You remove the glass panel.") state = 3 @@ -106,7 +106,7 @@ var/obj/item/stack/sheet/glass/G = new(drop_location(), 2) G.add_fingerprint(user) return - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) P.play_tool_sound(src) to_chat(user, "You connect the monitor.") var/obj/B = new circuit.build_path (loc, circuit) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 7057b8b02d..adadb40bc9 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -133,22 +133,20 @@ to_chat(user, "You insert [W].") playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) src.updateUsrDialog() - else if(istype(W, /obj/item/multitool)) - var/obj/item/multitool/P = W - - if(istype(P.buffer, clonepod_type)) - if(get_area(P.buffer) != get_area(src)) + else if(W.tool_behaviour == TOOL_MULTITOOL) + if(istype(W.buffer, clonepod_type)) + if(get_area(W.buffer) != get_area(src)) to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") - P.buffer = null + W.buffer = null return - to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") - var/obj/machinery/clonepod/pod = P.buffer + to_chat(user, "-% Successfully linked [W.buffer] with [src] %-") + var/obj/machinery/clonepod/pod = W.buffer if(pod.connected) pod.connected.DetachCloner(pod) AttachCloner(pod) else - P.buffer = src - to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") + W.buffer = src + to_chat(user, "-% Successfully stored [REF(W.buffer)] [W.buffer] in buffer %-") return else return ..() @@ -473,7 +471,7 @@ scanner.locked = prev_locked src.updateUsrDialog() playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - + /obj/machinery/computer/cloning/proc/scan_occupant(occupant) var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index b2f7ae73a1..18a0aeb221 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -23,11 +23,10 @@ if(W.tool_behaviour == TOOL_MULTITOOL) if(!multitool_check_buffer(user, W)) return - var/obj/item/multitool/M = W - if(M.buffer && istype(M.buffer, /obj/machinery/launchpad)) + if(W.buffer && istype(W.buffer, /obj/machinery/launchpad)) if(LAZYLEN(launchpads) < maximum_pads) - launchpads |= M.buffer - M.buffer = null + launchpads |= W.buffer + W.buffer = null to_chat(user, "You upload the data from the [W.name]'s buffer.") else to_chat(user, "[src] cannot handle any more connections!") diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index 88d3c765cb..3489ee5d35 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -55,11 +55,12 @@ return connected_mechpad /obj/machinery/computer/mechpad/multitool_act(mob/living/user, obj/item/tool) + if(!tool.tool_behaviour == TOOL_MULTITOOL) + return if(!multitool_check_buffer(user, tool)) return - var/obj/item/multitool/multitool = tool - if(istype(multitool.buffer, /obj/machinery/mechpad)) - var/obj/machinery/mechpad/buffered_console = multitool.buffer + if(istype(tool.buffer, /obj/machinery/mechpad)) + var/obj/machinery/mechpad/buffered_console = tool.buffer if(!(mechpads.len < maximum_pads)) to_chat(user, "[src] cannot handle any more connections!") return @@ -69,13 +70,13 @@ connected_mechpad = buffered_console connected_mechpad.connected_console = src connected_mechpad.id = id - multitool.buffer = null - to_chat(user, "You connect the console to the pad with data from the [multitool.name]'s buffer.") + tool.buffer = null + to_chat(user, "You connect the console to the pad with data from the [tool.name]'s buffer.") else mechpads += buffered_console LAZYADD(buffered_console.consoles, src) - multitool.buffer = null - to_chat(user, "You upload the data from the [multitool.name]'s buffer.") + tool.buffer = null + to_chat(user, "You upload the data from the [tool.name]'s buffer.") /** * Tries to call the launch proc on the connected mechpad, returns if there is no connected mechpad or there is no mecha on the pad diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 5ee8223625..b00edfd82c 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -90,7 +90,7 @@ icon_state = "box_1" return - if(istype(P, /obj/item/screwdriver) && !anchored) + if(P.tool_behaviour == TOOL_SCREWDRIVER && !anchored) user.visible_message("[user] disassembles the frame.", \ "You start to disassemble the frame...", "You hear banging and clanking.") if(P.use_tool(src, user, 40, volume=50)) @@ -100,7 +100,7 @@ M.add_fingerprint(user) qdel(src) return - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") if(P.use_tool(src, user, 40, volume=75)) if(state == 1) @@ -109,7 +109,7 @@ return if(2) - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") if(P.use_tool(src, user, 40, volume=75)) to_chat(user, "You [anchored ? "un" : ""]secure [name].") @@ -140,7 +140,7 @@ to_chat(user, "This frame does not accept circuit boards of this type!") return - if(istype(P, /obj/item/wirecutters)) + if(P.tool_behaviour == TOOL_WIRECUTTER) P.play_tool_sound(src) to_chat(user, "You remove the cables.") state = 1 @@ -149,7 +149,7 @@ return if(3) - if(istype(P, /obj/item/crowbar)) + if(P.tool_behaviour == TOOL_CROWBAR) P.play_tool_sound(src) state = 2 circuit.forceMove(drop_location()) @@ -167,14 +167,14 @@ icon_state = "box_1" return - if(istype(P, /obj/item/wrench) && !circuit.needs_anchored) + if(P.tool_behaviour == TOOL_WRENCH && !circuit.needs_anchored) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") if(P.use_tool(src, user, 40, volume=75)) to_chat(user, "You [anchored ? "un" : ""]secure [name].") setAnchored(!anchored) return - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) var/component_check = 1 for(var/R in req_components) if(req_components[R] > 0) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 756f924cfa..8b24a3804f 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -35,7 +35,7 @@ /obj/machinery/jukebox/attackby(obj/item/O, mob/user, params) if(!active && !(flags_1 & NODECONSTRUCT_1)) - if(istype(O, /obj/item/wrench)) + if(O.tool_behaviour == TOOL_WRENCH) if(!anchored && !isinspace()) to_chat(user,"You secure [src] to the floor.") setAnchored(TRUE) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 677cbe1208..bc6cc4b60e 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -99,19 +99,21 @@ return ..() -/obj/machinery/defibrillator_mount/multitool_act(mob/living/user, obj/item/multitool) +/obj/machinery/defibrillator_mount/multitool_act(mob/living/user, obj/item/W) + if(!W.tool_behaviour == TOOL_MULTITOOL) + return if(!defib) to_chat(user, "There isn't any defibrillator to clamp in!") return TRUE if(!clamps_locked) to_chat(user, "[src]'s clamps are disengaged!") return TRUE - user.visible_message("[user] presses [multitool] into [src]'s ID slot...", \ + user.visible_message("[user] presses [W] into [src]'s ID slot...", \ "You begin overriding the clamps on [src]...") playsound(src, 'sound/machines/click.ogg', 50, TRUE) if(!do_after(user, 100, target = src) || !clamps_locked) return - user.visible_message("[user] pulses [multitool], and [src]'s clamps slide up.", \ + user.visible_message("[user] pulses [W], and [src]'s clamps slide up.", \ "You override the locking clamps on [src]!") playsound(src, 'sound/machines/locktoggle.ogg', 50, TRUE) clamps_locked = FALSE diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 252e6cf6b3..ca4b392efa 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -26,7 +26,7 @@ return /obj/structure/barricade/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM && bar_material == METAL) + if(I.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM && bar_material == METAL) if(obj_integrity < max_integrity) if(!I.tool_start_check(user, amount=0)) return diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 9ef34390f6..d9444c3157 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -864,7 +864,7 @@ update_icon() return if(AIRLOCK_SECURITY_METAL) - if(istype(C, /obj/item/weldingtool)) + if(C.tool_behaviour == TOOL_WELDER) if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the panel's shielding...") @@ -879,10 +879,9 @@ update_icon() return if(AIRLOCK_SECURITY_PLASTEEL_I_S) - if(istype(C, /obj/item/crowbar)) - var/obj/item/crowbar/W = C + if(C.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start removing the inner layer of shielding...") - if(W.use_tool(src, user, 40, volume=100)) + if(C.use_tool(src, user, 40, volume=100)) if(!panel_open) return if(security_level != AIRLOCK_SECURITY_PLASTEEL_I_S) @@ -896,7 +895,7 @@ update_icon() return if(AIRLOCK_SECURITY_PLASTEEL_I) - if(istype(C, /obj/item/weldingtool)) + if(C.tool_behaviour == TOOL_WELDER) if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the inner layer of shielding...") @@ -909,7 +908,7 @@ security_level = AIRLOCK_SECURITY_PLASTEEL_I_S return if(AIRLOCK_SECURITY_PLASTEEL_O_S) - if(istype(C, /obj/item/crowbar)) + if(C.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start removing outer layer of shielding...") if(C.use_tool(src, user, 40, volume=100)) if(!panel_open) @@ -922,7 +921,7 @@ spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1) return if(AIRLOCK_SECURITY_PLASTEEL_O) - if(istype(C, /obj/item/weldingtool)) + if(C.tool_behaviour == TOOL_WELDER) if(!C.tool_start_check(user, amount=2)) return to_chat(user, "You begin cutting the outer layer of shielding...") @@ -935,7 +934,7 @@ security_level = AIRLOCK_SECURITY_PLASTEEL_O_S return if(AIRLOCK_SECURITY_PLASTEEL) - if(istype(C, /obj/item/wirecutters)) + if(C.tool_behaviour == TOOL_WIRECUTTER) if(src.hasPower() && src.shock(user, 60)) // Protective grille of wiring is electrified return to_chat(user, "You start cutting through the outer grille.") @@ -946,7 +945,7 @@ "You cut through \the [src]'s outer grille.") security_level = AIRLOCK_SECURITY_PLASTEEL_O return - if(istype(C, /obj/item/screwdriver)) + if(C.tool_behaviour == TOOL_SCREWDRIVER) if(panel_open && detonated) to_chat(user, "[src] has no maintenance panel!") return @@ -954,7 +953,7 @@ to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the airlock.") C.play_tool_sound(src) src.update_icon() - else if(istype(C, /obj/item/wirecutters) && note) + else if(C.tool_behaviour == TOOL_WIRECUTTER && note) user.visible_message("[user] cuts down [note] from [src].", "You remove [note] from [src].") C.play_tool_sound(src) note.forceMove(get_turf(user)) @@ -999,7 +998,9 @@ return ..() -/obj/machinery/door/airlock/try_to_weld(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/airlock/try_to_weld(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return if(!operating && density) if(user.a_intent != INTENT_HELP) if(!W.tool_start_check(user, amount=0)) @@ -1028,12 +1029,14 @@ else to_chat(user, "The airlock doesn't need repairing.") -/obj/machinery/door/airlock/proc/weld_checks(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/airlock/proc/weld_checks(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return return !operating && density /obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user) var/beingcrowbarred = null - if(istype(I, /obj/item/crowbar) ) + if(I.tool_behaviour == TOOL_CROWBAR) beingcrowbarred = 1 else beingcrowbarred = 0 @@ -1069,7 +1072,7 @@ else INVOKE_ASYNC(src, (density ? .proc/open : .proc/close), 2) - if(istype(I, /obj/item/crowbar/power)) + if(I.tool_behaviour == TOOL_CROWBAR) if(hasPower() && isElectrified()) shock(user,100)//it's like sticking a forck in a power socket return diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 8941c540ae..2a4b586d7c 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -658,7 +658,7 @@ /obj/machinery/door/airlock/clockwork/proc/attempt_construction(obj/item/I, mob/living/user) if(!I || !user || !user.canUseTopic(src)) return 0 - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) if(construction_state == GEAR_SECURE) user.visible_message("[user] begins loosening [src]'s cogwheel...", "You begin loosening [src]'s cogwheel...") if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_SECURE) @@ -674,7 +674,7 @@ playsound(src, 'sound/items/deconstruct.ogg', 50, 1) construction_state = GEAR_SECURE return 1 - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) if(construction_state == GEAR_SECURE) to_chat(user, "[src]'s cogwheel is too tightly secured! Your [I.name] can't reach under it!") return 1 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 1faff76626..63a8ad22d4 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -173,7 +173,9 @@ /obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) return get_dir(src, M) & unres_sides -/obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/proc/try_to_weld(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return return /obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d88a9c9072..d84b994b92 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -123,7 +123,9 @@ /obj/machinery/door/firedoor/try_to_activate_door(mob/user) return -/obj/machinery/door/firedoor/try_to_weld(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/firedoor/try_to_weld(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return if(!W.tool_start_check(user, amount=0)) return user.visible_message("[user] starts [welded ? "unwelding" : "welding"] [src].", "You start welding [src].") diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 7847c3757e..dd885542c9 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -243,7 +243,7 @@ add_fingerprint(user) if(!(flags_1&NODECONSTRUCT_1)) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(density || operating) to_chat(user, "You need to open the door to access the maintenance panel!") return @@ -252,7 +252,7 @@ to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the [src.name].") return - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) if(panel_open && !density && !operating) user.visible_message("[user] removes the electronics from the [src.name].", \ "You start to remove electronics from the [src.name]...") diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 4f27e38a14..1cdb81ee1d 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(doppler_arrays) return /obj/machinery/doppler_array/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) if(!anchored && !isinspace()) anchored = TRUE power_change() diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 33ea273e9d..74df30ebfe 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -210,13 +210,13 @@ icon_state = icon_on /obj/machinery/droneDispenser/attackby(obj/item/I, mob/living/user) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.retrieve_all() I.play_tool_sound(src) to_chat(user, "You retrieve the materials from [src].") - else if(istype(I, /obj/item/weldingtool)) + else if(I.tool_behaviour == TOOL_WELDER) if(!(stat & BROKEN)) to_chat(user, "[src] doesn't need repairs.") return diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index ca9ce09ced..c6b29cf54c 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -160,7 +160,7 @@ /obj/machinery/firealarm/attackby(obj/item/W, mob/user, params) add_fingerprint(user) - if(istype(W, /obj/item/screwdriver) && buildstage == 2) + if(W.tool_behaviour == TOOL_SCREWDRIVER && buildstage == 2) W.play_tool_sound(src) panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].") @@ -169,7 +169,7 @@ if(panel_open) - if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) + if((W.tool_behaviour == TOOL_WELDER) && user.a_intent == INTENT_HELP) if(obj_integrity < max_integrity) if(!W.tool_start_check(user, amount=0)) return @@ -184,7 +184,7 @@ switch(buildstage) if(2) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) detecting = !detecting if (src.detecting) user.visible_message("[user] has reconnected [src]'s detecting unit!", "You reconnect [src]'s detecting unit.") @@ -192,7 +192,7 @@ user.visible_message("[user] has disconnected [src]'s detecting unit!", "You disconnect [src]'s detecting unit.") return - else if (istype(W, /obj/item/wirecutters)) + else if(W.tool_behaviour == TOOL_WIRECUTTER) buildstage = 1 W.play_tool_sound(src) new /obj/item/stack/cable_coil(user.loc, 5) @@ -215,7 +215,7 @@ update_icon() return - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) user.visible_message("[user.name] removes the electronics from [src.name].", \ "You start prying out the circuit...") if(W.use_tool(src, user, 20, volume=50)) @@ -247,7 +247,7 @@ update_icon() return - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) user.visible_message("[user] removes the fire alarm assembly from the wall.", \ "You remove the fire alarm assembly from the wall.") var/obj/item/wallframe/firealarm/frame = new /obj/item/wallframe/firealarm() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index c0e1122140..20aac89743 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -57,8 +57,8 @@ //Don't want to render prison breaks impossible /obj/machinery/flasher/attackby(obj/item/W, mob/user, params) add_fingerprint(user) - if (istype(W, /obj/item/wirecutters)) - if (bulb) + if(W.tool_behaviour == TOOL_WIRECUTTER) + if(bulb) user.visible_message("[user] begins to disconnect [src]'s flashbulb.", "You begin to disconnect [src]'s flashbulb...") if(W.use_tool(src, user, 30, volume=50) && bulb) user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb.") @@ -66,7 +66,7 @@ bulb = null power_change() - else if (istype(W, /obj/item/assembly/flash/handheld)) + else if(istype(W, /obj/item/assembly/flash/handheld)) if (!bulb) if(!user.transferItemToLoc(W, src)) return @@ -76,7 +76,7 @@ else to_chat(user, "A flashbulb is already installed in [src]!") - else if (istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) if(!bulb) to_chat(user, "You start unsecuring the flasher frame...") if(W.use_tool(src, user, 40, volume=50)) @@ -173,10 +173,10 @@ flash() /obj/machinery/flasher/portable/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) W.play_tool_sound(src, 100) - if (!anchored && !isinspace()) + if(!anchored && !isinspace()) to_chat(user, "[src] is now secured.") add_overlay("[base_state]-s") setAnchored(TRUE) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index ba4d01cfe5..bb047a6a5e 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -91,7 +91,7 @@ // src.sd_SetLuminosity(0) /obj/machinery/sparker/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) add_fingerprint(user) src.disable = !src.disable if (src.disable) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index e3df79e291..87989b18ec 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -38,8 +38,7 @@ if(I.tool_behaviour == TOOL_MULTITOOL) if(!multitool_check_buffer(user, I)) return - var/obj/item/multitool/M = I - M.buffer = src + I.buffer = src to_chat(user, "You save the data in the [I.name]'s buffer.") return TRUE diff --git a/code/game/machinery/mechlaunchpad.dm b/code/game/machinery/mechlaunchpad.dm index 049f3e7d3e..f32fe0bc4f 100644 --- a/code/game/machinery/mechlaunchpad.dm +++ b/code/game/machinery/mechlaunchpad.dm @@ -37,13 +37,14 @@ return TRUE /obj/machinery/mechpad/multitool_act(mob/living/user, obj/item/tool) + if(!tool.tool_behaviour == TOOL_MULTITOOL) + return if(!panel_open) return if(!multitool_check_buffer(user, tool)) return - var/obj/item/multitool/multitool = tool - multitool.buffer = src - to_chat(user, "You save the data in the [multitool.name]'s buffer.") + tool.buffer = src + to_chat(user, "You save the data in the [tool.name]'s buffer.") return TRUE /** diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 766943de36..752ba1b732 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -89,7 +89,7 @@ if(T.intact) return // prevent intraction when T-scanner revealed - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) open = !open 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/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 3acbaba4fd..141afa53e7 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -127,7 +127,9 @@ Buildable meters /obj/item/pipe/attack_self(mob/user) setDir(turn(dir,-90)) -/obj/item/pipe/wrench_act(mob/living/user, obj/item/wrench/W) +/obj/item/pipe/wrench_act(mob/living/user, obj/item/W) + if(!W.tool_behaviour == TOOL_WRENCH) + return if(!isturf(loc)) return TRUE @@ -196,8 +198,9 @@ Buildable meters w_class = WEIGHT_CLASS_BULKY var/piping_layer = PIPING_LAYER_DEFAULT -/obj/item/pipe_meter/wrench_act(mob/living/user, obj/item/wrench/W) - +/obj/item/pipe_meter/wrench_act(mob/living/user, obj/item/W) + if(!W.tool_behaviour == TOOL_WRENCH) + return var/obj/machinery/atmospherics/pipe/pipe for(var/obj/machinery/atmospherics/pipe/P in loc) if(P.piping_layer == piping_layer) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index ee0a8224a8..aad64df6d9 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -283,9 +283,9 @@ /obj/machinery/porta_turret/attackby(obj/item/I, mob/user, params) if(stat & BROKEN) - if(istype(I, /obj/item/crowbar)) - //If the turret is destroyed, you can remove it with a crowbar to - //try and salvage its components + if(I.tool_behaviour == TOOL_CROWBAR) + //If the turret is destroyed, you can remove it with something + //that acts like a crowbar to try and salvage its components to_chat(user, "You begin prying the metal coverings off...") if(I.use_tool(src, user, 20)) if(prob(70)) @@ -302,7 +302,7 @@ qdel(src) return - else if((istype(I, /obj/item/wrench)) && (!on)) + else if((I.tool_behaviour == TOOL_WRENCH) && (!on)) if(raised) return @@ -329,12 +329,11 @@ to_chat(user, "Controls are now [locked ? "locked" : "unlocked"].") else to_chat(user, "Access denied.") - else if(istype(I, /obj/item/multitool) && !locked) + else if(I.tool_behaviour == TOOL_MULTITOOL && !locked) if(!multitool_check_buffer(user, I)) return - var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, "You add [src] to multitool buffer.") + I.buffer = src + to_chat(user, "You add [src] to [I]'s buffer.") else return ..() @@ -948,20 +947,19 @@ if(stat & BROKEN) return - if (istype(I, /obj/item/multitool)) + if(I.tool_behaviour == TOOL_MULTITOOL) if(!multitool_check_buffer(user, I)) return - var/obj/item/multitool/M = I - if(M.buffer && istype(M.buffer, /obj/machinery/porta_turret)) - turrets |= M.buffer - to_chat(user, "You link \the [M.buffer] with \the [src].") + if(I.buffer && istype(I.buffer, /obj/machinery/porta_turret)) + turrets |= I.buffer + to_chat(user, "You link \the [I.buffer] with \the [src].") return - if (issilicon(user)) + if(issilicon(user)) return attack_hand(user) - if ( get_dist(src, user) == 0 ) // trying to unlock the interface - if (allowed(usr)) + if(get_dist(src, user) == 0 ) // trying to unlock the interface + if(allowed(usr)) if(obj_flags & EMAGGED) to_chat(user, "The turret control is unresponsive!") return diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 2a73ee8d89..3b9e6ff45f 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -23,14 +23,14 @@ //this is a bit unwieldy but self-explanatory switch(build_step) if(PTURRET_UNSECURED) //first step - if(istype(I, /obj/item/wrench) && !anchored) + if(I.tool_behaviour == TOOL_WRENCH && !anchored) I.play_tool_sound(src, 100) to_chat(user, "You secure the external bolts.") setAnchored(TRUE) build_step = PTURRET_BOLTED return - else if(istype(I, /obj/item/crowbar) && !anchored) + else if(I.tool_behaviour == TOOL_CROWBAR && !anchored) I.play_tool_sound(src, 75) to_chat(user, "You dismantle the turret construction.") new /obj/item/stack/sheet/metal( loc, 5) @@ -48,7 +48,7 @@ to_chat(user, "You need two sheets of metal to continue construction!") return - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 75) to_chat(user, "You unfasten the external bolts.") setAnchored(FALSE) @@ -57,13 +57,13 @@ if(PTURRET_START_INTERNAL_ARMOUR) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 100) to_chat(user, "You bolt the metal armor into place.") build_step = PTURRET_INTERNAL_ARMOUR_ON return - else if(istype(I, /obj/item/weldingtool)) + else if(I.tool_behaviour == TOOL_WELDER) if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel return @@ -89,7 +89,7 @@ build_step = PTURRET_GUN_EQUIPPED return - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 100) to_chat(user, "You remove the turret's metal armor bolts.") build_step = PTURRET_START_INTERNAL_ARMOUR @@ -106,7 +106,7 @@ if(PTURRET_SENSORS_ON) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) I.play_tool_sound(src, 100) build_step = PTURRET_CLOSED to_chat(user, "You close the internal access hatch.") @@ -123,14 +123,14 @@ to_chat(user, "You need two sheets of metal to continue construction!") return - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) I.play_tool_sound(src, 100) build_step = PTURRET_SENSORS_ON to_chat(user, "You open the internal access hatch.") return if(PTURRET_START_EXTERNAL_ARMOUR) - if(istype(I, /obj/item/weldingtool)) + if(I.tool_behaviour == TOOL_WELDER) if(!I.tool_start_check(user, amount=5)) return @@ -153,7 +153,7 @@ qdel(src) return - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) I.play_tool_sound(src, 75) to_chat(user, "You pry off the turret's exterior armor.") new /obj/item/stack/sheet/metal(loc, 2) diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index e0746bda78..33a7a44e63 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -37,7 +37,7 @@ /obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench) && !parent_turret.on) + if(I.tool_behaviour == TOOL_WRENCH && !parent_turret.on) if(parent_turret.raised) return @@ -60,10 +60,9 @@ updateUsrDialog() else to_chat(user, "Access denied.") - else if(istype(I, /obj/item/multitool) && !parent_turret.locked) - var/obj/item/multitool/M = I - M.buffer = parent_turret - to_chat(user, "You add [parent_turret] to multitool buffer.") + else if(I.tool_behaviour == TOOL_MULTITOOL && !parent_turret.locked) + I.buffer = parent_turret + to_chat(user, "You add [parent_turret] to [I]'s buffer.") else return ..() diff --git a/code/game/machinery/poweredfans/fan_assembly.dm b/code/game/machinery/poweredfans/fan_assembly.dm index 651b3342ac..59dbe84def 100644 --- a/code/game/machinery/poweredfans/fan_assembly.dm +++ b/code/game/machinery/poweredfans/fan_assembly.dm @@ -25,7 +25,7 @@ switch(stat) if(1) // Stat 1 - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You weld the fan assembly securely into place.") setAnchored(TRUE) @@ -46,7 +46,7 @@ forceMove(F) F.setDir(src.dir) return - else if(istype(W, /obj/item/weldingtool)) + else if(W.tool_behaviour == TOOL_WELDER) if(weld(W, user)) to_chat(user, "You unweld the fan assembly from its place.") stat = 1 @@ -64,7 +64,9 @@ deconstruct() return TRUE -/obj/machinery/fan_assembly/proc/weld(obj/item/weldingtool/W, mob/living/user) +/obj/machinery/fan_assembly/proc/weld(obj/item/W, mob/living/user) + if(!W.tool_behaviour == TOOL_WELDER) + return if(!W.tool_start_check(user, amount=0)) return FALSE switch(stat) diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 4f706954a6..5c1a2195a4 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -55,19 +55,17 @@ return if(panel_open) - if(istype(I, /obj/item/multitool)) - var/obj/item/multitool/M = I - M.buffer = src + if(I.tool_behaviour == TOOL_MULTITOOL) + I.buffer = src to_chat(user, "You save the data in [I]'s buffer. It can now be saved to pads with closed panels.") return TRUE - else if(istype(I, /obj/item/multitool)) - var/obj/item/multitool/M = I - if(istype(M.buffer, /obj/machinery/quantumpad)) - if(M.buffer == src) + else if(I.tool_behaviour == TOOL_MULTITOOL) + if(istype(I.buffer, /obj/machinery/quantumpad)) + if(I.buffer == src) to_chat(user, "You cannot link a pad to itself!") return TRUE else - linked_pad = M.buffer + linked_pad = I.buffer to_chat(user, "You link [src] to the one in [I]'s buffer.") return TRUE else diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 1d118023c9..aad011119f 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -61,7 +61,7 @@ setCharging() /obj/machinery/recharger/attackby(obj/item/G, mob/user, params) - if(istype(G, /obj/item/wrench)) + if(G.tool_behaviour == TOOL_WRENCH) if(charging) to_chat(user, "Remove the charging item first!") return @@ -102,7 +102,7 @@ if(default_deconstruction_screwdriver(user, "rechargeropen", "recharger0", G)) return - if(panel_open && istype(G, /obj/item/crowbar)) + if(panel_open && G.tool_behaviour == TOOL_CROWBAR) default_deconstruction_crowbar(G) return diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 2915c2f34b..5d1b30741b 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -502,7 +502,7 @@ GLOBAL_LIST_EMPTY(allConsoles) messages += "From: [linkedsender]
[message]" /obj/machinery/requests_console/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/crowbar)) + if(O.tool_behaviour == TOOL_CROWBAR) if(open) to_chat(user, "You close the maintenance panel.") open = FALSE @@ -511,7 +511,7 @@ GLOBAL_LIST_EMPTY(allConsoles) open = TRUE update_icon() return - if(istype(O, /obj/item/screwdriver)) + if(O.tool_behaviour == TOOL_SCREWDRIVER) if(open) hackState = !hackState if(hackState) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 8a0f376b0f..2ebb137839 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -146,7 +146,7 @@ return /obj/machinery/shieldgen/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) W.play_tool_sound(src, 100) panel_open = !panel_open if(panel_open) @@ -165,7 +165,7 @@ to_chat(user, "You repair \the [src].") update_icon() - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) if(locked) to_chat(user, "The bolts are covered! Unlocking this would retract the covers.") return @@ -343,7 +343,7 @@ return ..() /obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, W, 0) else if(W.GetID()) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 056902801f..d6478f2e58 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -164,7 +164,7 @@ else to_chat(user, "The hatch must be open to insert a power cell!") return - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) panel_open = !panel_open user.visible_message("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src].", "You [panel_open ? "open" : "close"] the hatch on \the [src].") update_icon() diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 1b3f942c51..fc5af59dcb 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -75,7 +75,7 @@ GLOBAL_VAR_INIT(singularity_counter, 0) to_chat(user, "You need to screw the beacon to the floor first!") /obj/machinery/power/singularity_beacon/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(active) to_chat(user, "You need to deactivate the beacon first!") return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 50984c43b8..561daf433d 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -112,7 +112,7 @@ . = timer_set /obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench) && can_unanchor) + if(I.tool_behaviour == TOOL_WRENCH && can_unanchor) if(!anchored) if(!isturf(loc) || isspaceturf(loc)) to_chat(user, "The bomb must be placed on solid ground to attach it.") @@ -130,7 +130,7 @@ else to_chat(user, "The bolts are locked down!") - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) open_panel = !open_panel update_icon() to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") @@ -138,7 +138,7 @@ else if(is_wire_tool(I) && open_panel) wires.interact(user) - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) if(open_panel && wires.is_all_cut()) if(payload) to_chat(user, "You carefully pry out [payload].") @@ -158,7 +158,7 @@ to_chat(user, "You place [payload] into [src].") else to_chat(user, "[payload] is already loaded into [src]! You'll have to remove it first.") - else if(istype(I, /obj/item/weldingtool)) + else if(I.tool_behaviour == TOOL_WELDER) if(payload || !wires.is_all_cut() || !open_panel) return @@ -436,7 +436,7 @@ qdel(src) /obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/crowbar) && beakers.len > 0) + if(I.tool_behaviour == TOOL_CROWBAR && beakers.len > 0) I.play_tool_sound(src) for (var/obj/item/B in beakers) B.forceMove(drop_location()) diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 539025e4d5..a674bb6489 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -80,7 +80,7 @@ ref = REF(pda) ) data_out["message_logs"] += list(data) - + return data_out /obj/machinery/computer/message_monitor/ui_data(mob/user) @@ -119,7 +119,7 @@ if(!linkedServer) data_out["selected"] = null return data_out - + data_out["selected"] = list( name = linkedServer.name, id = linkedServer.id, @@ -156,7 +156,7 @@ if(LAZYLEN(machinelist) > 0) message = "FAILED: Cannot probe when buffer full" return - + for(var/obj/machinery/telecomms/message_server/T in GLOB.telecomms_list) if(T.network == network) LAZYADD(machinelist, T) @@ -206,7 +206,7 @@ message = "NOTICE: Decryption key set." return message = incorrectkey - + if("hack") if(!(linkedServer.on && (linkedServer.toggled != FALSE))) message = noserver @@ -225,7 +225,7 @@ else if(!(linkedServer.on && (linkedServer.toggled != FALSE))) message = noserver return - + var/datum/data_ref = locate(params["ref"]) if(istype(data_ref, /datum/data_rc_msg)) LAZYREMOVE(linkedServer.rc_msgs, data_ref) @@ -258,7 +258,7 @@ else if(!(linkedServer.on && (linkedServer.toggled != FALSE))) message = noserver return - + if("reset" in params) ResetMessage() return @@ -311,7 +311,7 @@ return custommessage = M return - + if("recepient" in params) // Get out list of viable PDAs var/list/obj/item/pda/sendPDAs = get_viewable_pdas() @@ -324,8 +324,8 @@ update_static_data(usr) /obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params) - if(istype(O, /obj/item/screwdriver) && CHECK_BITFIELD(obj_flags, EMAGGED)) - //Stops people from just unscrewing the monitor and putting it back to get the console working again. + if(O.tool_behaviour == TOOL_SCREWDRIVER && CHECK_BITFIELD(obj_flags, EMAGGED)) + //Stops people from just unscrewing the monitor and putting it back to get the console working again. //Why this though, you should make it emag to a board level. (i wont do it) to_chat(user, "It is too hot to mess with!") else diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index cc8784c5b8..d1c7222485 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -11,7 +11,7 @@ /obj/machinery/telecomms/attackby(obj/item/P, mob/user, params) var/icon_closed = initial(icon_state) var/icon_open = "[initial(icon_state)]_o" - + if(!on) icon_closed = "[initial(icon_state)]_off" icon_open = "[initial(icon_state)]_o_off" @@ -19,7 +19,7 @@ if(default_deconstruction_screwdriver(user, icon_open, icon_closed, P)) return // Using a multitool lets you access the receiver's interface - else if(istype(P, /obj/item/multitool)) + else if(P.tool_behaviour == TOOL_MULTITOOL) attack_hand(user) else if(default_deconstruction_crowbar(P)) @@ -42,7 +42,7 @@ . = list() //cpypaste from the vending bus .["notice"] = temp .["multitool"] = FALSE - var/obj/item/multitool/P = get_multitool(user) + var/obj/item/P = get_multitool(user) if(P) .["multitool"] = TRUE .["multitool_buf"] = null //to clean the list! @@ -113,7 +113,7 @@ if("network" in params) if(!canAccess(usr)) return - var/newnet = sanitize(sanitize_text(params["network"], network)) + var/newnet = sanitize(sanitize_text(params["network"], network)) if(length(newnet) > 15) temp = "-% Too many characters in new network tag. %-" return @@ -122,19 +122,19 @@ temp = "-% New network tag assigned: \"[network]\" %-" return if("multitool") - var/obj/item/multitool/P = get_multitool(usr) + var/obj/item/P = get_multitool(usr) if("Link" in params) if(!canAccess(usr)) return - if(!istype(P)) + if(!P.tool_behaviour == TOOL_MULTITOOL) temp = "-% Unable to acquire buffer %-" return - + var/obj/machinery/telecomms/T = P.buffer if(!istype(T) || T == src) temp = "-% Unable to acquire buffer %-" return - + if(!(src in T.links)) LAZYADD(T.links, src) @@ -158,7 +158,7 @@ return P.buffer = src - temp = "% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-" + temp = "% Successfully stored [REF(P.buffer)] [P.buffer] in buffer %-" if("unlink") var/obj/machinery/telecomms/T = locate(params["value"]) @@ -167,7 +167,7 @@ if(!istype(T)) temp = "-% Unable to locate machine to unlink from, try again. %-" return - + temp = "-% Removed [REF(T)] [T.name] from linked entities. %-" if(T.links) //lazyrem makes blank list null, which is good but some might cause runtime ee's T.links.Remove(src) @@ -198,7 +198,7 @@ var/x = text2num(params["remove"]) temp = "-% Removed frequency filter [x] %-" freq_listening.Remove(x) - + /obj/machinery/telecomms/relay/ui_act(action, params) ..() switch(action) @@ -243,7 +243,11 @@ // Check if the user can use it. /obj/machinery/telecomms/proc/canInteract(mob/user) - if(hasSiliconAccessInArea(user) || istype(user.get_active_held_item(), /obj/item/multitool)) + var/get = user.get_active_held_item() + var/obj/item/I = get + if(I.tool_behaviour == TOOL_MULTITOOL) + return TRUE + if(hasSiliconAccessInArea(user)) return TRUE return FALSE // Check if the user is nearby and has a multitool. @@ -256,14 +260,16 @@ /obj/machinery/telecomms/proc/get_multitool(mob/user) if(!canInteract(user)) return null - var/obj/item/multitool/P = user.get_active_held_item() + var/obj/item/P = user.get_active_held_item() // Is the ref not a null? and is it the actual type? - if(istype(P)) + if(P.tool_behaviour == TOOL_MULTITOOL) return P else if(isAI(user)) var/mob/living/silicon/ai/U = user P = U.aiMulti else if(iscyborg(user) && in_range(user, src)) - if(istype(user.get_active_held_item(), /obj/item/multitool)) - P = user.get_active_held_item() + var/get = user.get_active_held_item() + var/obj/item/I = get + if(I.tool_behaviour == TOOL_MULTITOOL) + I = user.get_active_held_item() return P diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index fbb5505586..7cc421ef15 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -38,5 +38,5 @@ signal.broadcast() /obj/machinery/telecomms/allinone/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/multitool)) + if(P.tool_behaviour == TOOL_MULTITOOL) return attack_hand(user) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 16ae158ea7..daadbf4f72 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -164,16 +164,15 @@ return ..() /obj/machinery/teleport/station/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/multitool)) - var/obj/item/multitool/M = W + if(W.tool_behaviour == TOOL_MULTITOOL) if(panel_open) - M.buffer = src + W.buffer = src to_chat(user, "You download the data to the [W.name]'s buffer.") else - if(M.buffer && istype(M.buffer, /obj/machinery/teleport/station) && M.buffer != src) + if(W.buffer && istype(W.buffer, /obj/machinery/teleport/station) && W.buffer != src) if(linked_stations.len < efficiency) - linked_stations.Add(M.buffer) - M.buffer = null + linked_stations.Add(W.buffer) + W.buffer = null to_chat(user, "You upload the data from the [W.name]'s buffer.") else to_chat(user, "This station can't hold more information, try to use better parts.") @@ -185,7 +184,7 @@ else if(default_deconstruction_crowbar(W)) return - else if(istype(W, /obj/item/wirecutters)) + else if(W.tool_behaviour == TOOL_WIRECUTTER) if(panel_open) link_console_and_hub() to_chat(user, "You reconnect the station to nearby machinery.") diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index d5b27a9636..ed26ff6185 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -196,7 +196,7 @@ to_chat(user, "Invalid ID: Access denied.") else to_chat(user, "Maintenance protocols disabled by operator.") - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) if(state==1) state = 2 to_chat(user, "You undo the securing bolts.") @@ -204,7 +204,7 @@ state = 1 to_chat(user, "You tighten the securing bolts.") return - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) if(state==2) state = 3 to_chat(user, "You open the hatch to the power unit.") @@ -220,7 +220,7 @@ else to_chat(user, "You need two lengths of cable to fix this mech!") return - else if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM) + else if(W.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent != INTENT_HARM) if(internal_damage & MECHA_INT_TEMP_CONTROL) clearInternalDamage(MECHA_INT_TEMP_CONTROL) to_chat(user, "You repair the damaged temperature controller.") @@ -248,7 +248,7 @@ to_chat(user, "There's already a powercell installed.") return - else if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + else if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) user.DelayNextAction(CLICK_CD_MELEE) if(obj_integrity < max_integrity) if(W.use_tool(src, user, 0, volume=50, amount=1)) diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 9175489c89..36584b85ec 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -35,7 +35,7 @@ . += "The AI recovery beacon is active." /obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weldingtool)) + if(I.tool_behaviour == TOOL_WELDER) if(salvage_num <= 0 || !length(welder_salvage)) to_chat(user, "You don't see anything that can be cut with [I]!") return @@ -54,7 +54,7 @@ to_chat(user, "You fail to salvage anything valuable from [src]!") return - else if(istype(I, /obj/item/wirecutters)) + else if(I.tool_behaviour == TOOL_WIRECUTTER) if(salvage_num <= 0) to_chat(user, "You don't see anything that can be cut with [I]!") return @@ -67,7 +67,7 @@ else to_chat(user, "You fail to salvage anything valuable from [src]!") - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) if(crowbar_salvage && crowbar_salvage.len) var/obj/S = pick(crowbar_salvage) if(S) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 8e2f39d0df..846132a2fc 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -92,7 +92,7 @@ /obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wirecutters)) + if(I.tool_behaviour == TOOL_WIRECUTTER) I.play_tool_sound(src, 100) if(ruined) to_chat(user, "You remove the remnants of the poster.") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 608768a0c7..df64ca72a5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -112,6 +112,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb var/tool_behaviour = NONE var/toolspeed = 1 + //Special multitools + var/buffer = null + var/show_wires = FALSE + var/datum/integrated_io/selected_io = null //functional for integrated circuits. var/reach = 1 //In tiles, how far this weapon can reach; 1 for adjacent, which is default diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index e0ac4b43c6..019231b8b4 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -63,7 +63,7 @@ return update_icon() to_chat(user, "You add the cables to [src]. It now contains [loaded.amount].") - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(!loaded) return if(ghetto && prob(10)) //Is it a ghetto RCL? If so, give it a 10% chance to fall apart diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 9b658bc5f1..3f5296a1ef 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -63,7 +63,7 @@ to_chat(user, "Your name has been sent to your employers for approval.") // Autoapproves after a certain time response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE) - to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will autoapprove in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") + to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [html_encode(new_name)] (will autoapprove in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") /obj/item/station_charter/proc/reject_proposed(user) if(!user) diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index f6f8bb6998..01bed631fa 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -436,7 +436,7 @@ build_path = /obj/machinery/computer/rdconsole/core /obj/item/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(build_path == /obj/machinery/computer/rdconsole/core) name = "R&D Console - Robotics (Computer Board)" build_path = /obj/machinery/computer/rdconsole/robotics diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 5d8ee1229a..dcd0cda233 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -358,7 +358,7 @@ build_path = PATH_HEATER /obj/item/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/obj/item/circuitboard/new_type var/new_setting switch(build_path) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index ecc8f9187a..25a5bcc800 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -120,7 +120,7 @@ to_chat(user, "You install a cell in [src].") update_power() - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(cell) cell.update_icon() cell.forceMove(get_turf(src)) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index f5d3014d35..2413a3fb9a 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -166,7 +166,7 @@ to_chat(user, "[icon2html(src, user)] Target is free of radioactive contamination.") /obj/item/geiger_counter/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver) && (obj_flags & EMAGGED)) + if(I.tool_behaviour == TOOL_SCREWDRIVER && (obj_flags & EMAGGED)) if(scanning) to_chat(user, "Turn off [src] before you perform this action!") return 0 diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 6d10d31f5c..4d9c0a687c 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -50,7 +50,7 @@ else to_chat(user, "[src] already has a diode installed.") - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(diode) to_chat(user, "You remove the [diode.name] from \the [src].") diode.forceMove(drop_location()) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index c02eb4a051..5177224835 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -26,10 +26,9 @@ throw_range = 7 throw_speed = 3 custom_materials = list(/datum/material/iron=50, /datum/material/glass=20) - var/obj/machinery/buffer // simple machine buffer for device linkage + buffer = null // simple machine buffer for device linkage toolspeed = 1 usesound = 'sound/weapons/empty.ogg' - var/datum/integrated_io/selected_io = null //functional for integrated circuits. var/mode = 0 /obj/item/multitool/chaplain @@ -72,7 +71,7 @@ if(selected_io) icon_state += "_red" -/obj/item/multitool/proc/wire(var/datum/integrated_io/io, mob/user) +/obj/item/proc/wire(var/datum/integrated_io/io, mob/user) if(!io.holder.assembly) to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") return @@ -101,7 +100,7 @@ update_icon() -/obj/item/multitool/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user) +/obj/item/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user) if(!io1.linked.len || !io2.linked.len) to_chat(user, "There is nothing connected to the data channel.") return @@ -256,6 +255,7 @@ icon = 'icons/obj/abductor.dmi' icon_state = "multitool" toolspeed = 0.1 + show_wires = TRUE /obj/item/multitool/advanced name = "advanced multitool" @@ -263,6 +263,7 @@ icon = 'icons/obj/advancedtools.dmi' icon_state = "multitool" toolspeed = 0.2 + show_wires = TRUE /obj/item/multitool/advanced/brass name = "clockwork multitool" diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 86d7766fd5..838b5376c5 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -67,7 +67,7 @@ GLOBAL_LIST_EMPTY(power_sinks) set_light(0) /obj/item/powersink/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(mode == DISCONNECTED) var/turf/T = loc if(isturf(T) && !T.intact) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 015b8774ad..54556c20b6 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -278,7 +278,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( to_chat(user,"You upgrade [src].") bowmanize() qdel(W) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(keyslot || keyslot2) for(var/ch_name in channels) SSradio.remove_object(src, GLOB.radiochannels[ch_name]) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 8657684ff4..72552de98d 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -23,7 +23,7 @@ freerange = TRUE /obj/item/radio/intercom/ratvar/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "[src] is fastened to the wall with [is_servant_of_ratvar(user) ? "replicant alloy" : "some material you've never seen"], and can't be removed.") return //no unfastening! . = ..() @@ -57,7 +57,7 @@ . += "It's unscrewed from the wall, and can be detached." /obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(unfastened) user.visible_message("[user] starts tightening [src]'s screws...", "You start screwing in [src]...") if(I.use_tool(src, user, 30, volume=50)) @@ -69,7 +69,7 @@ user.visible_message("[user] loosens [src]'s screws!", "You unscrew [src], loosening it from the wall.") unfastened = TRUE return - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) if(!unfastened) to_chat(user, "You need to unscrew [src] from the wall first!") return diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 3435a0d0f0..e81110425c 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -333,7 +333,7 @@ /obj/item/radio/attackby(obj/item/W, mob/user, params) add_fingerprint(user) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) unscrewed = !unscrewed if(unscrewed) to_chat(user, "The radio can now be attached and modified!") @@ -384,7 +384,7 @@ /obj/item/radio/borg/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(keyslot) for(var/ch_name in channels) SSradio.remove_object(src, GLOB.radiochannels[ch_name]) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index cfe0ba705d..8b5e1edd91 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -893,7 +893,7 @@ GENETICS SCANNER throw_range = 7 custom_materials = list(/datum/material/iron=200) var/list/discovered = list() //hit a dna console to update the scanners database - var/list/buffer + buffer = list() var/ready = TRUE var/cooldown = 200 diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 687b3ed771..958877d42d 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -314,7 +314,7 @@ /obj/item/tape/attackby(obj/item/I, mob/user, params) - if(ruined && istype(I, /obj/item/screwdriver) || istype(I, /obj/item/pen)) + if(ruined && I.tool_behaviour == TOOL_SCREWDRIVER || istype(I, /obj/item/pen)) to_chat(user, "You start winding the tape back in...") if(I.use_tool(src, user, 120)) to_chat(user, "You wound the tape back in.") diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 6cf6a524de..3d62a98ddf 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -253,7 +253,7 @@ possible_colors = list("purple") /obj/item/dualsaber/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) if(!hacked) hacked = TRUE to_chat(user, "2XRNBW_ENGAGE") diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 515f5715dd..3d1ea9e7a2 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -79,7 +79,7 @@ flame_turf(turflist) /obj/item/flamethrower/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !status)//Taking this apart + if(W.tool_behaviour == TOOL_WRENCH && !status)//Taking this apart var/turf/T = get_turf(src) if(weldtool) weldtool.forceMove(T) @@ -94,7 +94,7 @@ qdel(src) return - else if(istype(W, /obj/item/screwdriver) && igniter && !lit) + else if(W.tool_behaviour == TOOL_SCREWDRIVER && igniter && !lit) status = !status to_chat(user, "[igniter] is now [status ? "secured" : "unsecured"]!") update_icon() diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index f06dd634c6..b67b7ae587 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -51,7 +51,7 @@ /obj/item/grenade/chem_grenade/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(stage == WIRED) if(beakers.len) stage_change(READY) @@ -105,11 +105,11 @@ to_chat(user, "You need one length of coil to wire the assembly!") return - else if(stage == READY && istype(I, /obj/item/wirecutters) && !active) + else if(stage == READY && I.tool_behaviour == TOOL_WIRECUTTER && !active) stage_change(WIRED) to_chat(user, "You unlock the [initial(name)] assembly.") - else if(stage == WIRED && istype(I, /obj/item/wrench)) + else if(stage == WIRED && I.tool_behaviour == TOOL_WRENCH) if(beakers.len) for(var/obj/O in beakers) O.forceMove(drop_location()) @@ -275,7 +275,7 @@ var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool. /obj/item/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/multitool)) + if(I.tool_behaviour == TOOL_MULTITOOL) switch(unit_spread) if(0 to 24) unit_spread += 5 diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index ee259c4050..23fe128fa8 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -47,7 +47,7 @@ playsound(src, 'sound/weapons/tap.ogg', 20, 1) update_icon() return - if(nadeassembly && istype(I, /obj/item/wirecutters)) + if(nadeassembly && I.tool_behaviour == TOOL_WIRECUTTER) I.play_tool_sound(src, 20) nadeassembly.forceMove(get_turf(src)) nadeassembly.master = null @@ -206,7 +206,7 @@ user.gib(1, 1) /obj/item/grenade/plastic/c4/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) open_panel = !open_panel to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") else if(is_wire_tool(I)) diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 8a596b2e6e..ddcd35f834 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -62,7 +62,7 @@ /obj/item/inducer/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) W.play_tool_sound(src) if(!opened) to_chat(user, "You unscrew the battery compartment.") diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 7d95b8e736..55546a7f9c 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -279,7 +279,7 @@ to_chat(user, "[src] is now [choice].") /obj/item/melee/transforming/energy/sword/saber/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) if(user.a_intent == INTENT_DISARM) if(!active) to_chat(user, "COLOR_SET") @@ -439,7 +439,9 @@ force_on = 15 //As strong a survival knife/bone dagger /obj/item/melee/transforming/energy/sword/cx/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/melee/transforming/energy/sword/cx)) + if(istype(W, /obj/item/melee/transforming/energy/sword/cx/traitor)) + return + else if(istype(W, /obj/item/melee/transforming/energy/sword/cx)) if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP)) to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!") return diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 1db5cdd526..e62208f848 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -84,7 +84,7 @@ updateTank(W, 0, user) else if(W.type == type) to_chat(user, "You're fairly certain that putting a pneumatic cannon inside another pneumatic cannon would cause a spacetime disruption.") - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) switch(pressureSetting) if(1) pressureSetting = 2 @@ -93,7 +93,7 @@ if(3) pressureSetting = 1 to_chat(user, "You tweak \the [src]'s pressure output to [pressureSetting].") - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(tank) updateTank(tank, 1, user) else if(loadedWeightClass >= maxWeightClass) diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index bd83404356..f95acd6018 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -36,7 +36,7 @@ to_chat(user, "\The [IT] is too small for \the [src].") return updateTank(W, 0, user) - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) switch(fisto_setting) if(1) fisto_setting = 2 @@ -46,7 +46,7 @@ fisto_setting = 1 W.play_tool_sound(src) to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting].") - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(tank) updateTank(tank, 1, user) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 86468af355..fbb3297f89 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -226,7 +226,7 @@ else to_chat(user, "You need to attach a flash to it first!") - else if (istype(W, /obj/item/multitool)) + else if(W.tool_behaviour == TOOL_MULTITOOL) if(check_completion()) Interact(user) else @@ -382,7 +382,7 @@ var/mob/living/living_user = usr var/obj/item/item_in_hand = living_user.get_active_held_item() - if(!istype(item_in_hand, /obj/item/multitool)) + if(!item_in_hand.tool_behaviour == TOOL_MULTITOOL) to_chat(living_user, "You need a multitool!") return diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 517350c916..c6763092ca 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ icon_state = "rods" /obj/item/stack/rods/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(get_amount() < 2) to_chat(user, "You need at least two rods to do this!") return diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index 85e08aa4d2..00b1f49d9f 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -20,7 +20,7 @@ state = 0 //fine /obj/item/stack/tile/light/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/crowbar)) + if(O.tool_behaviour == TOOL_CROWBAR) new/obj/item/stack/sheet/metal(user.loc) amount-- new/obj/item/stack/light_w(user.loc) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 0f338383c0..8b272f98b4 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -40,7 +40,7 @@ /obj/item/stack/tile/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(get_amount() < 4) to_chat(user, "You need at least four tiles to do this!") return diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 4e6a0b3463..2988b54e8f 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -36,14 +36,14 @@ /obj/item/storage/secure/attackby(obj/item/W, mob/user, params) if(SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) - if (istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if (W.use_tool(src, user, 20)) open =! open to_chat(user, "You [open ? "open" : "close"] the service panel.") return - if (istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) to_chat(user, "[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be pulsed.") - if ((istype(W, /obj/item/multitool)) && (!l_hacking)) + if((W.tool_behaviour == TOOL_MULTITOOL) && (!l_hacking)) if(open == 1) to_chat(user, "Now attempting to reset internal memory, please hold.") l_hacking = 1 diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 1de77bd8b9..cc01e6aaee 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -119,7 +119,7 @@ to_chat(user, "You install a cell in [src].") update_icon() - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(cell) cell.update_icon() cell.forceMove(get_turf(src)) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 6b92b885bb..98889485b6 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -103,7 +103,7 @@ return (FIRELOSS) /obj/item/weldingtool/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) flamethrower_screwdriver(I, user) else if(istype(I, /obj/item/stack/rods)) flamethrower_rods(I, user) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 97fced4eb7..454016d9e7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -277,7 +277,7 @@ newSaber.hacked = TRUE qdel(W) qdel(src) - else if(istype(W, /obj/item/multitool)) + else if(W.tool_behaviour == TOOL_MULTITOOL) if(!hacked) hacked = TRUE to_chat(user, "RNBW_ENGAGE") diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 1090bae9f8..3549ab85f8 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -61,7 +61,7 @@ return TRUE /obj/structure/AIcore/latejoin_inactive/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/multitool)) + if(P.tool_behaviour == TOOL_MULTITOOL) active = !active to_chat(user, "You [active? "activate" : "deactivate"] [src]'s transmitters.") return @@ -76,10 +76,10 @@ return ..() /obj/structure/AIcore/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/wrench)) + if(P.tool_behaviour == TOOL_WRENCH) return default_unfasten_wrench(user, P, 20) if(!anchored) - if(istype(P, /obj/item/weldingtool) && can_deconstruct) + if(P.tool_behaviour == TOOL_WELDER && can_deconstruct) if(state != EMPTY_CORE) to_chat(user, "The core must be empty to deconstruct it!") return @@ -105,13 +105,13 @@ circuit = P return if(CIRCUIT_CORE) - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) P.play_tool_sound(src) to_chat(user, "You screw the circuit board into place.") state = SCREWED_CORE update_icon() return - if(istype(P, /obj/item/crowbar)) + if(P.tool_behaviour == TOOL_CROWBAR) P.play_tool_sound(src) to_chat(user, "You remove the circuit board.") state = EMPTY_CORE @@ -120,7 +120,7 @@ circuit = null return if(SCREWED_CORE) - if(istype(P, /obj/item/screwdriver) && circuit) + if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) P.play_tool_sound(src) to_chat(user, "You unfasten the circuit board.") state = CIRCUIT_CORE @@ -139,7 +139,7 @@ to_chat(user, "You need five lengths of cable to wire the AI core!") return if(CABLED_CORE) - if(istype(P, /obj/item/wirecutters)) + if(P.tool_behaviour == TOOL_WIRECUTTER) if(brain) to_chat(user, "Get that [brain.name] out of there first!") else @@ -201,7 +201,7 @@ update_icon() return - if(istype(P, /obj/item/crowbar) && brain) + if(P.tool_behaviour == TOOL_CROWBAR && brain) P.play_tool_sound(src) to_chat(user, "You remove the brain.") brain.forceMove(loc) @@ -210,7 +210,7 @@ return if(GLASS_CORE) - if(istype(P, /obj/item/crowbar)) + if(P.tool_behaviour == TOOL_CROWBAR) P.play_tool_sound(src) to_chat(user, "You remove the glass panel.") state = CABLED_CORE @@ -218,7 +218,7 @@ new /obj/item/stack/sheet/rglass(loc, 2) return - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) P.play_tool_sound(src) to_chat(user, "You connect the monitor.") if(brain) @@ -247,7 +247,7 @@ P.transfer_ai("INACTIVE", "AICARD", src, user) return - if(istype(P, /obj/item/screwdriver)) + if(P.tool_behaviour == TOOL_SCREWDRIVER) P.play_tool_sound(src) to_chat(user, "You disconnect the monitor.") state = GLASS_CORE diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index acddf27b6f..a96d39316e 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -62,7 +62,7 @@ pick_sign(user) /obj/structure/sign/barsign/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(!allowed(user)) to_chat(user, "Access denied.") return diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 2a703ad675..c86c62094b 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -37,7 +37,7 @@ return attack_hand(user) /obj/structure/bed/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) + if(W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1)) W.play_tool_sound(src) deconstruct(TRUE) else if(istype(W, /obj/item/bedsheet)) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 39bef1a9c0..76ab086eb2 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -77,7 +77,7 @@ qdel(src) /obj/structure/chair/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) + if(W.tool_behaviour == TOOL_WRENCH && !(flags_1 & NODECONSTRUCT_1)) W.play_tool_sound(src) deconstruct() else if(istype(W, /obj/item/assembly/shock_kit)) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 279f581b4d..2172040022 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -45,7 +45,7 @@ LINEN BINS return /obj/item/bedsheet/attackby(obj/item/I, mob/user, params) - if(!(flags_1 & HOLOGRAM_1) && (istype(I, /obj/item/wirecutters) || I.get_sharpness())) + if(!(flags_1 & HOLOGRAM_1) && (I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())) var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) transfer_fingerprints_to(C) C.add_fingerprint(user) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 52082637a3..be7a457c7d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -25,7 +25,7 @@ var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container var/mob_storage_capacity = 3 // how many human sized mob/living can fit together inside a closet. var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients. - var/cutting_tool = /obj/item/weldingtool + var/cutting_tool = TOOL_WELDER var/open_sound = 'sound/machines/click.ogg' var/close_sound = 'sound/machines/click.ogg' var/material_drop = /obj/item/stack/sheet/metal @@ -302,7 +302,9 @@ update_icon() return TRUE -/obj/structure/closet/proc/handle_lock_removal(mob/user, obj/item/screwdriver/S) +/obj/structure/closet/proc/handle_lock_removal(mob/user, obj/item/S) + if(!S.tool_behaviour == TOOL_SCREWDRIVER) + return if(lock_in_use) to_chat(user, "Wait for work on [src] to be done first!") return @@ -357,7 +359,7 @@ if(opened) if(istype(W, cutting_tool)) var/welder = FALSE - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin [welder ? "slicing" : "deconstructing"] \the [src] apart...") @@ -377,9 +379,9 @@ return TRUE else if(istype(W, /obj/item/electronics/airlock)) handle_lock_addition(user, W) - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) handle_lock_removal(user, W) - else if(istype(W, /obj/item/weldingtool) && can_weld_shut) + else if(W.tool_behaviour == TOOL_WELDER && can_weld_shut) if(!W.tool_start_check(user, amount=0)) return @@ -396,7 +398,7 @@ "You [welded ? "weld" : "unwelded"] \the [src] with \the [W].", "You hear welding.") update_icon() - else if(istype(W, /obj/item/wrench) && anchorable) + else if(W.tool_behaviour == TOOL_WRENCH && anchorable) if(isinspace() && !anchored) return setAnchored(!anchored) diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 2df57e1d68..09441a577e 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -32,7 +32,7 @@ else name = "body bag" return - else if(istype(I, /obj/item/wirecutters)) + else if(I.tool_behaviour == TOOL_WIRECUTTER) to_chat(user, "You cut the tag off [src].") name = "body bag" tagged = 0 diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 500b8d6a49..1d6826b548 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -8,7 +8,7 @@ max_integrity = 70 integrity_failure = 0 can_weld_shut = 0 - cutting_tool = /obj/item/wirecutters + cutting_tool = TOOL_WIRECUTTER open_sound = "rustle" material_drop = /obj/item/stack/sheet/cardboard delivery_icon = "deliverybox" @@ -74,7 +74,7 @@ mob_storage_capacity = 5 resistance_flags = NONE move_speed_multiplier = 2 - cutting_tool = /obj/item/weldingtool + cutting_tool = TOOL_WELDER open_sound = 'sound/machines/click.ogg' material_drop = /obj/item/stack/sheet/plasteel #undef SNAKE_SPAM_TICKS diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 0da502283b..b33962d8de 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -5,7 +5,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood - cutting_tool = /obj/item/screwdriver + cutting_tool = TOOL_SCREWDRIVER /obj/structure/closet/acloset name = "strange closet" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 484d152a3f..36b770cd25 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -5,7 +5,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood - cutting_tool = /obj/item/screwdriver + cutting_tool = TOOL_SCREWDRIVER /obj/structure/closet/secure_closet/bar/PopulateContents() ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index d127a87b20..52abb00cc7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -26,7 +26,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood - cutting_tool = /obj/item/screwdriver + cutting_tool = TOOL_SCREWDRIVER /obj/structure/closet/secure_closet/personal/cabinet/PopulateContents() new /obj/item/storage/backpack/satchel/leather/withwallet( src ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 2c31303f79..1d23903d03 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -155,7 +155,7 @@ resistance_flags = FLAMMABLE max_integrity = 70 material_drop = /obj/item/stack/sheet/mineral/wood - cutting_tool = /obj/item/screwdriver + cutting_tool = TOOL_SCREWDRIVER /obj/structure/closet/secure_closet/detective/PopulateContents() ..() diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 3cee96e435..c376e63880 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -16,7 +16,7 @@ to_chat(user, "You need a crowbar to pry this open!") /obj/structure/closet/crate/large/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) if(manifest) tear_manifest(user) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 5fdb22010e..c32bf81ecf 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -108,7 +108,7 @@ toggle_lock(user) else to_chat(user, "Access denied.") - else if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP && !broken) + else if(W.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP && !broken) if(obj_integrity < max_integrity) if(!W.tool_start_check(user, amount=5)) return @@ -121,7 +121,7 @@ else to_chat(user, "[src] is already in good condition!") return - else if(!alert && istype(W, /obj/item/crowbar) && openable) //Only applies to the lab cage and player made display cases + else if(!alert && W.tool_behaviour == TOOL_CROWBAR && openable) //Only applies to the lab cage and player made display cases if(broken) if(showpiece) to_chat(user, "Remove the displayed object first.") @@ -187,7 +187,7 @@ /obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) //The player can only deconstruct the wooden frame + if(I.tool_behaviour == TOOL_WRENCH) //The player can only deconstruct the wooden frame to_chat(user, "You start disassembling [src]...") I.play_tool_sound(src) if(I.use_tool(src, user, 30)) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index ac6ea27821..aba3b743bb 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -58,7 +58,7 @@ return created_name = t - else if(istype(W, /obj/item/weldingtool) && (mineral || glass || !anchored )) + else if(W.tool_behaviour == TOOL_WELDER && (mineral || glass || !anchored )) if(!W.tool_start_check(user, amount=0)) return @@ -88,8 +88,8 @@ to_chat(user, "You disassemble the airlock assembly.") deconstruct(TRUE) - else if(istype(W, /obj/item/wrench)) - if(!anchored ) + else if(W.tool_behaviour == TOOL_WRENCH) + if(!anchored) var/door_check = 1 for(var/obj/machinery/door/D in loc) if(!D.sub_door) @@ -134,7 +134,7 @@ to_chat(user, "You wire the airlock assembly.") name = "wired airlock assembly" - else if(istype(W, /obj/item/wirecutters) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) + else if(W.tool_behaviour == TOOL_WIRECUTTER && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) user.visible_message("[user] cuts the wires from the airlock assembly.", \ "You start to cut the wires from the airlock assembly...") @@ -162,7 +162,7 @@ electronics = W - else if(istype(W, /obj/item/crowbar) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) + else if(W.tool_behaviour == TOOL_CROWBAR && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) user.visible_message("[user] removes the electronics from the airlock assembly.", \ "You start to remove electronics from the airlock assembly...") @@ -226,7 +226,7 @@ else to_chat(user, "You cannot add [G] to [src]!") - else if(istype(W, /obj/item/screwdriver) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) + else if(W.tool_behaviour == TOOL_SCREWDRIVER && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) user.visible_message("[user] finishes the airlock.", \ "You start finishing the airlock...") diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 7fdec9b3d9..9790a0e661 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -7,7 +7,7 @@ anchored = TRUE /obj/structure/dresser/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 6f1d56c4a5..c5802b5086 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -11,7 +11,7 @@ add_overlay(mutable_appearance('icons/obj/chairs.dmi', "echair_over", MOB_LAYER + 1)) /obj/structure/chair/e_chair/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) var/obj/structure/chair/C = new /obj/structure/chair(loc) W.play_tool_sound(src) C.setDir(dir) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 84926ccfb0..467dd47c50 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -42,7 +42,7 @@ update_icon() /obj/structure/extinguisher_cabinet/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench) && !stored_extinguisher) + if(I.tool_behaviour == TOOL_WRENCH && !stored_extinguisher) to_chat(user, "You start unsecuring [name]...") I.play_tool_sound(src) if(I.use_tool(src, user, 60)) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index b654f4f5c0..5b3cd3139c 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -93,7 +93,7 @@ to_chat(user, "You must wait until the door has stopped moving!") return - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(density) var/turf/T = get_turf(src) if(T.density) @@ -107,7 +107,7 @@ else to_chat(user, "You can't reach, close it first!") - else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + else if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(W.use_tool(src, user, 0, volume=50)) dismantle(user, TRUE) else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) @@ -158,7 +158,7 @@ /obj/structure/falsewall/reinforced/attackby(obj/item/tool, mob/user) ..() - if(istype(tool, /obj/item/wirecutters)) + if(tool.tool_behaviour == TOOL_WIRECUTTER) dismantle(user, TRUE, tool) /* diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index f90161f587..eaf5398605 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -57,7 +57,7 @@ hole_size = LARGE_HOLE /obj/structure/fence/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) if(!cuttable) to_chat(user, "This section of the fence can't be cut.") return diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 412730910f..a247908b3b 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -24,9 +24,9 @@ return ..() /obj/structure/fireaxecabinet/attackby(obj/item/I, mob/user, params) - if(iscyborg(user) || istype(I, /obj/item/multitool)) + if(iscyborg(user) || I.tool_behaviour == TOOL_MULTITOOL) toggle_lock(user) - else if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP && !broken) + else if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP && !broken) if(obj_integrity < max_integrity) if(!I.tool_start_check(user, amount=2)) return diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index bd7ddb36d5..477bc19a22 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -11,7 +11,7 @@ var/deconstructible = TRUE /obj/structure/fluff/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/wrench) && deconstructible) + if(I.tool_behaviour == TOOL_WRENCH && deconstructible) user.visible_message("[user] starts disassembling [src]...", "You start disassembling [src]...") I.play_tool_sound(src) if(I.use_tool(src, user, 50)) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 87cfbb56e0..50240aabb3 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -361,7 +361,7 @@ new /obj/item/stack/sheet/runed_metal(drop_location(), 1) qdel(src) - else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + else if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount=0)) return @@ -436,7 +436,7 @@ /obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) - if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount = 0)) return to_chat(user, "You start slicing apart [src]...") diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 7853b9619c..2ac85f79dc 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -142,11 +142,11 @@ /obj/structure/grille/attackby(obj/item/W, mob/user, params) user.DelayNextAction(CLICK_CD_MELEE) add_fingerprint(user) - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) if(!shock(user, 100)) W.play_tool_sound(src, 100) deconstruct() - else if((istype(W, /obj/item/screwdriver)) && (isturf(loc) || anchored)) + else if((W.tool_behaviour == TOOL_SCREWDRIVER) && (isturf(loc) || anchored)) if(!shock(user, 90)) W.play_tool_sound(src, 100) setAnchored(!anchored) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 0c99188c49..bcb9422708 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -82,7 +82,7 @@ to_chat(user, "[src] can't hold any more signs!") else if(mybag) mybag.attackby(I, user) - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) user.visible_message("[user] begins to empty the contents of [src].", "You begin to empty the contents of [src]...") if(I.use_tool(src, user, 30)) to_chat(usr, "You empty the contents of [src]'s bucket onto the floor.") diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index a23dd3a21e..a37797045f 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -22,7 +22,7 @@ var/obj/F = new /obj/structure/kitchenspike(src.loc) transfer_fingerprints_to(F) qdel(src) - else if(istype(I, /obj/item/weldingtool)) + else if(I.tool_behaviour == TOOL_WELDER) if(!I.tool_start_check(user, amount=0)) return to_chat(user, "You begin cutting \the [src] apart...") diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 17c90e1444..13f86d13bd 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -39,7 +39,7 @@ /obj/structure/lattice/attackby(obj/item/C, mob/user, params) if(resistance_flags & INDESTRUCTIBLE) return - if(istype(C, /obj/item/wirecutters)) + if(C.tool_behaviour == TOOL_WIRECUTTER) to_chat(user, "Slicing [name] joints ...") deconstruct() else diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 5cc2315352..8174f6a82e 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -78,13 +78,13 @@ if(admin) return - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) can_rotate = !can_rotate to_chat(user, "You [can_rotate ? "unlock" : "lock"] [src]'s rotation.") W.play_tool_sound(src) return - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) if(anchored) to_chat(user, "Unweld [src] from the floor first!") return @@ -95,7 +95,7 @@ if(buildstackamount) new buildstacktype(drop_location(), buildstackamount) qdel(src) - else if(istype(W, /obj/item/weldingtool)) + else if(W.tool_behaviour == TOOL_WELDER) if(obj_integrity < max_integrity) if(!W.tool_start_check(user, amount=0)) return diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index b0427274a4..3b7933ab87 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -109,7 +109,7 @@ //However if a player wants to move an existing showcase or remove one, this is for that. /obj/structure/showcase/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/screwdriver) && !anchored) + if(W.tool_behaviour == TOOL_SCREWDRIVER && !anchored) if(deconstruction_state == SHOWCASE_SCREWDRIVERED) to_chat(user, "You screw the screws back into the showcase.") W.play_tool_sound(src, 100) @@ -119,7 +119,7 @@ W.play_tool_sound(src, 100) deconstruction_state = SHOWCASE_SCREWDRIVERED - if(istype(W, /obj/item/crowbar) && deconstruction_state == SHOWCASE_SCREWDRIVERED) + if(W.tool_behaviour == TOOL_CROWBAR && deconstruction_state == SHOWCASE_SCREWDRIVERED) if(W.use_tool(src, user, 20, volume=100)) to_chat(user, "You start to crowbar the showcase apart...") new /obj/item/stack/sheet/metal(drop_location(), 4) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index aa31fe9542..8b82cdba5e 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -26,7 +26,7 @@ playsound(loc, 'sound/items/welder.ogg', 80, 1) /obj/structure/sign/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench) && buildable_sign) + if(I.tool_behaviour == TOOL_WRENCH && buildable_sign) user.visible_message("[user] starts removing [src]...", \ "You start unfastening [src].") I.play_tool_sound(src) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index f8b54d04b6..2924545cc1 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -22,7 +22,7 @@ if(!(flags_1 & NODECONSTRUCT_1)) if(default_unfasten_wrench(user, W)) return - if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount=0)) return FALSE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 1ef0726e63..edb69236c6 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -170,13 +170,13 @@ /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) - if(istype(I, /obj/item/screwdriver) && deconstruction_ready) + if(I.tool_behaviour == TOOL_SCREWDRIVER && deconstruction_ready) to_chat(user, "You start disassembling [src]...") if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE) return - if(istype(I, /obj/item/wrench) && deconstruction_ready) + if(I.tool_behaviour == TOOL_WRENCH && deconstruction_ready) to_chat(user, "You start deconstructing [src]...") if(I.use_tool(src, user, 40, volume=50)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) @@ -538,7 +538,7 @@ return "The top cover is firmly welded on." /obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return @@ -689,7 +689,7 @@ step(O, get_dir(O, src)) /obj/structure/rack/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) + if(W.tool_behaviour == TOOL_WRENCH && !(flags_1 & NODECONSTRUCT_1)) W.play_tool_sound(src) deconstruct(TRUE) return @@ -747,7 +747,7 @@ var/building = FALSE /obj/item/rack_parts/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) new /obj/item/stack/sheet/metal(user.loc) qdel(src) else diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 2a441ff0f2..6b5e24089d 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -50,7 +50,7 @@ oxygentanks++ else full = TRUE - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, I, time = 20) return else if(user.a_intent != INTENT_HARM) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 3a5eb135f4..a5b6b0c9e1 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -94,7 +94,7 @@ /obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) for(var/obj/structure/transit_tube_pod/P in loc) P.deconstruct(FALSE, user) else diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 56608789f7..7e3684ad32 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -37,7 +37,7 @@ deconstruct(FALSE) /obj/structure/transit_tube/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) if(tube_construction) for(var/obj/structure/transit_tube_pod/pod in src.loc) to_chat(user, "Remove the pod first!") @@ -50,7 +50,7 @@ transfer_fingerprints_to(R) R.add_fingerprint(user) qdel(src) - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) for(var/obj/structure/transit_tube_pod/pod in src.loc) pod.attackby(W, user) else diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 21709edf73..89b03a8d78 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -26,7 +26,7 @@ icon_state = "pod" /obj/structure/transit_tube_pod/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) if(!moving) I.play_tool_sound(src) if(contents.len) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 33ecd7e29a..dba8d5de45 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -98,7 +98,7 @@ /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) add_fingerprint(user) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...") playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(I.use_tool(src, user, 30)) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 4544cab3da..ef1ca6720a 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -87,7 +87,7 @@ add_fingerprint(user) switch(state) if("01") - if(istype(W, /obj/item/weldingtool) && !anchored) + if(W.tool_behaviour == TOOL_WELDER && !anchored) if(!W.tool_start_check(user, amount=0)) return @@ -105,7 +105,7 @@ return //Wrenching an unsecure assembly anchors it in place. Step 4 complete - if(istype(W, /obj/item/wrench) && !anchored) + if(W.tool_behaviour == TOOL_WRENCH && !anchored) for(var/obj/machinery/door/window/WD in loc) if(WD.dir == dir) to_chat(user, "There is already a windoor in that location!") @@ -128,7 +128,7 @@ name = "anchored windoor assembly" //Unwrenching an unsecure assembly un-anchors it. Step 4 undone - else if(istype(W, /obj/item/wrench) && anchored) + else if(W.tool_behaviour == TOOL_WRENCH && anchored) user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...") @@ -184,7 +184,7 @@ if("02") //Removing wire from the assembly. Step 5 undone. - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...") if(W.use_tool(src, user, 40, volume=100)) @@ -218,7 +218,7 @@ W.forceMove(drop_location()) //Screwdriver to remove airlock electronics. Step 6 undone. - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) if(!electronics) return @@ -245,7 +245,7 @@ //Crowbar to complete the assembly, Step 7 complete. - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) if(!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 74f006296f..d0b21016d4 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -191,7 +191,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) add_fingerprint(user) - if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) + if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP) if(obj_integrity < max_integrity) if(!I.tool_start_check(user, amount=0)) return @@ -224,7 +224,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) qdel(K) if(!(flags_1&NODECONSTRUCT_1)) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) I.play_tool_sound(src, 75) if(reinf) if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME) @@ -245,7 +245,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) return - else if (istype(I, /obj/item/crowbar) && reinf && (state == WINDOW_OUT_OF_FRAME || state == WINDOW_IN_FRAME)) + else if(I.tool_behaviour == TOOL_CROWBAR && reinf && (state == WINDOW_OUT_OF_FRAME || state == WINDOW_IN_FRAME)) to_chat(user, "You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...") I.play_tool_sound(src, 75) if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) @@ -253,7 +253,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) to_chat(user, "You pry the window [state == WINDOW_IN_FRAME ? "into":"out of"] the frame.") return - else if(istype(I, /obj/item/wrench) && !anchored) + else if(I.tool_behaviour == TOOL_WRENCH && !anchored) I.play_tool_sound(src, 75) to_chat(user, " You begin to disassemble [src]...") if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored))) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 6a4ddea63b..d13ae862ca 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -171,7 +171,7 @@ /turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) return - var/obj/item/crowbar/CB = user.is_holding_item_of_type(/obj/item/crowbar) + var/obj/item/CB = user.is_holding_tool_quality(TOOL_CROWBAR) if(!CB) return var/turf/open/floor/plating/P = pry_tile(CB, user, TRUE) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 3cf6cc7511..3960f9a034 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -32,9 +32,9 @@ /turf/open/floor/wood/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) return - var/obj/item/tool = user.is_holding_item_of_type(/obj/item/screwdriver) + var/obj/item/tool = user.is_holding_tool_quality(TOOL_SCREWDRIVER) if(!tool) - tool = user.is_holding_item_of_type(/obj/item/crowbar) + tool = user.is_holding_tool_quality(TOOL_CROWBAR) if(!tool) return var/turf/open/floor/plating/P = pry_tile(tool, user, TRUE) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 5e60f65ccc..03d5cecc26 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -65,7 +65,7 @@ //DECONSTRUCTION switch(d_state) if(INTACT) - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) W.play_tool_sound(src, 100) d_state = SUPPORT_LINES update_icon() @@ -73,7 +73,7 @@ return 1 if(SUPPORT_LINES) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You begin unsecuring the support lines...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_LINES) @@ -83,7 +83,7 @@ to_chat(user, "You unsecure the support lines.") return 1 - else if(istype(W, /obj/item/wirecutters)) + else if(W.tool_behaviour == TOOL_WIRECUTTER) W.play_tool_sound(src, 100) d_state = INTACT update_icon() @@ -91,7 +91,7 @@ return 1 if(COVER) - if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin slicing through the metal cover...") @@ -103,7 +103,7 @@ to_chat(user, "You press firmly on the cover, dislodging it.") return 1 - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You begin securing the support lines...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) @@ -114,7 +114,7 @@ return 1 if(CUT_COVER) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You struggle to pry off the cover...") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) @@ -124,7 +124,7 @@ to_chat(user, "You pry off the cover.") return 1 - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin welding the metal cover back to the frame...") @@ -137,7 +137,7 @@ return 1 if(ANCHOR_BOLTS) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame...") if(W.use_tool(src, user, 40, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != ANCHOR_BOLTS) @@ -147,7 +147,7 @@ to_chat(user, "You remove the bolts anchoring the support rods.") return 1 - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You start to pry the cover back into place...") if(W.use_tool(src, user, 20, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != ANCHOR_BOLTS) @@ -158,7 +158,7 @@ return 1 if(SUPPORT_RODS) - if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin slicing through the support rods...") @@ -170,7 +170,7 @@ to_chat(user, "You slice through the support rods.") return 1 - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start tightening the bolts which secure the support rods to their frame...") W.play_tool_sound(src, 100) if(W.use_tool(src, user, 40)) @@ -182,7 +182,7 @@ return 1 if(SHEATH) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) to_chat(user, "You struggle to pry off the outer sheath...") if(W.use_tool(src, user, 100, volume=100)) if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) @@ -191,7 +191,7 @@ dismantle_wall() return 1 - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return to_chat(user, "You begin welding the support rods back together...") diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 402ab36947..79ca5add10 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -199,7 +199,7 @@ if((user.a_intent != INTENT_HELP) || !LAZYLEN(dent_decals)) return FALSE - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return FALSE @@ -233,7 +233,7 @@ return FALSE /turf/closed/wall/proc/try_decon(obj/item/I, mob/user, turf/T) - if(istype(I, /obj/item/weldingtool) || istype(I, /obj/item/gun/energy/plasmacutter)) + if(I.tool_behaviour == TOOL_WELDER || istype(I, /obj/item/gun/energy/plasmacutter)) if(!I.tool_start_check(user, amount=0)) return FALSE diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index bd4b4cf0c7..2efc04d5cc 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -257,9 +257,8 @@ for(var/mob/M in GLOB.player_list) if(M.ckey == banckey) - playermob = M - break - + if(!playermob || M.client) // prioritise mobs with a client to stop the 'oops the dead body with no client got forwarded' + playermob = M banreason = "(MANUAL BAN) "+banreason diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm index 2aed251189..69410027a4 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm @@ -43,14 +43,13 @@ // This exists so Hardened/Silver Stake can't have a welding torch used on them. /obj/item/stake/basic/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) //if (amWelded) // to_chat(user, "This stake has already been treated with fire.") // return //amWelded = TRUE // Weld it - var/obj/item/weldingtool/WT = W - if(WT.use(0))//remove_fuel(0,user)) + if(W.use(0))//remove_fuel(0,user)) user.visible_message("[user.name] scorched the pointy end of [src] with the welding tool.", \ "You scorch the pointy end of [src] with the welding tool.", \ "You hear welding.") diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm index a555677719..881da8f282 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm @@ -164,11 +164,11 @@ if(istype(W, cutting_tool)) to_chat(user, "This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].") return - else if(anchored && istype(W, /obj/item/wrench)) // Can't unanchor unless owner. + else if(anchored && W.tool_behaviour == TOOL_WRENCH) // Can't unanchor unless owner. to_chat(user, "The coffin won't come unanchored from the floor.") return - if(locked && istype(W, /obj/item/crowbar)) + if(locked && W.tool_behaviour == TOOL_CROWBAR) var/pry_time = pryLidTimer * W.toolspeed // Pry speed must be affected by the speed of the tool. user.visible_message("[user] tries to pry the lid off of [src] with [W].", \ "You begin prying the lid off of [src] with [W]. This should take about [DisplayTimeText(pry_time)].") diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index 2464015b6b..380e93f102 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -95,7 +95,7 @@ return ..() /obj/structure/destructible/clockwork/attackby(obj/item/I, mob/user, params) - if(is_servant_of_ratvar(user) && istype(I, /obj/item/wrench) && unanchored_icon) + if(is_servant_of_ratvar(user) && I.tool_behaviour == TOOL_WRENCH && unanchored_icon) if(default_unfasten_wrench(user, I, 50) == SUCCESSFUL_UNFASTEN) update_anchored(user) return 1 diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index d823f19d4a..7e4822b622 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -23,10 +23,10 @@ return /obj/structure/destructible/clockwork/wall_gear/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, I, 10) return 1 - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) if(anchored) to_chat(user, "[src] needs to be unsecured to disassemble it!") else diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index bf6599d782..7d669e5c41 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -104,7 +104,7 @@ switch(deconstruction_state) if(NUKESTATE_INTACT) - if(istype(I, /obj/item/screwdriver/nuke)) + if(istype(I, /obj/item/screwdriver/nuke)) //Special case, cannot replace with tool_behavior to_chat(user, "You start removing [src]'s front panel's screws...") if(I.use_tool(src, user, 60, volume=100)) deconstruction_state = NUKESTATE_UNSCREWED diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index d1bdac7e05..f283e33899 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -43,7 +43,7 @@ to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.") /obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM) + if(W.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent != INTENT_HARM) user.visible_message("[usr.name] deactivates [src].", "After some fiddling, you find a way to disable [src]'s power source.", "You hear clicking.") diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index 99683f1688..2f7f701012 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -9,6 +9,7 @@ var/hidden_underwear = FALSE var/hidden_undershirt = FALSE var/hidden_socks = FALSE + var/arousal_rate = 1 //Mob procs /mob/living/carbon/human/verb/underwear_toggle() @@ -20,29 +21,34 @@ return if(confirm == "Top") hidden_undershirt = !hidden_undershirt + log_message("[hidden_undershirt ? "removed" : "put on" ] [p_their()] undershirt.", LOG_EMOTE) if(confirm == "Bottom") hidden_underwear = !hidden_underwear + log_message("[hidden_underwear ? "removed" : "put on"] [p_their()] underwear.", LOG_EMOTE) if(confirm == "Socks") hidden_socks = !hidden_socks + log_message("[hidden_socks ? "removed" : "put on"] [p_their()] socks.", LOG_EMOTE) if(confirm == "All") var/on_off = (hidden_undershirt || hidden_underwear || hidden_socks) ? FALSE : TRUE hidden_undershirt = on_off hidden_underwear = on_off hidden_socks = on_off + log_message("[on_off ? "removed" : "put on"] all [p_their()] undergarments.", LOG_EMOTE) update_body(TRUE) -/mob/living/carbon/human/proc/adjust_arousal(strength,aphro = FALSE,maso = FALSE) // returns all genitals that were adjust +/mob/living/carbon/human/proc/adjust_arousal(strength, cause = "manual toggle", aphro = FALSE,maso = FALSE) // returns all genitals that were adjust var/list/obj/item/organ/genital/genit_list = list() if(!client?.prefs.arousable || (aphro && (client?.prefs.cit_toggles & NO_APHRO)) || (maso && !HAS_TRAIT(src, TRAIT_MASO))) return // no adjusting made here + var/enabling = strength > 0 for(var/obj/item/organ/genital/G in internal_organs) - if(G.genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(strength*G.sensitivity)) - G.set_aroused_state(strength > 0) + if(G.genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(abs(strength)*G.sensitivity * arousal_rate)) + G.set_aroused_state(enabling,cause) G.update_appearance() if(G.aroused_state) genit_list += G @@ -64,6 +70,7 @@ return var/turfing = isturf(target) G.generate_fluid(R) + log_message("Climaxed using [G] with [target]", LOG_EMOTE) if(spill && R.total_volume >= 5) R.reaction(turfing ? target : target.loc, TOUCH, 1, 0) if(!turfing) @@ -189,7 +196,7 @@ return TRUE //Here's the main proc itself -/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints +/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE,cause = "") //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints if(mb_cd_timer > world.time) if(!forced_climax) //Don't spam the message to the victim if forced to come too fast to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") @@ -202,6 +209,7 @@ to_chat(src, "You can't do that while dead!") return if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks + log_message("was forced to climax by [cause]",LOG_EMOTE) for(var/obj/item/organ/genital/G in internal_organs) if(!CHECK_BITFIELD(G.genital_flags, CAN_CLIMAX_WITH)) //Skip things like wombs and testicles continue @@ -272,7 +280,6 @@ var/obj/item/reagent_containers/fluid_container = pick_climax_container() if(fluid_container && available_rosie_palms(TRUE, /obj/item/reagent_containers)) mob_fill_container(picked_organ, fluid_container) - mb_cd_timer = world.time + mb_cd_length /mob/living/carbon/human/verb/climax_verb() diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 67de745d22..723049a784 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -27,11 +27,12 @@ if(do_update) update() -/obj/item/organ/genital/proc/set_aroused_state(new_state) +/obj/item/organ/genital/proc/set_aroused_state(new_state,cause = "manual toggle") if(!(genital_flags & GENITAL_CAN_AROUSE)) return FALSE if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state)) aroused_state = new_state + owner.log_message("[src]'s arousal was [new_state ? "enabled" : "disabled"] due to [cause]", LOG_EMOTE) return aroused_state /obj/item/organ/genital/proc/update() @@ -76,11 +77,19 @@ if(GEN_VISIBLE_ALWAYS) genital_flags |= GENITAL_THROUGH_CLOTHES if(owner) + owner.log_message("Exposed their [src]",LOG_EMOTE) owner.exposed_genitals += src + if(GEN_VISIBLE_NO_CLOTHES) + if(owner) + owner.log_message("Hid their [src] under clothes only",LOG_EMOTE) if(GEN_VISIBLE_NO_UNDIES) genital_flags |= GENITAL_UNDIES_HIDDEN + if(owner) + owner.log_message("Hid their [src] under underwear",LOG_EMOTE) if(GEN_VISIBLE_NEVER) genital_flags |= GENITAL_HIDDEN + if(owner) + owner.log_message("Hid their [src] completely",LOG_EMOTE) if(update && owner && ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index ccb8a3d81c..c63797282d 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -762,14 +762,14 @@ /obj/machinery/airalarm/attackby(obj/item/W, mob/user, params) switch(buildstage) if(2) - if(istype(W, /obj/item/wirecutters) && panel_open && wires.is_all_cut()) + if(W.tool_behaviour == TOOL_WIRECUTTER && panel_open && wires.is_all_cut()) W.play_tool_sound(src) to_chat(user, "You cut the final wires.") new /obj/item/stack/cable_coil(loc, 5) buildstage = 1 update_icon() return - else if(istype(W, /obj/item/screwdriver)) // Opening that Air Alarm up. + else if(W.tool_behaviour == TOOL_SCREWDRIVER) // Opening that Air Alarm up. W.play_tool_sound(src) panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].") @@ -781,7 +781,7 @@ wires.interact(user) return if(1) - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) user.visible_message("[user.name] removes the electronics from [src.name].",\ "You start prying out the circuit...") W.play_tool_sound(src) @@ -832,7 +832,7 @@ update_icon() return - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) to_chat(user, "You detach \the [src] from the wall.") W.play_tool_sound(src) new /obj/item/wallframe/airalarm( user.loc ) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c08eaf2e8a..cf2cdd80a7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -326,7 +326,7 @@ || default_deconstruction_crowbar(I)) update_icon() return - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You can't access the maintenance panel while the pod is " \ + (on ? "active" : (occupant ? "full" : "open")) + ".") return @@ -454,8 +454,10 @@ return G.return_temperature() return ..() -/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/wrench/W) +/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/W) . = ..() + if(!W.tool_behaviour == TOOL_WRENCH) + return if(.) SetInitDirections() var/obj/machinery/atmospherics/node = nodes[1] diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index fa57e683c4..166727f6ae 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -115,7 +115,7 @@ to_chat(user, "[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [T]" : "You insert [T] into [src]"].") replace_tank(user, FALSE, T) update_icon() - else if(istype(W, /obj/item/wrench)) + else if(W.tool_behaviour == TOOL_WRENCH) if(!(stat & BROKEN)) if(connected_port) disconnect() diff --git a/code/modules/awaymissions/mission_code/jungleresort.dm b/code/modules/awaymissions/mission_code/jungleresort.dm index 6c78a81da2..6c82b2c0c4 100644 --- a/code/modules/awaymissions/mission_code/jungleresort.dm +++ b/code/modules/awaymissions/mission_code/jungleresort.dm @@ -18,6 +18,66 @@ hitsound = 'sound/weapons/whip.ogg' icon_state = "whip" +/obj/item/clothing/suit/hooded/wintercoat/captain/jungle + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + +/obj/item/clothing/head/rice_hat/cursed // this was a stupid idea lmao + name = "cursed rice hat" + desc = "Welcome to the rice fields, motherfucker. This particular one seems to give you second thoughts about wearing it." + +/obj/item/clothing/head/rice_hat/cursed/equipped(mob/M, slot) + . = ..() + if (slot == SLOT_HEAD) + RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + else + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/head/rice_hat/cursed/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT) + +/obj/item/clothing/head/rice_hat/cursed/proc/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] != "*") + var/list/temp_message = splittext(message, " ") + var/list/pick_list = list() + for(var/i in 1 to temp_message.len) + pick_list += i + for(var/i in 1 to abs(temp_message.len/3)) + var/H = pick(pick_list) + if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) + continue + temp_message[H] = ninjaspeak(temp_message[H]) + pick_list -= H + message = temp_message.Join(" ") + + //The Alternate speech mod is now the main one. + message = replacetext(message, "l", "r") + message = replacetext(message, "rr", "ru") + message = replacetext(message, "v", "b") + message = replacetext(message, "f", "hu") + message = replacetext(message, "'t", "") + message = replacetext(message, "t ", "to ") + message = replacetext(message, " I ", " ai ") + message = replacetext(message, "th", "z") + message = replacetext(message, "is", "izu") + message = replacetext(message, "ziz", "zis") + message = replacetext(message, "se", "su") + message = replacetext(message, "br", "bur") + message = replacetext(message, "ry", "ri") + message = replacetext(message, "you", "yuu") + message = replacetext(message, "ck", "cku") + message = replacetext(message, "eu", "uu") + message = replacetext(message, "ow", "au") + message = replacetext(message, "are", "aa") + message = replacetext(message, "ay", "ayu") + message = replacetext(message, "ea", "ii") + message = replacetext(message, "ch", "chi") + message = replacetext(message, "than", "sen") + message = replacetext(message, ".", "") + message = lowertext(message) + speech_args[SPEECH_MESSAGE] = message + //turfs /turf/open/water/jungle @@ -41,4 +101,9 @@ rare_pet_monkey_names = list("Sun Mukong", "Monkey Kong") /mob/living/simple_animal/hostile/jungle/leaper/boss - health = 450 + health = 550 + name = "Froggerosa" + +/mob/living/simple_animal/hostile/gorilla/jungle + tame = 1 + faction = list("neutral") diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index db37fc5939..aaebe9a24a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -984,6 +984,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Breast Enlargement: [(cit_toggles & BREAST_ENLARGEMENT) ? "Allowed" : "Disallowed"]
" dat += "Penis Enlargement: [(cit_toggles & PENIS_ENLARGEMENT) ? "Allowed" : "Disallowed"]
" dat += "Hypno: [(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"]
" + dat += "Aphrodisiacs: [(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"]
" dat += "Ass Slapping: [(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]
" dat += "Automatic Wagging: [(cit_toggles & NO_AUTO_WAG) ? "Disabled" : "Enabled"]
" dat += "" diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 11de0124cb..c79dee926c 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -311,7 +311,7 @@ to_chat(user, "Install a new flash in [src]!") /obj/item/clothing/glasses/sunglasses/stunglasses/attackby(obj/item/W,mob/user) - if (istype(W,/obj/item/screwdriver)) + if (W.tool_behaviour == TOOL_SCREWDRIVER) if (installed) installed.forceMove(get_turf(src)) to_chat(user, "You remove [installed] from [src].") diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 56d6e7d38f..836b845faa 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -99,7 +99,7 @@ name = "fingerless insulated gloves" /obj/item/clothing/gloves/color/yellow/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wirecutters)) + if(I.tool_behaviour == TOOL_WIRECUTTER) if(can_be_cut && icon_state == initial(icon_state))//only if not dyed to_chat(user, "You snip the fingertips off of [src].") I.play_tool_sound(src) @@ -108,7 +108,7 @@ ..() /obj/item/clothing/gloves/color/fyellow/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wirecutters)) + if(I.tool_behaviour == TOOL_WIRECUTTER) if(can_be_cut && icon_state == initial(icon_state))//only if not dyed to_chat(user, "You snip the fingertips off of [src].") I.play_tool_sound(src) @@ -130,7 +130,7 @@ strip_mod = 1.2 /obj/item/clothing/gloves/color/black/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wirecutters)) + if(I.tool_behaviour == TOOL_WIRECUTTER) if(can_be_cut && icon_state == initial(icon_state))//only if not dyed to_chat(user, "You snip the fingertips off of [src].") I.play_tool_sound(src) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 662318fb82..de68883a7b 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -313,7 +313,7 @@ A.Grant(user) return - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(F) for(var/obj/item/flashlight/seclite/S in src) to_chat(user, "You unscrew the seclite from [src].") diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 40ad6dddd1..4af9e7387d 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -122,7 +122,7 @@ jetpack = I to_chat(user, "You successfully install the jetpack into [src].") return - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) if(!jetpack) to_chat(user, "[src] has no jetpack installed.") return diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index f4fd844e8a..b56f689979 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -107,7 +107,7 @@ name = "canvas cloak" desc = "A rugged cloak made of canvas." icon_state = "cancloak" - item_state = "cancloak" + item_state = "cloak" var/list/poly_colors = list("#585858", "#373737", "#BEBEBE") /obj/item/clothing/neck/cancloak/polychromic/ComponentInitialize() diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 07741208c3..8580b153b2 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -496,7 +496,7 @@ /obj/item/clothing/suit/jacket/urbanjacket/polychromic/ComponentInitialize() . = ..() - AddElement(/datum/element/polychromic, list("#26321D", "#CBBDAF", "#292929"), 3) + AddElement(/datum/element/polychromic, list("#3D4C31", "#CBBDAF", "#3B3B3B"), 3) /obj/item/clothing/suit/jacket/letterman name = "letterman jacket" diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 8bada6da77..5a5df41163 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -267,8 +267,8 @@ var/sending_state = "lpad-beam" var/cargo_hold_id -/obj/machinery/piratepad/multitool_act(mob/living/user, obj/item/multitool/I) - if (istype(I)) +/obj/machinery/piratepad/multitool_act(mob/living/user, obj/item/I) + if(I.tool_behaviour == TOOL_MULTITOOL) to_chat(user, "You register [src] in [I]s buffer.") I.buffer = src return TRUE @@ -291,8 +291,8 @@ ..() return INITIALIZE_HINT_LATELOAD -/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I) - if (istype(I) && istype(I.buffer,/obj/machinery/piratepad)) +/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/I) + if(I.tool_behaviour == TOOL_MULTITOOL && istype(I.buffer,/obj/machinery/piratepad)) to_chat(user, "You link [src] with [I.buffer] in [I] buffer.") pad = I.buffer return TRUE diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 7fc8a4f1d5..140004723b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -276,7 +276,9 @@ /obj/machinery/smartfridge/drying_rack/exchange_parts() /obj/machinery/smartfridge/drying_rack/spawn_frame() -/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/crowbar/C, ignore_panel = 1) +/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/C, ignore_panel = 1) + if(!C.tool_behaviour == TOOL_CROWBAR) + return ..() /obj/machinery/smartfridge/drying_rack/ui_data(mob/user) diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index 4212a2e296..11bd330112 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -72,16 +72,14 @@ if((last_poof+3 MINUTES) < world.realtime) poof() -/mob/living/simple_animal/jacq/Destroy() //I.e invincible +/mob/living/simple_animal/jacq/death() //What is alive may never die visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25) - var/mob/living/simple_animal/jacq/Jacq = new src.type(loc) - Jacq.progression = progression - if(ckey) //transfer over any ghost posessions - Jacq.key = key - ..() + fully_heal(FALSE) + health = 25 + poof() -/mob/living/simple_animal/jacq/death() //What is alive may never die +/mob/living/simple_animal/jacq/gib() visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25) fully_heal(FALSE) diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index a058601c39..2857099d0f 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -155,7 +155,7 @@ to_chat(user, "There's no room for any more frames in the apiary!") return - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) if(default_unfasten_wrench(user, I, time = 20)) return diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 6cb578dfb1..ac27b4a30e 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -452,7 +452,7 @@ for(var/obj/item/integrated_circuit/input/S in assembly_components) S.attackby_react(I,user,user.a_intent) return ..() - else if(istype(I, /obj/item/multitool) || istype(I, /obj/item/integrated_electronics/wirer) || istype(I, /obj/item/integrated_electronics/debugger)) + else if(I.tool_behaviour == TOOL_MULTITOOL || istype(I, /obj/item/integrated_electronics/wirer) || istype(I, /obj/item/integrated_electronics/debugger)) if(opened) interact(user) return TRUE diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 92d2aa270f..756706dcdf 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -252,7 +252,7 @@ a creative player the means to solve many problems. Circuits are held inside an var/update = TRUE var/update_to_assembly = FALSE - var/obj/held_item = usr.get_active_held_item() + var/obj/item/held_item = usr.get_active_held_item() if(href_list["rename"]) rename_component(usr) @@ -267,7 +267,7 @@ a creative player the means to solve many problems. Circuits are held inside an if(href_list["link"]) linked = locate(href_list["link"]) in pin.linked - if(istype(held_item, /obj/item/integrated_electronics) || istype(held_item, /obj/item/multitool)) + if(istype(held_item, /obj/item/integrated_electronics) || held_item.tool_behaviour == TOOL_MULTITOOL) pin.handle_wire(linked, held_item, href_list["act"], usr) else to_chat(usr, "You can't do a whole lot without the proper tools.") diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm index c1bbb900fa..e08d77007d 100644 --- a/code/modules/integrated_electronics/core/pins.dm +++ b/code/modules/integrated_electronics/core/pins.dm @@ -105,15 +105,14 @@ D [1]/ || push_data() /datum/integrated_io/proc/handle_wire(datum/integrated_io/linked_pin, obj/item/tool, action, mob/living/user) - if(istype(tool, /obj/item/multitool)) - var/obj/item/multitool/multitool = tool + if(tool.tool_behaviour == TOOL_MULTITOOL) switch(action) if("wire") - multitool.wire(src, user) + tool.wire(src, user) return TRUE if("unwire") if(linked_pin) - multitool.unwire(src, linked_pin, user) + tool.unwire(src, linked_pin, user) return TRUE if("data") ask_for_pin_data(user) diff --git a/code/modules/integrated_electronics/core/wirer.dm b/code/modules/integrated_electronics/core/wirer.dm index 95f46564cb..73dfa4e44a 100644 --- a/code/modules/integrated_electronics/core/wirer.dm +++ b/code/modules/integrated_electronics/core/wirer.dm @@ -12,13 +12,12 @@ icon_state = "wirer-wire" flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_SMALL - var/datum/integrated_io/selected_io = null var/mode = WIRE /obj/item/integrated_electronics/wirer/update_icon_state() icon_state = "wirer-[mode]" -/obj/item/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user) +/obj/item/integrated_electronics/wirer/wire(var/datum/integrated_io/io, mob/user) if(!io.holder.assembly) to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") return diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index a4d88158e2..ef0ee2ee77 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -53,12 +53,12 @@ /obj/structure/bookcase/attackby(obj/item/I, mob/user, params) switch(state) if(0) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") anchored = TRUE state = 1 - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You pry the frame apart.") deconstruct(TRUE) @@ -71,7 +71,7 @@ to_chat(user, "You add a shelf.") state = 2 icon_state = "book-0" - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) I.play_tool_sound(src, 100) to_chat(user, "You unwrench the frame.") anchored = FALSE @@ -100,7 +100,7 @@ return else name = "bookcase ([sanitize(newname)])" - else if(istype(I, /obj/item/crowbar)) + else if(I.tool_behaviour == TOOL_CROWBAR) if(contents.len) to_chat(user, "You need to remove the books first!") else @@ -302,7 +302,7 @@ scanner.computer.inventory.Add(src) to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'") - else if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/wirecutters)) + else if(istype(I, /obj/item/kitchen/knife) || I.tool_behaviour == TOOL_WIRECUTTER) to_chat(user, "You begin to carve out [title]...") if(do_after(user, 30, target = src)) to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.") diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 8c9b0b53e1..e97060b45d 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -190,7 +190,7 @@ /obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user) if(locked) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) to_chat(user, "DECA-CODE LOCK REPORT:") if(attempts == 1) to_chat(user, "* Anti-Tamper Bomb will activate on next failed access attempt.") diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index a6f456ce6f..859ea58d26 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -65,7 +65,7 @@ . += "It has \a [T] attached, which causes [T.effect_desc()]." /obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) if(LAZYLEN(trophies)) to_chat(user, "You remove [src]'s trophies.") I.play_tool_sound(src) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index d6c4dfae34..6cba540ca0 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -188,8 +188,10 @@ return ..() -/obj/machinery/mineral/ore_redemption/multitool_act(mob/living/user, obj/item/multitool/I) - if (panel_open) +/obj/machinery/mineral/ore_redemption/multitool_act(mob/living/user, obj/item/I) + if(!I.tool_behaviour == TOOL_MULTITOOL) + return + if(panel_open) input_dir = turn(input_dir, -90) output_dir = turn(output_dir, -90) to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].") diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 09246abc46..b0055204f9 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -170,8 +170,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs) updateUsrDialog() return TRUE -/obj/machinery/ore_silo/multitool_act(mob/living/user, obj/item/multitool/I) - if (istype(I)) +/obj/machinery/ore_silo/multitool_act(mob/living/user, obj/item/I) + if(I.tool_behaviour == TOOL_MULTITOOL) to_chat(user, "You log [src] in the multitool's buffer.") I.buffer = src return TRUE diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index ddc366736e..40f4db3660 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -102,8 +102,8 @@ if(istype(AM, /obj/item/stack/sheet) && AM.loc == get_step(src, input_dir)) process_sheet(AM) -/obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/multitool/M) - if(istype(M)) +/obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/M) + if(M.tool_behaviour == TOOL_MULTITOOL) if(istype(M.buffer, /obj/machinery/mineral/stacking_unit_console)) CONSOLE = M.buffer CONSOLE.machine = src diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 627d79d6ba..8037a22a52 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -105,7 +105,7 @@ to_chat(user, "You instruct [src] to drop any collected ore.") DropOre() return - if(istype(I, /obj/item/crowbar) || istype(I, /obj/item/borg/upgrade/modkit)) + if(I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/borg/upgrade/modkit)) I.melee_attack_chain(user, stored_gun, params) return ..() diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 26a3ca1b70..a3399bf46c 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -251,7 +251,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ GibtoniteReaction(user) return if(primed) - if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) || istype(I, /obj/item/multitool)) + if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) || I.tool_behaviour == TOOL_MULTITOOL) primed = FALSE if(det_timer) deltimer(det_timer) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index c3cdb3354f..432052d322 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1547,9 +1547,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!user.UseStaminaBuffer(3, warn = TRUE)) return FALSE user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP) - target.adjust_arousal(20,maso = TRUE) + target.adjust_arousal(20,"masochism", maso = TRUE) if (ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna() && prob(10)) - target.mob_climax(forced_climax=TRUE) + target.mob_climax(forced_climax=TRUE, cause = "masochism") if (!HAS_TRAIT(target, TRAIT_PERMABONER)) stop_wagging_tail(target) playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1) @@ -1931,7 +1931,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) H.update_damage_overlays() if(HAS_TRAIT(H, TRAIT_MASO) && prob(damage_amount)) - H.mob_climax(forced_climax=TRUE) + H.mob_climax(forced_climax=TRUE, cause = "masochism") else//no bodypart, we deal damage with a more general method. H.adjustBruteLoss(damage_amount) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 3079f65471..38f93f9ffc 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -307,11 +307,13 @@ return FALSE return ISINRANGE(T1.x, T0.x - interaction_range, T0.x + interaction_range) && ISINRANGE(T1.y, T0.y - interaction_range, T0.y + interaction_range) -/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/weldingtool/W, mob/user) - if (!getBruteLoss()) +/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/W, mob/user) + if(!W.tool_behaviour == TOOL_WELDER) + return + if(!getBruteLoss()) to_chat(user, "[src] is already in good condition!") return - if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. + if(!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. return user.DelayNextAction(CLICK_CD_MELEE) if(src == user) @@ -351,7 +353,7 @@ to_chat(user, "The wires seem fine, there's no need to fix them.") /mob/living/silicon/robot/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src)) + if(W.tool_behaviour == TOOL_WELDER && (user.a_intent != INTENT_HARM || user == src)) INVOKE_ASYNC(src, .proc/attempt_welder_repair, W, user) return @@ -359,7 +361,7 @@ INVOKE_ASYNC(src, .proc/attempt_cable_repair, W, user) return - else if(istype(W, /obj/item/crowbar)) // crowbar means open or close the cover + else if(W.tool_behaviour == TOOL_CROWBAR) // crowbar means open or close the cover if(opened) to_chat(user, "You close the cover.") opened = 0 @@ -391,12 +393,12 @@ else to_chat(user, "You can't reach the wiring!") - else if(istype(W, /obj/item/screwdriver) && opened && !cell) // haxing + else if(W.tool_behaviour == TOOL_SCREWDRIVER && opened && !cell) // haxing wiresexposed = !wiresexposed to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") update_icons() - else if(istype(W, /obj/item/screwdriver) && opened && cell) // radio + else if((W.tool_behaviour == TOOL_SCREWDRIVER) && opened && cell) // radio if(shell) to_chat(user, "You cannot seem to open the radio compartment") //Prevent AI radio key theft else if(radio) @@ -405,7 +407,7 @@ to_chat(user, "Unable to locate a radio!") update_icons() - else if(istype(W, /obj/item/wrench) && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module. + else if(W.tool_behaviour == TOOL_WRENCH && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module. if(!locked_down) to_chat(user, "[src]'s bolts spark! Maybe you should lock them down first!") spark_system.start() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index d3838a580f..a7fd9c5ac0 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -306,7 +306,7 @@ show_controls(user) /mob/living/simple_animal/bot/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) if(!locked) open = !open to_chat(user, "The maintenance panel is now [open ? "opened" : "closed"].") @@ -335,7 +335,7 @@ user.visible_message("[user] uses [W] to pull [paicard] out of [bot_name]!","You pull [paicard] out of [bot_name] with [W].") ejectpai(user) else - if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) if(health >= maxHealth) to_chat(user, "[src] does not need a repair!") return diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 5102c02ecf..fff1782154 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -100,7 +100,7 @@ build_step++ if(ASSEMBLY_FOURTH_STEP) - if(istype(W, /obj/item/weldingtool)) + if(W.tool_behaviour == TOOL_WELDER) if(W.use_tool(src, user, 0, volume=40) && build_step == ASSEMBLY_FOURTH_STEP) name = "shielded frame assembly" to_chat(user, "You weld the vest to [src].") @@ -180,7 +180,7 @@ build_step++ if(8) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, "You start attaching the gun to the frame...") if(W.use_tool(src, user, 40, volume=100) && build_step == 8) name = "armed [name]" @@ -386,13 +386,13 @@ var/atom/Tsec = drop_location() switch(build_step) if(ASSEMBLY_FIRST_STEP) - if(istype(I, /obj/item/weldingtool)) + if(I.tool_behaviour == TOOL_WELDER) if(I.use_tool(src, user, 0, volume=40)) add_overlay("hs_hole") to_chat(user, "You weld a hole in [src]!") build_step++ - else if(istype(I, /obj/item/screwdriver)) //deconstruct + else if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct new /obj/item/assembly/signaler(Tsec) new /obj/item/clothing/head/helmet/sec(Tsec) to_chat(user, "You disconnect the signaler from the helmet.") @@ -408,7 +408,7 @@ qdel(I) build_step++ - else if(istype(I, /obj/item/weldingtool)) //deconstruct + else if(I.tool_behaviour == TOOL_WELDER) //deconstruct if(I.use_tool(src, user, 0, volume=40)) cut_overlay("hs_hole") to_chat(user, "You weld the hole in [src] shut!") @@ -425,7 +425,7 @@ qdel(I) build_step++ - else if(istype(I, /obj/item/screwdriver)) //deconstruct + else if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct cut_overlay("hs_eye") new /obj/item/assembly/prox_sensor(Tsec) to_chat(user, "You detach the proximity sensor from [src].") @@ -442,7 +442,7 @@ S.robot_arm = robot_arm qdel(I) qdel(src) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) to_chat(user, "You adjust [src]'s arm slots to mount extra weapons") build_step ++ return @@ -466,7 +466,7 @@ qdel(I) qdel(src) - else if(istype(I, /obj/item/screwdriver)) //deconstruct + else if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct cut_overlay("hs_arm") var/obj/item/bodypart/dropped_arm = new robot_arm(Tsec) robot_arm = null @@ -499,7 +499,7 @@ S.robot_arm = robot_arm qdel(I) qdel(src) - else if(istype(I, /obj/item/screwdriver)) //deconstruct + else if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct build_step-- icon_state = initial(icon_state) to_chat(user, "You unbolt [src]'s energy swords") diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 8375d621d4..604a72b43e 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -184,9 +184,9 @@ Auto Patrol[]"}, /mob/living/simple_animal/bot/ed209/attackby(obj/item/W, mob/user, params) ..() - if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. + if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. return - if(!istype(W, /obj/item/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. + if(!W.tool_behaviour == TOOL_SCREWDRIVER && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. if(W.force && W.damtype != STAMINA)//If force is non-zero and damage type isn't stamina. retaliate(user) if(lasercolor)//To make up for the fact that lasertag bots don't hunt diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 0ee600ed1d..9625d2b084 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -120,9 +120,9 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, /mob/living/simple_animal/bot/honkbot/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) return - if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Check for welding tool to fix #2432. + if(!W.tool_behaviour == TOOL_SCREWDRIVER && (W.force) && (!target) && (W.damtype != STAMINA) ) // Check for welding tool to fix #2432. retaliate(user) addtimer(CALLBACK(src, .proc/react_buzz), 5) ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index cf9698655b..8bb30a11a6 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -299,12 +299,12 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/attackby(obj/item/W, mob/user, params) ..() - if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. + if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. return if(istype(W, /obj/item/clothing/head)) attempt_place_on_head(user, W) return - if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. + if(!W.tool_behaviour == TOOL_SCREWDRIVER && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. retaliate(user) if(special_retaliate_after_attack(user)) return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 22dbdd3db7..12b6447a02 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -160,7 +160,7 @@ ..() /mob/living/simple_animal/drone/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/screwdriver) && stat == DEAD) + if(I.tool_behaviour == TOOL_SCREWDRIVER && stat == DEAD) try_reactivate(user) else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 11d7884999..d9ea6f4a8a 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -55,7 +55,7 @@ /mob/living/simple_animal/drone/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/screwdriver) && stat != DEAD) + if(I.tool_behaviour == TOOL_SCREWDRIVER && stat != DEAD) if(health < maxHealth) to_chat(user, "You start to tighten loose screws on [src]...") if(I.use_tool(src, user, 80)) @@ -66,7 +66,7 @@ else to_chat(user, "[src]'s screws can't get any tighter!") return //This used to not exist and drones who repaired themselves also stabbed the shit out of themselves. - else if(istype(I, /obj/item/wrench) && user != src) //They aren't required to be hacked, because laws can change in other ways (i.e. admins) + else if(I.tool_behaviour == TOOL_WRENCH && user != src) //They aren't required to be hacked, because laws can change in other ways (i.e. admins) user.visible_message("[user] starts resetting [src]...", \ "You press down on [src]'s factory reset control...") if(I.use_tool(src, user, 50, volume=50)) diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm index 7e515bf0f5..c81a8f5d1a 100644 --- a/code/modules/newscaster/newscaster_machine.dm +++ b/code/modules/newscaster/newscaster_machine.dm @@ -552,7 +552,7 @@ GLOBAL_LIST_EMPTY(allCasters) updateUsrDialog() /obj/machinery/newscaster/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/wrench)) + if(I.tool_behaviour == TOOL_WRENCH) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") I.play_tool_sound(src) if(I.use_tool(src, user, 60)) @@ -566,7 +566,7 @@ GLOBAL_LIST_EMPTY(allCasters) to_chat(user, "You [anchored ? "un" : ""]secure [name].") new /obj/item/wallframe/newscaster(loc) qdel(src) - else if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + else if(I.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) if(stat & BROKEN) if(!I.tool_start_check(user, amount=0)) return diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index 25b5cfb51b..9f4a864e9c 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -22,10 +22,11 @@ var/list/obj/item/ticket_machine_ticket/tickets = list() /obj/machinery/ticket_machine/multitool_act(mob/living/user, obj/item/I) + if(!I.tool_behaviour == TOOL_MULTITOOL) + return if(!multitool_check_buffer(user, I)) //make sure it has a data buffer return - var/obj/item/multitool/M = I - M.buffer = src + I.buffer = src to_chat(user, "You store linkage information in [I]'s buffer.") return TRUE @@ -77,11 +78,10 @@ /obj/machinery/button/ticket_machine/multitool_act(mob/living/user, obj/item/I) . = ..() if(I.tool_behaviour == TOOL_MULTITOOL) - var/obj/item/multitool/M = I - if(M.buffer && !istype(M.buffer, /obj/machinery/ticket_machine)) + if(I.buffer && !istype(I.buffer, /obj/machinery/ticket_machine)) return var/obj/item/assembly/control/ticket_machine/controller = device - controller.linked = M.buffer + controller.linked = I.buffer id = null controller.id = null to_chat(user, "You've linked [src] to [controller.linked].") diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index d306c46815..4000bf843c 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -115,14 +115,14 @@ return ..() /obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, params) - if(can_decon && (istype(I, /obj/item/screwdriver) || istype(I, /obj/item/wrench))) + if(can_decon && (I.tool_behaviour == TOOL_SCREWDRIVER || I.tool_behaviour == TOOL_WRENCH)) to_chat(user, "You start unsecuring [name]...") if(I.use_tool(src, user, 30, volume=50)) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You unsecure [name].") deconstruct() - else if(istype(I, /obj/item/wirecutters) && framed) + else if(I.tool_behaviour == TOOL_WIRECUTTER && framed) framed.forceMove(drop_location()) framed = null user.visible_message("[user] cuts away [framed] from [src]!") diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index cac2b1f2b1..17c5bc0e4c 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -146,7 +146,7 @@ //No other icons for it atm /obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) if(!anchored) W.play_tool_sound(src, 75) user.visible_message("[user.name] secures the [src.name] to the floor.", \ diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 766c4d4392..100998d7c6 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -247,7 +247,7 @@ custom_materials = list(/datum/material/iron=100) /obj/item/am_shielding_container/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/multitool) && istype(src.loc, /turf)) + if(I.tool_behaviour == TOOL_MULTITOOL && istype(src.loc, /turf)) new/obj/machinery/am_shielding(src.loc) qdel(src) else diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 59f869627c..1058277cdf 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -155,7 +155,7 @@ By design, d1 is the smallest direction and d2 is the highest var/turf/T = get_turf(src) if(T.intact) return - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) if (shock(user, 50)) return user.visible_message("[user] cuts the cable.", "You cut the cable.") @@ -177,7 +177,7 @@ By design, d1 is the smallest direction and d2 is the highest R.loaded.cable_join(src, user) R.is_empty(user) - else if(istype(W, /obj/item/multitool)) + else if(W.tool_behaviour == TOOL_MULTITOOL) if(powernet && (powernet.avail > 0)) // is it powered? to_chat(user, "[DisplayPower(powernet.avail)] in power network.") else diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index 466030b83c..274d4cd7af 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -9,7 +9,7 @@ var/state = FLOODLIGHT_NEEDS_WRENCHING /obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/wrench) && (state == FLOODLIGHT_NEEDS_WRENCHING)) + if(O.tool_behaviour == TOOL_WRENCH && (state == FLOODLIGHT_NEEDS_WRENCHING)) to_chat(user, "You secure [src].") anchored = TRUE state = FLOODLIGHT_NEEDS_WIRES @@ -26,7 +26,7 @@ to_chat(user, "You put lights in [src].") new /obj/machinery/power/floodlight(src.loc) qdel(src) - else if(istype(O, /obj/item/screwdriver) && (state == FLOODLIGHT_NEEDS_SECURING)) + else if(O.tool_behaviour == TOOL_SCREWDRIVER && (state == FLOODLIGHT_NEEDS_SECURING)) to_chat(user, "You fasten the wiring and electronics in [src].") name = "secured [name]" desc = "A bare metal frame that looks like a floodlight. Requires light tubes." @@ -82,7 +82,7 @@ to_chat(user, "You set [src] to [setting_text].") /obj/machinery/power/floodlight/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/wrench)) + if(O.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, O, time = 20) change_setting(1) if(anchored) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 4c76c4b5b1..00487ee607 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -107,7 +107,7 @@ return switch(stage) if(1) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) to_chat(usr, "You begin deconstructing [src]...") if (W.use_tool(src, user, 30, volume=50)) new /obj/item/stack/sheet/metal(drop_location(), sheets_refunded) @@ -127,11 +127,11 @@ to_chat(user, "You need one length of cable to wire [src]!") return if(2) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) to_chat(usr, "You have to remove the wires first!") return - if(istype(W, /obj/item/wirecutters)) + if(W.tool_behaviour == TOOL_WIRECUTTER) stage = 1 icon_state = "[fixture_type]-construct-stage1" new /obj/item/stack/cable_coil(drop_location(), 1, "red") @@ -140,7 +140,7 @@ W.play_tool_sound(src, 100) return - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) user.visible_message("[user.name] closes [src]'s casing.", \ "You close [src]'s casing.", "You hear screwing.") W.play_tool_sound(src, 75) @@ -462,7 +462,7 @@ // attempt to stick weapon into light socket else if(status == LIGHT_EMPTY) - if(istype(W, /obj/item/screwdriver)) //If it's a screwdriver open it. + if(W.tool_behaviour == TOOL_SCREWDRIVER) //If it acts like a screwdriver, open it. W.play_tool_sound(src, 75) user.visible_message("[user.name] opens [src]'s casing.", \ "You open [src]'s casing.", "You hear a noise.") @@ -621,7 +621,7 @@ else to_chat(H, "You can't receive charge from the [fitting]!") return - + if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.max_heat_protection_temperature) diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 98729de3cc..f5e3bbc141 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -18,7 +18,7 @@ var/creation_type = /obj/singularity /obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) default_unfasten_wrench(user, W, 0) else return ..() diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 528a3abb8b..60c97eda76 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -63,7 +63,7 @@ switch(construction_state) if(PA_CONSTRUCTION_UNSECURED) - if(istype(W, /obj/item/wrench) && !isinspace()) + if(W.tool_behaviour == TOOL_WRENCH && !isinspace()) W.play_tool_sound(src, 75) anchored = TRUE user.visible_message("[user.name] secures the [name] to the floor.", \ @@ -71,7 +71,7 @@ construction_state = PA_CONSTRUCTION_UNWIRED did_something = TRUE if(PA_CONSTRUCTION_UNWIRED) - if(istype(W, /obj/item/wrench)) + if(W.tool_behaviour == TOOL_WRENCH) W.play_tool_sound(src, 75) anchored = FALSE user.visible_message("[user.name] detaches the [name] from the floor.", \ @@ -85,18 +85,18 @@ construction_state = PA_CONSTRUCTION_PANEL_OPEN did_something = TRUE if(PA_CONSTRUCTION_PANEL_OPEN) - if(istype(W, /obj/item/wirecutters))//TODO:Shock user if its on? + if(W.tool_behaviour == TOOL_WIRECUTTER)//TODO:Shock user if its on? user.visible_message("[user.name] removes some wires from the [name].", \ "You remove some wires.") construction_state = PA_CONSTRUCTION_UNWIRED did_something = TRUE - else if(istype(W, /obj/item/screwdriver)) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) user.visible_message("[user.name] closes the [name]'s access panel.", \ "You close the access panel.") construction_state = PA_CONSTRUCTION_COMPLETE did_something = TRUE if(PA_CONSTRUCTION_COMPLETE) - if(istype(W, /obj/item/screwdriver)) + if(W.tool_behaviour == TOOL_SCREWDRIVER) user.visible_message("[user.name] opens the [name]'s access panel.", \ "You open the access panel.") construction_state = PA_CONSTRUCTION_PANEL_OPEN diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index f0f99ab7da..32e6186133 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -162,8 +162,8 @@ return TRUE -/obj/machinery/power/smes/default_deconstruction_crowbar(obj/item/crowbar/C) - if(istype(C) && terminal) +/obj/machinery/power/smes/default_deconstruction_crowbar(obj/item/C) + if(C.tool_behaviour == TOOL_CROWBAR && terminal) to_chat(usr, "You must first remove the power terminal!") return FALSE diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index b3ef99f98a..855c579926 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -227,7 +227,7 @@ /obj/item/solar_assembly/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && isturf(loc)) + if(W.tool_behaviour == TOOL_WRENCH && isturf(loc)) if(isinspace()) to_chat(user, "You can't secure [src] here.") return @@ -267,7 +267,7 @@ user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly.") return 1 else - if(istype(W, /obj/item/crowbar)) + if(W.tool_behaviour == TOOL_CROWBAR) new /obj/item/electronics/tracker(src.loc) tracker = 0 user.visible_message("[user] takes out the electronics from the solar assembly.", "You take out the electronics from the solar assembly.") diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index be24ea0fef..13f2aab811 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -131,8 +131,10 @@ else . = ..() -/obj/machinery/power/tesla_coil/research/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) +/obj/machinery/power/tesla_coil/research/default_unfasten_wrench(mob/user, obj/item/W, time = 20) . = ..() + if(!W.tool_behaviour == TOOL_WRENCH) + return if(. == SUCCESSFUL_UNFASTEN) if(panel_open) icon_state = "rpcoil_open[anchored]" diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm index 91ed69f7a5..ac0358e220 100644 --- a/code/modules/projectiles/ammunition/caseless/foam.dm +++ b/code/modules/projectiles/ammunition/caseless/foam.dm @@ -24,13 +24,13 @@ /obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params) var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB - if (istype(A, /obj/item/screwdriver) && !modified) + if(A.tool_behaviour == TOOL_SCREWDRIVER && !modified) modified = TRUE FD.modified = TRUE FD.damage_type = BRUTE to_chat(user, "You pop the safety cap off [src].") update_icon() - else if (istype(A, /obj/item/pen)) + else if(istype(A, /obj/item/pen)) if(modified) if(!FD.pen) harmful = TRUE diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e3a2da68da..63d019f97f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -434,7 +434,7 @@ to_chat(user, "You attach \the [K] to the front of \the [src].") bayonet = K update_icon() - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) if(gun_light) var/obj/item/flashlight/seclite/S = gun_light to_chat(user, "You unscrew the seclite from \the [src].") diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 675502c5fb..45a87e690b 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -563,3 +563,129 @@ var/mob/living/carbon/C = M if(!C.undergoing_cardiac_arrest()) C.set_heartattack(TRUE) + +//aphrodisiac & anaphrodisiac + +/datum/reagent/drug/aphrodisiac + name = "Crocin" + description = "Naturally found in the crocus and gardenia flowers, this drug acts as a natural and safe aphrodisiac." + taste_description = "strawberries" + color = "#FFADFF"//PINK, rgb(255, 173, 255) + can_synth = FALSE + +/datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M) + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) + if((prob(min(current_cycle/2,5)))) + M.emote(pick("moan","blush")) + if(prob(min(current_cycle/4,10))) + var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.") + to_chat(M, "[aroused_message]") + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(current_cycle, "crocin", aphro = TRUE) // redundant but should still be here + for(var/g in genits) + var/obj/item/organ/genital/G = g + to_chat(M, "[G.arousal_verb]!") + ..() + +/datum/reagent/drug/aphrodisiacplus + name = "Hexacrocin" + description = "Chemically condensed form of basic crocin. This aphrodisiac is extremely powerful and addictive in most animals.\ + Addiction withdrawals can cause brain damage and shortness of breath. Overdosage can lead to brain damage and a \ + permanent increase in libido (commonly referred to as 'bimbofication')." + taste_description = "liquid desire" + color = "#FF2BFF"//dark pink + addiction_threshold = 20 + overdose_threshold = 20 + can_synth = FALSE + +/datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M) + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) + if(prob(5)) + if(prob(current_cycle)) + M.say(pick("Hnnnnngghh...", "Ohh...", "Mmnnn...")) + else + M.emote(pick("moan","blush")) + if(prob(5)) + var/aroused_message + if(current_cycle>25) + aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!") + else + aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.") + to_chat(M, "[aroused_message]") + REMOVE_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(100, "hexacrocin", aphro = TRUE) // redundant but should still be here + for(var/g in genits) + var/obj/item/organ/genital/G = g + to_chat(M, "[G.arousal_verb]!") + ..() + +/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M) + if(prob(30)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) + ..() +/datum/reagent/drug/aphrodisiacplus/addiction_act_stage3(mob/living/M) + if(prob(30)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3) + + ..() +/datum/reagent/drug/aphrodisiacplus/addiction_act_stage4(mob/living/M) + if(prob(30)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4) + ..() + +/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) + if(prob(5) && ishuman(M) && M.has_dna() && (M.client?.prefs.cit_toggles & BIMBOFICATION)) + if(!HAS_TRAIT(M,TRAIT_PERMABONER)) + to_chat(M, "Your libido is going haywire!") + M.log_message("Made perma-horny by hexacrocin.",LOG_EMOTE) + ADD_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) + ..() + +/datum/reagent/drug/anaphrodisiac + name = "Camphor" + description = "Naturally found in some species of evergreen trees, camphor is a waxy substance. When injested by most animals, it acts as an anaphrodisiac\ + , reducing libido and calming them. Non-habit forming and not addictive." + taste_description = "dull bitterness" + taste_mult = 2 + color = "#D9D9D9"//rgb(217, 217, 217) + reagent_state = SOLID + can_synth = FALSE + +/datum/reagent/drug/anaphrodisiac/on_mob_life(mob/living/M) + if(M && M.client?.prefs.arousable && prob(16)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(-100, "camphor", aphro = TRUE) + if(genits.len) + to_chat(M, "You no longer feel aroused.") + ..() + +/datum/reagent/drug/anaphrodisiacplus + name = "Hexacamphor" + description = "Chemically condensed camphor. Causes an extreme reduction in libido and a permanent one if overdosed. Non-addictive." + taste_description = "tranquil celibacy" + color = "#D9D9D9"//rgb(217, 217, 217) + reagent_state = SOLID + overdose_threshold = 20 + can_synth = FALSE + +/datum/reagent/drug/anaphrodisiacplus/on_mob_life(mob/living/M) + if(M && M.client?.prefs.arousable) + REMOVE_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(-100, "hexacamphor", aphro = TRUE) + if(genits.len) + to_chat(M, "You no longer feel aroused.") + + ..() + +/datum/reagent/drug/anaphrodisiacplus/overdose_process(mob/living/M) + if(M && M.client?.prefs.arousable && prob(5)) + to_chat(M, "You feel like you'll never feel aroused again...") + ADD_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) + ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index ba7f9a30d5..6552d82e95 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2362,6 +2362,12 @@ M.emote("nya") if(prob(20)) to_chat(M, "[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]") + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/adjusted = H.adjust_arousal(2,"catnip", aphro = TRUE) + for(var/g in adjusted) + var/obj/item/organ/genital/G = g + to_chat(M, "You feel like playing with your [G.name]!") ..() /datum/reagent/preservahyde diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 468d29c052..8de4b1248f 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -62,3 +62,35 @@ results = list(/datum/reagent/moonsugar = 1, /datum/reagent/medicine/morphine = 2.5) required_temp = 315 //a little above normal body temperature required_reagents = list(/datum/reagent/drug/skooma = 1) + +/datum/chemical_reaction/aphro + name = "crocin" + id = /datum/reagent/drug/aphrodisiac + results = list(/datum/reagent/drug/aphrodisiac = 6) + required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2, /datum/reagent/water = 1) + required_temp = 400 + mix_message = "The mixture boils off a pink vapor..."//The water boils off, leaving the crocin + +/datum/chemical_reaction/aphroplus + name = "hexacrocin" + id = /datum/reagent/drug/aphrodisiacplus + results = list(/datum/reagent/drug/aphrodisiacplus = 1) + required_reagents = list(/datum/reagent/drug/aphrodisiac = 6, /datum/reagent/phenol = 1) + required_temp = 400 + mix_message = "The mixture rapidly condenses and darkens in color..." + +/datum/chemical_reaction/anaphro + name = "camphor" + id = /datum/reagent/drug/anaphrodisiac + results = list(/datum/reagent/drug/anaphrodisiac = 6) + required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2, /datum/reagent/sulfur = 1) + required_temp = 400 + mix_message = "The mixture boils off a yellow, smelly vapor..."//Sulfur burns off, leaving the camphor + +/datum/chemical_reaction/anaphroplus + name = "pentacamphor" + id = /datum/reagent/drug/anaphrodisiacplus + results = list(/datum/reagent/drug/anaphrodisiacplus = 1) + required_reagents = list(/datum/reagent/drug/aphrodisiac = 5, /datum/reagent/acetone = 1) + required_temp = 300 + mix_message = "The mixture thickens and heats up slighty..." diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 93a422e2f2..6eb0d5825c 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -718,7 +718,7 @@ name = "felinid mutation toxin" id = /datum/reagent/mutationtoxin/felinid results = list(/datum/reagent/mutationtoxin/felinid = 1) - required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/ammonia = 1, /datum/reagent/water = 1, /datum/reagent/pax/catnip = 1, /datum/reagent/mutationtoxin = 1) + required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/ammonia = 1, /datum/reagent/water = 1, /datum/reagent/drug/aphrodisiac = 10, /datum/reagent/mutationtoxin = 1) required_temp = 450 /datum/chemical_reaction/moff diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index e0a7f7c00e..76b08c7cdf 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -417,6 +417,26 @@ name = "bromine bottle" list_reagents = list(/datum/reagent/bromine = 30) +/obj/item/reagent_containers/glass/bottle/crocin + name = "Crocin bottle" + desc = "A bottle of mild aphrodisiac. Increases libido." + list_reagents = list(/datum/reagent/drug/aphrodisiac = 30) + +/obj/item/reagent_containers/glass/bottle/hexacrocin + name = "Hexacrocin bottle" + desc = "A bottle of strong aphrodisiac. Increases libido." + list_reagents = list(/datum/reagent/drug/aphrodisiacplus = 30) + +/obj/item/reagent_containers/glass/bottle/camphor + name = "Camphor bottle" + desc = "A bottle of mild anaphrodisiac. Reduces libido." + list_reagents = list(/datum/reagent/drug/anaphrodisiac = 30) + +/obj/item/reagent_containers/glass/bottle/hexacamphor + name = "Hexacamphor bottle" + desc = "A bottle of strong anaphrodisiac. Reduces libido." + list_reagents = list(/datum/reagent/drug/anaphrodisiacplus = 30) + //Ichors /obj/item/reagent_containers/glass/bottle/ichor possible_transfer_amounts = list(1) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 39ccdd23a2..26f0ca66ee 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -173,7 +173,7 @@ boom() /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/weldingtool)) + if(I.tool_behaviour == TOOL_WELDER) if(!reagents.has_reagent(/datum/reagent/fuel)) to_chat(user, "[src] is out of fuel!") return diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index b81c3b88f8..aefb670dd3 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -145,7 +145,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) // attack with item, place item on conveyor /obj/machinery/conveyor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) user.visible_message("[user] struggles to pry up \the [src] with \the [I].", \ "You struggle to pry up \the [src] with \the [I].") if(I.use_tool(src, user, 40, volume=40)) @@ -155,14 +155,14 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) to_chat(user, "You remove the conveyor belt.") qdel(src) - else if(istype(I, /obj/item/wrench)) + else if(I.tool_behaviour == TOOL_WRENCH) if(!(stat & BROKEN)) I.play_tool_sound(src) setDir(turn(dir,-45)) update_move_direction() to_chat(user, "You rotate [src].") - else if(istype(I, /obj/item/screwdriver)) + else if(I.tool_behaviour == TOOL_SCREWDRIVER) if(!(stat & BROKEN)) verted = verted * -1 update_move_direction() @@ -306,7 +306,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) CHECK_TICK /obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/crowbar)) + if(I.tool_behaviour == TOOL_CROWBAR) var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc) C.id = id transfer_fingerprints_to(C) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index a7b266fc0e..a9284a19f7 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -194,7 +194,9 @@ Nothing else in the console has ID requirements. locked = FALSE return TRUE -/obj/machinery/computer/rdconsole/multitool_act(mob/user, obj/item/multitool/I) +/obj/machinery/computer/rdconsole/multitool_act(mob/user, obj/item/I) + if(!I.tool_behaviour == TOOL_MULTITOOL) + return var/lathe = linked_lathe && linked_lathe.multitool_act(user, I) var/print = linked_imprinter && linked_imprinter.multitool_act(user, I) return lathe || print diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm index 7488bdd205..dbf81d791e 100644 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -39,7 +39,9 @@ . = ..() update_icon() -/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/multitool/I) +/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/I) + if(!I.tool_behaviour == TOOL_MULTITOOL) + return if(panel_open) var/new_name = "Beacon_[input("Enter the custom name for this beacon", "It be Beacon ..your input..") as text]" if(new_name && Adjacent(user)) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 9ebcfe91d6..cb1fdcfc2e 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -41,9 +41,8 @@ icon_state = "power_box" /obj/machinery/bsa/back/multitool_act(mob/living/user, obj/item/I) - if(istype(I, /obj/item/multitool)) // Only this multitool type has a data buffer. - var/obj/item/multitool/M = I - M.buffer = src + if(I.tool_behaviour == TOOL_MULTITOOL) // Lies and deception + I.buffer = src to_chat(user, "You store linkage information in [I]'s buffer.") else to_chat(user, "[I] has no data buffer!") @@ -55,9 +54,8 @@ icon_state = "emitter_center" /obj/machinery/bsa/front/multitool_act(mob/living/user, obj/item/I) - if(istype(I, /obj/item/multitool)) // Only this multitool type has a data buffer. - var/obj/item/multitool/M = I - M.buffer = src + if(I.tool_behaviour == TOOL_MULTITOOL) // Lies and deception + I.buffer = src to_chat(user, "You store linkage information in [I]'s buffer.") else to_chat(user, "[I] has no data buffer!") @@ -71,16 +69,15 @@ var/obj/machinery/bsa/front/front /obj/machinery/bsa/middle/multitool_act(mob/living/user, obj/item/I) - if(istype(I, /obj/item/multitool)) // Only this multitool type has a data buffer. - var/obj/item/multitool/M = I - if(M.buffer) - if(istype(M.buffer, /obj/machinery/bsa/back)) - back = M.buffer - M.buffer = null + if(I.tool_behaviour == TOOL_MULTITOOL) // Lies and deception + if(I.buffer) + if(istype(I.buffer, /obj/machinery/bsa/back)) + back = I.buffer + I.buffer = null to_chat(user, "You link [src] with [back].") - else if(istype(M.buffer, /obj/machinery/bsa/front)) - front = M.buffer - M.buffer = null + else if(istype(I.buffer, /obj/machinery/bsa/front)) + front = I.buffer + I.buffer = null to_chat(user, "You link [src] with [front].") else to_chat(user, "[I]'s data buffer is empty!") diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index c8fbda8988..e317820e7d 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -122,7 +122,7 @@ icon_state = active ? "sat_active" : "sat_inactive" /obj/machinery/satellite/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/multitool)) + if(I.tool_behaviour == TOOL_MULTITOOL) to_chat(user, "// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[(obj_flags & EMAGGED) ? "DEBUG_MODE //" : ""]") else return ..() diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index d08d8bfa09..07b7ae1456 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -209,7 +209,7 @@ else src.flash1 = F to_chat(user, "You insert the flash into the eye socket.") - else if(istype(W, /obj/item/crowbar)) + else if(W.tool_behaviour == TOOL_CROWBAR) if(flash1 || flash2) W.play_tool_sound(src) to_chat(user, "You remove the flash from [src].") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 064abf1700..0e6456e8b0 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -829,7 +829,7 @@ if(HAS_TRAIT(L, TRAIT_MASO)) if(ishuman(L)) var/mob/living/carbon/human/H = L - H.adjust_arousal(3*power_multiplier,maso = TRUE) + H.adjust_arousal(3*power_multiplier,"velvet speech", maso = TRUE) descmessage += "And yet, it feels so good..!" //I don't really understand masco, is this the right sort of thing they like? E.enthrallTally += power_multiplier E.resistanceTally -= power_multiplier diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm index 898b716775..a8ca068ad2 100644 --- a/code/modules/uplink/uplink_items/uplink_dangerous.dm +++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm @@ -118,6 +118,18 @@ /datum/uplink_item/dangerous/doublesword/get_discount() return pick(4;0.8,2;0.65,1;0.5) +/datum/uplink_item/dangerous/hyperblade + name = "Hypereutactic Blade" + desc = "The result of two Dragon Tooth swords combining, you wouldn't want to see this coming at you down the hall! \ + Requires two hands to wield and it slows you down. You can also recolor it!" + item = /obj/item/dualsaber/hypereutactic + player_minimum = 25 + cost = 16 + exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/traitor/internal_affairs) + +/datum/uplink_item/dangerous/hyperblade/get_discount() + return pick(4;0.8,2;0.65,1;0.5) + /datum/uplink_item/dangerous/sword name = "Energy Sword" desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \ diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 707557ff73..fedaeff98c 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -21,7 +21,7 @@ /obj/item/clothing/suit/jacket/puffer/vest = 4, /obj/item/clothing/suit/jacket/puffer = 4, /obj/item/clothing/suit/hooded/cloak/david = 4, - /obj/item/clothing/neck/cancloak = 4, + /obj/item/clothing/neck/cancloak/polychromic = 4, /obj/item/clothing/suit/bomber = 5, /obj/item/clothing/under/suit/turtle/teal = 3, /obj/item/clothing/under/suit/turtle/grey = 3, @@ -68,7 +68,7 @@ /obj/item/clothing/under/pants/black = 4, /obj/item/clothing/under/pants/tan = 4, /obj/item/clothing/under/pants/track = 3, - /obj/item/clothing/under/pants/polypants = 4, + /obj/item/clothing/under/pants/polypants/polychromic = 4, /obj/item/clothing/accessory/suitjacket = 2, /obj/item/clothing/accessory/suitjacket/charcoal = 2, /obj/item/clothing/accessory/suitjacket/navy = 2, diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index 2316682e68..28e5a950ad 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -31,6 +31,8 @@ /obj/item/autosurgeon/testicles = 3, /obj/item/storage/pill_bottle/penis_enlargement = 5, /obj/item/storage/pill_bottle/breast_enlargement = 5, + /obj/item/reagent_containers/glass/bottle/crocin = 5, + /obj/item/reagent_containers/glass/bottle/camphor = 5, /obj/item/storage/daki = 4 ) contraband = list( @@ -46,6 +48,7 @@ ) premium = list( /obj/item/clothing/accessory/skullcodpiece/fake = 3, + /obj/item/reagent_containers/glass/bottle/hexacrocin = 10, /obj/item/clothing/under/pants/chaps = 5 ) refill_canister = /obj/item/vending_refill/kink diff --git a/html/changelog.html b/html/changelog.html index 55982e0efe..56ecc7ee31 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,49 @@ -->
+

23 February 2021

+

keronshb updated:

+ +

timothyteakettle updated:

+ + +

22 February 2021

+

Putnam3145 updated:

+ +

SandPoot updated:

+ +

Vynzill updated:

+ +

dzahlus updated:

+ +

21 February 2021

Hatterhat updated: