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/instruments.dm b/code/__DEFINES/instruments.dm index 3c414f87f4..69d2a60e51 100644 --- a/code/__DEFINES/instruments.dm +++ b/code/__DEFINES/instruments.dm @@ -19,7 +19,7 @@ #define INSTRUMENT_EXP_FALLOFF_MAX 10 /// Minimum volume for when the sound is considered dead. -#define INSTRUMENT_MIN_SUSTAIN_DROPOFF 0 +#define INSTRUMENT_MIN_SUSTAIN_DROPOFF 1 #define SUSTAIN_LINEAR 1 #define SUSTAIN_EXPONENTIAL 2 diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 57484ae85b..9403eca2da 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -86,8 +86,8 @@ #define EMOTE_OMNI 4 //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam -#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen? -#define MAX_FLAVOR_LEN 4096 //double the maximum message length. +#define MAX_MESSAGE_LEN 4096 //Citadel edit: What's the WORST that could happen? +#define MAX_FLAVOR_LEN 4096 #define MAX_TASTE_LEN 40 //lick... vore... ew... #define MAX_NAME_LEN 42 #define MAX_BROADCAST_LEN 512 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/_globalvars/traits.dm b/code/_globalvars/traits.dm index f376ba50d7..ac6ea4e25c 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -132,6 +132,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NODROP" = TRAIT_NODROP, "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT, "TRAIT_SPOOKY_THROW" = TRAIT_SPOOKY_THROW + ), + /datum/mind = list( + "TRAIT_CLOWN_MENTALITY" = TRAIT_CLOWN_MENTALITY ) )) 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 1b64cca787..bd2e515562 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -986,7 +986,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..00ba621550 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) @@ -117,12 +117,6 @@ if(user.a_intent == INTENT_HARM) return ..() -//callback proc used on stacks use_tool to stop unnecessary amounts being wasted from spam clicking. -/obj/structure/frame/computer/proc/check_state(target_state) - if(state == target_state) - return TRUE - return FALSE - /obj/structure/frame/computer/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(state == 4) 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..d5bbcb0adc 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -21,6 +21,11 @@ circuit = null qdel(src) +//callback proc used on stacks use_tool to stop unnecessary amounts being wasted from spam clicking. +/obj/structure/frame/proc/check_state(target_state) + if(state == target_state) + return TRUE + return FALSE /obj/structure/frame/machine name = "machine frame" @@ -84,34 +89,32 @@ if(!P.tool_start_check(user, amount=5)) return to_chat(user, "You start to add cables to the frame...") - if(P.use_tool(src, user, 20, volume=50, amount=5)) + if(P.use_tool(src, user, 20, volume=50, amount=5, extra_checks = CALLBACK(src, .proc/check_state, 1))) to_chat(user, "You add cables to the frame.") state = 2 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)) - if(state == 1) - to_chat(user, "You disassemble the frame.") - var/obj/item/stack/sheet/metal/M = new (loc, 5) - M.add_fingerprint(user) - qdel(src) + if(P.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, .proc/check_state, 1))) + to_chat(user, "You disassemble the frame.") + var/obj/item/stack/sheet/metal/M = new (loc, 5) + 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) - to_chat(user, "You [anchored ? "un" : ""]secure [name].") - setAnchored(!anchored) + if(P.use_tool(src, user, 40, volume=75, extra_checks = CALLBACK(src, .proc/check_state, 1))) + to_chat(user, "You [anchored ? "un" : ""]secure [name].") + setAnchored(!anchored) 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)) + if(P.use_tool(src, user, 40, volume=75, extra_checks = CALLBACK(src, .proc/check_state, 2))) to_chat(user, "You [anchored ? "un" : ""]secure [name].") setAnchored(!anchored) return @@ -140,7 +143,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 +152,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 +170,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)) + if(P.use_tool(src, user, 40, volume=75, extra_checks = CALLBACK(src, .proc/check_state, 3))) 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..f4a65ce984 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 @@ -1059,7 +1062,7 @@ to_chat(user, "The airlock's motors resist your efforts to force it!") else if(locked) to_chat(user, "The airlock's bolts prevent it from being forced!") - else if( !welded && !operating) + else if(!welded && !operating) if(!beingcrowbarred) //being fireaxe'd var/obj/item/fireaxe/axe = I if(!axe.wielded) @@ -1069,7 +1072,9 @@ else INVOKE_ASYNC(src, (density ? .proc/open : .proc/close), 2) - if(istype(I, /obj/item/crowbar/power)) + if(I.tool_behaviour == TOOL_CROWBAR) + if(!I.can_force_powered) + return 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..8a09bca0bf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -112,6 +112,12 @@ 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. + //Special crowbar + var/can_force_powered = FALSE 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 9a1c770417..8387c2704e 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -66,7 +66,7 @@ var/list/dept_list = list("Civilian","Security","Medical","Science","Engineering","Cargo") /obj/item/circuitboard/computer/card/minor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) target_dept = (target_dept == dept_list.len) ? 1 : (target_dept + 1) to_chat(user, "You set the board to \"[dept_list[target_dept]]\".") else @@ -181,7 +181,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 @@ -338,7 +338,7 @@ build_path = /obj/machinery/computer/libraryconsole /obj/item/circuitboard/computer/libraryconsole/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/libraryconsole/bookmanagement) name = "Library Visitor Console (Computer Board)" build_path = /obj/machinery/computer/libraryconsole diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 89d566f714..e0ea5f3bac 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -296,7 +296,7 @@ /obj/machinery/vending/custom = "Custom Vendor") /obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/position = vending_names_paths.Find(build_path) position = (position == vending_names_paths.len) ? 1 : (position + 1) var/typepath = vending_names_paths[position] @@ -372,7 +372,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) @@ -441,7 +441,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) if(build_path == /obj/machinery/processor) name = "Slime Processor (Machine Board)" build_path = /obj/machinery/processor/slime @@ -477,7 +477,7 @@ return ..() /obj/item/circuitboard/machine/smartfridge/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/position = fridges_name_paths.Find(build_path, fridges_name_paths) position = (position == fridges_name_paths.len) ? 1 : (position + 1) build_path = fridges_name_paths[position] @@ -658,7 +658,7 @@ build_path = PATH_POWERCOIL /obj/item/circuitboard/machine/tesla_coil/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) @@ -777,7 +777,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/chem_master/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) + if(I.tool_behaviour == TOOL_SCREWDRIVER) var/new_name = "ChemMaster" var/new_path = /obj/machinery/chem_master 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/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index a541fb8fe3..44121d64d1 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -771,7 +771,10 @@ /obj/item/nullrod/tribal_knife/process() slowdown = rand(-2, 2) - + if(iscarbon(loc)) + var/mob/living/carbon/wielder = loc + if(wielder.is_holding(src)) + wielder.update_equipment_speed_mods() /obj/item/nullrod/pitchfork icon_state = "pitchfork0" 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/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 36f89e57f2..f0fd29adbc 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -88,6 +88,7 @@ usesound = 'sound/items/jaws_pry.ogg' force = 15 toolspeed = 0.25 + can_force_powered = TRUE /obj/item/crowbar/power/suicide_act(mob/user) user.visible_message("[user] is putting [user.p_their()] head in [src], it looks like [user.p_theyre()] trying to commit suicide!") 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 2eda9f126a..e3b9ae1df1 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 2214f9e4bb..2d3ec4bc1f 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -93,7 +93,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 e0434a6fea..86ddc24ca3 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/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index ba4578add9..9c0b19cd83 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -433,31 +433,21 @@ destroy_objective.find_target() objectives += destroy_objective else - if(prob(70)) - var/datum/objective/assassinate/once/kill_objective = new - kill_objective.owner = owner - if(team_mode) //No backstabbing while in a team - kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - kill_objective.find_target() - objectives += kill_objective - - /*else - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - if(team_mode) - maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - maroon_objective.find_target() - objectives += maroon_objective*/ + var/datum/objective/assassinate/once/kill_objective = new + kill_objective.owner = owner + if(team_mode) //No backstabbing while in a team + kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) + else + kill_objective.find_target() + objectives += kill_objective - if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = owner - identity_theft.target = kill_objective.target - identity_theft.update_explanation_text() - objectives += identity_theft - escape_objective_possible = FALSE + if(!(locate(/datum/objective/escape) in objectives) && escape_objective_possible && prob(50)) + var/datum/objective/escape/escape_with_identity/identity_theft = new + identity_theft.owner = owner + identity_theft.target = kill_objective.target + identity_theft.update_explanation_text() + objectives += identity_theft + escape_objective_possible = FALSE if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) if(prob(50)) 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/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index 496d11bcbc..fc53575bd8 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -191,8 +191,6 @@ new /datum/disease_ability/symptom/powerful/youth /datum/disease_ability/action/sneeze name = "Voluntary Sneezing" actions = list(/datum/action/cooldown/disease_sneeze) - cost = 2 - required_total_points = 3 short_desc = "Force the host you are following to sneeze, spreading your infection to those in front of them." long_desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host.
Cooldown: 20 seconds" @@ -229,8 +227,6 @@ new /datum/disease_ability/symptom/powerful/youth /datum/disease_ability/action/infect name = "Secrete Infection" actions = list(/datum/action/cooldown/disease_infect) - cost = 2 - required_total_points = 3 short_desc = "Cause all objects your host is touching to become infectious for a limited time, spreading your infection to anyone who touches them." long_desc = "Cause the host you are following to excrete an infective substance from their pores, causing all objects touching their skin to transmit your infection to anyone who touches them for the next 30 seconds. This includes the floor, if they are not wearing shoes, and any items they are holding, if they are not wearing gloves.
Cooldown: 40 seconds" @@ -271,23 +267,20 @@ new /datum/disease_ability/symptom/powerful/youth //healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!) /datum/disease_ability/symptom/mild - cost = 2 - required_total_points = 4 category = "Symptom (Weak)" /datum/disease_ability/symptom/medium - cost = 4 - required_total_points = 8 category = "Symptom" /datum/disease_ability/symptom/medium/heal cost = 5 + required_total_points = 5 malefit = -1 category = "Symptom (+)" /datum/disease_ability/symptom/powerful cost = 4 - required_total_points = 16 + required_total_points = 10 category = "Symptom (Strong)" /datum/disease_ability/symptom/powerful/heal diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index ba79cca07a..bb95a8bdf3 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -566,7 +566,7 @@ human_user.adjustBruteLoss(-10, FALSE) human_user.adjustFireLoss(-10, FALSE) human_user.adjustStaminaLoss(-10, FALSE) - human_user.adjustToxLoss(-10, FALSE) + human_user.adjustToxLoss(-10, FALSE, TRUE) human_user.adjustOxyLoss(-10) /obj/effect/proc_holder/spell/pointed/manse_link diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index 9d65396c63..43678e17c6 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -183,7 +183,7 @@ var/mob/living/carbon/human/human_user = user human_user.adjustBruteLoss(-6, FALSE) human_user.adjustFireLoss(-6, FALSE) - human_user.adjustToxLoss(-6, FALSE) + human_user.adjustToxLoss(-6, FALSE, TRUE) human_user.adjustOxyLoss(-6, FALSE) human_user.adjustStaminaLoss(-20) 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/antagonists/traitor/classes/subterfuge.dm b/code/modules/antagonists/traitor/classes/subterfuge.dm index ea073f38c1..73dc455a45 100644 --- a/code/modules/antagonists/traitor/classes/subterfuge.dm +++ b/code/modules/antagonists/traitor/classes/subterfuge.dm @@ -12,11 +12,10 @@ mode = SSticker.mode assassin_prob = max(0,mode.threat_level-40) if(prob(assassin_prob)) - if(prob(assassin_prob)) - var/datum/objective/assassinate/once/kill_objective = new - kill_objective.owner = T.owner - kill_objective.find_target() - T.add_objective(kill_objective) + var/datum/objective/assassinate/once/kill_objective = new + kill_objective.owner = T.owner + kill_objective.find_target() + T.add_objective(kill_objective) else var/list/weights = list() weights["sabo"] = length(subtypesof(/datum/sabotage_objective)) 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 97de38e73a..dbbf648d1f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -969,6 +969,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/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 4728001699..a558abbfe8 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -220,8 +220,8 @@ parry_max_attacks = INFINITY parry_failed_cooldown_duration = 2.25 SECONDS parry_failed_stagger_duration = 2.25 SECONDS - parry_cooldown = 3 SECONDS - parry_failed_clickcd_duration = 0.5 SECONDS + parry_cooldown = 0 + parry_failed_clickcd_duration = 0 /obj/item/clothing/gloves/botanic_leather name = "botanist's leather gloves" 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..3e72765234 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" @@ -1040,6 +1040,12 @@ icon_state = "wbreakpoly" item_state = "wbreakpoly" +/obj/item/clothing/suit/toggle/wbreakpoly/on_toggle(mob/user) + if(suittoggled) + to_chat(usr, "You zip up [src].") + else + to_chat(usr, "You unzip [src].") + /obj/item/clothing/suit/toggle/wbreakpoly/polychromic/ComponentInitialize() . = ..() AddElement(/datum/element/polychromic, list("#464F65", "#916035", "#474747"), 3) diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index aa22834670..98d6809d64 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -110,6 +110,9 @@ suit_toggle(user) return TRUE +/obj/item/clothing/suit/toggle/proc/on_toggle(mob/user) // override this, not suit_toggle, which does checks + to_chat(usr, "You toggle [src]'s [togglename].") + /obj/item/clothing/suit/toggle/ui_action_click() suit_toggle() @@ -119,7 +122,7 @@ if(!can_use(usr)) return 0 - to_chat(usr, "You toggle [src]'s [togglename].") + on_toggle(usr) if(src.suittoggled) src.icon_state = "[initial(icon_state)]" src.suittoggled = FALSE 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/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 05a0da2793..152740f932 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -435,7 +435,7 @@ name = "alien drone cube" desc = "Just add water and run!" tastes = list("the jungle" = 1, "acid" = 1) - dried_being = /mob/living/carbon/alien/humanoid/drone + dried_being = /mob/living/simple_animal/hostile/alien/sentinel/cube /obj/item/reagent_containers/food/snacks/cube/goat name = "goat cube" diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 35fa40e15d..b79efdd39b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -259,7 +259,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 a5ff27e75e..d27e49b48c 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -38,9 +38,8 @@ user << browse(dat, "window=console_stacking_machine") /obj/machinery/mineral/stacking_unit_console/multitool_act(mob/living/user, obj/item/I) - 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 store linkage information in [I]'s buffer.") return TRUE @@ -97,8 +96,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/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 772022a987..66d3154ee3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -142,10 +142,10 @@ parry_efficiency_considered_successful = 0.01 parry_efficiency_to_counterattack = 0.01 parry_max_attacks = INFINITY - parry_failed_cooldown_duration = 3 SECONDS - parry_failed_stagger_duration = 2 SECONDS - parry_cooldown = 3 SECONDS - parry_failed_clickcd_duration = 0.8 SECONDS + parry_failed_cooldown_duration = 1.5 SECONDS + parry_failed_stagger_duration = 1 SECONDS + parry_cooldown = 0 + parry_failed_clickcd_duration = 0.8 parry_data = list( // yeah it's snowflake "UNARMED_PARRY_STAGGER" = 3 SECONDS, diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index c3cdb3354f..a7e305201d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1454,9 +1454,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/armor_block = target.run_armor_check(affecting, "melee") - if(HAS_TRAIT(user, TRAIT_MAULER)) // maulers get 15 armorpierce because if you're going to punch someone you might as well do a good job of it - armor_block = target.run_armor_check(affecting, "melee", armour_penetration = 15) // lot of good that sec jumpsuit did you - playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1) target.visible_message("[user] [atk_verb]ed [target]!", \ "[user] [atk_verb]ed you!", null, COMBAT_MESSAGE_RANGE, null, \ @@ -1473,9 +1470,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.apply_damage(damage*1.5, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus) target.apply_damage(damage*0.5, STAMINA, affecting, armor_block) log_combat(user, target, "kicked") - else if(HAS_TRAIT(user, TRAIT_MAULER)) // mauler punches deal 1.1x raw damage + 1.3x stam damage, and have some armor pierce - target.apply_damage(damage*1.1, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus) - target.apply_damage(damage*1.3, STAMINA, affecting, armor_block) + else if(HAS_TRAIT(user, TRAIT_MAULER)) // mauler punches deal 1.2x raw damage but nstam + target.apply_damage(damage*1.2, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus) log_combat(user, target, "punched (mauler)") else //other attacks deal full raw damage + 2x in stamina damage target.apply_damage(damage, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus) @@ -1547,9 +1543,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 +1927,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/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index c0423286c1..10f8aaf2f4 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -23,6 +23,9 @@ if(!(combat_flags & COMBAT_FLAG_PARRY_CAPABLE)) to_chat(src, "You are not something that can parry attacks.") return + if(!(mobility_flags & MOBILITY_STAND)) + to_chat(src, "You aren't able to parry without solid footing!") + return // Prioritize item, then martial art, then unarmed. // yanderedev else if time var/obj/item/using_item = get_active_held_item() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 7db417b8fa..36b5edcbc9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -289,11 +289,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) @@ -333,7 +335,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 @@ -341,7 +343,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 @@ -373,12 +375,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) @@ -387,7 +389,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/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 86467624b5..05d6eda435 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -78,6 +78,15 @@ projectiletype = /obj/item/projectile/neurotox projectilesound = 'sound/weapons/pierce.ogg' +/mob/living/simple_animal/hostile/alien/sentinel/cube + gold_core_spawnable = NO_SPAWN + health = 220 + maxHealth = 220 + melee_damage_lower = 20 + melee_damage_upper = 20 + del_on_death = TRUE + loot = list(/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel) + /mob/living/simple_animal/hostile/alien/queen name = "alien queen" diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 63cb1cc5fa..e53f4087ab 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -9,6 +9,7 @@ var/light_on = FALSE integrity_failure = 0.5 max_integrity = 100 + rad_flags = RAD_PROTECT_CONTENTS armor = list("melee" = 0, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) var/enabled = 0 // Whether the computer is turned on. 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 cf526f083d..da99ecaf73 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 @@ -269,7 +269,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..96985514b5 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -45,6 +45,13 @@ trippy = FALSE pH = 8 +//Nicotine is used as a pesticide IRL. +/datum/reagent/drug/nicotine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type))) + mytray.adjustPests(-rand(1,2)) + /datum/reagent/drug/nicotine/on_mob_life(mob/living/carbon/M) if(prob(1)) var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.") @@ -563,3 +570,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/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 1975eede70..303fd981fb 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -49,6 +49,11 @@ var/brute_heal = 1 var/burn_heal = 0 +/datum/reagent/consumable/nutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(type) * 0.2)) + /datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/M) if(!HAS_TRAIT(M, TRAIT_NO_PROCESS_FOOD)) if(prob(50)) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 0959fb58e0..65443b65c7 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -155,6 +155,12 @@ pH = 11 value = REAGENT_VALUE_COMMON +// Healing +/datum/reagent/medicine/cryoxadone/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + mytray.adjustHealth(round(chems.get_reagent_amount(type) * 3)) + mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 3)) + /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M) var/power = -0.00003 * (M.bodytemperature ** 2) + 3 if(M.bodytemperature < T0C) @@ -935,6 +941,12 @@ pH = 0 value = REAGENT_VALUE_RARE +// FEED ME SEYMOUR +/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.spawnplant() + /datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.stat == DEAD) if(M.suiciding || M.hellbound) //they are never coming back diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index ba7f9a30d5..fe8f923e1a 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 @@ -2539,7 +2545,7 @@ M.drowsyness = max(M.drowsyness-5, 0) M.AdjustAllImmobility(-40, FALSE) M.adjustStaminaLoss(-15, FALSE) - M.adjustToxLoss(-3, FALSE) + M.adjustToxLoss(-3, FALSE, TRUE) M.adjustOxyLoss(-3, FALSE) M.adjustBruteLoss(-3, FALSE) M.adjustFireLoss(-3, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 3f0ebcb3e3..2e05f66cf8 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -32,6 +32,12 @@ value = REAGENT_VALUE_VERY_COMMON taste_description = "metal" +//It has stable IN THE NAME. IT WAS MADE FOR THIS MOMENT. +/datum/reagent/stabilizing_agent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(myseed && chems.has_reagent(type, 1)) + myseed.adjust_instability(-1) + /datum/reagent/clf3 name = "Chlorine Trifluoride" description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." @@ -167,6 +173,15 @@ taste_description = "burning" value = REAGENT_VALUE_COMMON +// Smells like victory... +/datum/reagent/napalm/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + if(!(myseed.resistance_flags & FIRE_PROOF)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 6)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 7)) + mytray.adjustWeeds(-rand(5,9)) //At least give them a small reward if they bother. + /datum/reagent/napalm/on_mob_life(mob/living/carbon/M) M.adjust_fire_stacks(1) ..() 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/advanced/toxichealing.dm b/code/modules/surgery/advanced/toxichealing.dm index 0e0fd10c1c..376fb43c31 100644 --- a/code/modules/surgery/advanced/toxichealing.dm +++ b/code/modules/surgery/advanced/toxichealing.dm @@ -24,6 +24,13 @@ /datum/surgery_step/toxichealing/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] starts rejuvenating some of [target]'s flesh back to life.", "You start knitting some of [target]'s flesh back to life.") +/datum/surgery_step/toxichealing/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) + if(..()) + while((target.getToxLoss() >= 1) || (target.getOxyLoss() >= 1)) + . = ..() + if(!.) + break + /datum/surgery_step/toxichealing/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] fixes some of [target]'s wounds.", "You succeed in fixing some of [target]'s wounds.") target.heal_bodypart_damage(0,0,30) //Heals stam 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/tcg/cards.dm b/code/modules/tcg/cards.dm index ff7d2fee2a..54d6d5abd9 100644 --- a/code/modules/tcg/cards.dm +++ b/code/modules/tcg/cards.dm @@ -548,6 +548,7 @@ desc = "A TCG-branded card binder, specifically for your infinite collection of TCG cards!" icon = 'icons/obj/tcg/misc.dmi' icon_state = "binder" + w_class = WEIGHT_CLASS_SMALL var/list/cards = list() var/list/decks = list() 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/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm index 6e3951e60a..5622ec0382 100644 --- a/code/modules/vore/eating/vorepanel.dm +++ b/code/modules/vore/eating/vorepanel.dm @@ -4,8 +4,8 @@ #define BELLIES_MAX 20 #define BELLIES_NAME_MIN 2 -#define BELLIES_NAME_MAX 12 -#define BELLIES_DESC_MAX 1024 +#define BELLIES_NAME_MAX 24 +#define BELLIES_DESC_MAX 4096 /mob/living/proc/insidePanel() set name = "Vore Panel" diff --git a/html/changelog.html b/html/changelog.html index 55982e0efe..65e2d571a2 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,122 @@ -->
+

28 February 2021

+

Putnam3145 updated:

+ +

R3dtail updated:

+ +

SandPoot updated:

+ +

dzahlus updated:

+ + +

27 February 2021

+

Hatterhat updated:

+ +

Putnam3145 updated:

+ +

TheObserver-sys updated:

+ +

kappa-sama updated:

+ +

keronshb updated:

+ +

kiwedespars updated:

+ +

silicons updated:

+ + +

26 February 2021

+

DeltaFire15 updated:

+ + +

25 February 2021

+

DeltaFire15 updated:

+ + +

24 February 2021

+

SandPoot updated:

+ +

silicons updated:

+ + +

23 February 2021

+

keronshb updated:

+ +

timothyteakettle updated:

+ + +

22 February 2021

+

Putnam3145 updated:

+ +

SandPoot updated:

+ +

Vynzill updated:

+ +

dzahlus updated:

+ +

21 February 2021

Hatterhat updated: