diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 382ab89c367..00e45b009b9 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -186,7 +186,7 @@
if(scantemp == "Scanner unoccupied") scantemp = "" // Stupid check to remove the text
// Make sure we can't scan a headless person. It breaks the cloner permanently.
- var/datum/organ/external/temp = organs["head"]
+ var/datum/organ/external/temp = src.scanner.occupant.organs["head"]
if(temp && !(temp.status & DESTROYED))
dat += "Scan - [src.scanner.occupant]
"
else
diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm
index c0d479c17cf..f667ec390a4 100644
--- a/code/game/objects/weapons.dm
+++ b/code/game/objects/weapons.dm
@@ -95,6 +95,13 @@
/atom/proc/blob_act()
return
+/atom/proc/acid_act(var/datum/reagent/R)
+ return 0
+/*/obj/proc/acid_act(var/datum/reagent/R)
+ return 0
+/mob/proc/acid_act(var/datum/reagent/R)
+ return 0*/
+
// bullet_act called when anything is hit buy a projectile (bullet, tazer shot, laser, etc.)
// flag is projectile type, can be:
//PROJECTILE_TASER = 1 taser gun
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index d86f77622fe..753fafc8d94 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -702,6 +702,8 @@ datum
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
+ if(M.acid_act(src))
+ return
if(method == TOUCH)
if(istype(M, /mob/living/carbon/human))
if(M:wear_mask)
@@ -734,6 +736,8 @@ datum
M.take_organ_damage(min(15, volume * 2))
reaction_obj(var/obj/O, var/volume)
+ if(O.acid_act(src))
+ return
if(istype(O, /obj/effect/blob))
var/obj/effect/blob/B = O
if(B.weakness == "acid")
@@ -772,6 +776,9 @@ datum
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return //wooo more runtime fixin
+ //cael - added the option for things splashed with acid to handle it themselves (for xenoarch)
+ if(M.acid_act(src))
+ return
if(method == TOUCH)
if(istype(M, /mob/living/carbon/human))
if(M:wear_mask)
@@ -815,6 +822,8 @@ datum
M.take_organ_damage(min(15, volume * 4))
reaction_obj(var/obj/O, var/volume)
+ if(O.acid_act(src))
+ return
if(istype(O, /obj/effect/blob))
var/obj/effect/blob/B = O
if(B.weakness == "acid")
diff --git a/code/modules/research/artifact_analysis.dm b/code/modules/research/artifact_analysis.dm
index 16b4c0c1568..3089e9cd655 100644
--- a/code/modules/research/artifact_analysis.dm
+++ b/code/modules/research/artifact_analysis.dm
@@ -61,6 +61,8 @@
owned_pad = locate() in orange(1, src)
/obj/machinery/artifact_analyser/attack_hand(var/mob/user as mob)
+ if(stat & (NOPOWER|BROKEN))
+ return
user.machine = src
var/dat = "Artifact Analyser
"
dat += "
"
@@ -87,6 +89,10 @@
onclose(user, "artanalyser")
/obj/machinery/artifact_analyser/process()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ use_power(350)
+ //
if(!owned_pad)
for(var/obj/machinery/analyser_pad/pad in range(1))
owned_pad = pad
@@ -229,6 +235,7 @@
time *= 10
var/message = "[src] states, \"Commencing analysis.\""
src.visible_message(message, message)
+ use_power(500)
spawn(time)
src.working = 0
icon_state = "analyser"
@@ -239,11 +246,12 @@
scan_num++
message = "[src] states, \"Analysis complete.\""
src.visible_message(message, message)
+ use_power(500)
else if (findarti > 1)
- var/message = "[src] states, \"Cannot analyse. Too many artifacts on pad.\""
+ var/message = "[src] states, \"Cannot analyse. Error isolating energy signature.\""
src.visible_message(message, message)
else
- var/message = "[src] states, \"Cannot analyse. No artifact found.\""
+ var/message = "[src] states, \"Cannot analyse. No noteworthy energy signature isolated.\""
src.visible_message(message, message)
if(href_list["upload"] && cur_id != "")
@@ -267,6 +275,7 @@
CA.effecttype = aeffect1 + " ([accuE1]%)"
CA.effectmode = aeffect2 + " ([accuE2]%)"
DB.catalogued_artifacts.Add(CA)
+ use_power(100)
if(href_list["print"])
var/r = "Artifact Analysis Report (Scan #[scan_num])
"
@@ -280,6 +289,7 @@
P.info = r
for(var/mob/O in hearers(src, null))
O.show_message("\icon[src] \blue The [src.name] prints a sheet of paper", 3)
+ use_power(10)
if(href_list["close"])
usr << browse(null, "window=artanalyser")
diff --git a/code/modules/research/artifact_archaeo.dm b/code/modules/research/artifact_archaeo.dm
index f3b047d3ecb..cc03ad685d6 100644
--- a/code/modules/research/artifact_archaeo.dm
+++ b/code/modules/research/artifact_archaeo.dm
@@ -31,27 +31,23 @@
else
for(var/mob/M in viewers(world.view, user))
M.show_message("\blue A few sparks fly off the rock, but otherwise nothing else happens.",1)
- else if(istype(W, /obj/item/weapon/reagent_containers/))
- var/obj/item/weapon/reagent_containers/R = W
- if(R.reagents.has_reagent("pacid", 1))
- if(src.method)
- if(inside)
- var/obj/A = new src.inside(get_turf(src))
- for(var/mob/M in viewers(world.view, get_turf(src)))
- M.show_message("\blue The rock fizzes away revealing a [A.name].",1)
- else
- for(var/mob/M in viewers(world.view, get_turf(src)))
- M.show_message("\blue The rock fizzes away into nothing.",1)
- del src
- else
- for(var/mob/M in viewers(world.view, get_turf(src)))
- M.show_message("\blue The acid splashes harmlessly off the rock, nothing else interesting happens.",1)
+/obj/item/weapon/ore/strangerock/acid_act(var/datum/reagent/R)
+ if(src.method)
+ if(inside)
+ var/obj/A = new src.inside(get_turf(src))
+ for(var/mob/M in viewers(world.view, get_turf(src)))
+ M.show_message("\blue The rock fizzes away revealing a [A.name].",1)
+ else
+ for(var/mob/M in viewers(world.view, get_turf(src)))
+ M.show_message("\blue The rock fizzes away into nothing.",1)
+ del src
+ else
+ for(var/mob/M in viewers(world.view, get_turf(src)))
+ M.show_message("\blue The acid splashes harmlessly off the rock, nothing else interesting happens.",1)
+ return 1
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
/obj/item/weapon/crystal
name = "Crystal"
icon = 'mining.dmi'
@@ -124,7 +120,11 @@
/obj/item/weapon/talkingcrystal/proc/catchMessage(var/msg, var/mob/source)
var/list/seperate = list()
- if(findtext(msg," ")==0)
+ if(findtext(msg,"(("))
+ return
+ else if(findtext(msg,"))"))
+ return
+ else if(findtext(msg," ")==0)
return
else
/*var/l = lentext(msg)
@@ -167,7 +167,7 @@
if(!word)
text = "[pick(words)]"
else
- text = word
+ text = pick(stringsplit(word))
if(lentext(text)==1)
text=uppertext(text)
else
@@ -196,8 +196,18 @@
msg+="."
else
msg+="!"
- for(var/mob/M in viewers(src))
- M << "The crystal says, \"[msg]\""
+
+ var/list/listening = viewers(src)
+ for(var/mob/M in world)
+ if (!M.client)
+ continue //skip monkeys and leavers
+ if (istype(M, /mob/new_player))
+ continue
+ if(M.stat == 2 && M.client.ghost_ears)
+ listening|=M
+
+ for(var/mob/M in listening)
+ M << "The crystal reverberates, \blue\"[msg]\""
lastsaid = world.timeofday + rand(300,800)
/obj/item/weapon/talkingcrystal/process()
diff --git a/code/modules/research/artifact_effect.dm b/code/modules/research/artifact_effect.dm
index 867bf030187..19291af9b04 100644
--- a/code/modules/research/artifact_effect.dm
+++ b/code/modules/research/artifact_effect.dm
@@ -72,8 +72,8 @@
H.update_body()
H.update_face()
H.UpdateDamageIcon()
- return 1
- //
+ return 1
+ //
if (istype(user, /mob/living/carbon/monkey/))
user << "\blue You feel a soothing energy invigorate you."
user.adjustOxyLoss(-25)
@@ -81,6 +81,7 @@
user.adjustBruteLoss(-25)
user.adjustFireLoss(-25)
user.adjustBrainLoss(-25)
+ return 1
else user << "Nothing happens."
if("injure")
if (istype(user, /mob/living/carbon/))
diff --git a/code/modules/research/artifact_harvester.dm b/code/modules/research/artifact_harvester.dm
index 84839dfb768..b01bdbf4d0d 100644
--- a/code/modules/research/artifact_harvester.dm
+++ b/code/modules/research/artifact_harvester.dm
@@ -36,8 +36,12 @@
interact(user)
/obj/machinery/artifact_harvester/process()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ use_power(350)
if(harvesting)
+ use_power(250)
inserted_battery.stored_charge += 10
if(inserted_battery.stored_charge >= inserted_battery.capacity)
inserted_battery.stored_charge = inserted_battery.capacity
@@ -49,6 +53,8 @@
return
/obj/machinery/artifact_harvester/proc/interact(var/mob/user as mob)
+ if(stat & (NOPOWER|BROKEN))
+ return
user.machine = src
var/dat = "Artifact Power Harvester
"
dat += "
"
@@ -88,20 +94,19 @@
var/mundane = 0
for(var/obj/O in get_turf(owned_pad))
- mundane++
- break
+ if(!istype(O, /obj/machinery/artifact))
+ mundane++
+ break
for(var/mob/O in get_turf(owned_pad))
- mundane++
- break
+ if(!istype(O, /obj/machinery/artifact))
+ mundane++
+ break
- if(articount > 1)
- var/message = "[src] states, \"Cannot harvest. Too many artifacts on pad.\""
- src.visible_message(message, message)
- else if(mundane)
- var/message = "[src] states, \"No noteworthy energy signatures detected.\""
+ if(articount > 1 || mundane)
+ var/message = "[src] states, \"Cannot harvest. Error isolating energy signature.\""
src.visible_message(message, message)
else if(!articount)
- var/message = "[src] states, \"Cannot harvest. No artifact found.\""
+ var/message = "[src] states, \"Cannot harvest. No noteworthy energy signature isolated.\""
src.visible_message(message, message)
else if (cur_artifact.being_used)
var/message = "[src] states, \"Cannot harvest. Too much interferance from energy scan.\""
@@ -140,6 +145,7 @@
src.inserted_battery = null
if (href_list["drainbattery"])
+ use_power(100)
src.inserted_battery.battery_effect.artifact_id = ""
src.inserted_battery.stored_charge = 0
var/message = "[src] states, \"Battery drained of all charge.\""
diff --git a/code/modules/research/artifacts.dm b/code/modules/research/artifacts.dm
index d79222b3f21..83f85dee1c1 100644
--- a/code/modules/research/artifacts.dm
+++ b/code/modules/research/artifacts.dm
@@ -179,7 +179,7 @@
my_effect.UpdateEffect(src.loc)
//activate
- if(src.charged && my_effect.DoEffect(src.loc))
+ if(src.charged && my_effect.DoEffect(src))
src.charged = 0
src.chargetime = src.recharge
@@ -207,7 +207,7 @@
else if (my_effect.trigger != "touch" && !src.activated) user << "Nothing happens."
if (my_effect.effectmode == "contact" && src.activated && src.charged)
- my_effect.DoEffect(src.loc)
+ my_effect.DoEffect(src)
src.charged = 0
src.chargetime = src.recharge