diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
new file mode 100644
index 0000000000..4e28a370f7
--- /dev/null
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -0,0 +1,46 @@
+/obj/effect/temp_visual/decoy
+ desc = "It's a decoy!"
+ duration = 15
+
+/obj/effect/temp_visual/decoy/initialize(mapload, atom/mimiced_atom, var/customappearance)
+ . = ..()
+ alpha = initial(alpha)
+ if(mimiced_atom)
+ name = mimiced_atom.name
+ appearance = mimiced_atom.appearance
+ set_dir(mimiced_atom.dir)
+ mouse_opacity = 0
+ if(customappearance)
+ appearance = customappearance
+
+/obj/effect/temp_visual/decoy/fading/initialize(mapload, atom/mimiced_atom)
+ . = ..()
+ animate(src, alpha = 0, time = duration)
+
+/obj/effect/temp_visual/decoy/fading/fivesecond
+ duration = 50
+
+/obj/effect/temp_visual/small_smoke
+ icon_state = "smoke"
+ duration = 50
+
+// VOREStation Add - Used by Kinetic Accelerator
+/obj/effect/temp_visual/kinetic_blast
+ name = "kinetic explosion"
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "kinetic_blast"
+ layer = ABOVE_MOB_LAYER
+ duration = 4
+
+/obj/effect/temp_visual/explosion
+ name = "explosion"
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "explosion"
+ pixel_x = -32
+ pixel_y = -32
+ duration = 8
+
+/obj/effect/temp_visual/explosion/fast
+ icon_state = "explosionfast"
+ duration = 4
+// VOREStation Add End
diff --git a/code/game/objects/effects/temporary_visuals/temproary_visual.dm b/code/game/objects/effects/temporary_visuals/temproary_visual.dm
new file mode 100644
index 0000000000..79a8797bae
--- /dev/null
+++ b/code/game/objects/effects/temporary_visuals/temproary_visual.dm
@@ -0,0 +1,36 @@
+//temporary visual effects
+/obj/effect/temp_visual
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "nothing"
+ anchored = TRUE
+ layer = ABOVE_MOB_LAYER
+ mouse_opacity = 0
+ var/duration = 10 //in deciseconds
+ var/randomdir = TRUE
+
+/obj/effect/temp_visual/initialize()
+ . = ..()
+ if(randomdir)
+ set_dir(pick(cardinal))
+
+ spawn(duration)
+ qdel(src)
+
+/obj/effect/temp_visual/singularity_act()
+ return
+
+/obj/effect/temp_visual/singularity_pull()
+ return
+
+/obj/effect/temp_visual/ex_act()
+ return
+
+/*
+/obj/effect/temp_visual/dir_setting
+ randomdir = FALSE
+
+/obj/effect/temp_visual/dir_setting/Initialize(mapload, set_dir)
+ if(set_dir)
+ setDir(set_dir)
+ . = ..()
+*/ //More tg stuff that might be useful later
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 4a80379c16..0c9daee64d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -111,6 +111,13 @@
src.loc = null
return ..()
+// Check if target is reasonable for us to operate on.
+/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
+ if(((src in target) && !target_self) || ((!istype(target.loc, /turf)) && (!istype(target, /turf)) && (not_inside)))
+ return FALSE
+ else
+ return TRUE
+
/obj/item/proc/update_twohanding()
update_held_icon()
diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm
index d3d8b4d1a6..f3d6c7040b 100644
--- a/code/game/objects/items/weapons/id cards/station_ids.dm
+++ b/code/game/objects/items/weapons/id cards/station_ids.dm
@@ -30,6 +30,8 @@
var/rank = null //actual job
var/dorm = 0 // determines if this ID has claimed a dorm already
+ var/mining_points = 0 // For redeeming at mining equipment vendors
+
/obj/item/weapon/card/id/examine(mob/user)
set src in oview(1)
if(in_range(usr, src))
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 03568205c8..5110589942 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -11,6 +11,8 @@
density = TRUE
anchored = TRUE
+ var/obj/item/weapon/card/id/inserted_id // Inserted ID card, for points
+
var/obj/machinery/mineral/processing_unit/machine = null
var/show_all_ores = FALSE
@@ -23,11 +25,27 @@
log_debug("Ore processing machine console at [src.x], [src.y], [src.z] could not find its machine!")
qdel(src)
+/obj/machinery/mineral/processing_unit_console/Destroy()
+ if(inserted_id)
+ inserted_id.forceMove(loc) //Prevents deconstructing from deleting whatever ID was inside it.
+ . = ..()
+
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
if(..())
return
interact(user)
+/obj/machinery/mineral/processing_unit_console/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I, /obj/item/weapon/card/id))
+ if(!powered())
+ return
+ if(!inserted_id && user.unEquip(I))
+ I.forceMove(src)
+ inserted_id = I
+ interact(user)
+ return
+ ..()
+
/obj/machinery/mineral/processing_unit_console/interact(mob/user)
if(..())
return
@@ -40,6 +58,13 @@
var/dat = "
Ore processor console
"
+ dat += "Current unclaimed points: [machine.points]
"
+ if(istype(inserted_id))
+ dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
"
+ dat += "Claim points.
"
+ else
+ dat += "No ID inserted. Insert ID.
"
+
dat += "
"
for(var/ore in machine.ores_processing)
@@ -96,6 +121,26 @@
show_all_ores = !show_all_ores
+ if(href_list["choice"])
+ if(istype(inserted_id))
+ if(href_list["choice"] == "eject")
+ usr.put_in_hands(inserted_id)
+ inserted_id = null
+ if(href_list["choice"] == "claim")
+ if(access_mining_station in inserted_id.access)
+ inserted_id.mining_points += machine.points
+ machine.points = 0
+ else
+ to_chat(usr, "Required access not found.")
+ else if(href_list["choice"] == "insert")
+ var/obj/item/weapon/card/id/I = usr.get_active_hand()
+ if(istype(I))
+ usr.drop_item()
+ I.forceMove(src)
+ inserted_id = I
+ else
+ to_chat(usr, "No valid ID.")
+
src.updateUsrDialog()
return
@@ -118,6 +163,19 @@
var/static/list/alloy_data
var/active = FALSE
+ var/points = 0
+ var/static/list/ore_values = list(
+ "sand" = 1,
+ "hematite" = 1,
+ "carbon" = 1,
+ "phoron" = 15,
+ "silver" = 16,
+ "gold" = 18,
+ "uranium" = 30,
+ "diamond" = 50,
+ "platinum" = 40,
+ "mhydrogen" = 40)
+
/obj/machinery/mineral/processing_unit/New()
..()
// initialize static alloy_data list
@@ -148,7 +206,11 @@
/obj/machinery/mineral/processing_unit/process()
- if (!src.output || !src.input) return
+ if (!src.output || !src.input)
+ return
+
+ if(panel_open || !powered())
+ return
var/list/tick_alloys = list()
@@ -158,7 +220,7 @@
if(!O) break
if(!isnull(ores_stored[O.material]))
ores_stored[O.material]++
-
+ points += ore_values[O.material] // Give Points!
qdel(O)
if(!active)
diff --git a/code/modules/mining/ore_redemption_machine/construction.dm b/code/modules/mining/ore_redemption_machine/construction.dm
new file mode 100644
index 0000000000..dbf8a96ffb
--- /dev/null
+++ b/code/modules/mining/ore_redemption_machine/construction.dm
@@ -0,0 +1,12 @@
+#ifndef T_BOARD
+#error T_BOARD macro is not defined but we need it!
+#endif
+
+/obj/item/weapon/circuitboard/mining_equipment_vendor
+ name = T_BOARD("Mining Equipment Vendor")
+ board_type = new /datum/frame/frame_types/machine
+ build_path = /obj/machinery/mineral/equipment_vendor
+ origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 3)
+ req_components = list(
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 3)
diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
new file mode 100644
index 0000000000..7fc84592ba
--- /dev/null
+++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
@@ -0,0 +1,185 @@
+/**********************Mining Equipment Locker**************************/
+
+/obj/machinery/mineral/equipment_vendor
+ name = "mining equipment vendor"
+ desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here."
+ icon = 'icons/obj/machines/mining_machines.dmi'
+ icon_state = "mining"
+ density = TRUE
+ anchored = TRUE
+ circuit = /obj/item/weapon/circuitboard/mining_equipment_vendor
+ var/icon_deny = "mining-deny"
+ var/obj/item/weapon/card/id/inserted_id
+ var/list/prize_list = list(
+ new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
+ new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
+ new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
+ new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 125),
+ new /datum/data/mining_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe, 125),
+ new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/smokable/cigarette/cigar/havana, 150),
+ new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 200),
+ new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 900),
+ new /datum/data/mining_equipment("Plush Toy", /obj/random/plushie, 300),
+// new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 500),
+ new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
+// new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1200),
+ new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1200),
+// new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 2000),
+// new /datum/data/mining_equipment("Industrial Hardsuit - Control Module", /obj/item/weapon/rig/industrial, 2000),
+// new /datum/data/mining_equipment("Industrial Hardsuit - Plasma Cutter", /obj/item/rig_module/device/plasmacutter, 800),
+// new /datum/data/mining_equipment("Industrial Hardsuit - Drill", /obj/item/rig_module/device/drill, 2000),
+// new /datum/data/mining_equipment("Industrial Hardsuit - Ore Scanner", /obj/item/rig_module/device/orescanner, 1000),
+// new /datum/data/mining_equipment("Industrial Hardsuit - Material Scanner", /obj/item/rig_module/vision/material, 500),
+// new /datum/data/mining_equipment("Industrial Hardsuit - Maneuvering Jets", /obj/item/rig_module/maneuvering_jets, 1250),
+// new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
+ )
+
+/datum/data/mining_equipment
+ var/equipment_name = "generic"
+ var/equipment_path = null
+ var/cost = 0
+
+/datum/data/mining_equipment/New(name, path, cost)
+ src.equipment_name = name
+ src.equipment_path = path
+ src.cost = cost
+
+/obj/machinery/power/quantumpad/initialize()
+ . = ..()
+ default_apply_parts()
+
+/obj/machinery/mineral/equipment_vendor/power_change()
+ var/old_stat = stat
+ ..()
+ if(old_stat != stat)
+ update_icon()
+ if(inserted_id && !powered())
+ visible_message("The ID slot indicator light flickers on \the [src] as it spits out a card before powering down.")
+ inserted_id.forceMove(get_turf(src))
+
+/obj/machinery/mineral/equipment_vendor/update_icon()
+ if(panel_open)
+ icon_state = "[initial(icon_state)]-open"
+ else if(powered())
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-off"
+
+/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user)
+ if(..())
+ return
+ interact(user)
+
+/obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/mineral/equipment_vendor/interact(mob/user)
+ user.set_machine(src)
+
+ var/dat
+ dat +=""
+ if(istype(inserted_id))
+ dat += "You have [inserted_id.mining_points] mining points collected.
Eject ID."
+ else
+ dat += "No ID inserted.
Insert ID."
+ dat += "
"
+ dat += "
Equipment point cost list:
"
+ for(var/datum/data/mining_equipment/prize in prize_list)
+ dat += "| [prize.equipment_name] | [prize.cost] | Purchase |
"
+ dat += "
"
+ var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 600)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/machinery/mineral/equipment_vendor/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["choice"])
+ if(istype(inserted_id))
+ if(href_list["choice"] == "eject")
+ to_chat(usr, "You eject the ID from [src]'s card slot.")
+ usr.put_in_hands(inserted_id)
+ inserted_id = null
+ else if(href_list["choice"] == "insert")
+ var/obj/item/weapon/card/id/I = usr.get_active_hand()
+ if(istype(I) && !inserted_id && usr.unEquip(I))
+ I.forceMove(src)
+ inserted_id = I
+ interact(usr)
+ to_chat(usr, "You insert the ID into [src]'s card slot.")
+ else
+ to_chat(usr, "No valid ID.")
+ flick(icon_deny, src)
+
+ if(href_list["purchase"])
+ if(istype(inserted_id))
+ var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
+ if (!prize || !(prize in prize_list))
+ to_chat(usr, "Error: Invalid choice!")
+ flick(icon_deny, src)
+ return
+ if(prize.cost > inserted_id.mining_points)
+ to_chat(usr, "Error: Insufficent points for [prize.equipment_name]!")
+ flick(icon_deny, src)
+ else
+ inserted_id.mining_points -= prize.cost
+ to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!")
+ new prize.equipment_path(drop_location())
+ else
+ to_chat(usr, "Error: Please insert a valid ID!")
+ flick(icon_deny, src)
+ updateUsrDialog()
+
+/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, I))
+ updateUsrDialog()
+ return
+ if(default_part_replacement(user, I))
+ return
+ if(default_deconstruction_crowbar(user, I))
+ return
+ if(istype(I, /obj/item/mining_voucher))
+ if(!powered())
+ return
+ RedeemVoucher(I, user)
+ return
+ if(istype(I,/obj/item/weapon/card/id))
+ if(!powered())
+ return
+ else if(!inserted_id && user.unEquip(I))
+ I.forceMove(src)
+ inserted_id = I
+ interact(user)
+ return
+ ..()
+
+/obj/machinery/mineral/equipment_vendor/dismantle()
+ if(inserted_id)
+ inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
+ . = ..()
+
+/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer)
+ var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner", "Crusher")
+ if(!selection || !Adjacent(redeemer) || voucher.loc != redeemer)
+ return
+// var/drop_location = drop_location()
+// switch(selection)
+// if("Kinetic Accelerator")
+// new /obj/item/weapon/gun/energy/kinetic_accelerator(drop_location)
+// if("Resonator")
+// new /obj/item/resonator(drop_location)
+ // if("Mining Drone")
+ // new /obj/item/storage/box/drone_kit(drop_location)
+ // if("Advanced Scanner")
+ // new /obj/item/device/t_scanner/adv_mining_scanner(drop_location)
+ // if("Crusher")
+ // new /obj/item/twohanded/required/mining_hammer(drop_location)
+ qdel(voucher)
+
+/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ if(prob(50 / severity) && severity < 3)
+ qdel(src)
diff --git a/code/modules/mining/ore_redemption_machine/mine_point_items.dm b/code/modules/mining/ore_redemption_machine/mine_point_items.dm
new file mode 100644
index 0000000000..da4463842a
--- /dev/null
+++ b/code/modules/mining/ore_redemption_machine/mine_point_items.dm
@@ -0,0 +1,33 @@
+/**********************Mining Equipment Locker Items**************************/
+
+/**********************Mining Equipment Voucher**********************/
+
+/obj/item/mining_voucher
+ name = "mining voucher"
+ desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "mining_voucher"
+ w_class = ITEMSIZE_TINY
+
+/**********************Mining Point Card**********************/
+
+/obj/item/weapon/card/mining_point_card
+ name = "mining point card"
+ desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard."
+ icon_state = "data"
+ var/points = 500
+
+/obj/item/weapon/card/mining_point_card/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/card/id))
+ if(points)
+ var/obj/item/weapon/card/id/C = I
+ C.mining_points += points
+ to_chat(user, "You transfer [points] points to [C].")
+ points = 0
+ else
+ to_chat(user, "There's no points left on [src].")
+ ..()
+
+/obj/item/weapon/card/mining_point_card/examine(mob/user)
+ ..(user)
+ to_chat(user, "There's [points] points on the card.")
diff --git a/code/modules/mining/resonator.dm b/code/modules/mining/resonator.dm
new file mode 100644
index 0000000000..1e96dc775b
--- /dev/null
+++ b/code/modules/mining/resonator.dm
@@ -0,0 +1,107 @@
+/**********************Resonator**********************/
+
+/obj/item/resonator
+ name = "resonator"
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "resonator"
+ item_state = "resonator"
+ origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3)
+ desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in low temperature."
+ w_class = ITEMSIZE_NORMAL
+ force = 8
+ throwforce = 10
+ var/cooldown = 0
+ var/fieldsactive = 0
+ var/burst_time = 50
+ var/fieldlimit = 3
+
+/obj/item/resonator/upgraded
+ name = "upgraded resonator"
+ desc = "An upgraded version of the resonator that can produce more fields at once."
+ icon_state = "resonator_u"
+ origin_tech = list(TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 3, TECH_ENGINEERING = 3)
+ fieldlimit = 5
+
+/obj/item/resonator/proc/CreateResonance(var/target, var/creator)
+ var/turf/T = get_turf(target)
+ if(locate(/obj/effect/resonance) in T)
+ return
+ if(fieldsactive < fieldlimit)
+ playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
+ new /obj/effect/resonance(T, creator, burst_time)
+ fieldsactive++
+ spawn(burst_time)
+ fieldsactive--
+
+/obj/item/resonator/attack_self(mob/user)
+ if(burst_time == 50)
+ burst_time = 30
+ to_chat(user, "You set the resonator's fields to detonate after 3 seconds.")
+ else
+ burst_time = 50
+ to_chat(user, "You set the resonator's fields to detonate after 5 seconds.")
+
+/obj/item/resonator/afterattack(atom/target, mob/user, proximity_flag)
+ if(proximity_flag)
+ if(!check_allowed_items(target, 1))
+ return
+ CreateResonance(target, user)
+
+/obj/effect/resonance
+ name = "resonance field"
+ desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shield1"
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
+ mouse_opacity = 0
+ var/resonance_damage = 20
+
+/obj/effect/resonance/initialize(mapload, var/creator = null, var/timetoburst)
+ . = ..()
+ // Start small and grow to big size as we are about to burst
+ transform = matrix()*0.75
+ animate(src, transform = matrix()*1.5, time = timetoburst)
+ // Queue the actual bursting
+ spawn(timetoburst)
+ if(!QDELETED(src))
+ burst(creator)
+
+/obj/effect/resonance/proc/burst(var/creator = null)
+ var/turf/T = get_turf(src)
+ if(!T)
+ return
+ playsound(src, 'sound/weapons/resonator_blast.ogg', 50, 1)
+ // Make the collapsing effect
+ new /obj/effect/temp_visual/resonance_crush(T)
+
+ // Mineral turfs get drilled!
+ if(istype(T, /turf/simulated/mineral))
+ var/turf/simulated/mineral/M = T
+ M.GetDrilled()
+ qdel(src)
+ return
+ // Otherwise we damage mobs! Boost damage if low tempreature
+ var/datum/gas_mixture/environment = T.return_air()
+ if(environment.temperature < 250)
+ name = "strong resonance field"
+ resonance_damage = 50
+
+ for(var/mob/living/L in src.loc)
+ if(creator)
+ add_attack_logs(creator, L, "used a resonator field on")
+ to_chat(L, "\The [src] ruptured with you in it!")
+ L.apply_damage(resonance_damage, BRUTE)
+ qdel(src)
+
+
+/obj/effect/temp_visual/resonance_crush
+ icon_state = "shield1"
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
+ duration = 4
+
+/obj/effect/temp_visual/resonance_crush/initialize()
+ . = ..()
+ transform = matrix()*1.5
+ animate(src, transform = matrix()*0.1, alpha = 50, time = 4)
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index 841c17d3f5..ea6cdc9545 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/obj/machines/mining_machines.dmi b/icons/obj/machines/mining_machines.dmi
index af660e2475..e3a1796377 100644
Binary files a/icons/obj/machines/mining_machines.dmi and b/icons/obj/machines/mining_machines.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 7b00c401d2..b4401c872a 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 74d2c0a9f8..2492c87e70 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/polaris.dme b/polaris.dme
index a322d3f822..15d0425888 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -841,6 +841,8 @@
#include "code\game\objects\effects\decals\posters\polarisposters.dm"
#include "code\game\objects\effects\spawners\bombspawner.dm"
#include "code\game\objects\effects\spawners\gibspawner.dm"
+#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm"
+#include "code\game\objects\effects\temporary_visuals\temproary_visual.dm"
#include "code\game\objects\items\antag_spawners.dm"
#include "code\game\objects\items\apc_frame.dm"
#include "code\game\objects\items\blueprints.dm"
@@ -1699,6 +1701,9 @@
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\drilling\drill.dm"
#include "code\modules\mining\drilling\scanner.dm"
+#include "code\modules\mining\ore_redemption_machine\construction.dm"
+#include "code\modules\mining\ore_redemption_machine\equipment_vendor.dm"
+#include "code\modules\mining\ore_redemption_machine\mine_point_items.dm"
#include "code\modules\mob\animations.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
diff --git a/sound/weapons/resonator_blast.ogg b/sound/weapons/resonator_blast.ogg
new file mode 100644
index 0000000000..7110a716b1
Binary files /dev/null and b/sound/weapons/resonator_blast.ogg differ
diff --git a/sound/weapons/resonator_fire.ogg b/sound/weapons/resonator_fire.ogg
new file mode 100644
index 0000000000..20665e5dd0
Binary files /dev/null and b/sound/weapons/resonator_fire.ogg differ