diff --git a/code/__defines/map.dm b/code/__defines/map.dm
index 13b1bfd795..7d0f3706af 100644
--- a/code/__defines/map.dm
+++ b/code/__defines/map.dm
@@ -6,6 +6,7 @@
#define MAP_LEVEL_SEALED 0x010 // Z-levels that don't allow random transit at edge
#define MAP_LEVEL_EMPTY 0x020 // Empty Z-levels that may be used for various things (currently used by bluespace jump)
#define MAP_LEVEL_CONSOLES 0x040 // Z-levels available to various consoles, such as the crew monitor (when that gets coded in). Defaults to station_levels if unset.
+#define MAP_LEVEL_XENOARCH_EXEMPT 0x080 // Z-levels exempt from xenoarch digsite generation.
// Misc map defines.
#define SUBMAP_MAP_EDGE_PAD 15 // Automatically created submaps are forbidden from being this close to the main map's edge.
\ No newline at end of file
diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm
index aec0d624c7..f49730f25d 100644
--- a/code/controllers/Processes/supply.dm
+++ b/code/controllers/Processes/supply.dm
@@ -100,6 +100,7 @@ var/datum/controller/supply/supply_controller = new()
EC.name = "\proper[MA.name]"
EC.value = 0
EC.contents = list()
+ var/base_value = 0
// Must be in a crate!
if(istype(MA,/obj/structure/closet/crate))
@@ -107,6 +108,8 @@ var/datum/controller/supply/supply_controller = new()
callHook("sell_crate", list(CR, area_shuttle))
points += CR.points_per_crate
+ if(CR.points_per_crate)
+ base_value = CR.points_per_crate
var/find_slip = 1
for(var/atom/A in CR)
@@ -151,6 +154,7 @@ var/datum/controller/supply/supply_controller = new()
exported_crates += EC
points += EC.value
+ EC.value += base_value
// Duplicate the receipt for the admin-side log
var/datum/exported_crate/adm = new()
diff --git a/code/controllers/subsystems/xenoarch.dm b/code/controllers/subsystems/xenoarch.dm
index 7f3e292c1a..d863ad8269 100644
--- a/code/controllers/subsystems/xenoarch.dm
+++ b/code/controllers/subsystems/xenoarch.dm
@@ -31,7 +31,7 @@ SUBSYSTEM_DEF(xenoarch)
/datum/controller/subsystem/xenoarch/proc/SetupXenoarch()
for(var/turf/simulated/mineral/M in turfs)
- if(!M.density)
+ if(!M.density || M.z in using_map.xenoarch_exempt_levels)
continue
if(isnull(M.geologic_data))
diff --git a/code/datums/observation/destroyed.dm b/code/datums/observation/destroyed.dm
index ff8778645c..650909f86d 100644
--- a/code/datums/observation/destroyed.dm
+++ b/code/datums/observation/destroyed.dm
@@ -10,5 +10,6 @@
name = "Destroyed"
/datum/Destroy()
- GLOB.destroyed_event.raise_event(src)
+ if(GLOB.destroyed_event)
+ GLOB.destroyed_event.raise_event(src)
. = ..()
diff --git a/code/datums/wires/seedstorage.dm b/code/datums/wires/seedstorage.dm
index e21bbb9faf..8268d936b0 100644
--- a/code/datums/wires/seedstorage.dm
+++ b/code/datums/wires/seedstorage.dm
@@ -10,10 +10,6 @@
/datum/wires/seedstorage/CanUse(var/mob/living/L)
var/obj/machinery/seed_storage/V = holder
- if(!istype(L, /mob/living/silicon))
- if(V.seconds_electrified)
- if(V.shock(L, 100))
- return 0
if(V.panel_open)
return 1
return 0
diff --git a/code/datums/wires/smartfridge.dm b/code/datums/wires/smartfridge.dm
index b611497e79..15f10cd800 100644
--- a/code/datums/wires/smartfridge.dm
+++ b/code/datums/wires/smartfridge.dm
@@ -12,10 +12,6 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
/datum/wires/smartfridge/CanUse(var/mob/living/L)
var/obj/machinery/smartfridge/S = holder
- if(!istype(L, /mob/living/silicon))
- if(S.seconds_electrified)
- if(S.shock(L, 100))
- return 0
if(S.panel_open)
return 1
return 0
diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm
index 6715669fc1..bad3a0078b 100644
--- a/code/datums/wires/vending.dm
+++ b/code/datums/wires/vending.dm
@@ -9,10 +9,6 @@ var/const/VENDING_WIRE_IDSCAN = 8
/datum/wires/vending/CanUse(var/mob/living/L)
var/obj/machinery/vending/V = holder
- if(!istype(L, /mob/living/silicon))
- if(V.seconds_electrified)
- if(V.shock(L, 100))
- return 0
if(V.panel_open)
return 1
return 0
@@ -43,7 +39,7 @@ var/const/VENDING_WIRE_IDSCAN = 8
if(VENDING_WIRE_THROW)
V.shoot_inventory = !mended
if(VENDING_WIRE_CONTRABAND)
- V.categories &= ~CAT_HIDDEN
+ V.categories &= ~CAT_HIDDEN
if(VENDING_WIRE_ELECTRIFY)
if(mended)
V.seconds_electrified = 0
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 002ba894ad..de4e8a4685 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -205,24 +205,23 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(computer_deconstruction_screwdriver(user, O))
return
if(istype(O, /obj/item/device/multitool))
- if(panel_open)
- var/input = sanitize(input(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department))
- if(!input)
- to_chat(usr, "No input found. Please hang up and try your call again.")
- return
- department = input
- announcement.title = "[department] announcement"
- announcement.newscast = 1
-
- name = "[department] Requests Console"
- allConsoles += src
- if(departmentType & RC_ASSIST)
- req_console_assistance |= department
- if(departmentType & RC_SUPPLY)
- req_console_supplies |= department
- if(departmentType & RC_INFO)
- req_console_information |= department
+ var/input = sanitize(input(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department))
+ if(!input)
+ to_chat(usr, "No input found. Please hang up and try your call again.")
return
+ department = input
+ announcement.title = "[department] announcement"
+ announcement.newscast = 1
+
+ name = "[department] Requests Console"
+ allConsoles += src
+ if(departmentType & RC_ASSIST)
+ req_console_assistance |= department
+ if(departmentType & RC_SUPPLY)
+ req_console_supplies |= department
+ if(departmentType & RC_INFO)
+ req_console_information |= department
+ return
if(istype(O, /obj/item/weapon/card/id))
if(inoperable(MAINT)) return
diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm
index 477815e62f..73b62f0741 100644
--- a/code/game/objects/items/weapons/tools/crowbar.dm
+++ b/code/game/objects/items/weapons/tools/crowbar.dm
@@ -51,6 +51,24 @@
toolspeed = 0.1
origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 4)
+/obj/item/weapon/tool/crowbar/hybrid
+ name = "strange crowbar"
+ desc = "A crowbar whose head seems to phase in and out of view."
+ catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar)
+ icon_state = "hybcrowbar"
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ toolspeed = 0.4
+ origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 3)
+ reach = 2
+
+/obj/item/weapon/tool/crowbar/hybrid/is_crowbar()
+ if(prob(10))
+ var/turf/T = get_turf(src)
+ radiation_repository.radiate(get_turf(src), 5)
+ T.visible_message("\The [src] shudders!")
+ return FALSE
+ return TRUE
+
/obj/item/weapon/tool/crowbar/cyborg
name = "hydraulic crowbar"
desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbars in industrial synthetics."
diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm
index cb6a7f7c90..a9bdd6cee8 100644
--- a/code/game/objects/items/weapons/tools/screwdriver.dm
+++ b/code/game/objects/items/weapons/tools/screwdriver.dm
@@ -92,6 +92,27 @@
toolspeed = 0.1
random_color = FALSE
+/obj/item/weapon/tool/screwdriver/hybrid
+ name = "strange screwdriver"
+ desc = "A strange conglomerate of a screwdriver."
+ icon_state = "hybscrewdriver"
+ item_state = "screwdriver_black"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
+ slowdown = 0.1
+ w_class = ITEMSIZE_NORMAL
+ usesound = 'sound/effects/uncloak.ogg'
+ toolspeed = 0.4
+ random_color = FALSE
+ reach = 2
+
+/obj/item/weapon/tool/screwdriver/hybrid/is_screwdriver()
+ if(prob(10))
+ var/turf/T = get_turf(src)
+ radiation_repository.radiate(get_turf(src), 5)
+ T.visible_message("\The [src] shudders!")
+ return FALSE
+ return TRUE
+
/obj/item/weapon/tool/screwdriver/cyborg
name = "powered screwdriver"
desc = "An electrical screwdriver, designed to be both precise and quick."
diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm
index a47e78bd57..720b0d7b22 100644
--- a/code/game/objects/items/weapons/tools/weldingtool.dm
+++ b/code/game/objects/items/weapons/tools/weldingtool.dm
@@ -436,6 +436,19 @@
nextrefueltick = world.time + 10
reagents.add_reagent("fuel", 1)
+/obj/item/weapon/weldingtool/experimental/hybrid
+ name = "strange welding tool"
+ desc = "An experimental welder capable of synthesizing its own fuel from spatial waveforms. It's like welding with a star!"
+ icon_state = "hybwelder"
+ max_fuel = 20
+ eye_safety_modifier = -2 // Brighter than the sun. Literally, you can look at the sun with a welding mask of proper grade, this will burn through that.
+ slowdown = 0.1
+ toolspeed = 0.25
+ w_class = ITEMSIZE_LARGE
+ flame_intensity = 5
+ origin_tech = list(TECH_ENGINEERING = 5, TECH_PHORON = 4, TECH_PRECURSOR = 1)
+ reach = 2
+
/*
* Backpack Welder.
*/
diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm
index f53225ab41..181c786c4c 100644
--- a/code/game/objects/items/weapons/tools/wirecutters.dm
+++ b/code/game/objects/items/weapons/tools/wirecutters.dm
@@ -73,6 +73,26 @@
usesound = 'sound/items/jaws_cut.ogg'
toolspeed = 0.5
+/obj/item/weapon/tool/wirecutters/hybrid
+ name = "strange wirecutters"
+ desc = "This cuts wires. With Science!"
+ icon_state = "hybcutters"
+ w_class = ITEMSIZE_NORMAL
+ slowdown = 0.1
+ origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_PHORON = 2)
+ attack_verb = list("pinched", "nipped", "warped", "blasted")
+ usesound = 'sound/effects/stealthoff.ogg'
+ toolspeed = 0.4
+ reach = 2
+
+/obj/item/weapon/tool/wirecutters/hybrid/is_wirecutter()
+ if(prob(10))
+ var/turf/T = get_turf(src)
+ radiation_repository.radiate(get_turf(src), 5)
+ T.visible_message("\The [src] shudders!")
+ return FALSE
+ return TRUE
+
/obj/item/weapon/tool/wirecutters/power
name = "jaws of life"
desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head."
diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm
index 7b1ab6a07c..652e32cf75 100644
--- a/code/game/objects/items/weapons/tools/wrench.dm
+++ b/code/game/objects/items/weapons/tools/wrench.dm
@@ -25,6 +25,29 @@
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
+/obj/item/weapon/tool/wrench/hybrid // Slower and bulkier than normal power tools, but it has the power of reach.
+ name = "strange wrench"
+ desc = "A wrench with many common uses. Can be usually found in your hand."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "hybwrench"
+ slot_flags = SLOT_BELT
+ force = 8
+ throwforce = 10
+ w_class = ITEMSIZE_NORMAL
+ slowdown = 0.1
+ origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_PHORON = 2)
+ attack_verb = list("bashed", "battered", "bludgeoned", "whacked", "warped", "blasted")
+ usesound = 'sound/effects/stealthoff.ogg'
+ toolspeed = 0.5
+ reach = 2
+
+/obj/item/weapon/tool/wrench/hybrid/is_wrench()
+ if(prob(10))
+ var/turf/T = get_turf(src)
+ radiation_repository.radiate(get_turf(src), 5)
+ T.visible_message("\The [src] shudders!")
+ return FALSE
+ return TRUE
/datum/category_item/catalogue/anomalous/precursor_a/alien_wrench
name = "Precursor Alpha Object - Fastener Torque Tool"
diff --git a/code/modules/food/drinkingglass/drinkingglass.dm b/code/modules/food/drinkingglass/drinkingglass.dm
index d4c8389a51..604b85665f 100644
--- a/code/modules/food/drinkingglass/drinkingglass.dm
+++ b/code/modules/food/drinkingglass/drinkingglass.dm
@@ -65,7 +65,7 @@
return 1
return 0
-/obj/item/weapon/reagent_containers/food/drinks/glass2/New()
+/obj/item/weapon/reagent_containers/food/drinks/glass2/Initialize()
..()
icon_state = base_icon
diff --git a/code/modules/food/drinkingglass/shaker.dm b/code/modules/food/drinkingglass/shaker.dm
index b653f14c60..3b81c6bdec 100644
--- a/code/modules/food/drinkingglass/shaker.dm
+++ b/code/modules/food/drinkingglass/shaker.dm
@@ -11,7 +11,7 @@
rim_pos = null // no fruit slices
var/lid_color = "black"
-/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/New()
+/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/Initialize()
..()
lid_color = pick("black", "red", "blue")
update_icon()
@@ -23,7 +23,7 @@
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake
name = "protein shake"
-/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake/New()
+/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake/Initialize()
..()
reagents.add_reagent("nutriment", 30)
reagents.add_reagent("iron", 10)
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 2a84b7f844..355e40b362 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -171,9 +171,11 @@
"phoron" = 15,
"silver" = 16,
"gold" = 18,
+ "marble" = 20,
"uranium" = 30,
"diamond" = 50,
"platinum" = 40,
+ "lead" = 40,
"mhydrogen" = 40,
"verdantium" = 60)
diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm
index da97a26873..b54ac6c5f0 100644
--- a/code/modules/mining/ore_datum.dm
+++ b/code/modules/mining/ore_datum.dm
@@ -158,8 +158,8 @@ var/global/list/ore_data = list()
/ore/lead
name = MAT_LEAD
display_name = "lead glance"
- compresses_to = "marble"
- result_amount = 1
- spread_chance = 10
- ore = /obj/item/weapon/ore/marble
- scan_icon = "mineral_rare"
\ No newline at end of file
+ smelts_to = "lead"
+ result_amount = 3
+ spread_chance = 20
+ ore = /obj/item/weapon/ore/lead
+ scan_icon = "mineral_rare"
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index c51eeb3226..987ab3ff68 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1387,7 +1387,7 @@
/mob/living/carbon/human/proc/process_glasses(var/obj/item/clothing/glasses/G)
if(G && G.active)
see_in_dark += G.darkness_view
- if(G.overlay)
+ if(G.overlay && client)
client.screen |= G.overlay
if(G.vision_flags)
sight |= G.vision_flags
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index fae3542f18..fe06438c69 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -904,7 +904,11 @@ default behaviour is:
/mob/living/proc/escape_buckle()
if(buckled)
- buckled.user_unbuckle_mob(src, src)
+ if(istype(buckled, /obj/vehicle))
+ var/obj/vehicle/vehicle = buckled
+ vehicle.unload()
+ else
+ buckled.user_unbuckle_mob(src, src)
/mob/living/proc/resist_grab()
var/resisting = 0
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 5b6909f042..adac86b438 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -299,7 +299,10 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null)
powered_ai = ai
powered_ai.psupply = src
- forceMove(powered_ai.loc)
+ if(istype(powered_ai,/mob/living/silicon/ai/announcer)) //Don't try to get a loc for a nullspace announcer mob, just put it into it
+ forceMove(powered_ai)
+ else
+ forceMove(powered_ai.loc)
..()
use_power(1) // Just incase we need to wake up the power system.
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index ad76cb061f..8628315601 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -144,11 +144,6 @@
charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive)
add_avail(output_used) // add output to powernet (smes side)
-
- if(output_used < 0.0001) // either from no charge or set to 0
- outputting(0)
- investigate_log("lost power and turned off","singulo")
- log_game("SMES([x],[y],[z]) Power depleted.")
else if(output_attempt && output_level > 0)
outputting = 1
else
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index ad79a052de..08427ba027 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -247,7 +247,7 @@
closest_atom = A
closest_dist = dist
- else if(closest_mob)
+ else if(closest_machine)
continue
else if(istype(A, /obj/structure/blob))
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 4121b8a558..4cc755d158 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -32,12 +32,7 @@
if(newdir)
set_dir(newdir)
- if(dir & (dir-1)) // Diagonal. Forwards is *away* from dir, curving to the right.
- forwards = turn(dir, 135)
- backwards = turn(dir, 45)
- else
- forwards = dir
- backwards = turn(dir, 180)
+ update_dir()
if(on)
operating = FORWARDS
@@ -60,6 +55,18 @@
operating = OFF
update()
+/obj/machinery/conveyor/set_dir()
+ .=..()
+ update_dir()
+
+/obj/machinery/conveyor/proc/update_dir()
+ if(!(dir in cardinal)) // Diagonal. Forwards is *away* from dir, curving to the right.
+ forwards = turn(dir, 135)
+ backwards = turn(dir, 45)
+ else
+ forwards = dir
+ backwards = turn(dir, 180)
+
/obj/machinery/conveyor/proc/update()
if(stat & BROKEN)
icon_state = "conveyor-broken"
diff --git a/code/modules/research/designs/precursor.dm b/code/modules/research/designs/precursor.dm
index 41284c64ef..88575e5667 100644
--- a/code/modules/research/designs/precursor.dm
+++ b/code/modules/research/designs/precursor.dm
@@ -13,6 +13,51 @@
desc = initial(I.desc)
..()
+/datum/design/item/precursor/crowbar
+ name = "Hybrid Crowbar"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridcrowbar"
+ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1)
+ materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_GOLD = 250, MAT_URANIUM = 2500)
+ build_path = /obj/item/weapon/tool/crowbar/hybrid
+ sort_string = "PATAC"
+
+/datum/design/item/precursor/wrench
+ name = "Hybrid Wrench"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridwrench"
+ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_PRECURSOR = 1)
+ materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_SILVER = 300, MAT_URANIUM = 2000)
+ build_path = /obj/item/weapon/tool/wrench/hybrid
+ sort_string = "PATAW"
+
+/datum/design/item/precursor/screwdriver
+ name = "Hybrid Screwdriver"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridscrewdriver"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_PRECURSOR = 1)
+ materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_PLASTIC = 8000, MAT_DIAMOND = 2000)
+ build_path = /obj/item/weapon/tool/screwdriver/hybrid
+ sort_string = "PATAS"
+
+/datum/design/item/precursor/wirecutters
+ name = "Hybrid Wirecutters"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridwirecutters"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_PHORON = 2, TECH_PRECURSOR = 1)
+ materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_PLASTIC = 8000, MAT_PHORON = 2750, MAT_DIAMOND = 2000)
+ build_path = /obj/item/weapon/tool/wirecutters/hybrid
+ sort_string = "PATBW"
+
+/datum/design/item/precursor/welder
+ name = "Hybrid Welding Tool"
+ desc = "A tool utilizing cutting edge modern technology, and ancient component designs."
+ id = "hybridwelder"
+ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PHORON = 3, TECH_MAGNET = 5, TECH_PRECURSOR = 1)
+ materials = list(MAT_DURASTEEL = 2000, MAT_MORPHIUM = 3000, MAT_METALHYDROGEN = 4750, MAT_URANIUM = 6000)
+ build_path = /obj/item/weapon/weldingtool/experimental/hybrid
+ sort_string = "PATCW"
+
/datum/design/item/anomaly/AssembleDesignName()
..()
name = "Anomalous prototype ([item_name])"
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index 6f23560d10..87cf6172c1 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index a7d05818bf..f1a46abc1d 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm
index fb695a52a6..490f4eab8e 100644
--- a/maps/~map_system/maps.dm
+++ b/maps/~map_system/maps.dm
@@ -30,6 +30,7 @@ var/list/all_maps = list()
var/list/contact_levels = list() // Z-levels that can be contacted from the station, for eg announcements
var/list/player_levels = list() // Z-levels a character can typically reach
var/list/sealed_levels = list() // Z-levels that don't allow random transit at edge
+ var/list/xenoarch_exempt_levels = list() //Z-levels exempt from xenoarch finds and digsites spawning.
var/list/empty_levels = null // Empty Z-levels that may be used for various things (currently used by bluespace jump)
var/list/map_levels // Z-levels available to various consoles, such as the crew monitor (when that gets coded in). Defaults to station_levels if unset.
@@ -178,6 +179,7 @@ var/list/all_maps = list()
if(flags & MAP_LEVEL_CONTACT) map.contact_levels += z
if(flags & MAP_LEVEL_PLAYER) map.player_levels += z
if(flags & MAP_LEVEL_SEALED) map.sealed_levels += z
+ if(flags & MAP_LEVEL_XENOARCH_EXEMPT) map.xenoarch_exempt_levels += z
if(flags & MAP_LEVEL_EMPTY)
if(!map.empty_levels) map.empty_levels = list()
map.empty_levels += z