diff --git a/baystation12.dme b/baystation12.dme
index ff370aa446..da6909df27 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -261,10 +261,10 @@
#include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\revolution\rp_revolution.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
+#include "code\game\gamemodes\wizard\artifact.dm"
#include "code\game\gamemodes\wizard\rightandwrong.dm"
#include "code\game\gamemodes\wizard\soulstone.dm"
#include "code\game\gamemodes\wizard\spellbook.dm"
-#include "code\game\gamemodes\wizard\veilrender.dm"
#include "code\game\gamemodes\wizard\wizard.dm"
#include "code\game\jobs\access.dm"
#include "code\game\jobs\job_controller.dm"
@@ -599,6 +599,7 @@
#include "code\game\objects\structures\barsign.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
#include "code\game\objects\structures\coathanger.dm"
+#include "code\game\objects\structures\curtains.dm"
#include "code\game\objects\structures\displaycase.dm"
#include "code\game\objects\structures\door_assembly.dm"
#include "code\game\objects\structures\electricchair.dm"
diff --git a/code/game/gamemodes/wizard/veilrender.dm b/code/game/gamemodes/wizard/artifact.dm
similarity index 60%
rename from code/game/gamemodes/wizard/veilrender.dm
rename to code/game/gamemodes/wizard/artifact.dm
index 225158465f..2e846c5cc3 100644
--- a/code/game/gamemodes/wizard/veilrender.dm
+++ b/code/game/gamemodes/wizard/artifact.dm
@@ -1,3 +1,5 @@
+// Veil render //
+
/obj/item/weapon/veilrender
name = "veil render"
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city."
@@ -37,3 +39,22 @@
else
user << "\red The unearthly energies that powered the blade are now dormant"
+// Scrying orb //
+
+/obj/item/weapon/scrying
+ name = "scrying orb"
+ desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means."
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "bluespace"
+ throw_speed = 3
+ throw_range = 7
+ throwforce = 10
+ damtype = BURN
+ force = 10
+ hitsound = 'sound/items/welder2.ogg'
+
+/obj/item/weapon/scrying/attack_self(mob/user as mob)
+ user << "You can see... everything!"
+ visible_message("[usr] stares into [src], their eyes glazing over.")
+ user.ghostize(1)
+ return
\ No newline at end of file
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index cd70a392de..20f762c0ba 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -55,6 +55,8 @@
dat += "
"
dat += "Staff of Animation
"
dat += "
"
+ dat += "Scrying Orb
"
+ dat += "
"
if(op)
dat += "Re-memorize Spells
"
user << browse(dat, "window=radio")
@@ -188,6 +190,17 @@
new /obj/item/weapon/gun/energy/staff/animate(get_turf(H))
temp = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
max_uses--
+ if("scrying")
+ feedback_add_details("wizard_spell_learned","SO") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ new /obj/item/weapon/scrying(get_turf(H))
+ if (!(XRAY in H.mutations))
+ H.mutations.Add(XRAY)
+ H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
+ H.see_in_dark = 8
+ H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
+ H << "The walls suddenly disappear."
+ temp = "You have purchased a scrying orb, and gained x-ray vision."
+ max_uses--
else
if(href_list["temp"])
temp = null
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index f4a80c0a41..5887e0bc32 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -1,3 +1,20 @@
+var/global/list/holodeck_programs = list(
+ "emptycourt" = /area/holodeck/source_emptycourt, \
+ "boxingcourt" = /area/holodeck/source_boxingcourt, \
+ "basketball" = /area/holodeck/source_basketball, \
+ "thunderdomecourt" = /area/holodeck/source_thunderdomecourt, \
+ "beach" = /area/holodeck/source_beach, \
+ "desert" = /area/holodeck/source_desert, \
+ "space" = /area/holodeck/source_space, \
+ "picnicarea" = /area/holodeck/source_picnicarea, \
+ "snowfield" = /area/holodeck/source_snowfield, \
+ "theatre" = /area/holodeck/source_theatre, \
+ "meetinghall" = /area/holodeck/source_meetinghall, \
+ "burntest" = /area/holodeck/source_burntest, \
+ "wildlifecarp" = /area/holodeck/source_wildlife, \
+ "turnoff" = /area/holodeck/source_plating \
+ )
+
/obj/machinery/computer/HolodeckControl
name = "Holodeck Control Computer"
desc = "A computer used to control a nearby holodeck."
@@ -8,7 +25,20 @@
var/list/holographic_items = list()
var/damaged = 0
var/last_change = 0
-
+ var/list/supported_programs = list( \
+ "Empty Court" = "emptycourt", \
+ "Boxing Court"="boxingcourt", \
+ "Basketball Court" = "basketball", \
+ "Thunderdome Court" = "thunderdomecourt", \
+ "Beach" = "beach", \
+ "Desert" = "desert", \
+ "Space" = "space", \
+ "Picnic Area" = "picnicarea", \
+ "Snow Field" = "snowfield", \
+ "Theatre" = "theatre", \
+ "Meeting Hall" = "meetinghall" \
+ )
+ var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "ildlife Simulation" = "wildlifecarp")
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
@@ -23,45 +53,31 @@
user.set_machine(src)
var/dat
-
dat += "Holodeck Control System
"
dat += "
Current Loaded Programs:
"
-
- dat += "((Empty Court))
"
- dat += "((Boxing Court))
"
- dat += "((Basketball Court))
"
- dat += "((Thunderdome Court))
"
- dat += "((Beach))
"
- dat += "((Desert))
"
- dat += "((Space))
"
- dat += "((Picnic Area))
"
- dat += "((Snow Field))
"
- dat += "((Theatre))
"
- dat += "((Meeting Hall))
"
-// dat += "((Shutdown System))
"
+ for(var/prog in supported_programs)
+ dat += "(([prog]))
"
dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
"
- if(emagged)
- dat += "(Begin Atmospheric Burn Simulation)
"
- dat += "Ensure the holodeck is empty before testing.
"
- dat += "
"
- dat += "(Begin Wildlife Simulation)
"
- dat += "Ensure the holodeck is empty before testing.
"
- dat += "
"
- if(issilicon(user))
+ if(issilicon(user))
+ if(emagged)
dat += "(Re-Enable Safety Protocols?)
"
+ else
+ dat += "(Override Safety Protocols?)
"
+
+ if(emagged)
+ for(var/prog in restricted_programs)
+ dat += "(Begin [prog])
"
+ dat += "Ensure the holodeck is empty before testing.
"
+ dat += "
"
dat += "Safety Protocols are DISABLED
"
else
- if(issilicon(user))
- dat += "(Override Safety Protocols?)
"
- dat += "
"
dat += "Safety Protocols are ENABLED
"
user << browse(dat, "window=computer;size=400x500")
onclose(user, "computer")
-
return
@@ -71,77 +87,12 @@
if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
- if(href_list["emptycourt"])
- target = locate(/area/holodeck/source_emptycourt)
- if(target)
- loadProgram(target)
-
- else if(href_list["boxingcourt"])
- target = locate(/area/holodeck/source_boxingcourt)
- if(target)
- loadProgram(target)
-
- else if(href_list["basketball"])
- target = locate(/area/holodeck/source_basketball)
- if(target)
- loadProgram(target)
-
- else if(href_list["thunderdomecourt"])
- target = locate(/area/holodeck/source_thunderdomecourt)
- if(target)
- loadProgram(target)
-
- else if(href_list["beach"])
- target = locate(/area/holodeck/source_beach)
- if(target)
- loadProgram(target)
-
- else if(href_list["desert"])
- target = locate(/area/holodeck/source_desert)
- if(target)
- loadProgram(target)
-
- else if(href_list["space"])
- target = locate(/area/holodeck/source_space)
- if(target)
- loadProgram(target)
-
- else if(href_list["picnicarea"])
- target = locate(/area/holodeck/source_picnicarea)
- if(target)
- loadProgram(target)
-
- else if(href_list["snowfield"])
- target = locate(/area/holodeck/source_snowfield)
- if(target)
- loadProgram(target)
-
- else if(href_list["theatre"])
- target = locate(/area/holodeck/source_theatre)
- if(target)
- loadProgram(target)
-
- else if(href_list["meetinghall"])
- target = locate(/area/holodeck/source_meetinghall)
- if(target)
- loadProgram(target)
-
- else if(href_list["turnoff"])
- target = locate(/area/holodeck/source_plating)
- if(target)
- loadProgram(target)
-
- else if(href_list["burntest"])
- if(!emagged) return
- target = locate(/area/holodeck/source_burntest)
- if(target)
- loadProgram(target)
-
- else if(href_list["wildlifecarp"])
- if(!emagged) return
- target = locate(/area/holodeck/source_wildlife)
- if(target)
- loadProgram(target)
+ if(href_list["program"])
+ var/prog = href_list["program"]
+ if(prog in holodeck_programs)
+ target = locate(holodeck_programs[prog])
+ if(target)
+ loadProgram(target)
else if(href_list["AIoverride"])
if(!issilicon(usr)) return
@@ -158,38 +109,7 @@
return
-
/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
-//Warning, uncommenting this can have concequences. For example, deconstructing the computer may cause holographic eswords to never derez
-
-/* if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
-
-*/
if(istype(D, /obj/item/weapon/card/emag) && !emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
@@ -447,7 +367,7 @@
if(isrobot(user))
return
-
+
..()
/obj/structure/table/holotable/wood
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index 7407a55e31..451cb24030 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -118,15 +118,17 @@
update_display(line1, line2)
return 1
if(STATUS_DISPLAY_TIME)
- update_display("TIME", worldtime2text())
+ message1 = "TIME"
+ message2 = worldtime2text()
+ update_display(message1, message2)
+ return 1
return 0
/obj/machinery/status_display/examine()
set src in view()
. = ..()
- switch(mode)
- if(STATUS_DISPLAY_TRANSFER_SHUTTLE_TIME,2)
- usr << "The display says:
\t[message1]
\t[message2]"
+ if(mode != STATUS_DISPLAY_BLANK && mode != STATUS_DISPLAY_ALERT)
+ usr << "The display says:
\t[sanitize(message1)]
\t[sanitize(message2)]"
/obj/machinery/status_display/proc/set_message(m1, m2)
if(m1)
diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm
index e9a5065907..aacd770d79 100644
--- a/code/game/machinery/supply_display.dm
+++ b/code/game/machinery/supply_display.dm
@@ -27,12 +27,6 @@
return 1
return 0
-/obj/machinery/status_display/supply_display/examine()
- if(mode == STATUS_DISPLAY_CUSTOM)
- usr << "The display says:
\t[message1]
\t[message2]"
- else
- ..()
-
/obj/machinery/status_display/supply_display/receive_signal/(datum/signal/signal)
if(signal.data["command"] == "supply")
mode = STATUS_DISPLAY_CUSTOM
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
new file mode 100644
index 0000000000..6e3fa6e6ae
--- /dev/null
+++ b/code/game/objects/structures/curtains.dm
@@ -0,0 +1,37 @@
+/obj/structure/curtain
+ icon = 'icons/obj/curtain.dmi'
+ name = "curtain"
+ icon_state = "closed"
+ layer = MOB_LAYER + 0.1
+ opacity = 1
+ density = 0
+
+/obj/structure/curtain/bullet_act(obj/item/projectile/P, def_zone)
+ if(!P.nodamage)
+ visible_message("[P] tears [src] down!")
+ del(src)
+ else
+ ..(P, def_zone)
+
+/obj/structure/curtain/attack_hand(mob/user)
+ playsound(get_turf(loc), "rustle", 15, 1, -5)
+ toggle()
+ ..()
+
+/obj/structure/curtain/proc/toggle()
+ opacity = !opacity
+ if(opacity)
+ icon_state = "closed"
+ layer = MOB_LAYER + 0.1
+ else
+ icon_state = "open"
+ layer = OBJ_LAYER
+
+/obj/structure/curtain/black
+ name = "black curtain"
+ color = "#222222"
+
+/obj/structure/curtain/medical
+ name = "plastic curtain"
+ color = "#B8F5E3"
+ alpha = 200
\ No newline at end of file
diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm
index d04fe83f46..2610a5c24a 100644
--- a/code/modules/detectivework/forensics.dm
+++ b/code/modules/detectivework/forensics.dm
@@ -31,7 +31,7 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
if(prob(15*item_multiplier) && !(fibertext in suit_fibers))
suit_fibers += fibertext
- if(M.gloves && (M.w_uniform.body_parts_covered & ~suit_coverage))
+ if(M.gloves && (M.gloves.body_parts_covered & ~suit_coverage))
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
suit_fibers += "Material from a pair of [M.gloves.name]."
diff --git a/html/changelog.html b/html/changelog.html
index 787817c2df..4553e8a61c 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -124,6 +124,24 @@ should be listed in the changelog upon commit though. Thanks. -->
+ PsiOmegaDelta updated:
+
+ - AI can now make priority announcements.
+ - PDAs display the station time upon examination.
+ - Status displays can now also show the station time.
+ - Security HUDs now have improved handling of alt-titles.
+ - Crew record photos can now be updated through security consoles.
+ - pAI settings can now be configured from the character setup screen.
+ - Pipes can now be placed by clicking the floor, similar to power cables.
+ - Mechas and cargo trains can no longer enter the transfer shuttle, Odysseys with patients excepted.
+
+ Kelenius updated:
+
+ - Wizards now use a new item: scrying orb. It grants x-ray vision upon purchase, and can be used to temporary leave your body as a ghost.
+
+
+
+
5 August 2014
HarpyEagle updated:
diff --git a/icons/obj/curtain.dmi b/icons/obj/curtain.dmi
new file mode 100644
index 0000000000..69b7de1dc0
Binary files /dev/null and b/icons/obj/curtain.dmi differ