diff --git a/_maps/map_files/rift/rift-03-underground1.dmm b/_maps/map_files/rift/rift-03-underground1.dmm
index ac4297dc4bd..bfc1f845478 100644
--- a/_maps/map_files/rift/rift-03-underground1.dmm
+++ b/_maps/map_files/rift/rift-03-underground1.dmm
@@ -31,6 +31,12 @@
},
/turf/simulated/floor/plating,
/area/storage/tech)
+"ad" = (
+/obj/random/cigarettes,
+/obj/structure/catwalk,
+/mob/living/simple_mob/vore/aggressive/rat/maurice,
+/turf/simulated/floor/plating,
+/area/maintenance/lower/trash_pit)
"ae" = (
/turf/simulated/wall,
/area/rift/station/stairs_two)
@@ -43,6 +49,13 @@
"ag" = (
/turf/simulated/open,
/area/rift/station/stairs_two)
+"ah" = (
+/obj/machinery/vending/tool/adherent,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/crystal,
+/area/rift/station/adherent_maintenance)
"ai" = (
/turf/simulated/shuttle/wall/voidcraft,
/area/turbolift/runder/level1)
@@ -9726,12 +9739,6 @@
/obj/machinery/atmospherics/pipe/simple/visible,
/turf/simulated/floor/plating,
/area/maintenance/engineering)
-"MG" = (
-/obj/random/cigarettes,
-/mob/living/simple_mob/vore/aggressive/rat/maurice,
-/obj/structure/catwalk,
-/turf/simulated/floor/plating,
-/area/maintenance/lower/trash_pit)
"MH" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -23396,7 +23403,7 @@ Cl
eg
rT
zz
-Am
+ah
PH
PH
Yt
@@ -24926,7 +24933,7 @@ aa
aa
aa
Ol
-MG
+ad
UE
Zc
BN
diff --git a/code/__DEFINES/species/species_flags.dm b/code/__DEFINES/species/species_flags.dm
index c9fd08f404c..3f1e8730a41 100644
--- a/code/__DEFINES/species/species_flags.dm
+++ b/code/__DEFINES/species/species_flags.dm
@@ -26,6 +26,8 @@
#define NO_DEFIB (1<<11)
///(Phoron) Contamination doesnt affect them.
#define CONTAMINATION_IMMUNE (1<<12)
+/// Cannot be ignited
+#define NO_IGNITE (1<<13)
DEFINE_BITFIELD(species_flags, list(
BITFIELD(NO_MINOR_CUT),
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index d2f49c67b30..7f511fa11d1 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -2458,3 +2458,26 @@
/obj/item/reagent_containers/hypospray/glukoz/pyrholidon = 50,
/obj/item/reagent_containers/hypospray/glukoz/viraplus = 25,
)
+
+/obj/machinery/vending/tool/adherent
+ name = "\improper Adherent Tool Dispenser"
+ desc = "This looks like a heavily modified vending machine. It contains technology that doesn't appear to be human in origin."
+ product_ads = "\[C#\]\[Cb\]\[Db\]. \[Ab\]\[A#\]\[Bb\]. \[E\]\[C\]\[Gb\]\[B#\]. \[C#\].;\[Cb\]\[A\]\[F\]\[Cb\]\[C\]\[E\]\[Cb\]\[E\]\[Fb\]. \[G#\]\[C\]\[Ab\]\[A\]\[C#\]\[B\]. \[Eb\]\[choral\]. \[E#\]\[C#\]\[Ab\]\[E\]\[C#\]\[Fb\]\[Cb\]\[F#\]\[C#\]\[Gb\]."
+ icon_state = "adh-tool"
+ icon_deny = "adh-tool-deny"
+ icon_vend = "adh-tool-vend"
+ vend_delay = 5
+ products = list(/obj/item/weldingtool/electric/crystal = 5,
+ /obj/item/tool/wirecutters/crystal = 5,
+ /obj/item/tool/screwdriver/crystal = 5,
+ /obj/item/tool/crowbar/crystal = 5,
+ /obj/item/tool/wrench/crystal = 5,
+ /obj/item/multitool/crystal = 5,
+ /obj/item/storage/belt/utility/crystal = 5,
+ /obj/item/storage/toolbox/crystal = 5)
+
+/obj/machinery/vending/tool/adherent/vend(datum/stored_item/vending_product/, mob/living/carbon/user)
+ if (emagged || istype(user) && user.species.name == SPECIES_ADHERENT)
+ return ..()
+ to_chat(user, SPAN_WARNING("\The [src] emits a discordant chime."))
+
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index c38d6c2476d..f1b6fb3d3fb 100755
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -119,3 +119,16 @@
/obj/item/multitool/green
color_overlay = "multi_g"
+
+/obj/item/multitool/crystal
+ name = "crystalline multitool"
+ desc = "A crystalline energy patterning tool of an alien make."
+ icon_state = "crystal_multitool"
+ item_state = "crystal_tool"
+ icon = 'icons/obj/crystal_tools.dmi'
+ matter = list(MATERIAL_CRYSTAL = 1250)
+
+/obj/item/multitool/crystal/Initialize()
+ . = ..()
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 68cf0d58d93..578faeda4f9 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -618,3 +618,19 @@
starts_with = list(
/obj/item/ammo_casing/arrow/ash = 15
)
+
+/obj/item/storage/belt/utility/crystal
+ name = "crystalline tool harness"
+ desc = "A segmented belt of strange crystalline material."
+ icon_state = "utilitybelt_crystal"
+ item_state = "utilitybelt_crystal"
+
+/obj/item/storage/belt/utility/crystal/Initialize()
+ new /obj/item/multitool/crystal(src)
+ new /obj/item/tool/wrench/crystal(src)
+ new /obj/item/tool/crowbar/crystal(src)
+ new /obj/item/tool/screwdriver/crystal(src)
+ new /obj/item/tool/wirecutters/crystal(src)
+ new /obj/item/weldingtool/electric/crystal(src)
+ update_icon()
+ . = ..()
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index a0c9a5f16a2..4b2ebbc33a6 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -207,3 +207,20 @@
/obj/item/storage/toolbox/lunchbox/survival/zaddat
starts_with = list(/obj/item/reagent_containers/hypospray/autoinjector/biginjector/glucose = 6)
+
+/obj/item/storage/toolbox/crystal
+ name = "crystalline toolbox"
+ desc = "A translucent toolbox made out of an odd crystalline material that is surprisingly light."
+ icon_state = "toolbox_crystal"
+ item_state = "toolbox_crystal"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 3)
+
+/obj/item/storage/toolbox/crystal/Initialize()
+ new /obj/item/multitool/crystal(src)
+ new /obj/item/tool/wrench/crystal(src)
+ new /obj/item/tool/crowbar/crystal(src)
+ new /obj/item/tool/screwdriver/crystal(src)
+ new /obj/item/tool/wirecutters/crystal(src)
+ new /obj/item/weldingtool/electric/crystal(src)
+ update_icon()
+ . = ..()
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 997ffe8f4a0..ee4a6790cec 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -154,3 +154,17 @@
. = ..()
if(random_color)
icon_state = "prybar[pick("","_green","_aubergine","_blue")]"
+
+/obj/item/tool/crowbar/crystal
+ name = "crystalline prytool"
+ desc = "A crystalline prying tool of an alien make."
+ icon_state = "crystal_crowbar"
+ item_state = "crystal_tool"
+ icon = 'icons/obj/crystal_tools.dmi'
+ matter = list(MATERIAL_CRYSTAL = 1250)
+ tool_speed = 0.2
+
+/obj/item/tool/crowbar/crystal/Initialize()
+ . = ..()
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index fbe17d5533f..99d3c4725f8 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -176,3 +176,18 @@
counterpart.forceMove(get_turf(src))
forceMove(counterpart)
to_chat(user, "You attach the bolt driver bit to [src].")
+
+
+/obj/item/tool/screwdriver/crystal
+ name = "crystalline screwdriver"
+ desc = "A crystalline screwdriving tool of an alien make."
+ icon_state = "crystal_screwdriver"
+ item_state = "crystal_tool"
+ icon = 'icons/obj/crystal_tools.dmi'
+ matter = list(MATERIAL_CRYSTAL = 1250)
+ tool_speed = 0.2
+
+/obj/item/tool/screwdriver/crystal/Initialize()
+ . = ..()
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index a42ff17351f..db0fef02bfb 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -700,3 +700,62 @@
setWelding(FALSE, M.occupant)
#undef WELDER_FUEL_BURN_INTERVAL
+
+/obj/item/weldingtool/electric/crystal
+ name = "crystalline arc welder"
+ desc = "A crystalline welding tool of an alien make."
+ icon_state = "crystal_welder"
+ item_state = "crystal_tool"
+ icon = 'icons/obj/crystal_tools.dmi'
+ matter = list(MATERIAL_CRYSTAL = 1250)
+ cell_type = null
+ charge_cost = null
+ tool_speed = 0.2
+ use_external_power = 1
+
+/obj/item/weldingtool/electric/crystal/attackby(var/obj/item/W, var/mob/user)
+ return
+
+/obj/item/weldingtool/electric/crystal/update_icon()
+ icon_state = welding ? "crystal_welder_on" : "crystal_welder"
+ item_state = welding ? "crystal_tool_lit" : "crystal_tool"
+ var/mob/M = loc
+ if(istype(M))
+ M.update_inv_l_hand()
+ M.update_inv_r_hand()
+
+/obj/item/weldingtool/electric/crystal/attack_self(var/mob/living/carbon/human/user)
+ if(user.species.name == SPECIES_ADHERENT)
+ if(user.nutrition >= 40)
+ setWelding(!welding, user)
+ else
+ to_chat(user, "You need more charge to activate your arc welder.")
+ else
+ to_chat(user, "This tool is beyond your understanding.")
+
+/obj/item/weldingtool/electric/crystal/get_fuel()
+ if(ishuman(src.loc))
+ var/mob/living/carbon/human/R = src.loc
+ if(R.species.name == SPECIES_ADHERENT)
+ return R.nutrition
+ else
+ return
+
+/obj/item/weldingtool/electric/crystal/get_external_power_supply()
+ return get_fuel()
+
+/obj/item/weldingtool/electric/crystal/get_max_fuel()
+ return get_fuel()
+
+/obj/item/weldingtool/electric/crystal/remove_fuel(var/amount = 1, var/mob/M = null)
+ if(ishuman(src.loc))
+ var/mob/living/carbon/human/R = src.loc
+ if(R.species.name == SPECIES_ADHERENT)
+ if(R.nutrition >= amount)
+ R.nutrition = R.nutrition - amount
+ return 1
+ else
+ if(M)
+ to_chat(M, "You need more energy to complete this task.")
+ update_icon()
+ return 0
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index a508c4d3c88..2e07741c339 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -150,3 +150,17 @@
counterpart.forceMove(get_turf(user))
forceMove(counterpart)
to_chat(user, "You attach the pry jaws to [src].")
+
+/obj/item/tool/wirecutters/crystal
+ name = "crystalline shears"
+ desc = "A crystalline shearing tool of an alien make."
+ icon_state = "crystal_wirecutter"
+ item_state = "crystal_tool"
+ icon = 'icons/obj/crystal_tools.dmi'
+ matter = list(MATERIAL_CRYSTAL = 1250)
+ tool_speed = 0.2
+
+/obj/item/tool/wirecutters/crystal/Initialize()
+ . = ..()
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 571829630ab..cf062eae6de 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -153,3 +153,17 @@
counterpart.forceMove(get_turf(user))
forceMove(counterpart)
to_chat(user, "You attach the screw driver bit to [src].")
+
+/obj/item/tool/wrench/crystal
+ name = "crystalline wrench"
+ desc = "A crystalline wrenching tool of an alien make."
+ icon_state = "crystal_wrench"
+ item_state = "crystal_tool"
+ icon = 'icons/obj/crystal_tools.dmi'
+ matter = list(MATERIAL_CRYSTAL = 1250)
+ tool_speed = 0.2
+
+/obj/item/tool/wrench/crystal/Initialize()
+ . = ..()
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index cb6c52525ff..4fc196ad5aa 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -373,6 +373,11 @@
handle_light()
update_fire()
+/mob/living/carbon/human/IgniteMob()
+ if(!(species.species_flags & NO_IGNITE))
+ return ..()
+
+
/mob/living/proc/ExtinguishMob()
if(on_fire)
on_fire = 0
diff --git a/code/modules/organs/external/species/adherent.dm b/code/modules/organs/external/species/adherent.dm
index 5992069da8d..3f128a3a814 100644
--- a/code/modules/organs/external/species/adherent.dm
+++ b/code/modules/organs/external/species/adherent.dm
@@ -38,6 +38,7 @@
eye_icon_location = 'icons/mob/species/adherent/eyes.dmi'
eye_icon = "eyes"
robotic = ORGAN_CRYSTAL
+// can_intake_reagents = FALSE //! DO NOT UNCOMMENT THIS LINE UNTIL ADHERENTS CAN PASS IsSynthetic()
// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_HEALS_OVERKILL | ORGAN_FLAG_CAN_BREAK
/obj/item/organ/external/arm/crystal
diff --git a/code/modules/species/station/adherent.dm b/code/modules/species/station/adherent.dm
index aba14e2ee6a..385279c9e49 100644
--- a/code/modules/species/station/adherent.dm
+++ b/code/modules/species/station/adherent.dm
@@ -32,12 +32,23 @@
min_age = 10000
max_age = 12000
// antaghud_offset_y = 14
- warning_low_pressure = 50
- hazard_low_pressure = -1
mob_size = MOB_LARGE
// strength = STR_HIGH
has_glowing_eyes = TRUE
+ warning_low_pressure = 50
+ hazard_low_pressure = -1
+ hazard_high_pressure = INFINITY
+ radiation_mod = 0
+ toxins_mod = 0
+ breath_type = null
+ poison_type = null
+ brute_mod = 2
+ burn_mod = 0.1
+ total_health = 75
+
+ hunger_factor = 0.04
+
speech_sounds = list('sound/voice/chime.ogg')
speech_chance = 25
@@ -49,7 +60,7 @@
heat_level_2 = 1000
heat_level_3 = 2000
- species_flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN
+ species_flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN | NO_POISON | NO_IGNITE
species_spawn_flags = SPECIES_SPAWN_WHITELISTED | SPECIES_SPAWN_NO_FBP_CONSTRUCT | SPECIES_SPAWN_NO_FBP_SETUP | SPECIES_SPAWN_CHARACTER
species_appearance_flags = HAS_EYE_COLOR | HAS_BASE_SKIN_COLOR
@@ -120,6 +131,9 @@
wikilink = "N/A"
+/datum/species/adherent/equip_survival_gear(mob/living/carbon/human/H, extendedtank = FALSE, comprehensive = FALSE)
+ H.equip_to_slot_or_del(new /obj/item/storage/belt/utility/crystal, /datum/inventory_slot_meta/abstract/put_in_backpack)
+
/datum/species/adherent/New()
/*equip_adjust = list(
"[SLOT_ID_LEFT_HAND]" = list("[NORTH]" = list("x" = 0, "y" = 14), "[EAST]" = list("x" = 0, "y" = 14), "[SOUTH]" = list("x" = 0, "y" = 14), "[WEST]" = list("x" = 0, "y" = 14)),
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 399b85c1d93..4fa992e892c 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/crystal_tools.dmi b/icons/obj/crystal_tools.dmi
new file mode 100644
index 00000000000..033176cd04d
Binary files /dev/null and b/icons/obj/crystal_tools.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 37535225d20..b366c78e226 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index a4700654036..fa155e49173 100755
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ