diff --git a/code/modules/research/xenoarchaeology/unknown/unknown_harvester.dm b/code/modules/research/xenoarchaeology/unknown/unknown_harvester.dm
index 06fe3d9de32..cdd9fbf9177 100644
--- a/code/modules/research/xenoarchaeology/unknown/unknown_harvester.dm
+++ b/code/modules/research/xenoarchaeology/unknown/unknown_harvester.dm
@@ -1,60 +1,55 @@
-/obj/machinery/anomaly/artifact_harvester
+/obj/machinery/artifact_harvester
name = "Anomaly Power Collector"
icon = 'virology.dmi'
icon_state = "incubator" //incubator_on
anchored = 1
density = 1
+ idle_power_usage = 50
+ active_power_usage = 750
+ use_power = 1
var/harvesting = 0
var/obj/item/weapon/anobattery/inserted_battery
var/obj/machinery/artifact/cur_artifact
var/obj/machinery/scanner/owned_scanner = null
-/obj/machinery/anomaly/artifact_harvester/New()
+/obj/machinery/artifact_harvester/New()
..()
-
//connect to a nearby scanner pad
owned_scanner = locate(/obj/machinery/scanner) in get_step(src, dir)
if(!owned_scanner)
owned_scanner = locate(/obj/machinery/scanner) in orange(1, src)
-/obj/machinery/anomaly/artifact_harvester/attackby(var/obj/I as obj, var/mob/user as mob)
+/obj/machinery/artifact_harvester/attackby(var/obj/I as obj, var/mob/user as mob)
if(istype(I,/obj/item/weapon/anobattery))
if(!inserted_battery)
- user << "You insert the battery."
+ user << "\blue You insert [I] into [src]."
user.drop_item()
I.loc = src
src.inserted_battery = I
- return
+ updateDialog()
+ else
+ user << "\red There is already a battery in [src]."
else
return..()
-/obj/machinery/anomaly/artifact_harvester/process()
+/obj/machinery/artifact_harvester/attack_hand(var/mob/user as mob)
+ src.add_fingerprint(user)
+ interact(user)
+
+/obj/machinery/artifact_harvester/interact(var/mob/user as mob)
if(stat & (NOPOWER|BROKEN))
return
- use_power(350)
-
- if(harvesting)
- use_power(250)
- inserted_battery.stored_charge += 10
- if(inserted_battery.stored_charge >= inserted_battery.capacity)
- inserted_battery.stored_charge = inserted_battery.capacity
- harvesting = 0
- cur_artifact.anchored = 0
- src.visible_message("[name] states, \"Battery is full.\"")
- icon_state = "incubator"
- return
-
-/obj/machinery/anomaly/artifact_harvester/interact(var/mob/user as mob)
- if(stat & (NOPOWER|BROKEN))
- return
- user.machine = src
+ user.set_machine(src)
var/dat = "Artifact Power Harvester
"
dat += "
"
//
if(owned_scanner)
if(harvesting)
- dat += "Please wait. Harvesting in progress ([(inserted_battery.stored_charge/inserted_battery.capacity)*100]%).
"
+ if(harvesting > 0)
+ dat += "Please wait. Harvesting in progress ([(inserted_battery.stored_charge/inserted_battery.capacity)*100]%).
"
+ else
+ dat += "Please wait. Energy dump in progress ([(inserted_battery.stored_charge/inserted_battery.capacity)*100]%).
"
dat += "Halt early
"
else
if(inserted_battery)
@@ -74,7 +69,49 @@
user << browse(dat, "window=artharvester;size=450x500")
onclose(user, "artharvester")
-/obj/machinery/anomaly/artifact_harvester/Topic(href, href_list)
+/obj/machinery/artifact_harvester/process()
+ if(stat & (NOPOWER|BROKEN))
+ return
+
+ if(harvesting > 0)
+ //gain a bit of charge
+ inserted_battery.stored_charge += 0.5
+
+ //check if we've finished
+ if(inserted_battery.stored_charge >= inserted_battery.capacity)
+ use_power = 1
+ harvesting = 0
+ cur_artifact.anchored = 0
+ cur_artifact.being_used = 0
+ src.visible_message("[name] states, \"Battery is full.\"")
+ icon_state = "incubator"
+
+ else if(harvesting < 0)
+ //dump some charge
+ inserted_battery.stored_charge -= 2
+
+ //do the effect
+ if(inserted_battery.battery_effect)
+ inserted_battery.battery_effect.process()
+
+ //if the effect works by touch, activate it on anyone viewing the console
+ if(inserted_battery.battery_effect.effect == 0)
+ var/list/nearby = viewers(1, src)
+ for(var/mob/M in nearby)
+ if(M.machine == src)
+ inserted_battery.battery_effect.DoEffectTouch(M)
+
+ //if there's no charge left, finish
+ if(inserted_battery.stored_charge <= 0)
+ use_power = 1
+ inserted_battery.stored_charge = 0
+ harvesting = 0
+ if(inserted_battery.battery_effect && inserted_battery.battery_effect.activated)
+ inserted_battery.battery_effect.ToggleActivate()
+ src.visible_message("[name] states, \"Battery dump completed.\"")
+ icon_state = "incubator"
+
+/obj/machinery/artifact_harvester/Topic(href, href_list)
if (href_list["harvest"])
//locate artifact on analysis pad
@@ -87,66 +124,104 @@
var/mundane = 0
for(var/obj/O in get_turf(owned_scanner))
+ if(O.invisibility)
+ continue
if(!istype(O, /obj/machinery/artifact) && !istype(O, /obj/machinery/scanner))
mundane++
break
for(var/mob/O in get_turf(owned_scanner))
- if(!istype(O, /obj/machinery/artifact))
- mundane++
- break
+ if(O.invisibility)
+ continue
+ mundane++
+ break
- if(articount == 1 && !mundane)
+ if(analysed.being_used)
+ var/message = "[src] states, \"Cannot harvest. Too much interference.\""
+ src.visible_message(message)
+ else if(articount == 1 && !mundane)
cur_artifact = analysed
- //check to see if the battery is compatible
+ //there should already be a battery inserted, but this is just in case
if(inserted_battery)
- if(inserted_battery.battery_effect.artifact_id == cur_artifact.my_effect.artifact_id || inserted_battery.stored_charge == 0)
+ //see if we can clear out an old effect
+ //delete it when the ids match to account for duplicate ids having different effects
+ if(inserted_battery.battery_effect && inserted_battery.stored_charge <= 0)
+ del(inserted_battery.battery_effect)
+
+ //only charge up
+ var/matching_id = 0
+ if(inserted_battery.battery_effect)
+ matching_id = (inserted_battery.battery_effect.artifact_id == cur_artifact.my_effect.artifact_id)
+ var/matching_effecttype = 0
+ if(inserted_battery.battery_effect)
+ matching_effecttype = (inserted_battery.battery_effect.type == cur_artifact.my_effect.type)
+ if(!inserted_battery.battery_effect || (matching_id && matching_effecttype))
harvesting = 1
+ use_power = 2
cur_artifact.anchored = 1
cur_artifact.being_used = 1
icon_state = "incubator_on"
var/message = "[src] states, \"Beginning artifact energy harvesting.\""
- src.visible_message(message, message)
- //
- inserted_battery.battery_effect = cur_artifact.my_effect
+ src.visible_message(message)
+
+ //duplicate the artifact's effect datum
+ if(!inserted_battery.battery_effect)
+ var/effecttype = cur_artifact.my_effect.type
+ var/datum/artifact_effect/E = new effecttype(inserted_battery)
+
+ //duplicate it's unique settings
+ for(var/varname in list("chargelevelmax","artifact_id","effect","effectrange","trigger"))
+ E.vars[varname] = cur_artifact.my_effect.vars[varname]
+
+ //copy the new datum into the battery
+ inserted_battery.battery_effect = E
+ inserted_battery.stored_charge = 0
else
var/message = "[src] states, \"Cannot harvest. Incompatible energy signatures detected.\""
- src.visible_message(message, message)
+ src.visible_message(message)
else if(cur_artifact)
var/message = "[src] states, \"Cannot harvest. No battery inserted.\""
- src.visible_message(message, message)
+ src.visible_message(message)
else if(articount > 1 || mundane)
var/message = "[src] states, \"Cannot harvest. Error isolating energy signature.\""
- src.visible_message(message, message)
+ src.visible_message(message)
else if(!articount)
var/message = "[src] states, \"Cannot harvest. No noteworthy energy signature isolated.\""
- src.visible_message(message, message)
- else if (cur_artifact.being_used)
- var/message = "[src] states, \"Cannot harvest. Too much interferance from energy scan.\""
- src.visible_message(message, message)
+ src.visible_message(message)
if (href_list["stopharvest"])
if(harvesting)
+ if(harvesting < 0 && inserted_battery.battery_effect && inserted_battery.battery_effect.activated)
+ inserted_battery.battery_effect.ToggleActivate()
harvesting = 0
cur_artifact.anchored = 0
cur_artifact.being_used = 0
- src.visible_message("[name] states, \"Harvesting interrupted.\"")
+ src.visible_message("[name] states, \"Activity interrupted.\"")
icon_state = "incubator"
-
if (href_list["ejectbattery"])
src.inserted_battery.loc = src.loc
src.inserted_battery = null
if (href_list["drainbattery"])
- use_power(100)
- src.inserted_battery.battery_effect.artifact_id = ""
- src.inserted_battery.stored_charge = 0
- var/message = "[src] states, \"Battery drained of all charge.\""
- src.visible_message(message, message)
+ if(inserted_battery)
+ if(inserted_battery.battery_effect && inserted_battery.stored_charge > 0)
+ if(alert("This action will dump all charge, safety gear is recommended before proceeding","Warning","Continue","Cancel"))
+ if(!inserted_battery.battery_effect.activated)
+ inserted_battery.battery_effect.ToggleActivate(0)
+ harvesting = -1
+ use_power = 2
+ icon_state = "incubator_on"
+ var/message = "[src] states, \"Warning, battery charge dump commencing.\""
+ src.visible_message(message)
+ else
+ var/message = "[src] states, \"Cannot dump energy. Battery is drained of charge already.\""
+ src.visible_message(message)
+ else
+ var/message = "[src] states, \"Cannot dump energy. No battery inserted.\""
+ src.visible_message(message)
if(href_list["close"])
usr << browse(null, "window=artharvester")
- usr.machine = null
+ usr.unset_machine(src)
- src.updateDialog()
- return
+ updateDialog()