diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm
index 639ab4c30bc..8b0a0706d6c 100644
--- a/_maps/map_files/stations/boxstation.dmm
+++ b/_maps/map_files/stations/boxstation.dmm
@@ -23872,10 +23872,11 @@
/turf/simulated/floor/plasteel,
/area/station/public/storage/tools/auxiliary)
"bGa" = (
-/obj/machinery/atmospherics/unary/portables_connector{
- dir = 4
- },
/obj/machinery/light,
+/obj/machinery/atmospherics/binary/pump{
+ dir = 8;
+ name = "Heat Exchange to Port"
+ },
/turf/simulated/floor/plasteel{
icon_state = "whitepurple"
},
@@ -33866,6 +33867,9 @@
},
/area/station/science/toxins/mixing)
"ctQ" = (
+/obj/machinery/atmospherics/unary/portables_connector{
+ dir = 4
+ },
/turf/simulated/floor/plasteel{
icon_state = "whitepurplecorner"
},
@@ -38897,7 +38901,7 @@
/obj/machinery/atmospherics/pipe/simple/visible/yellow{
dir = 10
},
-/obj/structure/lattice,
+/obj/structure/lattice/catwalk,
/turf/space,
/area/space/nearstation)
"cNF" = (
@@ -48445,6 +48449,13 @@
},
/turf/simulated/floor/plating,
/area/station/maintenance/asmaint2)
+"eff" = (
+/obj/machinery/anomaly_refinery,
+/obj/machinery/alarm/directional/east,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/station/science/toxins/launch)
"efk" = (
/obj/structure/rack{
dir = 1
@@ -54066,7 +54077,7 @@
/obj/machinery/atmospherics/pipe/simple/visible/yellow{
dir = 9
},
-/obj/structure/lattice,
+/obj/structure/lattice/catwalk,
/turf/space,
/area/space/nearstation)
"gNX" = (
@@ -62496,8 +62507,8 @@
},
/area/station/maintenance/asmaint2)
"kQX" = (
-/obj/machinery/atmospherics/pipe/simple/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/visible{
+ dir = 1
},
/turf/simulated/floor/plasteel{
icon_state = "white"
@@ -66528,13 +66539,6 @@
icon_state = "white"
},
/area/station/science/toxins/mixing)
-"mMV" = (
-/obj/machinery/atmospherics/pipe/simple/visible/yellow{
- dir = 10
- },
-/obj/structure/lattice/catwalk,
-/turf/space,
-/area/space/nearstation)
"mNd" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -70725,15 +70729,6 @@
},
/turf/simulated/floor/plating,
/area/station/maintenance/fore)
-"oND" = (
-/obj/machinery/atmospherics/binary/pump{
- dir = 8;
- name = "Heat Exchange to Port"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "whitepurple"
- },
-/area/station/science/toxins/mixing)
"oNH" = (
/obj/structure/cable,
/obj/effect/spawner/window/reinforced/polarized/grilled{
@@ -76601,6 +76596,7 @@
/obj/item/storage/toolbox/mechanical,
/obj/structure/table/reinforced,
/obj/machinery/requests_console/directional/south,
+/obj/item/raw_anomaly_core,
/turf/simulated/floor/plasteel{
icon_state = "darkpurple"
},
@@ -78011,12 +78007,6 @@
},
/turf/simulated/floor/plasteel,
/area/station/hallway/primary/central/south)
-"ska" = (
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "whitepurple"
- },
-/area/station/science/toxins/mixing)
"skb" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -80736,8 +80726,8 @@
/turf/simulated/floor/plasteel,
/area/station/engineering/transmission_laser)
"tHH" = (
-/obj/machinery/atmospherics/pipe/manifold/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/visible{
+ dir = 9
},
/turf/simulated/floor/plasteel{
icon_state = "white"
@@ -84462,7 +84452,6 @@
network = list("Toxins");
pixel_x = 32
},
-/obj/machinery/alarm/directional/north,
/turf/simulated/floor/plasteel{
dir = 5;
icon_state = "darkpurple"
@@ -84798,13 +84787,6 @@
icon_state = "white"
},
/area/station/science/xenobiology)
-"vJx" = (
-/obj/machinery/atmospherics/pipe/simple/visible/yellow{
- dir = 9
- },
-/obj/structure/lattice/catwalk,
-/turf/space,
-/area/space/nearstation)
"vJN" = (
/obj/machinery/atmospherics/pipe/simple/hidden/cyan{
dir = 4
@@ -85719,6 +85701,13 @@
icon_state = "caution"
},
/area/station/public/dorms)
+"wfZ" = (
+/obj/machinery/atmospherics/pipe/simple/visible/yellow{
+ dir = 9
+ },
+/obj/structure/lattice,
+/turf/space,
+/area/space/nearstation)
"wgt" = (
/obj/structure/table/wood,
/obj/item/ashtray/glass,
@@ -89212,6 +89201,13 @@
},
/turf/simulated/floor/plating,
/area/station/maintenance/abandonedservers)
+"xPT" = (
+/obj/machinery/atmospherics/pipe/simple/visible/yellow{
+ dir = 10
+ },
+/obj/structure/lattice,
+/turf/space,
+/area/space/nearstation)
"xQB" = (
/obj/effect/spawner/window/reinforced/tinted,
/obj/structure/disposalpipe/segment{
@@ -126269,7 +126265,7 @@ aab
cQp
aab
cZh
-mMV
+cNE
dba
djE
dcS
@@ -126281,7 +126277,7 @@ djE
djE
djE
djE
-vJx
+gNQ
aab
aab
aab
@@ -127573,7 +127569,7 @@ igi
igi
igi
igi
-gNQ
+wfZ
fPY
wyD
wyD
@@ -127802,7 +127798,7 @@ cep
cjq
cep
cxO
-cNE
+xPT
igi
igi
igi
@@ -127820,7 +127816,7 @@ igi
igi
igi
igi
-gNQ
+wfZ
dgS
eQU
eQU
@@ -143714,7 +143710,7 @@ nTk
cmB
vXo
kQX
-oND
+vjd
fDJ
ioU
tPX
@@ -143971,7 +143967,7 @@ plq
cmB
wdE
tHH
-vjd
+fDJ
fDJ
kCd
ros
@@ -144228,8 +144224,8 @@ lVB
cmB
cWN
vSI
-ska
fDJ
+eff
vyQ
xEf
jRM
@@ -144485,7 +144481,7 @@ bES
fUW
fqQ
fqQ
-fqQ
+fDJ
fDJ
wan
wan
diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm
index 90fe833660d..97fa8e5e889 100644
--- a/_maps/map_files/stations/cerestation.dmm
+++ b/_maps/map_files/stations/cerestation.dmm
@@ -4716,6 +4716,7 @@
},
/obj/structure/table/reinforced,
/obj/item/paper_bin,
+/obj/item/raw_anomaly_core,
/turf/simulated/floor/plasteel{
icon_state = "white"
},
@@ -117736,6 +117737,7 @@
/area/station/engineering/atmos)
"xyC" = (
/obj/machinery/firealarm/directional/east,
+/obj/machinery/anomaly_refinery,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "darkpurple"
diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm
index c39d3cedc0d..8b7f6e36f3c 100644
--- a/_maps/map_files/stations/deltastation.dmm
+++ b/_maps/map_files/stations/deltastation.dmm
@@ -10908,15 +10908,6 @@
},
/turf/simulated/floor/wood,
/area/station/service/theatre)
-"aSj" = (
-/obj/machinery/flasher{
- id = "Execution";
- pixel_y = -27
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/station/security/execution)
"aSp" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -48433,6 +48424,7 @@
pixel_x = -5;
pixel_y = 5
},
+/obj/item/raw_anomaly_core,
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "darkpurple"
@@ -54609,6 +54601,14 @@
},
/turf/simulated/floor/plating,
/area/station/maintenance/fsmaint)
+"fAd" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/station/security/execution)
"fAB" = (
/obj/structure/cable/extra_insulated{
icon_state = "1-2"
@@ -56605,6 +56605,10 @@
icon_state = "neutral"
},
/area/station/maintenance/starboard)
+"gqm" = (
+/obj/structure/closet/secure_closet/scientist,
+/turf/simulated/floor/plasteel/white,
+/area/station/science/toxins/mixing)
"gqo" = (
/obj/machinery/door/airlock/security/glass,
/obj/machinery/door/firedoor,
@@ -59735,12 +59739,11 @@
/area/station/engineering/control)
"hMa" = (
/obj/machinery/power/apc/critical/directional/north,
-/obj/machinery/firealarm/directional/east,
/obj/structure/cable{
icon_state = "0-2"
},
/turf/simulated/floor/plasteel{
- dir = 5;
+ dir = 1;
icon_state = "darkpurple"
},
/area/station/science/toxins/launch)
@@ -69485,6 +69488,12 @@
},
/turf/simulated/floor/plasteel/white,
/area/station/medical/medbay)
+"lYy" = (
+/obj/machinery/atmospherics/unary/portables_connector{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel/white,
+/area/station/science/toxins/mixing)
"lYz" = (
/obj/structure/sign/poster/contraband/random/directional/north,
/turf/simulated/floor/plating,
@@ -69629,7 +69638,7 @@
c_tag = "Research Toxin Mixing Fore";
network = list("Research","SS13")
},
-/obj/structure/closet/secure_closet/scientist,
+/obj/machinery/atmospherics/unary/thermomachine/freezer,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "whitepurple"
@@ -72950,6 +72959,16 @@
/obj/effect/spawner/random/blood,
/turf/simulated/floor/plasteel/dark,
/area/station/maintenance/apmaint)
+"nwt" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkpurple"
+ },
+/area/station/science/toxins/launch)
"nwu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -74143,6 +74162,14 @@
name = "reinforced stairs"
},
/area/station/science/test_chamber)
+"nXG" = (
+/obj/machinery/firealarm/directional/east,
+/obj/machinery/anomaly_refinery,
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkpurple"
+ },
+/area/station/science/toxins/launch)
"nXN" = (
/obj/machinery/light{
dir = 4
@@ -75790,6 +75817,15 @@
icon_state = "tranquillite"
},
/area/station/service/kitchen)
+"oHl" = (
+/obj/machinery/flasher{
+ id = "Execution";
+ pixel_y = -27
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/station/security/execution)
"oHv" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -76217,15 +76253,6 @@
},
/turf/simulated/floor/plasteel,
/area/station/engineering/transmission_laser)
-"oQB" = (
-/obj/machinery/atmospherics/unary/thermomachine/freezer{
- dir = 4
- },
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "whitepurple"
- },
-/area/station/science/toxins/mixing)
"oQO" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -77421,15 +77448,10 @@
/turf/simulated/floor/wood,
/area/station/maintenance/fore)
"pqB" = (
-/obj/machinery/disposal,
/obj/structure/disposalpipe/trunk,
-/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal,
-/obj/machinery/light{
- dir = 4
- },
+/obj/machinery/disposal,
/turf/simulated/floor/plasteel{
- dir = 6;
icon_state = "darkpurple"
},
/area/station/science/toxins/launch)
@@ -79872,14 +79894,6 @@
icon_state = "caution"
},
/area/station/public/fitness)
-"quz" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 10
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/station/security/execution)
"quL" = (
/obj/item/kirbyplants/large,
/obj/machinery/light,
@@ -80824,7 +80838,7 @@
},
/area/station/hallway/secondary/entry/north)
"qQx" = (
-/obj/structure/closet/secure_closet/scientist,
+/obj/machinery/atmospherics/unary/thermomachine/heater,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "whitepurple"
@@ -82780,15 +82794,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/wood,
/area/station/security/detective)
-"rCo" = (
-/obj/machinery/atmospherics/unary/thermomachine/heater{
- dir = 4
- },
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "whitepurple"
- },
-/area/station/science/toxins/mixing)
"rCv" = (
/obj/item/kirbyplants/large{
icon_state = "plant-18"
@@ -84254,9 +84259,6 @@
/turf/simulated/floor/plasteel/dark,
/area/station/turret_protected/ai_upload)
"sfD" = (
-/obj/machinery/door/airlock/research,
-/obj/effect/mapping_helpers/airlock/autoname,
-/obj/effect/mapping_helpers/airlock/access/all/science/tox,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
@@ -84266,9 +84268,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/machinery/door/firedoor/heavy,
/turf/simulated/floor/plasteel{
- icon_state = "darkpurplefull"
+ dir = 4;
+ icon_state = "darkpurple"
},
/area/station/science/toxins/launch)
"sgd" = (
@@ -84902,12 +84904,6 @@
},
/turf/simulated/floor/plating,
/area/station/maintenance/port)
-"sqF" = (
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "whitepurple"
- },
-/area/station/science/toxins/mixing)
"sqI" = (
/obj/machinery/recharger/wallcharger{
pixel_y = 25
@@ -86223,14 +86219,6 @@
icon_state = "redyellowfull"
},
/area/station/medical/break_room)
-"sSH" = (
-/obj/structure/closet/bombcloset,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 9;
- icon_state = "whitepurple"
- },
-/area/station/science/toxins/mixing)
"sSX" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/cable{
@@ -87059,8 +87047,7 @@
dir = 4
},
/turf/simulated/floor/plasteel{
- dir = 4;
- icon_state = "darkpurple"
+ icon_state = "dark"
},
/area/station/science/toxins/launch)
"tiC" = (
@@ -89965,11 +89952,15 @@
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/door/airlock/research,
+/obj/effect/mapping_helpers/airlock/access/all/science/tox,
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/machinery/door/firedoor/heavy,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "whitepurple"
},
-/area/station/science/toxins/mixing)
+/area/station/science/toxins/launch)
"uos" = (
/obj/structure/table/reinforced,
/obj/item/assembly/prox_sensor{
@@ -93815,6 +93806,10 @@
icon_state = "neutralcorner"
},
/area/station/hallway/primary/starboard/south)
+"vTZ" = (
+/obj/structure/closet/bombcloset,
+/turf/simulated/floor/plasteel/white,
+/area/station/science/toxins/mixing)
"vUx" = (
/obj/effect/spawner/random/blood/maybe,
/obj/structure/cable/extra_insulated{
@@ -127982,9 +127977,9 @@ xlH
hvg
bDp
gQW
-gQW
+nXG
sfD
-gKj
+nwt
gQW
gQW
dkI
@@ -128238,12 +128233,12 @@ drn
dhG
drn
drn
-dkI
-sSH
+gQW
+gQW
uoa
-sqF
-oQB
-rCo
+gKj
+gQW
+dkI
wVZ
noF
ogw
@@ -128498,9 +128493,9 @@ cIS
dkI
kdm
jqA
-dyz
-oba
-oba
+vTZ
+gqm
+gqm
eaO
gHc
kVI
@@ -129011,7 +129006,7 @@ xFq
drn
dkI
qQx
-dyz
+lYy
dyz
nWB
dyz
@@ -129268,7 +129263,7 @@ tIK
dhG
dkI
mcg
-dyz
+lYy
dyz
nWB
dyz
@@ -156944,7 +156939,7 @@ eud
jbp
uNJ
vzV
-aSj
+oHl
aMv
aaa
aaa
@@ -157200,7 +157195,7 @@ vyc
hof
tvQ
bdf
-quz
+fAd
oRB
aMv
aaa
diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm
index fa9a1231cf1..298b8b07905 100644
--- a/_maps/map_files/stations/emeraldstation.dmm
+++ b/_maps/map_files/stations/emeraldstation.dmm
@@ -74714,10 +74714,10 @@
/turf/space,
/area/space)
"oFZ" = (
-/obj/machinery/firealarm/directional/west,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
+/obj/machinery/anomaly_refinery,
/turf/simulated/floor/plasteel,
/area/station/science/toxins/launch)
"oGg" = (
@@ -96090,6 +96090,7 @@
name = "west bump";
pixel_x = -28
},
+/obj/item/raw_anomaly_core,
/turf/simulated/floor/plasteel{
dir = 9;
icon_state = "whitepurple"
@@ -123448,6 +123449,10 @@
icon_state = "dark"
},
/area/station/aisat/service)
+"yhM" = (
+/obj/machinery/firealarm/directional/north,
+/turf/simulated/floor/plasteel,
+/area/station/science/toxins/launch)
"yhR" = (
/obj/machinery/door/window/classic/normal{
dir = 8;
@@ -176759,7 +176764,7 @@ bJV
dKU
tyE
dtw
-qPL
+yhM
xrQ
dxp
lwp
diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm
index 47a3a013ae3..1a5cd55abce 100644
--- a/_maps/map_files/stations/metastation.dmm
+++ b/_maps/map_files/stations/metastation.dmm
@@ -72496,9 +72496,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/item/paper_bin,
-/obj/item/pen,
-/obj/structure/table/reinforced,
+/obj/machinery/anomaly_refinery,
/turf/simulated/floor/plasteel{
dir = 6;
icon_state = "darkpurple"
@@ -72613,6 +72611,7 @@
"rAG" = (
/obj/structure/table/reinforced,
/obj/item/storage/toolbox/mechanical,
+/obj/item/raw_anomaly_core,
/turf/simulated/floor/plasteel{
icon_state = "darkpurple"
},
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index fe2ea2e6575..37e66ca974a 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -10,6 +10,8 @@
var/explosion_target
var/datum/tech/toxins/toxins_tech
var/max_toxins_tech = 7
+ /// List of linked machines
+ var/list/linked_machines = list()
/datum/explosion_log
var/logged_time
@@ -49,6 +51,16 @@
return
update_icon(UPDATE_ICON_STATE)
+/obj/machinery/doppler_array/multitool_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!I.multitool_check_buffer(user))
+ return
+ var/obj/item/multitool/multi = I
+ multi.set_multitool_buffer(user, src)
+ to_chat(user, "You save [src]'s linking data to the buffer.")
+
/obj/machinery/doppler_array/attack_hand(mob/user)
if(..())
return
@@ -148,6 +160,8 @@
messages += "Toxins technology level upgraded to [toxins_tech.level]. Swipe a technology disk to save data."
for(var/message in messages)
atom_say(message)
+ for(var/obj/machinery/anomaly_refinery/anom_refiner in linked_machines)
+ anom_refiner.refine_core(orig_light_range)
/obj/machinery/doppler_array/update_icon_state()
if(stat & BROKEN)
diff --git a/code/game/machinery/machine_frame.dm b/code/game/machinery/machine_frame.dm
index 87428392a0b..872f5ca1f62 100644
--- a/code/game/machinery/machine_frame.dm
+++ b/code/game/machinery/machine_frame.dm
@@ -1018,6 +1018,18 @@ to destroy them and players will be able to make replacements.
/obj/item/stock_parts/cell = 1,
/obj/item/stock_parts/manipulator = 1)
+/obj/item/circuitboard/anomaly_refinery
+ board_name = "Anomaly Refinery"
+ icon_state = "science"
+ build_path = /obj/machinery/anomaly_refinery
+ board_type = "machine"
+ origin_tech = "programming=4;engineering=4;"
+ req_components = list(
+ /obj/item/stock_parts/scanning_module = 1,
+ /obj/item/stack/sheet/glass = 1,
+ /obj/item/stack/cable_coil = 2
+ )
+
// Telecomms circuit boards:
/obj/item/circuitboard/tcomms/relay
board_name = "Telecommunications Relay"
diff --git a/code/modules/research/anomaly/anomaly.dm b/code/modules/research/anomaly/anomaly.dm
index 47158e2a5e6..a36196fb6a2 100644
--- a/code/modules/research/anomaly/anomaly.dm
+++ b/code/modules/research/anomaly/anomaly.dm
@@ -68,6 +68,17 @@
new A(loc)
qdel(src)
+/obj/item/raw_anomaly_core
+ name = "unrefined anomaly core"
+ desc = "The raw core of an unknown anomaly. It glimmers with potential."
+ icon_state = "unrefined_anomaly_core"
+ w_class = WEIGHT_CLASS_SMALL
+ var/target_explosion_size = 4
+
+/obj/item/raw_anomaly_core/Initialize(mapload)
+ . = ..()
+ target_explosion_size = rand(4, 20)
+
/obj/item/reactive_armour_shell
name = "reactive armour shell"
desc = "An experimental suit of armour, awaiting installation of an anomaly core."
diff --git a/code/modules/research/anomaly/anomaly_refiner.dm b/code/modules/research/anomaly/anomaly_refiner.dm
new file mode 100644
index 00000000000..592b4e3d123
--- /dev/null
+++ b/code/modules/research/anomaly/anomaly_refiner.dm
@@ -0,0 +1,119 @@
+/obj/machinery/anomaly_refinery
+ name = "anomaly refinery"
+ desc = "An advanced machine capable of implosion-compressing raw anomaly cores into finished artifacts. Also equipped with state of the art anomaly-analysis software."
+ icon = 'icons/obj/machines/research.dmi'
+ base_icon_state = "explosive_compressor"
+ icon_state = "explosive_compressor"
+ density = TRUE
+
+ /// The raw core inserted in the machine.
+ var/obj/item/raw_anomaly_core/inserted_core
+ /// The refined core produced by the machine
+ var/obj/item/assembly/signaler/anomaly/refined_core
+ /// The message produced by the explosive compressor at the end of the compression test.
+ var/test_status = ""
+ /// Linked tachyon-doppler array
+ var/obj/machinery/doppler_array/linked_doppler
+
+/obj/machinery/anomaly_refinery/Initialize(mapload)
+ . = ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/anomaly_refinery(src)
+ component_parts += new /obj/item/stock_parts/scanning_module(src)
+ component_parts += new /obj/item/stack/sheet/glass(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 2)
+ RefreshParts()
+ // Try to link to tachyon-doppler array on initialize. Link to the first doppler it can find.
+ for(var/obj/machinery/doppler_array/doppler in view(3, src))
+ linked_doppler = doppler
+ linked_doppler.linked_machines |= src
+ return
+
+/obj/machinery/anomaly_refinery/examine(mob/user)
+ . = ..()
+ if(inserted_core)
+ . += "There is [inserted_core] in [src]."
+ . += "[inserted_core]'s causality point corresponds to an explosive of size [inserted_core.target_explosion_size]."
+ if(refined_core)
+ . += "There is a [refined_core] in [src]."
+
+/obj/machinery/anomaly_refinery/item_interaction(mob/living/user, obj/item/used, list/modifiers)
+ if(!istype(used, /obj/item/raw_anomaly_core))
+ return ..()
+ if(refined_core)
+ to_chat(user, "There is already a core in [src]!")
+ return ITEM_INTERACT_COMPLETE
+ if(used.flags & NODROP || !user.drop_item() || !used.forceMove(src))
+ to_chat(user, "[used] is stuck to your hand!")
+ return ITEM_INTERACT_COMPLETE
+ inserted_core = used
+ to_chat(user, "You insert [used] into [src].")
+ atom_say("Analyzing... [inserted_core]'s causality point corresponds to an explosive of size [inserted_core.target_explosion_size].")
+ return ITEM_INTERACT_COMPLETE
+
+/obj/machinery/anomaly_refinery/attack_hand(mob/user)
+ if(..())
+ return
+ add_fingerprint(user)
+ if(refined_core)
+ user.put_in_active_hand(refined_core)
+ refined_core = null
+ return
+ if(inserted_core)
+ user.put_in_active_hand(inserted_core)
+ inserted_core = null
+ return
+
+/obj/machinery/anomaly_refinery/screwdriver_act(mob/user, obj/item/I)
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ . = TRUE
+ default_deconstruction_screwdriver(user, icon_state, icon_state, I)
+
+/obj/machinery/anomaly_refinery/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/anomaly_refinery/multitool_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!I.multitool_check_buffer(user))
+ return
+ if(panel_open)
+ var/obj/item/multitool/multi = I
+ if(!istype(multi.buffer, /obj/machinery/doppler_array))
+ to_chat(user, "You cannot link [multi.buffer] to [src]!")
+ return
+ linked_doppler = multi.buffer
+ linked_doppler.linked_machines |= src
+ to_chat(user, "You link [multi.buffer] to [src].")
+
+/obj/machinery/anomaly_refinery/proc/refine_core(explosion_size)
+ if(!inserted_core)
+ return
+ if(inserted_core.target_explosion_size != explosion_size)
+ atom_say("Temporal displacement detected. Criticality status: FAILURE.")
+ return
+ inserted_core = null
+ if(emagged)
+ atom_say("Temporal displacement detected. Criticality status: SUCCESS.")
+ atom_say("ERROR: CONTAINMENT STATUS - NONFUNCTIONAL.")
+ var/list/types = list(/obj/effect/anomaly/flux, /obj/effect/anomaly/cryo, /obj/effect/anomaly/grav, /obj/effect/anomaly/pyro, /obj/effect/anomaly/bluespace, /obj/effect/anomaly/bhole)
+ var/released_anomaly = pick(types)
+ new released_anomaly(get_turf(src))
+ return
+ var/list/types = list(/obj/item/assembly/signaler/anomaly/pyro,
+ /obj/item/assembly/signaler/anomaly/cryo,
+ /obj/item/assembly/signaler/anomaly/grav,
+ /obj/item/assembly/signaler/anomaly/flux,
+ /obj/item/assembly/signaler/anomaly/bluespace,
+ /obj/item/assembly/signaler/anomaly/vortex)
+ var/A = pick(types)
+ refined_core = new A(src)
+ atom_say("Temporal displacement detected. Criticality status: SUCCESS.")
+
+/obj/machinery/anomaly_refinery/emag_act(mob/user)
+ . = ..()
+ emagged = TRUE
+ atom_say("ERROR: CONTAINMENT STATUS - NONFUNCTIONAL.")
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 1ba1ae3f03d..f93823699de 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -311,6 +311,16 @@
build_path = /obj/item/circuitboard/cyborgrecharger
category = list("Research Machinery")
+/datum/design/anomaly_refinery
+ name = "Machine Board (Anomaly Refinery)"
+ desc = "The circuit board for an Anomaly Refinery."
+ id = "anomalyrefinery"
+ req_tech = list("powerstorage" = 5, "engineering" = 5, "toxins" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000)
+ build_path = /obj/item/circuitboard/anomaly_refinery
+ category = list("Research Machinery")
+
/datum/design/scientific_analyzer
name = "Machine Board (Scientific Analyzer)"
desc = "The circuit board for a Scientific Analyzer."
diff --git a/code/modules/supply/supply_packs/pack_science.dm b/code/modules/supply/supply_packs/pack_science.dm
index 0f6149c2753..a12b3825482 100644
--- a/code/modules/supply/supply_packs/pack_science.dm
+++ b/code/modules/supply/supply_packs/pack_science.dm
@@ -121,6 +121,14 @@
containername = "machine prototype crate"
access = ACCESS_RESEARCH
+/datum/supply_packs/science/raw_anomaly_core
+ name = "Raw Anomaly Core Crate"
+ contains = list(/obj/item/raw_anomaly_core)
+ cost = 2000
+ containertype = /obj/structure/closet/crate/secure/scisec
+ containername = "raw anomaly core crate"
+ access = ACCESS_RESEARCH
+
/datum/supply_packs/science/oil
name = "Oil Tank Crate"
contains = list(/obj/structure/reagent_dispensers/oil,
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 8e70528a470..01e2f5530dd 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi
index 58499d761bc..8b6a07f2e9a 100644
Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 67ff14b803f..553f0cd42d0 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -3053,6 +3053,7 @@
#include "code\modules\research\server.dm"
#include "code\modules\research\strange_objects.dm"
#include "code\modules\research\anomaly\anomaly.dm"
+#include "code\modules\research\anomaly\anomaly_refiner.dm"
#include "code\modules\research\designs\AI_module_designs.dm"
#include "code\modules\research\designs\autolathe_designs.dm"
#include "code\modules\research\designs\biogenerator_designs.dm"