From dbce0f457f9ef72526fc6a553ea619a4cf89fa9e Mon Sep 17 00:00:00 2001 From: Cael Aislinn Date: Thu, 19 Jun 2014 15:41:35 +1000 Subject: [PATCH] harvester can now harvest artifact's secondary effect, which effect it chooses is determined by which are active (if both are active it can harvest neither) Signed-off-by: Cael Aislinn --- .../machinery/artifact_harvester.dm | 190 +++++++++++------- 1 file changed, 113 insertions(+), 77 deletions(-) diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm index 501fabaa402..495d3937662 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm @@ -48,14 +48,14 @@ if(owned_scanner) if(harvesting) if(harvesting > 0) - dat += "Please wait. Harvesting in progress ([(inserted_battery.stored_charge/inserted_battery.capacity)*100]%).
" + dat += "Please wait. Harvesting in progress ([round((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 += "Please wait. Energy dump in progress ([round((inserted_battery.stored_charge/inserted_battery.capacity)*100)]%).
" dat += "Halt early
" else if(inserted_battery) dat += "[inserted_battery.name] inserted, charge level: [inserted_battery.stored_charge]/[inserted_battery.capacity] ([(inserted_battery.stored_charge/inserted_battery.capacity)*100]%)
" - dat += "Energy signature ID:[inserted_battery.battery_effect.artifact_id == "" ? "???" : "[inserted_battery.battery_effect.artifact_id]"]
" + dat += "Energy signature ID:[inserted_battery.battery_effect ? (inserted_battery.battery_effect.artifact_id == "" ? "???" : "[inserted_battery.battery_effect.artifact_id]") : "NA"]
" dat += "Eject battery
" dat += "Drain battery of all charge
" dat += "Begin harvesting
" @@ -76,7 +76,7 @@ if(harvesting > 0) //charge at 33% consumption rate - inserted_battery.stored_charge += (last_process - last_process) / 3 + inserted_battery.stored_charge += (world.time - last_process) / 3 last_process = world.time //check if we've finished @@ -90,14 +90,14 @@ else if(harvesting < 0) //dump some charge - inserted_battery.stored_charge -= 2 + inserted_battery.stored_charge -= (world.time - last_process) / 3 //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) + if(inserted_battery.battery_effect.effect == EFFECT_TOUCH) var/list/nearby = viewers(1, src) for(var/mob/M in nearby) if(M.machine == src) @@ -116,80 +116,115 @@ /obj/machinery/artifact_harvester/Topic(href, href_list) if (href_list["harvest"]) - //locate artifact on analysis pad - cur_artifact = null - var/articount = 0 - var/obj/machinery/artifact/analysed - for(var/obj/machinery/artifact/A in get_turf(owned_scanner)) - analysed = A - articount++ + if(!inserted_battery) + src.visible_message("[src] states, \"Cannot harvest. No battery inserted.\"") - 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/artifact_scanpad)) - mundane++ - break - for(var/mob/O in get_turf(owned_scanner)) - if(O.invisibility) - continue - mundane++ - break + else if(inserted_battery.stored_charge >= inserted_battery.capacity) + src.visible_message("[src] states, \"Cannot harvest. battery is full.\"") - if(analysed && analysed.being_used) - var/message = "[src] states, \"Cannot harvest. Too much interference.\"" - src.visible_message(message) - else if(articount == 1 && !mundane) - cur_artifact = analysed - //there should already be a battery inserted, but this is just in case - if(inserted_battery) - //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) + else - //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) - last_process = world.time + //locate artifact on analysis pad + cur_artifact = null + var/articount = 0 + var/obj/machinery/artifact/analysed + for(var/obj/machinery/artifact/A in get_turf(owned_scanner)) + analysed = A + articount++ - //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) - else if(cur_artifact) - var/message = "[src] states, \"Cannot harvest. No battery inserted.\"" + if(articount <= 0) + var/message = "[src] states, \"Cannot harvest. No noteworthy energy signature isolated.\"" src.visible_message(message) - else if(articount > 1 || mundane) - var/message = "[src] states, \"Cannot harvest. Error isolating energy signature.\"" - src.visible_message(message) - else if(!articount) - var/message = "[src] states, \"Cannot harvest. No noteworthy energy signature isolated.\"" - src.visible_message(message) + + else if(analysed && analysed.being_used) + src.visible_message("[src] states, \"Cannot harvest. Source already being harvested.\"") + + else + 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/artifact_scanpad)) + mundane++ + break + for(var/mob/O in get_turf(owned_scanner)) + if(O.invisibility) + continue + mundane++ + break + + if(articount > 1 || mundane) + var/message = "[src] states, \"Cannot harvest. Too many artifacts on the pad.\"" + src.visible_message(message) + else + cur_artifact = analysed + + //if both effects are active, we can't harvest either + if(cur_artifact.my_effect.activated && cur_artifact.secondary_effect.activated) + src.visible_message("[src] states, \"Cannot harvest. Source is emitting conflicting energy signatures.\"") + else if(!cur_artifact.my_effect.activated && !cur_artifact.secondary_effect.activated) + src.visible_message("[src] states, \"Cannot harvest. No energy emitting from source.\"") + + else + //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) + + // + var/datum/artifact_effect/source_effect + + //if we already have charge in the battery, we can only recharge it from the source artifact + if(inserted_battery.stored_charge > 0) + var/battery_matches_primary_id = 0 + if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.my_effect.artifact_id) + battery_matches_primary_id = 1 + if(battery_matches_primary_id && cur_artifact.my_effect.activated) + //we're good to recharge the primary effect! + source_effect = cur_artifact.my_effect + + var/battery_matches_secondary_id = 0 + if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.secondary_effect.artifact_id) + battery_matches_secondary_id = 1 + if(battery_matches_secondary_id && cur_artifact.secondary_effect.activated) + //we're good to recharge the secondary effect! + source_effect = cur_artifact.secondary_effect + + if(!source_effect) + src.visible_message("[src] states, \"Cannot harvest. Battery is charged with a different energy signature.\"") + else + //we're good to charge either + if(cur_artifact.my_effect.activated) + //charge the primary effect + source_effect = cur_artifact.my_effect + + else if(cur_artifact.secondary_effect.activated) + //charge the secondary effect + source_effect = cur_artifact.secondary_effect + + + if(source_effect) + harvesting = 1 + use_power = 2 + cur_artifact.anchored = 1 + cur_artifact.being_used = 1 + icon_state = "incubator_on" + var/message = "[src] states, \"Beginning energy harvesting.\"" + src.visible_message(message) + last_process = world.time + + //duplicate the artifact's effect datum + if(!inserted_battery.battery_effect) + var/effecttype = source_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] = source_effect.vars[varname] + + //copy the new datum into the battery + inserted_battery.battery_effect = E + inserted_battery.stored_charge = 0 if (href_list["stopharvest"]) if(harvesting) @@ -198,7 +233,7 @@ harvesting = 0 cur_artifact.anchored = 0 cur_artifact.being_used = 0 - src.visible_message("[name] states, \"Activity interrupted.\"") + src.visible_message("[name] states, \"Energy harvesting interrupted.\"") icon_state = "incubator" if (href_list["ejectbattery"]) @@ -210,7 +245,8 @@ 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) + inserted_battery.battery_effect.ToggleActivate(1) + last_process = world.time harvesting = -1 use_power = 2 icon_state = "incubator_on"