artifacts can be harvested and reused in a portable emitter, restructured artifacts, artifact analyses should go a lot smoother and faster now, additional bugfixes in general, moves some icons around to hopefully fix some bugs, additional strange rock formations should spawn now, dbs should work now, reworked the anomaly lab, redacted

Signed-off-by: caelaislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
caelaislinn
2012-06-23 04:16:09 +10:00
parent 149eb05a61
commit 0e21ed125a
15 changed files with 7457 additions and 7034 deletions

View File

@@ -1133,7 +1133,10 @@
#include "code\modules\research\artifact_analysis.dm"
#include "code\modules\research\artifact_archaeo.dm"
#include "code\modules\research\artifact_db.dm"
#include "code\modules\research\artifact_effect.dm"
#include "code\modules\research\artifact_harvester.dm"
#include "code\modules\research\artifact_misc.dm"
#include "code\modules\research\artifact_synthetic.dm"
#include "code\modules\research\artifacts.dm"
#include "code\modules\research\circuitprinter.dm"
#include "code\modules\research\designs.dm"

View File

@@ -152,7 +152,7 @@
//find out what mobs we can see
var/list/incapacitated = list()
var/list/conscious = list()
for(var/mob/living/M in view(7, src))
for(var/mob/living/carbon/M in view(7, src))
//this may not be quite the right test
if(M == src)
continue
@@ -162,14 +162,14 @@
conscious.Add(M)
//pick the nearest valid conscious target
var/mob/living/target_mob
for(var/mob/living/M in conscious)
var/mob/living/carbon/target_mob
for(var/mob/living/carbon/M in conscious)
if(!target_mob || get_dist(src, M) < get_dist(src, target_mob))
target_mob = M
if(!target_mob)
//get an unconscious mob
for(var/mob/living/M in incapacitated)
for(var/mob/living/carbon/M in incapacitated)
if(!target_mob || get_dist(src, M) < get_dist(src, target_mob))
target_mob = M
if(target_mob)

View File

@@ -78,6 +78,15 @@
desc = "Completely useless"
icon_state = "slag"
/obj/item/weapon/ore/strangerock //see artifact_archaeo.dm in modules/research for more info
name = "Strange rock"
desc = "Seems to have some unusal strata evident throughout it."
icon_state = "strange"
var/obj/inside
var/method // 0 = fire, 1+ = acid
origin_tech = "materials=5"
/obj/item/weapon/ore/New()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8

View File

@@ -1,23 +1,6 @@
//cael - some changes here. the analysis pad is entirely new
//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, src))
if(!analyser.owned_pad)
analyser.owned_pad = src
break
/obj/machinery/artifact_analyser
name = "Artifact Analyser"
desc = "Studies the structure of artifacts to discover their uses."
@@ -38,14 +21,14 @@
var/list/trigger_bonuses
var/list/function_bonuses
var/list/range_bonuses
var/cur_id = "N\\A"
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")
var/obj/machinery/analyser_pad/owned_pad = null
/obj/machinery/artifact_analyser/New()
..()
@@ -92,8 +75,9 @@
dat += "<B>Artifact Range:</B> [aeffect2] ([accuE2]%)<BR><BR>"
dat += "<HR><BR>"
dat += "Artifact ID is determined from unique energy emission signatures.<br>"
dat += "<A href='?src=\ref[src];analyse=1'>Analyse Artifact<BR>"
dat += "<A href='?src=\ref[src];print=1'>Print Page<BR>"
dat += "<A href='?src=\ref[src];analyse=1'>Analyse Artifact (Scan number #[scan_num+1])</a><BR>"
dat += "<A href='?src=\ref[src];upload=1'>Upload/update artifact scan</a><BR>"
dat += "<A href='?src=\ref[src];print=1'>Print Page</a><BR>"
else
dat += "<B>Please wait. Analysis in progress.</B><BR>"
dat += "<HR><BR>"
@@ -103,10 +87,125 @@
onclose(user, "artanalyser")
/obj/machinery/artifact_analyser/process()
//
return
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
/obj/machinery/artifact_analyser/Topic(href, href_list)
if(href_list["analyse"])
if(owned_pad)
var/turf/pad_turf = get_turf(owned_pad)
@@ -118,7 +217,7 @@
cur_artifact.anchored = 1
src.working = 1
src.icon_state = "analyser_processing"
var/time = rand(30,150) + max(0, 150 - scan_num * 10)
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*/
@@ -140,152 +239,63 @@
else
var/message = "<b>[src]</b> states, \"Cannot analyse. No artifact found.\""
src.visible_message(message, message)
else
var/message = "<b>[src]</b> states, \"Cannot analyse, no analysis pad connected.\""
src.visible_message(message, message)
else if(href_list["upload"])
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.name == cur_id)
if(CA.display_id == cur_id)
//already there, so update it
update = 1
CA.name = aorigin + " ([accuO]%)"
CA.origin = aorigin + " ([accuO]%)"
CA.trigger = atrigger + " ([accuT]%)"
CA.function = aeffect1 + " ([accuE1]%)"
CA.range = aeffect2 + " ([accuE2]%)"
CA.effecttype = aeffect1 + " ([accuE1]%)"
CA.effectmode = aeffect2 + " ([accuE2]%)"
if(!update)
//not there, so add it
var/datum/catalogued_artifact/CA = new()
CA.name = cur_id
CA.name = aorigin + " ([accuO]%)"
CA.display_id = cur_id
CA.origin = aorigin + " ([accuO]%)"
CA.trigger = atrigger + " ([accuT]%)"
CA.function = aeffect1 + " ([accuE1]%)"
CA.range = aeffect2 + " ([accuE2]%)"
CA.effecttype = aeffect1 + " ([accuE1]%)"
CA.effectmode = aeffect2 + " ([accuE2]%)"
DB.catalogued_artifacts.Add(CA)
else if(href_list["print"])
if(href_list["print"])
var/r = "Artifact Analysis Report (Scan #[scan_num])<hr>"
r += "<B>Artifact ID:</B> [cur_id] (determined from unique energy emission signatures)<BR>"
r += "<B>Artifact Origin:</B> [aorigin] ([accuO]%)<BR>"
r += "<B>Activation Trigger:</B> [atrigger] ([accuT]%)<BR>"
r += "<B>Artifact Function:</B> [aeffect1] ([accuE1]%)<BR>"
r += "<B>Artifact Range:</B> [aeffect2] ([accuE2]%)<BR><BR>"
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)
else if(href_list["close"])
if(href_list["close"])
usr << browse(null, "window=artanalyser")
usr.machine = null
src.updateDialog()
/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)
//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/artifact_analyser/proc/AA_Analyse()
if(!cur_artifact)
return
//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.trigger)
trigger_correct = 1
else if(src.atrigger == cur_artifact.triggerX)
trigger_correct = 1
if(src.aeffect1 == cur_artifact.effecttype)
function_correct = 1
if(src.aeffect2 == cur_artifact.effectmode)
range_correct = 1
src.accuO = 5 + rand(0,10) + origin_bonuses[cur_artifact.origin]
src.accuT = 5 + rand(0,10) + trigger_bonuses[cur_artifact.origin]
src.accuE1 = 5 + rand(0,10) + function_bonuses[cur_artifact.origin]
src.accuE2 = 5 + rand(0,10) + range_bonuses[cur_artifact.origin]
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)
if (prob(accuT) || trigger_correct)
switch(cur_artifact.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.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)
if (prob(accuE1) || function_correct)
switch(cur_artifact.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)
if (prob(accuE2) || range_correct)
switch(cur_artifact.effectmode)
if("aura") src.aeffect2 = "Constant Short-Range Energy Field"
if("pulse")
if(cur_artifact.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)
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
/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*/

View File

@@ -2,22 +2,15 @@
//talking crystals may quickly turnout to be very annoying
//strange rocks have been mostly redone
/obj/item/weapon/ore/strangerock
name = "Strange rock"
icon = 'rubble.dmi'
icon_state = "strange"
var/obj/inside
var/method // 0 = fire, 1+ = acid
New()
//var/datum/reagents/r = new/datum/reagents(50)
//src.reagents = r
icon = 'rubble.dmi'
if(rand(3))
method = 0
else
method = 1
inside = pick(150;"", 50;"/obj/item/weapon/crystal", 25;"/obj/item/weapon/talkingcrystal", "/obj/item/weapon/fossil/base")
/obj/item/weapon/ore/strangerock/New()
..()
//var/datum/reagents/r = new/datum/reagents(50)
//src.reagents = r
if(rand(3))
method = 0
else
method = 1
inside = pick(150;"", 50;"/obj/item/weapon/crystal", 25;"/obj/item/weapon/talkingcrystal", "/obj/item/weapon/fossil/base")
/obj/item/weapon/ore/strangerock/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/weldingtool/))
@@ -56,20 +49,16 @@
/obj/item/weapon/crystal
name = "Crystal"
icon = 'rubble.dmi'
icon = 'mining.dmi'
icon_state = "crystal"
/obj/item/weapon/talkingcrystal
name = "Crystal"
icon = 'rubble.dmi'
icon = 'mining.dmi'
icon_state = "crystal2"
var/list/list/words = list()
var/lastsaid
/obj/item/weapon/talkingcrystal/New()
icon = 'rubble.dmi'
return
/obj/item/weapon/talkingcrystal/proc/catchMessage(var/msg, var/mob/source)
var/list/seperate = list()
if(findtext(msg," ")==0)
@@ -141,7 +130,7 @@
else
msg+="!"
for(var/mob/M in viewers(src))
M << "\blue You hear \"[msg]\" from the [src]"
M << "<b>The crystal</b> says, \"[msg]\""
lastsaid = world.timeofday + rand(300,800)
/obj/item/weapon/talkingcrystal/process()
@@ -160,7 +149,6 @@
desc = "It's a fossil."
/obj/item/weapon/fossil/base/New()
icon = 'fossil.dmi'
spawn(0)
var/list/l = list("/obj/item/weapon/fossil/bone"=8,"/obj/item/weapon/fossil/skull"=2,
"/obj/item/weapon/fossil/skull/horned"=2,"/obj/item/weapon/fossil/shell"=1)

View File

@@ -1,9 +1,10 @@
/datum/catalogued_artifact
var/name = ""
var/function = ""
var/range = ""
var/trigger = ""
var/trigger = "touch" // What activates it?
var/effecttype = "healing" // What does it do?
var/effectmode = "aura" // How does it carry out the effect?
var/display_id = "" // Artifact ID to display once successfully scanned
var/origin = ""
/obj/machinery/computer/artifact_database
name = "Artifact Database"
@@ -43,11 +44,24 @@
var/t = "<B>Artifact Database</B><BR>"
t += "<hr>"
for(var/datum/catalogued_artifact/CA in catalogued_artifacts)
t += "<B>Artifact ID:</B> [CA.name] (determined from unique energy emission signatures)<BR>"
t += "<B>Artifact ID:</B> [CA.display_id] (determined from unique energy emission signatures)<BR>"
t += "<B>Artifact Origin:</B> [CA.origin]<BR>"
t += "<B>Activation Trigger:</B> [CA.trigger]<BR>"
t += "<B>Artifact Function:</B> [CA.function]<BR>"
t += "<B>Artifact Range:</B> [CA.range]<BR><BR>"
t += "<B>Artifact Function:</B> [CA.effecttype]<BR>"
t += "<B>Artifact Range:</B> [CA.effectmode]<BR><BR>"
t += "<hr>"
t += "<A href='?src=\ref[src];refresh=1'>Refresh</A> <A href='?src=\ref[src];close=1'>Close</A><BR>"
user << browse(t, "window=artifact_db;size=500x800")
user.machine = src
/*
/datum/artifact_effect
var/origin = null // Used in the randomisation/research of the artifact.
var/trigger = "touch" // What activates it?
var/triggerX = "none" // Used for more varied triggers
var/effecttype = "healing" // What does it do?
var/effectmode = "aura" // How does it carry out the effect?
var/aurarange = 4 // How far the artifact will extend an aura effect.
var/display_id = "" // Artifact ID to display once successfully scanned
var/list/created_field
*/

View File

@@ -0,0 +1,477 @@
/datum/artifact_effect
var/artifact_id = "" // Display ID of the spawning artifact
var/trigger = "touch" // What activates it?
var/triggerX = "none" // Used for more varied triggers
var/effecttype = "healing" // What does it do?
var/effectmode = "aura" // How does it carry out the effect?
var/aurarange = 4 // How far the artifact will extend an aura effect.
var/list/created_field
/datum/artifact_effect/New()
//
created_field = new()
/datum/artifact_effect/proc/GetOriginString(var/origin)
/datum/artifact_effect/proc/GetEffectString(var/effect)
/datum/artifact_effect/proc/GetTriggerString(var/trigger)
/datum/artifact_effect/proc/GetRangeString(var/range)
switch(effectmode)
if("aura") return "Constant Short-Range Energy Field"
if("pulse")
if(aurarange > 7) return "Long Range Energy Pulses"
else return "Medium Range Energy Pulses"
if("worldpulse") return "Extreme Range Energy Pulses"
if("contact") return "Requires contact with subject"
else return "Unknown Range"
/datum/artifact_effect/proc/HaltEffect()
for(var/obj/effect/energy_field/F in created_field)
created_field.Remove(F)
del F
/datum/artifact_effect/proc/UpdateEffect(var/atom/originator)
for(var/obj/effect/energy_field/F in created_field)
created_field.Remove(F)
del F
/datum/artifact_effect/proc/DoEffect(var/atom/originator)
if (src.effectmode == "contact")
var/mob/user = originator
if(!user)
return
switch(src.effecttype)
if("healing")
if (istype(user, /mob/living/carbon/human/))
user << "\blue You feel a soothing energy invigorate you."
var/mob/living/carbon/human/H = user
for(var/A in H.organs)
var/datum/organ/external/affecting = null
if(!H.organs[A]) continue
affecting = H.organs[A]
if(!istype(affecting, /datum/organ/external)) continue
affecting.heal_damage(25, 25) //fixes getting hit after ingestion, killing you when game updates organ health
for(var/datum/organ/wound/W in affecting.wounds)
W.stopbleeding()
W.is_healing = 1
//user:heal_organ_damage(25, 25)
//
user.adjustOxyLoss(-25)
user.adjustToxLoss(-25)
user.adjustBruteLoss(-25)
user.adjustFireLoss(-25)
user.adjustBrainLoss(-25)
user.radiation -= min(user.radiation, 25)
user.nutrition += 50
H.bodytemperature = initial(H.bodytemperature)
//
H.vessel.add_reagent("blood",50)
spawn(1)
H.fixblood()
H.update_body()
H.update_face()
H.UpdateDamageIcon()
return 1
//
if (istype(user, /mob/living/carbon/monkey/))
user << "\blue You feel a soothing energy invigorate you."
user.adjustOxyLoss(-25)
user.adjustToxLoss(-25)
user.adjustBruteLoss(-25)
user.adjustFireLoss(-25)
user.adjustBrainLoss(-25)
else user << "Nothing happens."
if("injure")
if (istype(user, /mob/living/carbon/))
user << "\red A painful discharge of energy strikes you!"
user.adjustOxyLoss(25)
user.adjustToxLoss(25)
user.adjustBruteLoss(25)
user.adjustFireLoss(25)
user.adjustBrainLoss(25)
user.radiation += 25
user.nutrition -= min(50, user.nutrition)
user.stunned += 6
user.weakened += 6
return 1
else user << "Nothing happens."
if("stun")
if (istype(user, /mob/living/carbon/))
user << "\red A powerful force overwhelms your consciousness."
user.paralysis += 30
user.stunned += 45
user.weakened += 45
user.stuttering += 45
return 1
else user << "Nothing happens."
if("roboheal")
if (istype(user, /mob/living/silicon/robot))
user << "\blue Your systems report damaged components mending by themselves!"
user.adjustBruteLoss(-30)
user.adjustFireLoss(-30)
return 1
else user << "Nothing happens."
if("robohurt")
if (istype(user, /mob/living/silicon/robot))
user << "\red Your systems report severe damage has been inflicted!"
user.adjustBruteLoss(40)
user.adjustFireLoss(40)
return 1
else user << "Nothing happens."
if("forcefield")
var/obj/effect/energy_field/E = new /obj/effect/energy_field(locate(user.x + 2,user.y,user.z))
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x + 2,user.y + 1,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x + 2,user.y + 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x + 2,user.y - 1,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x + 2,user.y - 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x - 2,user.y,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x - 2,user.y + 1,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x - 2,user.y + 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x - 2,user.y - 1,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x - 2,user.y - 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x,user.y + 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x + 1,user.y + 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x - 1,user.y + 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x,user.y - 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x + 1,user.y - 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
E = new /obj/effect/energy_field(locate(user.x - 1,user.y - 2,user.z))
created_field.Add(E)
E.strength = 1
E.invisibility = 0
return 1
if("teleport")
var/list/randomturfs = new/list()
for(var/turf/T in orange(user, 50))
if(!istype(T, /turf/simulated/floor) || T.density)
continue
randomturfs.Add(T)
if(randomturfs.len > 0)
user << "\red You are suddenly zapped away elsewhere!"
user.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(src)) //no idea what the 0 is
sparks.start()
return 1
else if (src.effectmode == "aura")
switch(src.effecttype)
if("healing")
for (var/mob/living/carbon/M in range(src.aurarange,originator))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
if(prob(10)) M << "\blue You feel a soothing energy radiating from something nearby."
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
M.adjustToxLoss(-1)
M.adjustOxyLoss(-1)
M.adjustBrainLoss(-1)
M.updatehealth()
return 1
if("injure")
for (var/mob/living/carbon/M in range(src.aurarange,originator))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
if(prob(10)) M << "\red You feel a painful force radiating from something nearby."
M.adjustBruteLoss(1)
M.adjustFireLoss(1)
M.adjustToxLoss(1)
M.adjustOxyLoss(1)
M.adjustBrainLoss(1)
M.updatehealth()
return 1
if("stun")
for (var/mob/living/carbon/M in range(src.aurarange,originator))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
if(prob(10)) M << "\red Energy radiating from the [src] is making you feel numb."
if(prob(20))
M << "\red Your body goes numb for a moment."
M.stunned += 2
M.weakened += 2
M.stuttering += 2
return 1
if("roboheal")
for (var/mob/living/silicon/robot/M in range(src.aurarange,originator))
if(prob(10)) M << "\blue SYSTEM ALERT: Beneficial energy field detected!"
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
M.updatehealth()
return 1
if("robohurt")
for (var/mob/living/silicon/robot/M in range(src.aurarange,originator))
if(prob(10)) M << "\red SYSTEM ALERT: Harmful energy field detected!"
M.adjustBruteLoss(1)
M.adjustFireLoss(1)
M.updatehealth()
return 1
if("cellcharge")
for (var/obj/machinery/power/apc/C in range(src.aurarange,originator))
for (var/obj/item/weapon/cell/B in C.contents)
B.charge += 10
for (var/obj/machinery/power/smes/S in range (src.aurarange,originator)) S.charge += 20
for (var/mob/living/silicon/robot/M in range(src.aurarange,originator))
for (var/obj/item/weapon/cell/D in M.contents)
D.charge += 10
if(prob(10)) M << "\blue SYSTEM ALERT: Energy boosting field detected!"
return 1
if("celldrain")
for (var/obj/machinery/power/apc/C in range(src.aurarange,originator))
for (var/obj/item/weapon/cell/B in C.contents)
B.charge -= 10
for (var/obj/machinery/power/smes/S in range (src.aurarange,originator)) S.charge -= 20
for (var/mob/living/silicon/robot/M in range(src.aurarange,originator))
for (var/obj/item/weapon/cell/D in M.contents)
D.charge -= 10
if(prob(10)) M << "\red SYSTEM ALERT: Energy draining field detected!"
return 1
if("planthelper")
for (var/obj/machinery/hydroponics/H in range(src.aurarange,originator))
//makes weeds and shrooms and stuff more potent too
if(H.planted)
H.waterlevel += 2
H.nutrilevel += 2
if(H.toxic > 0)
H.toxic -= 1
H.health += 1
if(H.pestlevel > 0)
H.pestlevel -= 1
if(H.weedlevel > 0)
H.weedlevel -= 1
H.lastcycle += 5
return 1
else if (src.effectmode == "pulse")
for(var/mob/O in viewers(originator, null))
O.show_message(text("<b>[]</b> emits a pulse of energy!", originator), 1)
switch(src.effecttype)
if("healing")
for (var/mob/living/carbon/M in range(src.aurarange,originator))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\blue A wave of energy invigorates you."
M.adjustBruteLoss(5)
M.adjustFireLoss(5)
M.adjustToxLoss(5)
M.adjustOxyLoss(5)
M.adjustBrainLoss(5)
M.updatehealth()
return 1
if("injure")
for (var/mob/living/carbon/M in range(src.aurarange,originator))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\red A wave of energy causes you great pain!"
M.adjustBruteLoss(5)
M.adjustFireLoss(5)
M.adjustToxLoss(5)
M.adjustOxyLoss(5)
M.adjustBrainLoss(5)
M.stunned += 3
M.weakened += 3
M.updatehealth()
return 1
if("stun")
for (var/mob/living/carbon/M in range(src.aurarange,originator))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\red A wave of energy overwhelms your senses!"
M.paralysis += 3
M.stunned += 4
M.weakened += 4
M.stuttering += 4
return 1
if("roboheal")
for (var/mob/living/silicon/robot/M in range(src.aurarange,originator))
M << "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!"
M.adjustBruteLoss(-10)
M.adjustFireLoss(-10)
M.updatehealth()
return 1
if("robohurt")
for (var/mob/living/silicon/robot/M in range(src.aurarange,originator))
M << "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!"
M.adjustBruteLoss(10)
M.adjustFireLoss(10)
M.updatehealth()
return 1
if("cellcharge")
for (var/obj/machinery/power/apc/C in range(src.aurarange,originator))
for (var/obj/item/weapon/cell/B in C.contents)
B.charge += 250
for (var/obj/machinery/power/smes/S in range (src.aurarange,originator)) S.charge += 400
for (var/mob/living/silicon/robot/M in range(src.aurarange,originator))
for (var/obj/item/weapon/cell/D in M.contents)
D.charge += 250
M << "\blue SYSTEM ALERT: Large energy boost detected!"
return 1
if("celldrain")
for (var/obj/machinery/power/apc/C in range(src.aurarange,originator))
for (var/obj/item/weapon/cell/B in C.contents)
B.charge -= 500
for (var/obj/machinery/power/smes/S in range (src.aurarange,originator)) S.charge -= 400
for (var/mob/living/silicon/robot/M in range(src.aurarange,originator))
for (var/obj/item/weapon/cell/D in M.contents)
D.charge -= 500
M << "\red SYSTEM ALERT: Severe energy drain detected!"
return 1
if("planthelper")
//makes weeds and shrooms and stuff more potent too
for (var/obj/machinery/hydroponics/H in range(src.aurarange,originator))
if(H.planted)
H.dead = 0
H.waterlevel = 200
H.nutrilevel = 200
H.toxic = 0
H.health = 100
H.pestlevel = 0
H.weedlevel = 0
H.lastcycle = H.cycledelay
return 1
if("teleport")
for (var/mob/living/M in range(src.aurarange,originator))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
var/list/randomturfs = new/list()
for(var/turf/T in orange(M, 30))
if(!istype(T, /turf/simulated/floor) || T.density)
continue
randomturfs.Add(T)
if(randomturfs.len > 0)
M << "\red You are displaced by a strange force!"
M.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is
sparks.start()
return 1
else if (src.effectmode == "worldpulse")
for(var/mob/O in viewers(originator, null))
O.show_message(text("<b>[]</b> emits a powerful burst of energy!", originator), 1)
switch(src.effecttype)
if("healing")
for (var/mob/living/carbon/M in world)
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\blue Waves of soothing energy wash over you."
M.adjustBruteLoss(-3)
M.adjustFireLoss(-3)
M.adjustToxLoss(-3)
M.adjustOxyLoss(-3)
M.adjustBrainLoss(-3)
M.updatehealth()
return 1
if("injure")
for (var/mob/living/carbon/M in world)
M << "\red A wave of painful energy strikes you!"
M.adjustBruteLoss(3)
M.adjustFireLoss(3)
M.adjustToxLoss(3)
M.adjustOxyLoss(3)
M.adjustBrainLoss(3)
M.updatehealth()
return 1
if("stun")
for (var/mob/living/carbon/M in world)
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\red A powerful force causes you to black out momentarily."
M.paralysis += 5
M.stunned += 8
M.weakened += 8
M.stuttering += 8
return 1
if("roboheal")
for (var/mob/living/silicon/robot/M in world)
M << "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!"
M.adjustBruteLoss(-5)
M.adjustFireLoss(-5)
M.updatehealth()
return 1
if("robohurt")
for (var/mob/living/silicon/robot/M in world)
M << "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!"
M.adjustBruteLoss(5)
M.adjustFireLoss(5)
M.updatehealth()
return 1
if("cellcharge")
for (var/obj/machinery/power/apc/C in world)
for (var/obj/item/weapon/cell/B in C.contents)
B.charge += 100
for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge += 250
for (var/mob/living/silicon/robot/M in world)
for (var/obj/item/weapon/cell/D in M.contents)
D.charge += 100
M << "\blue SYSTEM ALERT: Energy boost detected!"
return 1
if("celldrain")
for (var/obj/machinery/power/apc/C in world)
for (var/obj/item/weapon/cell/B in C.contents)
B.charge -= 250
for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge -= 250
for (var/mob/living/silicon/robot/M in world)
for (var/obj/item/weapon/cell/D in M.contents)
D.charge -= 250
M << "\red SYSTEM ALERT: Energy drain detected!"
return 1
if("teleport")
for (var/mob/living/M in world)
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
var/list/randomturfs = new/list()
for(var/turf/T in orange(M, 15))
if(!istype(T, /turf/simulated/floor) || T.density)
continue
randomturfs.Add(T)
if(randomturfs.len > 0)
M << "\red You are displaced by a strange force!"
M.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is
sparks.start()
return 1

View File

@@ -0,0 +1,136 @@
/obj/machinery/artifact_harvester
name = "Anomaly Power Collector"
icon = 'virology.dmi'
icon_state = "incubator" //incubator_on
anchored = 1
density = 1
var/harvesting = 0
var/obj/item/weapon/anobattery/inserted_battery
var/obj/machinery/artifact/cur_artifact
var/obj/machinery/analyser_pad/owned_pad = null
/obj/machinery/artifact_harvester/New()
..()
spawn(10)
owned_pad = locate() in orange(1, src)
/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.drop_item()
I.loc = src
src.inserted_battery = I
return
else
return..()
/obj/machinery/artifact_harvester/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/artifact_harvester/attack_paw(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/artifact_harvester/attack_hand(var/mob/user as mob)
interact(user)
/obj/machinery/artifact_harvester/process()
if(harvesting)
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("<b>[name]</b> states, \"Battery is full.\"")
icon_state = "incubator"
return
/obj/machinery/artifact_harvester/proc/interact(var/mob/user as mob)
user.machine = src
var/dat = "<B>Artifact Power Harvester</B><BR>"
dat += "<HR><BR>"
//
if(owned_pad)
if(harvesting)
dat += "Please wait. Harvesting in progress ([(inserted_battery.stored_charge/inserted_battery.capacity)*100]%).<br>"
dat += "<A href='?src=\ref[src];stopharvest=1'>Halt early</A><BR>"
else
if(inserted_battery)
dat += "<b>[inserted_battery.name]</b> inserted, charge level: [inserted_battery.stored_charge]/[inserted_battery.capacity] ([(inserted_battery.stored_charge/inserted_battery.capacity)*100]%)<BR>"
dat += "<b>Energy signature ID:</b>[inserted_battery.battery_effect.artifact_id]<BR>"
dat += "<A href='?src=\ref[src];ejectbattery=1'>Eject battery</a><BR>"
dat += "<A href='?src=\ref[src];drainbattery=1'>Drain battery of all charge</a><BR>"
dat += "<A href='?src=\ref[src];harvest=1'>Begin harvesting</a><BR>"
else
dat += "No battery inserted.<BR>"
else
dat += "<B><font color=red>Unable to locate analysis pad.</font><BR></b>"
//
dat += "<HR>"
dat += "<A href='?src=\ref[src];refresh=1'>Refresh</A> <A href='?src=\ref[src];close=1'>Close<BR>"
user << browse(dat, "window=artharvester;size=450x500")
onclose(user, "artharvester")
/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_pad))
analysed = A
articount++
if(articount > 1)
var/message = "<b>[src]</b> states, \"Cannot harvest. Too many artifacts on pad.\""
src.visible_message(message, message)
else if(!articount)
var/message = "<b>[src]</b> states, \"Cannot harvest. No artifact found.\""
src.visible_message(message, message)
else
cur_artifact = analysed
//check to see if the battery is compatible
if(inserted_battery)
if(inserted_battery.battery_effect.artifact_id == cur_artifact.my_effect.artifact_id || inserted_battery.stored_charge == 0)
harvesting = 1
cur_artifact.anchored = 1
icon_state = "incubator_on"
var/message = "<b>[src]</b> states, \"Beginning artifact energy harvesting.\""
src.visible_message(message, message)
//
inserted_battery.battery_effect = cur_artifact.my_effect
else
var/message = "<b>[src]</b> states, \"Cannot harvest. Incompatible energy signatures detected.\""
src.visible_message(message, message)
else if(cur_artifact)
var/message = "<b>[src]</b> states, \"Cannot harvest. No battery inserted.\""
src.visible_message(message, message)
if (href_list["stopharvest"])
if(harvesting)
harvesting = 0
cur_artifact.anchored = 0
src.visible_message("<b>[name]</b> states, \"Harvesting interrupted.\"")
icon_state = "incubator"
if (href_list["ejectbattery"])
src.inserted_battery.loc = src.loc
src.inserted_battery = null
if (href_list["drainbattery"])
src.inserted_battery.battery_effect.artifact_id = ""
src.inserted_battery.stored_charge = 0
var/message = "<b>[src]</b> states, \"Battery drained of all charge.\""
src.visible_message(message, message)
if(href_list["close"])
usr << browse(null, "window=artharvester")
usr.machine = null
src.updateDialog()
return

View File

@@ -18,4 +18,30 @@
/area/anomaly
name = "Anomaly Lab"
icon_state = "anomaly"
icon_state = "anomaly"
/obj/structure/noticeboard/anomaly/New()
notices = 3
icon_state = "nboard03"
//add some memos
var/obj/item/weapon/paper/P = new()
P.name = "Memo RE: proper analysis procedure"
P.info = "Rose,<br>activate <i>then</i> analyse the anomalies, your results will come so much quicker. Remember to employ basic quasi-elemental forces such as heat, energy, force and various chemical mixes - who knows why those ancient aliens made such obscure activation indices.<br><br>And don't forget your suit this time, I can't afford to have any researchers out of commision for as long as that again!.<br>- Ward"
P.stamped = list(/obj/item/weapon/stamp/rd)
P.overlays = list("paper_stamped_rd")
src.contents += P
P = new()
P.name = "Memo RE: materials gathering"
P.info = "Corasang,<br>the hands-on approach to gathering our samples may very well be slow at times, but it's safer than allowing the blundering miners to roll willy-nilly over our dig sites in their mechs, destroying everything in the process. And don't forget the escavation tools on your way out there!<br>- Ward"
P.stamped = list(/obj/item/weapon/stamp/rd)
P.overlays = list("paper_stamped_rd")
src.contents += P
P = new()
P.name = "Memo RE: ethical quandaries"
P.info = "Darion-<br><br>I don't care what his rank is, our business is that of science and knowledge - questions of moral application do not come into this. Sure, so there are those who would employ the energy-wave particles my modified device has managed to abscond for their own personal gain, but I can hardly see the practical benefits of some of those things our benefactors left behind. Ward--"
P.stamped = list(/obj/item/weapon/stamp/rd)
P.overlays = list("paper_stamped_rd")
src.contents += P

View File

@@ -0,0 +1,130 @@
/obj/item/weapon/anobattery
name = "Anomaly power battery"
icon = 'anomaly.dmi'
icon_state = "anobattery0"
var/datum/artifact_effect/battery_effect
var/capacity = 200
var/stored_charge = 0
/obj/item/weapon/anobattery/New()
battery_effect = new()
/obj/item/weapon/anobattery/proc/UpdateSprite()
var/p = (stored_charge/capacity)*100
icon_state = "anobattery[round(p,25)]"
/obj/item/weapon/anodevice
name = "Anomaly power utilizer"
icon = 'anomaly.dmi'
icon_state = "anodev"
var/cooldown = 0
var/activated = 0
var/time = 50
var/obj/item/weapon/anobattery/inserted_battery
/obj/item/weapon/anodevice/New()
spawn(10)
pulse()
/obj/item/weapon/anodevice/proc/UpdateSprite()
if(!inserted_battery)
icon_state = "anodev"
return
var/p = (inserted_battery.stored_charge/inserted_battery.capacity)*100
var/s = round(p,25)
icon_state = "anodev[s]"
/obj/item/weapon/anodevice/proc/interact(var/mob/user)
user.machine = src
var/dat = "<b>Anomalous Materials Energy Utiliser</b><br>"
if(cooldown)
dat += "Cooldown in progress, please wait.<BR>"
else
if(!inserted_battery)
dat += "Please insert battery<BR>"
else
dat += "[inserted_battery] inserted, anomaly ID: [inserted_battery.battery_effect.artifact_id]<BR>"
dat += "<b>Total Power:</b> [inserted_battery.stored_charge]/[inserted_battery.capacity]<BR><BR>"
dat += "<b>Timed activation:</b> <A href='?src=\ref[src];changetime=-100'>--</a> <A href='?src=\ref[src];changetime=-10'>-</a> [time >= 1000 ? "[time/10]" : time >= 100 ? " [time/10]" : " [time/10]" ] <A href='?src=\ref[src];changetime=10'>+</a> <A href='?src=\ref[src];changetime=100'>++</a><BR>"
if(cooldown && !activated)
dat += "<font color=red>Cooldown in progress.</font><BR>"
else if(activated)
dat += "<A href='?src=\ref[src];stoptimer=1'>Stop timer</a><BR>"
else
dat += "<A href='?src=\ref[src];starttimer=1'>Start timer</a><BR>"
dat += "<A href='?src=\ref[src];ejectbattery=1'>Eject battery</a><BR>"
dat += "<A href='?src=\ref[src];refresh=1'>Refresh</a><BR>"
dat += "<A href='?src=\ref[src];close=1'>Close</a><BR>"
user << browse(dat, "window=anodevice;size=400x500")
onclose(user, "anodevice")
return
/obj/item/weapon/anodevice/attackby(var/obj/I as obj, var/mob/user as mob)
if(istype(I, /obj/item/weapon/anobattery))
if(!inserted_battery)
user << "\blue You insert the battery."
user.drop_item()
I.loc = src
inserted_battery = I
UpdateSprite()
else
return ..()
/obj/item/weapon/anodevice/attack_ai(var/mob/user as mob)
return src.interact(user)
/*/obj/item/weapon/anodevice/attack_paw(var/mob/user as mob)
return src.interact(user)*/
/obj/item/weapon/anodevice/attack_self(var/mob/user as mob)
return src.interact(user)
/*obj/item/weapon/anodevice/attack_hand(var/mob/user as mob)
return src.interact(user)*/
/obj/item/weapon/anodevice/proc/pulse()
if(activated)
time -= 10
cooldown += 10
if(time <= 0)
time = 0
activated = 0
var/turf/T = get_turf(src)
T.visible_message("\icon[src]\blue The utiliser device buzzes.", "\icon[src]\blue You hear something buzz.")
updateDialog()
else
inserted_battery.battery_effect.DoEffect(src)
else if(cooldown > 0)
cooldown -= 10
if(cooldown <= 0)
cooldown = 0
var/turf/T = get_turf(src)
T.visible_message("\icon[src]\blue The utiliser device chimes.", "\icon[src]\blue You hear something chime.")
updateDialog()
spawn(10)
pulse()
/obj/item/weapon/anodevice/Topic(href, href_list)
if(href_list["changetime"])
var/mod = href_list["changetime"]
time += num2text(mod)
if(href_list["stoptimer"])
activated = 0
if(href_list["starttimer"])
activated = 1
if(href_list["ejectbattery"])
inserted_battery.loc = get_turf(src)
inserted_battery = null
UpdateSprite()
if(href_list["close"])
usr << browse(null, "window=anodevice")
usr.machine = null
updateDialog()

View File

@@ -8,586 +8,213 @@
icon_state = "ano0"
anchored = 0
density = 1
var/display_id = "" // Artifact ID to display once successfully scanned
var/origin = null // Used in the randomisation/research of the artifact.
var/activated = 0 // Whether or not the artifact has been unlocked.
var/charged = 1 // Whether the artifact is ready to have it's effect.
var/chargetime = 0 // How much time until the artifact is charged.
var/recharge = 5 // How long does it take this artifact to recharge?
var/origin = null // Used in the randomisation/research of the artifact.
var/trigger = "touch" // What activates it?
var/triggerX = "none" // Used for more varied triggers
var/effecttype = "healing" // What does it do?
var/effectmode = "aura" // How does it carry out the effect?
var/aurarange = 4 // How far the artifact will extend an aura effect.
var/display_id = "" // Artifact ID to display once successfully scanned
var/datum/artifact_effect/my_effect = null
New()
..()
// Origin and appearance randomisation
// cael - need some more icons
src.origin = pick("ancient","martian","wizard","eldritch","precursor")
switch(src.origin)
if("ancient") src.icon_state = pick("ano2")
if("martian") src.icon_state = pick("ano4")
if("wizard") src.icon_state = pick("ano0","ano1")
if("eldritch") src.icon_state = pick("ano3")
if("precursor") src.icon_state = pick("ano5")
// Low-ish random chance to not look like it's origin
if(prob(20)) src.icon_state = pick("ano0","ano1","ano2","ano3","ano4","ano5")
// Power randomisation
src.trigger = pick("force","energy","chemical","heat","touch")
if (src.trigger == "chemical") src.triggerX = pick("hydrogen","corrosive","volatile","toxic")
// Ancient Artifacts focus on robotic/technological effects
// Martian Artifacts focus on biological effects
// Wizard Artifacts focus on weird shit
// Eldritch Artifacts are 100% bad news
// Precursor Artifacts do everything
switch(src.origin)
if("ancient") src.effecttype = pick("roboheal","robohurt","cellcharge","celldrain")
if("martian") src.effecttype = pick("healing","injure","stun","planthelper")
if("wizard") src.effecttype = pick("stun","forcefield","teleport")
if("eldritch") src.effecttype = pick("injure","stun","robohurt","celldrain")
if("precursor") src.effecttype = pick("healing","injure","stun","roboheal","robohurt","cellcharge","celldrain","planthelper","forcefield","teleport")
// Select range based on the power
var/canworldpulse = 1
switch(src.effecttype)
if("healing") src.effectmode = pick("aura","pulse","contact")
if("injure") src.effectmode = pick("aura","pulse","contact")
if("stun") src.effectmode = pick("aura","pulse","contact")
if("roboheal") src.effectmode = pick("aura","pulse","contact")
if("robohurt") src.effectmode = pick("aura","pulse","contact")
if("cellcharge") src.effectmode = pick("aura","pulse")
if("celldrain") src.effectmode = pick("aura","pulse")
if("planthelper")
src.effectmode = pick("aura","pulse")
canworldpulse = 0
if("forcefield")
src.effectmode = "contact"
canworldpulse = 0
if("teleport") src.effectmode = pick("pulse","contact")
// Recharge timer & range setup
if (src.effectmode == "aura") src.aurarange = rand(1,4)
if (src.effectmode == "contact")
src.recharge = rand(5,15)
if (src.effectmode == "pulse")
src.aurarange = rand(2,14)
src.recharge = rand(5,20)
if (canworldpulse == 1 && prob(1))
src.effectmode = "worldpulse"
src.recharge = rand(40,120)
/obj/machinery/artifact/New()
world << "\blue new artifact"
..()
// Origin and appearance randomisation
// cael - need some more icons
display_id += pick("kappa","sigma","antaeres","beta","lorard","omicron","iota","upsilon","omega","gamma","delta")
display_id += "-"
display_id += num2text(rand(100,999))
my_effect = new()
attack_hand(var/mob/user as mob)
if (istype(user, /mob/living/silicon/ai) || istype(user, /mob/dead/)) return
if (istype(user, /mob/living/silicon/robot))
if (get_dist(user, src) > 1)
user << "\red You can't reach [src] from here."
return
if(istype(user:gloves,/obj/item/clothing/gloves))
return ..()
for(var/mob/O in viewers(src, null))
O.show_message(text("<b>[]</b> touches [].", user, src), 1)
src.add_fingerprint(user)
src.Artifact_Contact(user)
src.origin = pick("ancient","martian","wizard","eldritch","precursor")
switch(src.origin)
if("ancient") src.icon_state = pick("ano2")
if("martian") src.icon_state = pick("ano4")
if("wizard") src.icon_state = pick("ano0","ano1")
if("eldritch") src.icon_state = pick("ano3")
if("precursor") src.icon_state = pick("ano5")
attackby(obj/item/weapon/W as obj, mob/living/user as mob)
/*if (istype(W, /obj/item/weapon/cargotele))
W:cargoteleport(src, user)
return*/
if (src.trigger == "chemical" && istype(W, /obj/item/weapon/reagent_containers/))
switch(src.triggerX)
if("hydrogen")
if (W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1)) src.Artifact_Activate()
if("corrosive")
if (W.reagents.has_reagent("acid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) src.Artifact_Activate()
if("volatile")
if (W.reagents.has_reagent("plasma", 1) || W.reagents.has_reagent("thermite", 1)) src.Artifact_Activate()
if("toxic")
if (W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amanitin", 1) || W.reagents.has_reagent("neurotoxin", 1)) src.Artifact_Activate()
..()
if (src.trigger == "force" && W.force >= 30 && !src.activated) src.Artifact_Activate()
if (src.trigger == "energy")
if (istype(W,/obj/item/weapon/melee/baton) && W:status) src.Artifact_Activate()
if (istype(W,/obj/item/weapon/melee/energy)) src.Artifact_Activate()
if (istype(W,/obj/item/weapon/melee/cultblade)) src.Artifact_Activate()
if (istype(W,/obj/item/weapon/gun/energy/)) src.Artifact_Activate()
if (istype(W,/obj/item/device/multitool)) src.Artifact_Activate()
if (istype(W,/obj/item/weapon/card/emag)) src.Artifact_Activate()
if (src.trigger == "heat")
if (istype(W,/obj/item/weapon/match) && W:lit) src.Artifact_Activate()
if (istype(W, /obj/item/weapon/weldingtool) && W:welding) src.Artifact_Activate()
if (istype(W, /obj/item/weapon/lighter) && W:lit) src.Artifact_Activate()
// Low-ish random chance to not look like it's origin
if(prob(20)) src.icon_state = pick("ano0","ano1","ano2","ano3","ano4","ano5")
// Power randomisation
my_effect.trigger = pick("force","energy","chemical","heat","touch")
if (my_effect.trigger == "chemical") my_effect.triggerX = pick("hydrogen","corrosive","volatile","toxic")
// Ancient Artifacts focus on robotic/technological effects
// Martian Artifacts focus on biological effects
// Wizard Artifacts focus on weird shit
// Eldritch Artifacts are 100% bad news
// Precursor Artifacts do everything
switch(src.origin)
if("ancient") my_effect.effecttype = pick("roboheal","robohurt","cellcharge","celldrain")
if("martian") my_effect.effecttype = pick("healing","injure","stun","planthelper")
if("wizard") my_effect.effecttype = pick("stun","forcefield","teleport")
if("eldritch") my_effect.effecttype = pick("injure","stun","robohurt","celldrain")
if("precursor") my_effect.effecttype = pick("healing","injure","stun","roboheal","robohurt","cellcharge","celldrain","planthelper","forcefield","teleport")
// Select range based on the power
var/canworldpulse = 1
switch(my_effect.effecttype)
if("healing") my_effect.effectmode = pick("aura","pulse","contact")
if("injure") my_effect.effectmode = pick("aura","pulse","contact")
if("stun") my_effect.effectmode = pick("aura","pulse","contact")
if("roboheal") my_effect.effectmode = pick("aura","pulse","contact")
if("robohurt") my_effect.effectmode = pick("aura","pulse","contact")
if("cellcharge") my_effect.effectmode = pick("aura","pulse")
if("celldrain") my_effect.effectmode = pick("aura","pulse")
if("planthelper")
my_effect.effectmode = pick("aura","pulse")
canworldpulse = 0
if("forcefield")
my_effect.effectmode = "contact"
canworldpulse = 0
if("teleport") my_effect.effectmode = pick("pulse","contact")
// Recharge timer & range setup
if (my_effect.effectmode == "aura")
my_effect.aurarange = rand(1,4)
if (my_effect.effectmode == "contact")
src.recharge = rand(5,15)
if (my_effect.effectmode == "pulse")
my_effect.aurarange = rand(2,14)
src.recharge = rand(5,20)
if (canworldpulse == 1 && prob(1))
my_effect.effectmode = "worldpulse"
src.recharge = rand(40,120)
display_id += pick("kappa","sigma","antaeres","beta","lorard","omicron","iota","upsilon","omega","gamma","delta")
display_id += "-"
display_id += num2text(rand(100,999))
/obj/machinery/artifact/attack_hand(var/mob/user as mob)
if (istype(user, /mob/living/silicon/ai) || istype(user, /mob/dead/)) return
if (istype(user, /mob/living/silicon/robot))
if (get_dist(user, src) > 1)
user << "\red You can't reach [src] from here."
return
if(istype(user:gloves,/obj/item/clothing/gloves))
return ..()
for(var/mob/O in viewers(src, null))
O.show_message(text("<b>[]</b> touches [].", user, src), 1)
src.add_fingerprint(user)
src.Artifact_Contact(user)
/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
/*if (istype(W, /obj/item/weapon/cargotele))
W:cargoteleport(src, user)
return*/
if (my_effect.trigger == "chemical" && istype(W, /obj/item/weapon/reagent_containers/))
switch(my_effect.triggerX)
if("hydrogen")
if (W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1))
src.Artifact_Activate()
return
if("corrosive")
if (W.reagents.has_reagent("acid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1))
src.Artifact_Activate()
return
if("volatile")
if (W.reagents.has_reagent("plasma", 1) || W.reagents.has_reagent("thermite", 1))
src.Artifact_Activate()
return
if("toxic")
if (W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amanitin", 1) || W.reagents.has_reagent("neurotoxin", 1))
src.Artifact_Activate()
return
..()
if (my_effect.trigger == "force" && W.force >= 10 && !src.activated) src.Artifact_Activate()
if (my_effect.trigger == "energy")
if (istype(W,/obj/item/weapon/melee/baton) && W:status) src.Artifact_Activate()
if (istype(W,/obj/item/weapon/melee/energy)) src.Artifact_Activate()
if (istype(W,/obj/item/weapon/melee/cultblade)) src.Artifact_Activate()
if (istype(W,/obj/item/weapon/gun/energy/)) src.Artifact_Activate()
if (istype(W,/obj/item/device/multitool)) src.Artifact_Activate()
if (istype(W,/obj/item/weapon/card/emag)) src.Artifact_Activate()
if (my_effect.trigger == "heat")
if (istype(W,/obj/item/weapon/match) && W:lit) src.Artifact_Activate()
if (istype(W, /obj/item/weapon/weldingtool) && W:welding) src.Artifact_Activate()
if (istype(W, /obj/item/weapon/lighter) && W:lit) src.Artifact_Activate()
//Bump(atom/A)
Bumped(M as mob|obj)
if (istype(M,/obj/item/weapon/) && src.trigger == "force" && M:throwforce >= 30) src.Artifact_Activate()
/obj/machinery/artifact/Bumped(M as mob|obj)
if (istype(M,/obj/item/weapon/) && my_effect.trigger == "force" && M:throwforce >= 10) src.Artifact_Activate()
bullet_act(var/obj/item/projectile/P)
if (src.trigger == "force")
if(istype(P,/obj/item/projectile/bullet)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/hivebotbullet)) src.Artifact_Activate()
if (src.trigger == "energy")
if(istype(P,/obj/item/projectile/beam)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/ion)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/energy)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/bluetag)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/redtag)) src.Artifact_Activate()
if (src.trigger == "heat")
if(istype(P,/obj/item/projectile/temp)) src.Artifact_Activate()
/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P)
if (my_effect.trigger == "force")
if(istype(P,/obj/item/projectile/bullet)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/hivebotbullet)) src.Artifact_Activate()
if (my_effect.trigger == "energy")
if(istype(P,/obj/item/projectile/beam)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/ion)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/energy)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/bluetag)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/redtag)) src.Artifact_Activate()
if (my_effect.trigger == "heat")
if(istype(P,/obj/item/projectile/temp)) src.Artifact_Activate()
ex_act(severity)
switch(severity)
if(1.0) del src
if(2.0)
if (prob(50)) del src
if (src.trigger == "force") src.Artifact_Activate()
if (src.trigger == "heat") src.Artifact_Activate()
if(3.0)
if (src.trigger == "force") src.Artifact_Activate()
if (src.trigger == "heat") src.Artifact_Activate()
/obj/machinery/artifact/ex_act(severity)
switch(severity)
if(1.0) del src
if(2.0)
if (prob(50)) del src
if (my_effect.trigger == "force") src.Artifact_Activate()
if (my_effect.trigger == "heat") src.Artifact_Activate()
if(3.0)
if (my_effect.trigger == "force") src.Artifact_Activate()
if (my_effect.trigger == "heat") src.Artifact_Activate()
return
/obj/machinery/artifact/temperature_expose(null, temp, volume)
if (my_effect.trigger == "heat") src.Artifact_Activate()
/obj/machinery/artifact/process()
if (!src.activated)
return
if (chargetime > 0)
chargetime -= 1
else
src.charged = 1
my_effect.HaltEffect(src.loc)
temperature_expose(null, temp, volume)
if (src.trigger == "heat") src.Artifact_Activate()
my_effect.UpdateEffect(src.loc)
process()
if (!src.activated) return
if (src.chargetime > 0)
src.chargetime--
else src.charged = 1
if (src.effectmode == "aura")
switch(src.effecttype)
if("healing")
for (var/mob/living/carbon/M in range(src.aurarange,src))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
if(prob(10)) M << "\blue You feel a soothing energy radiating from something nearby."
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
M.adjustToxLoss(-1)
M.adjustOxyLoss(-1)
M.adjustBrainLoss(-1)
M.updatehealth()
if("injure")
for (var/mob/living/carbon/M in range(src.aurarange,src))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
if(prob(10)) M << "\red You feel a painful force radiating from something nearby."
M.adjustBruteLoss(1)
M.adjustFireLoss(1)
M.adjustToxLoss(1)
M.adjustOxyLoss(1)
M.adjustBrainLoss(1)
M.updatehealth()
if("stun")
for (var/mob/living/carbon/M in range(src.aurarange,src))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
if(prob(10)) M << "\red Energy radiating from the [src] is making you feel numb."
if(prob(20))
M << "\red Your body goes numb for a moment."
M.stunned += 2
M.weakened += 2
M.stuttering += 2
if("roboheal")
for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
if(prob(10)) M << "\blue SYSTEM ALERT: Beneficial energy field detected!"
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
M.updatehealth()
if("robohurt")
for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
if(prob(10)) M << "\red SYSTEM ALERT: Harmful energy field detected!"
M.adjustBruteLoss(1)
M.adjustFireLoss(1)
M.updatehealth()
if("cellcharge")
for (var/obj/machinery/power/apc/C in range(src.aurarange,src))
for (var/obj/item/weapon/cell/B in C.contents)
B.charge += 10
for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge += 20
for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
for (var/obj/item/weapon/cell/D in M.contents)
D.charge += 10
if(prob(10)) M << "\blue SYSTEM ALERT: Energy boosting field detected!"
if("celldrain")
for (var/obj/machinery/power/apc/C in range(src.aurarange,src))
for (var/obj/item/weapon/cell/B in C.contents)
B.charge -= 10
for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge -= 20
for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
for (var/obj/item/weapon/cell/D in M.contents)
D.charge -= 10
if(prob(10)) M << "\red SYSTEM ALERT: Energy draining field detected!"
if("planthelper")
for (var/obj/machinery/hydroponics/H in range(src.aurarange,src))
//makes weeds and shrooms and stuff more potent too
if(H.planted)
H.waterlevel += 2
H.nutrilevel += 2
if(H.toxic > 0)
H.toxic -= 1
H.health += 1
if(H.pestlevel > 0)
H.pestlevel -= 1
if(H.weedlevel > 0)
H.weedlevel -= 1
H.lastcycle += 5
if (src.effectmode == "pulse")
if (!src.charged) return
for(var/mob/O in viewers(src, null))
O.show_message(text("<b>[]</b> emits a pulse of energy!", src), 1)
switch(src.effecttype)
if("healing")
for (var/mob/living/carbon/M in range(src.aurarange,src))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\blue A wave of energy invigorates you."
M.adjustBruteLoss(5)
M.adjustFireLoss(5)
M.adjustToxLoss(5)
M.adjustOxyLoss(5)
M.adjustBrainLoss(5)
M.updatehealth()
src.charged = 0
src.chargetime = src.recharge
if("injure")
for (var/mob/living/carbon/M in range(src.aurarange,src))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\red A wave of energy causes you great pain!"
M.adjustBruteLoss(5)
M.adjustFireLoss(5)
M.adjustToxLoss(5)
M.adjustOxyLoss(5)
M.adjustBrainLoss(5)
M.stunned += 3
M.weakened += 3
M.updatehealth()
src.charged = 0
src.chargetime = src.recharge
if("stun")
for (var/mob/living/carbon/M in range(src.aurarange,src))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\red A wave of energy overwhelms your senses!"
M.paralysis += 3
M.stunned += 4
M.weakened += 4
M.stuttering += 4
src.charged = 0
src.chargetime = src.recharge
if("roboheal")
for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
M << "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!"
M.adjustBruteLoss(-10)
M.adjustFireLoss(-10)
M.updatehealth()
src.charged = 0
src.chargetime = src.recharge
if("robohurt")
for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
M << "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!"
M.adjustBruteLoss(10)
M.adjustFireLoss(10)
M.updatehealth()
src.charged = 0
src.chargetime = src.recharge
if("cellcharge")
for (var/obj/machinery/power/apc/C in range(src.aurarange,src))
for (var/obj/item/weapon/cell/B in C.contents)
B.charge += 250
for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge += 400
for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
for (var/obj/item/weapon/cell/D in M.contents)
D.charge += 250
M << "\blue SYSTEM ALERT: Large energy boost detected!"
src.charged = 0
src.chargetime = src.recharge
if("celldrain")
for (var/obj/machinery/power/apc/C in range(src.aurarange,src))
for (var/obj/item/weapon/cell/B in C.contents)
B.charge -= 500
for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge -= 400
for (var/mob/living/silicon/robot/M in range(src.aurarange,src))
for (var/obj/item/weapon/cell/D in M.contents)
D.charge -= 500
M << "\red SYSTEM ALERT: Severe energy drain detected!"
src.charged = 0
src.chargetime = src.recharge
if("planthelper")
//makes weeds and shrooms and stuff more potent too
for (var/obj/machinery/hydroponics/H in range(src.aurarange,src))
if(H.planted)
H.dead = 0
H.waterlevel = 200
H.nutrilevel = 200
H.toxic = 0
H.health = 100
H.pestlevel = 0
H.weedlevel = 0
H.lastcycle = H.cycledelay
if("teleport")
for (var/mob/living/M in range(src.aurarange,src))
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
var/list/randomturfs = new/list()
for(var/turf/T in orange(M, 30))
if(!istype(T, /turf/simulated/floor) || T.density)
continue
randomturfs.Add(T)
if(randomturfs.len > 0)
M << "\red You are displaced by a strange force!"
M.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(src)) //no idea what the 0 is
sparks.start()
src.charged = 0
src.chargetime = src.recharge
if (src.effectmode == "worldpulse")
if (!src.charged) return
for(var/mob/O in viewers(src, null))
O.show_message(text("<b>[]</b> emits a powerful burst of energy!", src), 1)
switch(src.effecttype)
if("healing")
for (var/mob/living/carbon/M in world)
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\blue Waves of soothing energy wash over you."
M.adjustBruteLoss(-3)
M.adjustFireLoss(-3)
M.adjustToxLoss(-3)
M.adjustOxyLoss(-3)
M.adjustBrainLoss(-3)
M.updatehealth()
src.charged = 0
src.chargetime = src.recharge
if("injure")
for (var/mob/living/carbon/M in world)
M << "\red A wave of painful energy strikes you!"
M.adjustBruteLoss(3)
M.adjustFireLoss(3)
M.adjustToxLoss(3)
M.adjustOxyLoss(3)
M.adjustBrainLoss(3)
M.updatehealth()
src.charged = 0
src.chargetime = src.recharge
if("stun")
for (var/mob/living/carbon/M in world)
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
M << "\red A powerful force causes you to black out momentarily."
M.paralysis += 5
M.stunned += 8
M.weakened += 8
M.stuttering += 8
src.charged = 0
src.chargetime = src.recharge
if("roboheal")
for (var/mob/living/silicon/robot/M in world)
M << "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!"
M.adjustBruteLoss(-5)
M.adjustFireLoss(-5)
M.updatehealth()
src.charged = 0
src.chargetime = src.recharge
if("robohurt")
for (var/mob/living/silicon/robot/M in world)
M << "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!"
M.adjustBruteLoss(5)
M.adjustFireLoss(5)
M.updatehealth()
src.charged = 0
src.chargetime = src.recharge
if("cellcharge")
for (var/obj/machinery/power/apc/C in world)
for (var/obj/item/weapon/cell/B in C.contents)
B.charge += 100
for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge += 250
for (var/mob/living/silicon/robot/M in world)
for (var/obj/item/weapon/cell/D in M.contents)
D.charge += 100
M << "\blue SYSTEM ALERT: Energy boost detected!"
src.charged = 0
src.chargetime = src.recharge
if("celldrain")
for (var/obj/machinery/power/apc/C in world)
for (var/obj/item/weapon/cell/B in C.contents)
B.charge -= 250
for (var/obj/machinery/power/smes/S in range (src.aurarange,src)) S.charge -= 250
for (var/mob/living/silicon/robot/M in world)
for (var/obj/item/weapon/cell/D in M.contents)
D.charge -= 250
M << "\red SYSTEM ALERT: Energy drain detected!"
src.charged = 0
src.chargetime = src.recharge
if("teleport")
for (var/mob/living/M in world)
if(istype(M:wear_suit,/obj/item/clothing/suit/bio_suit/anomaly) && istype(M:head,/obj/item/clothing/head/bio_hood/anomaly))
continue
var/list/randomturfs = new/list()
for(var/turf/T in orange(M, 15))
if(!istype(T, /turf/simulated/floor) || T.density)
continue
randomturfs.Add(T)
if(randomturfs.len > 0)
M << "\red You are displaced by a strange force!"
M.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(src)) //no idea what the 0 is
sparks.start()
src.charged = 0
src.chargetime = src.recharge
//activate
if(src.charged && my_effect.DoEffect(src.loc))
src.charged = 0
src.chargetime = src.recharge
/obj/machinery/artifact/proc/Artifact_Activate()
src.activated = 1
src.activated = !src.activated
var/display_msg = ""
switch(rand(1))
if(0)
display_msg = "momentarily glows brightly!"
if(1)
display_msg = "distorts slightly for a moment!"
if(2)
display_msg = "makes a slightly clicking noise!"
if(3)
display_msg = "flickers slightly!"
if(3)
display_msg = "vibrates!"
for(var/mob/O in viewers(src, null))
O.show_message(text("<b>[]</b> activates!", src), 1)
O.show_message(text("<b>[]</b> [display_msg]", src), 1)
/obj/machinery/artifact/proc/Artifact_Contact(var/mob/user as mob)
// Trigger Code
if (istype (user,/mob/living/carbon/) && src.trigger == "touch" && !src.activated) src.Artifact_Activate()
else if (src.trigger != "touch" && !src.activated) user << "Nothing happens."
// Effect Code
if (src.effectmode == "contact" && src.activated && src.charged)
switch(src.effecttype)
if("healing")
if (istype(user, /mob/living/carbon/human/))
user << "\blue You feel a soothing energy invigorate you."
if (istype (user,/mob/living/carbon/) && my_effect.trigger == "touch" && !src.activated) src.Artifact_Activate()
else if (my_effect.trigger != "touch" && !src.activated) user << "Nothing happens."
var/mob/living/carbon/human/H = user
for(var/A in H.organs)
var/datum/organ/external/affecting = null
if(!H.organs[A]) continue
affecting = H.organs[A]
if(!istype(affecting, /datum/organ/external)) continue
affecting.heal_damage(25, 25) //fixes getting hit after ingestion, killing you when game updates organ health
for(var/datum/organ/wound/W in affecting.wounds)
W.stopbleeding()
W.is_healing = 1
//user:heal_organ_damage(25, 25)
//
user.adjustOxyLoss(-25)
user.adjustToxLoss(-25)
user.adjustBruteLoss(-25)
user.adjustFireLoss(-25)
user.adjustBrainLoss(-25)
user.radiation -= min(user.radiation, 25)
user.nutrition += 50
H.bodytemperature = initial(H.bodytemperature)
//
H.vessel.add_reagent("blood",50)
spawn(1)
H.fixblood()
H.update_body()
H.update_face()
H.UpdateDamageIcon()
//
src.charged = 0
src.chargetime = src.recharge
else user << "Nothing happens."
if("injure")
if (istype(user, /mob/living/carbon/))
user << "\red A painful discharge of energy strikes you!"
user.adjustOxyLoss(25)
user.adjustToxLoss(25)
user.adjustBruteLoss(25)
user.adjustFireLoss(25)
user.adjustBrainLoss(25)
user.radiation += 25
user.nutrition -= min(50, user.nutrition)
user.stunned += 6
user.weakened += 6
src.charged = 0
src.chargetime = src.recharge
else user << "Nothing happens."
if("stun")
if (istype(user, /mob/living/carbon/))
user << "\red A powerful force overwhelms your consciousness."
user.paralysis += 30
user.stunned += 45
user.weakened += 45
user.stuttering += 45
src.charged = 0
src.chargetime = src.recharge
else user << "Nothing happens."
if("roboheal")
if (istype(user, /mob/living/silicon/robot))
user << "\blue Your systems report damaged components mending by themselves!"
user.adjustBruteLoss(-30)
user.adjustFireLoss(-30)
src.charged = 0
src.chargetime = src.recharge
else user << "Nothing happens."
if("robohurt")
if (istype(user, /mob/living/silicon/robot))
user << "\red Your systems report severe damage has been inflicted!"
user.adjustBruteLoss(40)
user.adjustFireLoss(40)
src.charged = 0
src.chargetime = src.recharge
else user << "Nothing happens."
if("forcefield")
var/obj/effect/energy_field/E = new /obj/effect/energy_field(locate(src.x + 2,src.y,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x + 2,src.y + 1,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x + 2,src.y + 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x + 2,src.y - 1,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x + 2,src.y - 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x - 2,src.y,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x - 2,src.y + 1,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x - 2,src.y + 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x - 2,src.y - 1,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x - 2,src.y - 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x,src.y + 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x + 1,src.y + 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x - 1,src.y + 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x,src.y - 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x + 1,src.y - 2,src.z))
E.strength = 1
E = new /obj/effect/energy_field(locate(src.x - 1,src.y - 2,src.z))
E.strength = 1
src.charged = 0
src.chargetime = src.recharge
spawn (src.recharge)
for(var/obj/effect/energy_field/F in range(5,src))
del F
if("teleport")
var/list/randomturfs = new/list()
for(var/turf/T in orange(user, 50))
if(!istype(T, /turf/simulated/floor) || T.density)
continue
randomturfs.Add(T)
if(randomturfs.len > 0)
user << "\red You are suddenly zapped away elsewhere!"
user.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(src)) //no idea what the 0 is
sparks.start()
else if (src.effectmode == "contact" && src.activated && !src.charged) user << "The artifact feels warm, but nothing interesting happens."
if (my_effect.effectmode == "contact" && src.activated && src.charged)
my_effect.DoEffect(src.loc)
src.charged = 0
src.chargetime = src.recharge
// this was used in QM for a time but it fell into disuse and wasn't removed, the purpose being to check if an artifact
// was benevolent or malicious, to determine whether QMs would be paid or punished for shipping it
/proc/artifact_checkgood(var/obj/machinery/artifact/A)
/proc/artifact_checkgood(var/datum/artifact_effect/A)
switch(A.effecttype)
if("healing") return 1
if("injure") return 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

File diff suppressed because it is too large Load Diff