//cael - some changes here. the analysis pad is entirely new /obj/machinery/artifact_analyser name = "Artifact Analyser" desc = "Studies the structure of artifacts to discover their uses." icon = 'virology.dmi' icon_state = "analyser" anchored = 1 density = 1 var/working = 0 var/accuO = 0 var/accuT = 0 var/accuE1 = 0 var/accuE2 = 0 var/aorigin = "None" var/atrigger = "None" var/aeffect1 = "None" var/aeffect2 = "None" var/list/origin_bonuses var/list/trigger_bonuses var/list/function_bonuses var/list/range_bonuses var/cur_id = "" var/scan_num = 0 var/obj/machinery/artifact/cur_artifact = null var/obj/machinery/analyser_pad/owned_pad = null var/list/allorigins = list("Ancient Robots","Martian","Wizard Federation","Extradimensional","Precursor") var/list/alltriggers = list("Contact with Living Organism","Heavy Impact","Contact with Energy Source","Contact with Hydrogen","Contact with Corrosive Substance","Contact with Volatile Substance","Contact with Toxins","Exposure to Heat") var/list/alleffects = list("Healing Device","Anti-biological Weapon","Non-lethal Stunning Trap","Mechanoid Repair Module","Mechanoid Deconstruction Device","Power Generator","Power Drain","Stellar Mineral Attractor","Agriculture Regulator","Shield Generator","Space-Time Displacer") var/list/allranges = list("Constant Short-Range Energy Field","Medium Range Energy Pulses","Long Range Energy Pulses","Extreme Range Energy Pulses","Requires contact with subject") /obj/machinery/artifact_analyser/New() ..() origin_bonuses = new/list() origin_bonuses["ancient"] = 0 origin_bonuses["martian"] = 0 origin_bonuses["wizard"] = 0 origin_bonuses["eldritch"] = 0 origin_bonuses["precursor"] = 0 trigger_bonuses = new/list() trigger_bonuses["ancient"] = 0 trigger_bonuses["martian"] = 0 trigger_bonuses["wizard"] = 0 trigger_bonuses["eldritch"] = 0 trigger_bonuses["precursor"] = 0 function_bonuses = new/list() function_bonuses["ancient"] = 0 function_bonuses["martian"] = 0 function_bonuses["wizard"] = 0 function_bonuses["eldritch"] = 0 function_bonuses["precursor"] = 0 range_bonuses = new/list() range_bonuses["ancient"] = 0 range_bonuses["martian"] = 0 range_bonuses["wizard"] = 0 range_bonuses["eldritch"] = 0 range_bonuses["precursor"] = 0 // spawn(10) owned_pad = locate() in orange(1, src) /obj/machinery/artifact_analyser/attack_hand(var/mob/user as mob) if(stat & (NOPOWER|BROKEN)) return user.machine = src var/dat = "Artifact Analyser
" dat += "

" if(!owned_pad) dat += "Unable to locate analysis pad.
" dat += "

" else if (!src.working) dat += "Artifact ID: [cur_id]
" dat += "Artifact Origin: [aorigin] ([accuO]%)
" dat += "Activation Trigger: [atrigger] ([accuT]%)
" dat += "Artifact Function: [aeffect1] ([accuE1]%)
" dat += "Artifact Range: [aeffect2] ([accuE2]%)

" dat += "

" dat += "Artifact ID is determined from unique energy emission signatures.
" dat += "Analyse Artifact (Scan number #[scan_num+1])
" dat += "Upload/update artifact scan
" dat += "Print Page
" else dat += "Please wait. Analysis in progress.
" dat += "

" // dat += "Close
" user << browse(dat, "window=artanalyser;size=450x500") onclose(user, "artanalyser") /obj/machinery/artifact_analyser/process() if(stat & (NOPOWER|BROKEN)) return use_power(350) // if(!owned_pad) for(var/obj/machinery/analyser_pad/pad in range(1)) owned_pad = pad break /obj/machinery/artifact_analyser/proc/AA_FailedAnalysis(var/failtype) switch(failtype) if(1) src.aorigin = "Failed to Identify" if (prob(20)) src.aorigin = pick(src.allorigins) if(2) src.atrigger = "Failed to Identify" if (prob(20)) src.atrigger = pick(src.alltriggers) if(3) src.aeffect1 = "Failed to Identify" if (prob(20)) src.aeffect1 = pick(src.alleffects) if(4) src.aeffect2 = "Failed to Identify" if (prob(20)) src.aeffect2 = pick(src.allranges) /obj/machinery/artifact_analyser/proc/AA_Analyse() if(!cur_artifact) return src.accuO = 5 + rand(0,10) + origin_bonuses[cur_artifact.origin] + cur_artifact.activated * 50 src.accuT = 5 + rand(0,10) + trigger_bonuses[cur_artifact.origin] + cur_artifact.activated * 50 src.accuE1 = 5 + rand(0,10) + function_bonuses[cur_artifact.origin] + cur_artifact.activated * 50 src.accuE2 = 5 + rand(0,10) + range_bonuses[cur_artifact.origin] + cur_artifact.activated * 50 //keep any correctly determined properties the same var/origin_correct = 0 var/trigger_correct = 0 var/function_correct = 0 var/range_correct = 0 if(cur_id == cur_artifact.display_id) if(src.aorigin == cur_artifact.origin) origin_correct = 1 if(src.atrigger == cur_artifact.my_effect.trigger) trigger_correct = 1 else if(src.atrigger == cur_artifact.my_effect.triggerX) trigger_correct = 1 if(src.aeffect1 == cur_artifact.my_effect.effecttype) function_correct = 1 if(src.aeffect2 == cur_artifact.my_effect.effectmode) range_correct = 1 if (src.accuO > 100) src.accuO = 100 if (src.accuT > 100) src.accuT = 100 if (src.accuE1 > 100) src.accuE1 = 100 if (src.accuE2 > 100) src.accuE2 = 100 // Roll to generate report if (prob(accuO) || origin_correct) switch(cur_artifact.origin) if("ancient") src.aorigin = "Ancient Robots" if("martian") src.aorigin = "Martian" if("wizard") src.aorigin = "Wizard Federation" if("eldritch") src.aorigin = "Extradimensional" if("precursor") src.aorigin = "Precursor" else src.aorigin = "Unknown Origin" origin_bonuses[cur_artifact.origin] += 10 else AA_FailedAnalysis(1) origin_bonuses[cur_artifact.origin] += 5 if (prob(accuT) || trigger_correct) switch(cur_artifact.my_effect.trigger) if("touch") src.atrigger = "Contact with Living Organism" if("force") src.atrigger = "Heavy Impact" if("energy") src.atrigger = "Contact with Energy Source" if("chemical") switch(cur_artifact.my_effect.triggerX) if("hydrogen") src.atrigger = "Contact with Hydrogen" if("corrosive") src.atrigger = "Contact with Corrosive Substance" if("volatile") src.atrigger = "Contact with Volatile Substance" if("toxin") src.atrigger = "Contact with Toxins" if("heat") src.atrigger = "Exposure to Heat" else src.atrigger = "Unknown Trigger" trigger_bonuses[cur_artifact.origin] += 5 else AA_FailedAnalysis(2) trigger_bonuses[cur_artifact.origin] += 1 if (prob(accuE1) || function_correct) switch(cur_artifact.my_effect.effecttype) if("healing") src.aeffect1 = "Healing Device" if("injure") src.aeffect1 = "Anti-biological Weapon" if("stun") src.aeffect1 = "Non-lethal Stunning Trap" if("roboheal") src.aeffect1 = "Mechanoid Repair Module" if("robohurt") src.aeffect1 = "Mechanoid Deconstruction Device" if("cellcharge") src.aeffect1 = "Power Generator" if("celldrain") src.aeffect1 = "Power Drain" if("planthelper") src.aeffect1 = "Agriculture Regulator" if("forcefield") src.aeffect1 = "Shield Generator" if("teleport") src.aeffect1 = "Space-Time Displacer" else src.aeffect1 = "Unknown Effect" function_bonuses[cur_artifact.origin] += 5 else AA_FailedAnalysis(3) function_bonuses[cur_artifact.origin] += 1 if (prob(accuE2) || range_correct) switch(cur_artifact.my_effect.effectmode) if("aura") src.aeffect2 = "Constant Short-Range Energy Field" if("pulse") if(cur_artifact.my_effect.aurarange > 7) src.aeffect2 = "Long Range Energy Pulses" else src.aeffect2 = "Medium Range Energy Pulses" if("worldpulse") src.aeffect2 = "Extreme Range Energy Pulses" if("contact") src.aeffect2 = "Requires contact with subject" else src.aeffect2 = "Unknown Range" range_bonuses[cur_artifact.origin] += 5 else AA_FailedAnalysis(4) range_bonuses[cur_artifact.origin] += 1 cur_artifact.name = "alien artifact ([cur_artifact.display_id])" cur_artifact.desc = "A large alien device. It has a small tag near the bottom that reads \"[cur_artifact.display_id]\"." cur_id = cur_artifact.display_id cur_artifact.my_effect.artifact_id = cur_artifact.display_id /obj/machinery/artifact_analyser/Topic(href, href_list) if(href_list["analyse"]) if(owned_pad) var/turf/pad_turf = get_turf(owned_pad) var/findarti = 0 for(var/obj/machinery/artifact/A in pad_turf.contents) findarti++ cur_artifact = A if (findarti == 1) if(cur_artifact.being_used) var/message = "[src] states, \"Cannot analyse. Excess energy drain is disrupting signal.\"" src.visible_message(message, message) else cur_artifact.anchored = 1 cur_artifact.being_used = 1 src.working = 1 src.icon_state = "analyser_processing" var/time = rand(30,50) + max(0, 300 - scan_num * 10) /*for(var/i = artifact_research.starting_tier, i <= artifact_research.max_tiers, i++) for(var/datum/artiresearch/R in artifact_research.researched_items[i]) if (R.bonustype == "analyser") time -= R.bonusTime*/ time *= 10 var/message = "[src] states, \"Commencing analysis.\"" src.visible_message(message, message) use_power(500) spawn(time) src.working = 0 icon_state = "analyser" cur_artifact.anchored = 0 cur_artifact.being_used = 0 if(cur_artifact.loc == pad_turf) AA_Analyse() scan_num++ message = "[src] states, \"Analysis complete.\"" src.visible_message(message, message) use_power(500) else if (findarti > 1) var/message = "[src] states, \"Cannot analyse. Error isolating energy signature.\"" src.visible_message(message, message) else var/message = "[src] states, \"Cannot analyse. No noteworthy energy signature isolated.\"" src.visible_message(message, message) if(href_list["upload"] && cur_id != "") //add new datum to every DB in the world for(var/obj/machinery/computer/artifact_database/DB in world) var/update = 0 for(var/datum/catalogued_artifact/CA in DB.catalogued_artifacts) if(CA.display_id == cur_id) //already there, so update it update = 1 CA.origin = aorigin + " ([accuO]%)" CA.trigger = atrigger + " ([accuT]%)" CA.effecttype = aeffect1 + " ([accuE1]%)" CA.effectmode = aeffect2 + " ([accuE2]%)" if(!update) //not there, so add it var/datum/catalogued_artifact/CA = new() CA.display_id = cur_id CA.origin = aorigin + " ([accuO]%)" CA.trigger = atrigger + " ([accuT]%)" CA.effecttype = aeffect1 + " ([accuE1]%)" CA.effectmode = aeffect2 + " ([accuE2]%)" DB.catalogued_artifacts.Add(CA) use_power(100) if(href_list["print"]) var/r = "Artifact Analysis Report (Scan #[scan_num])
" r += "Artifact ID: [cur_id] (determined from unique energy emission signatures)
" r += "Artifact Origin: [aorigin] ([accuO]%)
" r += "Activation Trigger: [atrigger] ([accuT]%)
" r += "Artifact Function: [aeffect1] ([accuE1]%)
" r += "Artifact Range: [aeffect2] ([accuE2]%)

" var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc) P.name = "Artifact Analysis Report #[scan_num]" P.info = r for(var/mob/O in hearers(src, null)) O.show_message("\icon[src] \blue The [src.name] prints a sheet of paper", 3) use_power(10) if(href_list["close"]) usr << browse(null, "window=artanalyser") usr.machine = null src.updateDialog() //stick artifacts onto this then switch the analyser on /obj/machinery/analyser_pad name = "artifact analysis pad" desc = "Studies the structure of artifacts to discover their uses." icon = 'stationobjs.dmi' icon_state = "tele0" anchored = 1 density = 0 /obj/machinery/analyser_pad/New() ..() /*spawn(10) for(var/obj/machinery/artifact_analyser/analyser in orange(1)) world << "pad found analyser" if(!analyser.owned_pad) analyser.owned_pad = src world << "pad set analyser to self" break*/