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