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