mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-30 07:27:57 +01:00
Merge pull request #1363 from caelaislinn/master
multiple anomaly updates
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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()
|
||||
+180
-553
@@ -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
|
||||
|
||||
@@ -3,7 +3,6 @@ bluefishie - Skrell
|
||||
densane - Skrell
|
||||
duntadaman - Skrell
|
||||
fenrisian - Tajaran
|
||||
firefishie - Skrell
|
||||
forsamori - Tajaran
|
||||
forsamori - Soghun
|
||||
galenus - Soghun
|
||||
|
||||
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 |
+6306
-6303
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user