From 50f4d3a24dd34d2848c601c876171d16eadb7773 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Sun, 10 Mar 2013 18:42:01 +1000 Subject: [PATCH] harvester overhaul to be cleaner + updated interaction and processing, should properly interact with the rest of the xenoarch update, draining charge is now done incrementally and procs the artifact effect on the harvester/anyone nearby Signed-off-by: Cael_Aislinn --- .../unknown/unknown_harvester.dm | 179 +++++++++++++----- 1 file changed, 127 insertions(+), 52 deletions(-) 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()