Merge branch 'master' of git://github.com/Baystation12/Baystation12

Conflicts:
	code/unused/toilets.dm
	maps/tgstation.2.0.8.dmm
This commit is contained in:
CaelAislinn
2012-02-04 22:36:42 +10:00
78 changed files with 15212 additions and 14440 deletions

View File

@@ -144,6 +144,8 @@
#define FILE_DIR "code/unused/spacecraft"
#define FILE_DIR "code/WorkInProgress"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Tajara"
#define FILE_DIR "code/WorkInProgress/mapload"
#define FILE_DIR "code/WorkInProgress/Mini"
#define FILE_DIR "code/WorkInProgress/organs"
@@ -185,6 +187,7 @@
#define FILE_DIR "sound/mecha"
#define FILE_DIR "sound/misc"
#define FILE_DIR "sound/piano"
#define FILE_DIR "sound/scary"
#define FILE_DIR "sound/voice"
#define FILE_DIR "sound/weapons"
// END_FILE_DIR
@@ -683,7 +686,6 @@
#include "code\game\objects\items\weapons\table_rack_parts.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
#include "code\game\objects\items\weapons\tiles_wires.dm"
#include "code\game\objects\items\weapons\toilets.dm"
#include "code\game\objects\items\weapons\tools.dm"
#include "code\game\objects\items\weapons\twohanded.dm"
#include "code\game\objects\items\weapons\implants\implant.dm"
@@ -799,6 +801,7 @@
#include "code\modules\critters\critters.dm"
#include "code\modules\critters\hivebots\hivebot.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
#include "code\modules\food\food.dm"
#include "code\modules\food\recipes_microwave.dm"

View File

@@ -329,8 +329,8 @@ datum
AG.process_group()
process_singletons()
for(var/item in active_singletons)
item:process_cell()
for(var/turf/simulated/T in active_singletons)
T.process_cell()
process_super_conductivity()
for(var/turf/simulated/hot_potato in active_super_conductivity)

View File

@@ -7,6 +7,14 @@
/turf/proc/visibilityChanged()
cameranet.updateVisibility(src)
/turf/New()
..()
cameranet.updateVisibility(src)
/*
/turf/Del()
..()
cameranet.updateVisibility(src)
*/
/datum/camerachunk
var/list/obscuredTurfs = list()
var/list/visibleTurfs = list()
@@ -246,6 +254,21 @@ var/datum/cameranet/cameranet = new()
chunk.cameras += c
chunk.hasChanged()
/datum/cameranet/proc/removeCamera(obj/machinery/camera/c)
var/x1 = max(0, c.x - 16) & ~0xf
var/y1 = max(0, c.y - 16) & ~0xf
var/x2 = min(world.maxx, c.x + 16) & ~0xf
var/y2 = min(world.maxy, c.y + 16) & ~0xf
for(var/x = x1; x <= x2; x += 16)
for(var/y = y1; y <= y2; y += 16)
if(chunkGenerated(x, y, c.z))
var/datum/camerachunk/chunk = getCameraChunk(x, y, c.z)
if(!c)
chunk.hasChanged()
if(c in chunk.cameras)
chunk.cameras -= c
chunk.hasChanged()
/mob/living/silicon/ai/var/mob/aiEye/eyeobj = new()
@@ -318,6 +341,18 @@ var/datum/cameranet/cameranet = new()
..()
cameranet.addCamera(src)
/obj/machinery/camera/Del()
cameranet.removeCamera(src)
..()
/obj/machinery/camera/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
. = ..(W, user)
if(istype(W, /obj/item/weapon/wirecutters))
if(status)
cameranet.addCamera(src)
else
cameranet.removeCamera(src)
/proc/checkcameravis(atom/A)
for(var/obj/machinery/camera/C in view(A,7))
if(!C.status || C.stat == 2)

View File

@@ -174,9 +174,9 @@
H.apply_damage(0.5*damage, BRUTE, "l_arm")
H.apply_damage(0.5*damage, BRUTE, "r_arm")
var/obj/effect/decal/cleanable/blood/B = new(src.loc)
B.blood_DNA = H.dna.unique_enzymes
B.blood_type = H.b_type
//var/obj/effect/decal/cleanable/blood/B = new(src.loc)
//B.blood_DNA = H.dna.unique_enzymes
//B.blood_type = H.b_type
H:weakened = max(H:weakened,2)
H:updatehealth()

View File

@@ -21,6 +21,8 @@ A list of items and costs is stored under the datum of every game mode, alongsid
var/items // List of items
var/list/ItemList // Parsed list of items
var/uses // Numbers of crystals
// List of items not to shove in their hands.
var/list/NotInHand = list(/obj/machinery/singularity_beacon/syndicate)
New()
welcome = ticker.mode.uplink_welcome
@@ -34,7 +36,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
src.menu_message += "Tele-Crystals left: [src.uses]<BR>"
src.menu_message += "<HR>"
src.menu_message += "<B>Request item:</B><BR>"
src.menu_message += "<I>Each item costs a number of tele-crystals as indicated by the number following their name.</I><BR>"
src.menu_message += "<I>Each item costs a number of tele-crystals as indicated by the number following their name.</I><br><BR>"
var/cost
var/item
@@ -158,7 +160,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
var/path_obj = text2path(href_list["buy_item"])
var/mob/A = src.hostpda.loc
var/item = new path_obj(get_turf(src.hostpda))
if(ismob(A)) //&& !istype(item, /obj/spawner))
if(ismob(A) && !(locate(item) in NotInHand)) //&& !istype(item, /obj/spawner))
if(!A.r_hand)
item:loc = A
A.r_hand = item
@@ -167,6 +169,8 @@ A list of items and costs is stored under the datum of every game mode, alongsid
item:loc = A
A.l_hand = item
item:layer = 20
else
item:loc = get_turf(A)
usr.update_clothing()
// usr.client.onBought("[item:name]") When we have the stats again, uncomment.
/* if(istype(item, /obj/spawner)) // Spawners need to have del called on them to avoid leaving a marker behind
@@ -237,7 +241,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
var/path_obj = text2path(href_list["buy_item"])
var/item = new path_obj(get_turf(src.loc))
var/mob/A = src.loc
if(ismob(A)) //&& !istype(item, /obj/spawner))
if(ismob(A) && !(locate(item) in NotInHand)) //&& !istype(item, /obj/spawner))
if(!A.r_hand)
item:loc = A
A.r_hand = item
@@ -246,6 +250,8 @@ A list of items and costs is stored under the datum of every game mode, alongsid
item:loc = A
A.l_hand = item
item:layer = 20
else
item:loc = get_turf(A)
/* if(istype(item, /obj/spawner)) // Spawners need to have del called on them to avoid leaving a marker behind
del item*/
// usr.client.onBought("[item:name]") When we have the stats again, uncomment.

View File

@@ -121,6 +121,319 @@ obj/machinery/computer/forensic_scanning
onclose(user,"scanner")
Topic(href,href_list)
switch(href_list["operation"])
if("login")
var/mob/M = usr
if(istype(M,/mob/living/silicon))
authenticated = 1
updateDialog()
return
var/obj/item/weapon/card/id/I = M.equipped()
if (I && istype(I))
if(src.check_access(I))
authenticated = 1
//usr << "\green Access Granted"
//if(!authenticated)
//usr << "\red Access Denied"
if("logout")
authenticated = 0
if("clear")
if(canclear)
temp = null
if("eject")
if(scanning)
scanning.loc = loc
scanning = null
else
temp = "Eject Failed: No Object"
if("insert")
var/mob/M = usr
var/obj/item/I = M.equipped()
if(I && istype(I))
if(istype(I, /obj/item/weapon/evidencebag))
scanning = I.contents[1]
scanning.loc = src
I.overlays -= scanning
I.icon_state = "evidenceobj"
else
scanning = I
M.drop_item()
I.loc = src
else
temp = "Invalid Object Rejected."
if("card")
var/mob/M = usr
var/obj/item/I = M.equipped()
if(I && istype(I,/obj/item/weapon/f_card))
card = I
M.drop_item()
I.loc = src
process_card()
usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
else
usr << "\red Invalid Object Rejected."
if("database")
canclear = 1
if((!misc || !misc.len) && (!files || !files.len))
temp = "Database is empty."
else
if(files && files.len)
temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points:<br>"
for(var/i = 1, i < (files.len + 1), i++)
temp += "<a href='?src=\ref[src];operation=record;identifier=[i]'>{Dossier [i]}</a><br>"
temp += "<br><a href='?src=\ref[src];operation=card'>{Insert Finger Print Card}</a><br><br><br>"
else
temp = ""
if(misc && misc.len)
if(href_list["delete"])
delete_record(text2num(href_list["delete"]))
temp += "<b>Auxiliary Evidence Database</b><br><br>"
temp += "This is where anything without fingerprints goes.<br><br>"
for(var/i = 1, i < (misc.len + 1), i++)
var/list/temp_list = misc[i]
var/item_name = get_name(temp_list[1])
temp += "<a href='?src=\ref[src];operation=auxiliary;identifier=[i]'>{[item_name]}</a><br>"
if("record")
canclear = 0
if(files)
temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/identifier = text2num(href_list["identifier"])
var/list/dossier = files[identifier]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: (80% or higher completion reached)<br>" + prints[num2text(2)] + "<br>"
temp += print_string
for(var/i = 2, i < (dossier.len + 1), i++)
var/list/outputs = dossier[i]
var/item_name = get_name(outputs[1])
var/list/prints_len = outputs[2]
temp += "Object: [item_name]<br>"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3]
if(fibers && fibers.len)
var/dat = "[fibers[1]]"
for(var/j = 2, j < (fibers.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found.<br>"
var/list/blood = outputs[4]
if(blood && blood.len)
var/dat = "[blood[1]]"
if(blood.len > 1)
for(var/j = 2, j < (blood.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else
temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("databaseprint")
if(files)
var/obj/item/weapon/paper/P = new(loc)
P.name = "Database File (Dossier [href_list["identifier"]])"
P.overlays += "paper_words"
P.info = "<b>Criminal Evidence Database</b><br><br>"
P.info += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/list/dossier = files[text2num(href_list["identifier"])]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: " + prints[num2text(2)] + "<BR>"
P.info += print_string
for(var/i = 2, i < (dossier.len + 1), i++)
var/list/outputs = dossier[i]
var/item_name = get_name(outputs[1])
var/list/prints_len = outputs[2]
P.info += "Object: [item_name]<br>"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3]
if(fibers && fibers.len)
var/dat = "[fibers[1]]"
for(var/j = 2, j < (fibers.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found.<br>"
var/list/blood = outputs[4]
if(blood && blood.len)
var/dat = "[blood[1]]"
if(blood.len > 1)
for(var/j = 2, j < (blood.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found."
else
usr << "ERROR. Database not found!<br>"
if("auxiliary")
canclear = 0
if(misc)
temp = "<b>Auxiliary Evidence Database</b><br><br>"
var/identifier = text2num(href_list["identifier"])
var/list/outputs = misc[identifier]
var/item_name = get_name(outputs[1])
temp += "Consolidated data points: [item_name]<br>"
var/list/fibers = outputs[2]
if(fibers && fibers.len)
var/dat = "[fibers[1]]"
for(var/j = 2, j <= fibers.len, j++)
dat += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found."
var/list/blood = outputs[3]
if(blood && blood.len)
var/dat = "[blood[1]]"
for(var/j = 2, j <= blood.len, j++)
dat += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else
temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete=[href_list["identifier"]]'>{Delete This Record}</a>"
temp += "<br><a href='?src=\ref[src];operation=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("auxiliaryprint")
if(misc)
var/obj/item/weapon/paper/P = new(loc)
var/identifier = text2num(href_list["identifier"])
var/list/outputs = misc[identifier]
var/item_name = get_name(outputs[1])
P.name = "Auxiliary Database File ([item_name])"
P.overlays += "paper_words"
P.info = "<b>Auxiliary Evidence Database</b><br><br>"
P.info += "Consolidated data points: [item_name]<br>"
var/list/fibers = outputs[2]
if(fibers && fibers.len)
var/dat = "[fibers[1]]"
for(var/j = 2, j <= fibers.len, j++)
dat += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found."
var/list/blood = outputs[3]
if(blood && blood.len)
var/dat = "[blood[1]]"
for(var/j = 2, j <= blood.len, j++)
dat += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else
usr << "ERROR. Database not found!<br>"
if("scan")
if(scanning)
scan_process = 3
scan_data = "Scanning [scanning]: 25% complete"
updateDialog()
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_data = "Scanning [scanning]: 50% complete"
updateDialog()
scan_process = 2
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_data = "Scanning [scanning]: 75% complete"
updateDialog()
scan_process = 1
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_process = 0
scan_name = scanning.name
scan_data = "<u>[scanning]</u><br><br>"
if (scanning.blood_DNA)
scan_data += "Blood Found:<br>"
for(var/i = 1, i < (scanning.blood_DNA.len + 1), i++)
var/list/templist = scanning.blood_DNA[i]
scan_data += "-Blood type: [templist[2]]\nDNA: [templist[1]]<br><br>"
else
scan_data += "No Blood Found<br><br>"
if (!length(scanning.fingerprints))
scan_data += "No Fingerprints Found<br><br>"
else
var/list/L = scanning.fingerprints
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.<br>"
add_data(scanning)
if(!scanning.suit_fibers)
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"
else*/
scan_data += "No Fibers/Materials Located<br>"
else
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"*/
scan_data += "Fibers/Materials Found:<br>"
for(var/data in scanning.suit_fibers)
scan_data += "- [data]<br>"
if(istype(scanning,/obj/item/device/detective_scanner))
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
add_data_scanner(scanning)
else if(!length(scanning.fingerprints))
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
else
temp = "Scan Failed: No Object"
if("print")
if(scan_data)
temp = "Scan Data Printed."
var/obj/item/weapon/paper/P = new(loc)
P.name = "Scan Data ([scan_name])"
P.info = "<tt>[scan_data]</tt>"
P.overlays += "paper_words"
else
temp = "Print Failed: No Data"
if("erase")
scan_data = ""
if("cancel")
scan_process = 0
if("add")
if(scanning)
add_data(scanning)
else
temp = "Data Transfer Failed: No Object."
updateUsrDialog()
verb/reset()
set name = "Reset Screen"
set category = "Object"
set src in oview(1)
temp = ""
add_fingerprint(usr)
return
ex_act()
return
@@ -312,281 +625,16 @@ obj/machinery/computer/forensic_scanning
del(card)
return
proc/delete_record(var/location)
if(misc && misc.len)
for(var/i = location, i < misc.len, i++)
misc[i] = misc[i+i]
misc.len--
return
proc/get_name(var/atom/A)
return A.name
Topic(href,href_list)
switch(href_list["operation"])
if("login")
var/mob/M = usr
if(istype(M,/mob/living/silicon))
authenticated = 1
updateDialog()
return
var/obj/item/weapon/card/id/I = M.equipped()
if (I && istype(I))
if(src.check_access(I))
authenticated = 1
//usr << "\green Access Granted"
//if(!authenticated)
//usr << "\red Access Denied"
if("logout")
authenticated = 0
if("clear")
if(canclear)
temp = null
if("eject")
if(scanning)
scanning.loc = loc
scanning = null
else
temp = "Eject Failed: No Object"
if("insert")
var/mob/M = usr
var/obj/item/I = M.equipped()
if(I && istype(I))
if(istype(I, /obj/item/weapon/evidencebag))
scanning = I.contents[1]
scanning.loc = src
I.overlays -= scanning
I.icon_state = "evidenceobj"
else
scanning = I
M.drop_item()
I.loc = src
else
temp = "Invalid Object Rejected."
if("card")
var/mob/M = usr
var/obj/item/I = M.equipped()
if(I && istype(I,/obj/item/weapon/f_card))
card = I
M.drop_item()
I.loc = src
process_card()
usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
else
usr << "\red Invalid Object Rejected."
if("database")
canclear = 1
if(!misc && !files)
temp = "Database is empty."
else
if(files)
temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points:<br>"
for(var/i = 1, i < (files.len + 1), i++)
temp += "<a href='?src=\ref[src];operation=record;identifier=[i]'>{Dossier [i]}</a><br>"
temp += "<br><a href='?src=\ref[src];operation=card'>{Insert Finger Print Card}</a><br><br><br>"
else
temp = ""
if(misc)
temp += "<b>Auxiliary Evidence Database</b><br><br>"
temp += "This is where anything without fingerprints goes.<br><br>"
for(var/i = 1, i < (misc.len + 1), i++)
var/list/temp_list = misc[i]
var/item_name = get_name(temp_list[1])
temp += "<a href='?src=\ref[src];operation=auxiliary;identifier=[i]'>{[item_name]}</a><br>"
if("record")
canclear = 0
if(files)
temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/identifier = text2num(href_list["identifier"])
var/list/dossier = files[identifier]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: (80% or higher completion reached)<br>" + prints[num2text(2)] + "<br>"
temp += print_string
for(var/i = 2, i < (dossier.len + 1), i++)
var/list/outputs = dossier[i]
var/item_name = get_name(outputs[1])
var/list/prints_len = outputs[2]
temp += "Object: [item_name]<br>"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3]
if(fibers)
var/dat = "[fibers[1]]"
for(var/j = 2, j < (fibers.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found.<br>"
var/list/blood = outputs[4]
if(blood)
var/dat = "[blood[1]]"
if(blood.len > 1)
for(var/j = 2, j < (blood.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else
temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("databaseprint")
if(files)
var/obj/item/weapon/paper/P = new(loc)
P.name = "Database File (Dossier [href_list["identifier"]])"
P.overlays += "paper_words"
P.info = "<b>Criminal Evidence Database</b><br><br>"
P.info += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/list/dossier = files[text2num(href_list["identifier"])]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: " + prints[num2text(2)] + "<BR>"
P.info += print_string
for(var/i = 2, i < (dossier.len + 1), i++)
var/list/outputs = dossier[i]
var/item_name = get_name(outputs[1])
var/list/prints_len = outputs[2]
P.info += "Object: [item_name]<br>"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3]
if(fibers)
var/dat = "[fibers[1]]"
for(var/j = 2, j < (fibers.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found.<br>"
var/list/blood = outputs[4]
if(blood)
var/dat = "[blood[1]]"
if(blood.len > 1)
for(var/j = 2, j < (blood.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found."
else
usr << "ERROR. Database not found!<br>"
if("auxiliary")
canclear = 0
if(misc)
temp = "<b>Auxiliary Evidence Database</b><br><br>"
var/identifier = text2num(href_list["identifier"])
var/list/outputs = misc[identifier]
var/item_name = get_name(outputs[1])
temp += "Consolidated data points: [item_name]<br>"
var/list/fibers = outputs[2]
if(fibers)
var/dat = "[fibers[1]]"
for(var/j = 2, j < (fibers.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found."
var/list/blood = outputs[3]
if(blood)
var/dat = "[blood[1]]"
for(var/j = 2, j < (blood.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else
temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("scan")
if(scanning)
scan_process = 3
scan_data = "Scanning [scanning]: 25% complete"
updateDialog()
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_data = "Scanning [scanning]: 50% complete"
updateDialog()
scan_process = 2
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_data = "Scanning [scanning]: 75% complete"
updateDialog()
scan_process = 1
sleep(50)
if(!scan_process)
scan_data = null
updateDialog()
return
scan_process = 0
scan_name = scanning.name
scan_data = "<u>[scanning]</u><br><br>"
if (scanning.blood_DNA)
scan_data += "Blood Found:<br>"
for(var/i = 1, i < (scanning.blood_DNA.len + 1), i++)
var/list/templist = scanning.blood_DNA[i]
scan_data += "-Blood type: [templist[2]]\nDNA: [templist[1]]<br><br>"
else
scan_data += "No Blood Found<br><br>"
if (!length(scanning.fingerprints))
scan_data += "No Fingerprints Found<br><br>"
else
var/list/L = scanning.fingerprints
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.<br>"
add_data(scanning)
if(!scanning.suit_fibers)
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"
else*/
scan_data += "No Fibers/Materials Located<br>"
else
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
scan_data += "Fibers/Materials Data - [scanner.stored_name]:<br>"
for(var/data in scanner.stored_fibers)
scan_data += "- [data]<br>"
else
scan_data += "No Fibers/Materials Data<br>"*/
scan_data += "Fibers/Materials Found:<br>"
for(var/data in scanning.suit_fibers)
scan_data += "- [data]<br>"
if(istype(scanning,/obj/item/device/detective_scanner))
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
add_data_scanner(scanning)
else if(!length(scanning.fingerprints))
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
else
temp = "Scan Failed: No Object"
if("print")
if(scan_data)
temp = "Scan Data Printed."
var/obj/item/weapon/paper/P = new(loc)
P.name = "Scan Data ([scan_name])"
P.info = "<tt>[scan_data]</tt>"
P.overlays += "paper_words"
else
temp = "Print Failed: No Data"
if("erase")
scan_data = ""
if("cancel")
scan_process = 0
if("add")
if(scanning)
add_data(scanning)
else
temp = "Data Transfer Failed: No Object."
updateUsrDialog()
detective
icon_state = "old"
name = "PowerScan Mk.I"
@@ -631,20 +679,21 @@ turf/Entered(mob/living/carbon/human/M)
M.shoes.track_blood--
src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name)
for(var/obj/effect/decal/cleanable/blood/B in src)
if(B.track_amt <= 0) continue
if(B.type != /obj/effect/decal/cleanable/blood/tracks)
if(istype(M,/mob/living/carbon/human))
if(M.shoes)
M.shoes.add_blood(B.blood_owner)
M.shoes.track_blood_mob = B.blood_owner
M.shoes.track_blood = max(M.shoes.track_blood,8)
else
M.add_blood(B.blood_owner)
M.track_blood_mob = B.blood_owner
M.track_blood = max(M.track_blood,rand(4,8))
B.track_amt--
break
//REMOVED until we improve it.
// for(var/obj/effect/decal/cleanable/blood/B in src)
// if(B.track_amt <= 0) continue
// if(B.type != /obj/effect/decal/cleanable/blood/tracks)
// if(istype(M,/mob/living/carbon/human))
// if(M.shoes)
// M.shoes.add_blood(B.blood_owner)
// M.shoes.track_blood_mob = B.blood_owner
// M.shoes.track_blood = max(M.shoes.track_blood,8)
// else
// M.add_blood(B.blood_owner)
// M.track_blood_mob = B.blood_owner
// M.track_blood = max(M.track_blood,rand(4,8))
// B.track_amt--
// break
. = ..()
turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
@@ -654,7 +703,7 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
T.desc = "These bloody footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
T.blood_DNA.len++
T.blood_DNA[T.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
T.blood_DNA[T.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = 'footprints.dmi'
@@ -695,3 +744,18 @@ proc/blood_incompatible(donor,receiver)
if(donor_antigen != "O") return 1
//AB is a universal receiver.
return 0
/obj/item/weapon/rag
name = "damp rag"
desc = "For cleaning up messes, I suppose."
w_class = 1
icon = 'toy.dmi'
icon_state = "rag"
afterattack(atom/A as obj|turf|area, mob/user as mob)
if(istype(A))
user.visible_message("[user] starts to wipe the prints off of [A] with \the [src]!")
if(do_after(user,30))
user.visible_message("[user] finishes wiping away the evidence!")
A.clean_blood()
return

View File

@@ -322,6 +322,12 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.gib()
/datum/disease2/effect/greater/hallucinations
name = "Hallucinational Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.hallucination += 25
/datum/disease2/effect/greater/radian
name = "Radian's syndrome"
stage = 4
@@ -452,6 +458,12 @@ proc/airborne_can_reach(turf/source, turf/target)
mob.suiciding = 0
// lesser syndromes, partly just copypastes
/datum/disease2/effect/lesser/hallucinations
name = "Hallucinational Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.hallucination += 5
/datum/disease2/effect/lesser/mind
name = "Lazy mind syndrome"
stage = 3

View File

@@ -51,4 +51,9 @@
if(prob(20))
affected_mob.adjustToxLoss(1)
affected_mob.updatehealth()
if(prob(25))
affected_mob << "\red The world around you feels surreal"
if(prob(50))
affected_mob.hallucination += 100
shake_camera(affected_mob,20)
return

View File

@@ -247,6 +247,10 @@ the mob is also allowed to move without any sort of restriction. For instance, i
// var/obj/effect/organstructure/organStructure = null //for dem organs
var/list/organs = list( ) //List of organs.
//Yes, yes I did. --SkyMarshal
var/list/atom/hallucinations = list()
var/halloss = 0
var/hallucination = 0
/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1)
// world << "Contract_disease called by [src] with virus [virus]"

View File

@@ -1519,7 +1519,7 @@ proc/get_opposite(var/checkdir)
if(!text || !character)
return 0
var/count = 0
for(var/i = 1, i < lentext(text), i++)
for(var/i = 1, i <= lentext(text), i++)
var/a = copytext(text,i,i+1)
if(a == character)
count++

View File

@@ -46,6 +46,7 @@
/turf/space/New()
// icon = 'space.dmi'
..()
icon_state = "[pick(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)]"
/turf/simulated

View File

@@ -92,31 +92,40 @@
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
if (H.dna.uni_identity)
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex))
return 0
else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex))
return 0
else
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
var/new_prints = 0
var/prints
for(var/i = 1, i < (src.fingerprints.len + 1), i++)
for(var/i = 1, i <= src.fingerprints.len, i++)
var/list/L = params2list(src.fingerprints[i])
if(L.len > 1)
if(L[num2text(1)] == md5(H.dna.uni_identity))
new_prints = i
prints = L[num2text(2)]
break
else
src.fingerprints[i] = "1=" + L[num2text(1)] + "&2=" + stars(L[num2text(2)], rand(80,90))
var/test_print = stars(L[num2text(2)], rand(80,90))
if(stringpercent(test_print) == 32)
if(src.fingerprints.len == 1)
src.fingerprints = list()
else
var/turf/T = get_turf(src)
for (var/mob/N in world)
if (N.client && N.client.holder)
N << "<span class=\"gfartadmin\"><span class=\"prefix\">ERROR:</span><span class=\"message\">Fingerprint application failed! Important data: [src.name] at [T.x], [T.y], [T.z] with the print string [L[1]]</span></span>"
for(var/j = (i + 1), j < (src.fingerprints.len), j++)
src.fingerprints[j-1] = src.fingerprints[j]
src.fingerprints.len--
else
src.fingerprints[i] = "1=" + L[num2text(1)] + "&2=" + test_print
if(new_prints)
src.fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), rand(15,30))))
src.fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40)))))
else if(new_prints == 0)
src.fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(15,30)))
src.fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
for(var/i = 1, i <= src.fingerprints.len, i++)
if(length(src.fingerprints[i]) != 69)
src.fingerprints.Remove(src.fingerprints[i])
return 1
else
if(src.fingerprintslast != M.key)
@@ -130,7 +139,7 @@
return 0
if (!( src.flags ) & 256)
return
if (!( src.blood_DNA ))
if (src.blood_DNA)
if (istype(src, /obj/item)&&!istype(src, /obj/item/weapon/melee/energy))//Only regular items. Energy melee weapon are not affected.
var/obj/item/source2 = src
source2.icon_old = src.icon
@@ -155,7 +164,7 @@
return
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source2)
var/list/blood_DNA_temp[1]
blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.b_type)
blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.dna.b_type)
this.blood_DNA = blood_DNA_temp
this.virus2 = M.virus2
for(var/datum/disease/D in M.viruses)
@@ -198,7 +207,8 @@
if( istype(src, /turf/simulated) )
var/turf/simulated/source1 = src
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source1)
this.blood_DNA = M.dna.unique_enzymes
this.blood_DNA = list(M.dna.unique_enzymes, M.dna.b_type)
this.OriginalMob = M.dna.original_name
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
@@ -245,6 +255,25 @@
source2.blood_DNA = null
var/icon/I = new /icon(source2.icon_old, source2.icon_state)
source2.icon = I
if(src.fingerprints && src.fingerprints.len)
var/done = 0
while(!done)
done = 1
for(var/i = 1, i < (src.fingerprints.len + 1), i++)
var/list/prints = params2list(src.fingerprints[i])
var/test_print = prints["2"]
var/new_print = stars(test_print, rand(1,20))
if(stringpercent(new_print) == 32)
if(src.fingerprints.len == 1)
src.fingerprints = list()
else
for(var/j = (i + 1), j < (src.fingerprints.len), j++)
src.fingerprints[j-1] = src.fingerprints[j]
src.fingerprints.len--
done = 0
break
else
src.fingerprints[i] = "1=" + prints["1"] + "&2=" + new_print
return
/atom/MouseDrop(atom/over_object as mob|obj|turf|area)

View File

@@ -17,7 +17,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
anchored = 1
Bump(atom/clong)
if (istype(clong, /turf))
if (istype(clong, /turf) && !istype(clong, /turf/simulated/shuttle) && !istype(clong, /turf/unsimulated))
if(clong.density)
clong.ex_act(2)
for (var/mob/O in hearers(src, null))
@@ -32,6 +32,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
clong.meteorhit(src)
if(clong && prob(25))
src.loc = clong.loc
else del(src)
/proc/immovablerod()

View File

@@ -15,7 +15,7 @@
dotheblobbaby()
spawn(15000)
blobevent = 0
spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
spawn(rand(30, 60)) //Delayed announcements to keep the crew on their toes.
command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
world << sound('outbreak5.ogg')

View File

@@ -6,7 +6,7 @@
list/obj/machinery/light/Comms = list( )
Announce()
command_alert("The station is flying through an electrical storm. Radio communications may be disrupted", "Anomaly Alert")
// command_alert("The station is flying through an electrical storm. Radio communications may be disrupted", "Anomaly Alert")
for(var/obj/machinery/light/Light in world)
if(Light.z == 1 && Light.status != 0)

View File

@@ -5,7 +5,7 @@
Announce()
Lifetime = rand(15, 20)
command_alert("The station has entered an ion storm. Monitor all electronic equipment for malfunctions", "Anomaly Alert")
// command_alert("The station has entered an ion storm. Monitor all electronic equipment for malfunctions", "Anomaly Alert")
for (var/mob/living/carbon/human/player in world)
if(player.client)
players += player.real_name
@@ -44,3 +44,6 @@
bot.Emag()
Die()
spawn(rand(5000,8000))
if(prob(50))
command_alert("It has come to our attention that the station passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert")

View File

@@ -1,8 +1,15 @@
/datum/event/power_offline
Announce()
command_alert("The station is performing an automated power system grid check, please stand by.", "Maintenance alert")
for(var/obj/machinery/power/apc/a in world)
if(!a.crit)
if(istype(a.area, /area/engine))
continue
a.eventoff = 1
spawn(200)
a.eventoff = 0 /*Got a few bug reports about this, disabling for now --Mloc*/
a.update()
Die()
command_alert("The station has finished an automated power system grid check, thank you.", "Maintenance alert")
for(var/obj/machinery/power/apc/a in world)
if(!a.crit)
a.eventoff = 0
a.update()

View File

@@ -5,7 +5,7 @@
Tick()
for(var/mob/living/carbon/L in world)
L.apply_effect(rand(1,7), IRRADIATE)
L.apply_effect(rand(4,10), IRRADIATE)
Die()
command_alert("The station has cleared the radiation belt", "Medical Alert")

View File

@@ -33,7 +33,7 @@ var/datum/roundinfo/roundinfo = new()
login_music = pick('title1.ogg', 'title2.ogg') // choose title music!
do
pregame_timeleft = 180
pregame_timeleft = 10
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds"
while(current_state == GAME_STATE_PREGAME)

View File

@@ -22,7 +22,9 @@
spawn(0)
spawn_meteor()
/proc/spawn_meteor()
//if size is 0, it picks a random size
//if T is null, it starts on an edge space tile
/proc/spawn_meteor(var/size = 0, var/turf/T = null)
var/startx
var/starty
@@ -32,8 +34,10 @@
var/turf/pickedgoal
var/max_i = 10//number of tries to spawn meteor.
do
if(T)
pickedstart = T
else
switch(pick(1,2,3,4))
if(1) //NORTH
starty = world.maxy-3
@@ -55,24 +59,30 @@
startx = 3
endy = rand(1,world.maxy-1)
endx = world.maxx-1
pickedstart = locate(startx, starty, 1)
pickedgoal = locate(endx, endy, 1)
max_i--
if(max_i<=0) return
while (!istype(pickedstart, /turf/space) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen.
//meteors can spawn on station when a large one is hit by a missile
while ( (!istype(pickedstart, /turf/space) || pickedstart.loc.name != "Space") && !T )
var/obj/effect/meteor/M
switch(size)
if(0)
switch(rand(1, 100))
if(1 to 10)
M = new /obj/effect/meteor/big( pickedstart )
if(11 to 75)
M = new /obj/effect/meteor( pickedstart )
if(76 to 100)
M = new /obj/effect/meteor/small( pickedstart )
if(1)
M = new /obj/effect/meteor/small( pickedstart )
if(2)
M = new /obj/effect/meteor( pickedstart )
if(3)
M = new /obj/effect/meteor/big( pickedstart )
M.dest = pickedgoal
spawn(0)

View File

@@ -101,7 +101,7 @@
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
for(var/j, j < traitor.objectives.len, j++)
for(var/j, j < (traitor.objectives.len + 1), j++)
var/compare = istype(traitor.objectives[j],/datum/objective/assassinate)
if(compare)
var/datum/objective/assassinate/test = traitor.objectives[j]
@@ -129,7 +129,7 @@
var/datum/objective/protect/protect_objective = new
protect_objective.owner = traitor
protect_objective.find_target()
for(var/j, j < traitor.objectives.len, j++)
for(var/j, j < (traitor.objectives.len + 1), j++)
var/compare = istype(traitor.objectives[j],/datum/objective/assassinate)
if(compare)
var/datum/objective/assassinate/test = traitor.objectives[j]
@@ -157,7 +157,7 @@
var/datum/objective/steal/steal_objective = new
steal_objective.owner = traitor
steal_objective.find_target()
for(var/j, j < traitor.objectives.len, j++)
for(var/j, j < (traitor.objectives.len + 1), j++)
var/compare = istype(traitor.objectives[j],/datum/objective/steal)
if(compare)
var/datum/objective/steal/test = traitor.objectives[j]

View File

@@ -5,7 +5,7 @@
faction = "Station"
total_positions = -1
spawn_positions = -1
supervisors = "absolutely everyone"
equip(var/mob/living/carbon/human/H)
if(!H) return 0

View File

@@ -5,6 +5,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "Nanotrasen officials and Space law"
equip(var/mob/living/carbon/human/H)
@@ -32,6 +33,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
equip(var/mob/living/carbon/human/H)

View File

@@ -11,6 +11,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -34,6 +35,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -53,6 +55,7 @@
faction = "Station"
total_positions = 3
spawn_positions = 2
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -74,6 +77,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -95,6 +99,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -114,6 +119,7 @@
faction = "Station"
total_positions = 3
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -137,6 +143,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -164,6 +171,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -196,6 +204,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -215,6 +224,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)
@@ -234,6 +244,7 @@ var/global/lawyer = 0//Checks for another lawyer
faction = "Station"
total_positions = 2
spawn_positions = 2
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)

View File

@@ -6,6 +6,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
equip(var/mob/living/carbon/human/H)

View File

@@ -5,6 +5,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
equip(var/mob/living/carbon/human/H)
@@ -28,6 +29,7 @@
faction = "Station"
total_positions = 5
spawn_positions = 5
supervisors = "the chief engineer"
equip(var/mob/living/carbon/human/H)
@@ -51,6 +53,7 @@
faction = "Station"
total_positions = 3
spawn_positions = 2
supervisors = "the chief engineer"
equip(var/mob/living/carbon/human/H)
@@ -72,6 +75,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 1
supervisors = "the chief engineer and research director"
equip(var/mob/living/carbon/human/H)
if(!H) return 0

View File

@@ -1,19 +1,26 @@
/datum/job
var
//The name of the job
title = "NOPE"
var/title = "NOPE"
//Bitflags for the job
flag = 0
department_flag = 0
var/flag = 0
var/department_flag = 0
//Players will be allowed to spawn in as jobs that are set to "Station"
faction = "None"
var/faction = "None"
//How many players can be this job
total_positions = 0
var/total_positions = 0
//How many players can spawn in as this job
spawn_positions = 0
var/spawn_positions = 0
//How many players have this job
current_positions = 0
var/current_positions = 0
//Supervisors, who this person answers to directly
var/supervisors = ""
proc/equip(var/mob/living/carbon/human/H)
/datum/job/proc/equip(var/mob/living/carbon/human/H)
return 1

View File

@@ -5,6 +5,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
equip(var/mob/living/carbon/human/H)
@@ -28,6 +29,7 @@
faction = "Station"
total_positions = 5
spawn_positions = 3
supervisors = "the chief medical officer"
equip(var/mob/living/carbon/human/H)
@@ -51,6 +53,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
supervisors = "the chief medical officer and research director"
equip(var/mob/living/carbon/human/H)
@@ -73,6 +76,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the chief medical officer and research director"
equip(var/mob/living/carbon/human/H)

View File

@@ -5,6 +5,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
equip(var/mob/living/carbon/human/H)
@@ -26,6 +27,7 @@
faction = "Station"
total_positions = 5
spawn_positions = 3
supervisors = "the research director"
equip(var/mob/living/carbon/human/H)
@@ -48,6 +50,7 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
supervisors = "the chief medical officer and the research director"
equip(var/mob/living/carbon/human/H)

View File

@@ -5,6 +5,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
equip(var/mob/living/carbon/human/H)
@@ -36,6 +37,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of security"
equip(var/mob/living/carbon/human/H)
@@ -65,6 +67,7 @@
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of security"
equip(var/mob/living/carbon/human/H)
@@ -102,6 +105,7 @@
faction = "Station"
total_positions = 5
spawn_positions = 5
supervisors = "the head of security"
equip(var/mob/living/carbon/human/H)

View File

@@ -209,6 +209,7 @@ var/global/datum/controller/occupations/job_master
spawnId(H,rank)
H << "<B>You are the [rank].</B>"
H << "<b>As the [rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>"
H.job = rank
if(H.mind)
H.mind.assigned_role = rank

View File

@@ -144,7 +144,10 @@
..()
spawn( 5 )
if(orient == "RIGHT")
if(!istype(src,/obj/machinery/sleeper/syndicate))
icon_state = "sleeper_0-r"
else
icon_state = "syndipod_0-r"
return
return
@@ -193,9 +196,14 @@
M.client.eye = src
M.loc = src
src.occupant = M
if(!istype(src,/obj/machinery/sleeper/syndicate))
src.icon_state = "sleeper_1"
if(orient == "RIGHT")
icon_state = "sleeper_1-r"
else
src.icon_state = "syndipod_1"
if(orient == "RIGHT")
icon_state = "syndipod_1-r"
for(var/obj/O in src)
O.loc = src.loc
@@ -259,8 +267,11 @@
src.occupant.client.perspective = MOB_PERSPECTIVE
src.occupant.loc = src.loc
src.occupant = null
if(orient == "RIGHT" && !istype(src,/obj/machinery/sleeper/syndicate))
if(orient == "RIGHT")
if(!istype(src,/obj/machinery/sleeper/syndicate))
icon_state = "sleeper_0-r"
else
icon_state = "syndipod_0-r"
return
@@ -350,7 +361,9 @@
icon_state = "sleeper_0-r"
src.icon_state = "sleeper_0"
else
src.icon_state = "syndi_0"
if(orient == "RIGHT")
icon_state = "syndipod_0-r"
src.icon_state = "syndipod_0"
src.go_out()
add_fingerprint(usr)
return
@@ -390,7 +403,9 @@
if(orient == "RIGHT")
icon_state = "sleeper_1-r"
else
src.icon_state = "syndi_1"
src.icon_state = "syndipod_1"
if(orient == "RIGHT")
icon_state = "syndipod_1-r"
for(var/obj/O in src)
del(O)

View File

@@ -698,13 +698,8 @@
// calculates a path to the current destination
// given an optional turf to avoid
/obj/machinery/bot/mulebot/proc/calc_path(var/turf/avoid = null)
if(src.target)
src.path = AStar(src.loc, src.target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_ortho, 0, 250, id=botcard, exclude=avoid)
src.path = reverselist(src.path)
else
for (var/mob/M in world)
if (M.client && M.client.holder)
M << "<span class=\"gfartadmin\"><span class=\"prefix\">ERROR:</span><span class=\"message\">A Mulebot has attempted to path to a null target! This is a bug!</span></span>"
// sets the current destination

View File

@@ -68,7 +68,8 @@
/obj/machinery/computer/cloning/New()
..()
spawn(5)
src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir))
updatemodules()
/*src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir))
src.pod1 = locate(/obj/machinery/clonepod, get_step(src, poddir))
src.temp = ""
@@ -80,10 +81,54 @@
src.pod1.connected = src
if (src.temp == "")
src.temp = "System ready."
src.temp = "System ready."*/
return
return
/obj/machinery/computer/cloning/proc/updatemodules()
//world << "UPDATING MODULES"
src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST))
src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST))
//world << "SEARCHING FOR MACHEIN"
//src.temp = ""
//if (isnull(src.scanner))
// src.temp += " <font color=red>SCNR-ERROR</font>"
if (!isnull(src.pod1) && !wantspod)
src.pod1.connected = src
// src.temp += " <font color=red>POD1-ERROR</font>"
//else
//if (src.temp == "")
// src.temp = "System ready."
/obj/machinery/computer/cloning/proc/findscanner()
//..()
//world << "SEARCHING FOR SCANNER"
var/obj/machinery/dna_scannernew/scannerf = null
for(dir in list(NORTH,EAST,SOUTH,WEST))
//world << "SEARCHING IN [dir]"
scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
if (!isnull(scannerf))
//world << "FOUND"
break
if(isnull(scannerf) && wantsscan)
src.temp += " <font color=red>SCNR-ERROR</font>"
return scannerf
/obj/machinery/computer/cloning/proc/findcloner()
//..()
//world << "SEARCHING FOR POD"
var/obj/machinery/clonepod/podf = null
for(dir in list(NORTH,EAST,SOUTH,WEST))
//world << "SEARCHING IN [dir]"
podf = locate(/obj/machinery/clonepod, get_step(src, dir))
if (!isnull(podf))
//world << "FOUND"
break
if(isnull(podf) && wantspod)
src.temp += " <font color=red>POD1-ERROR</font>"
return podf
/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
if (!src.diskette)
@@ -110,6 +155,7 @@
if(stat & (BROKEN|NOPOWER))
return
updatemodules()
var/dat = "<h3>Cloning System Control</h3>"
dat += "<font size=-1><a href='byond://?src=\ref[src];refresh=1'>Refresh</a></font>"

View File

@@ -126,6 +126,8 @@
if(P:brainmob.mind in ticker.mode.head_revolutionaries)
user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI."
return
if(P:brainmob.mind in ticker.mode:revolutionaries)
ticker.mode:remove_revolutionary(P:brainmob.mind , 1)
if(jobban_isbanned(P:brainmob, "AI"))
user << "\red This MMI does not seem to fit."
@@ -154,13 +156,11 @@
else
icon_state = "3"
new /obj/item/stack/sheet/rglass( loc, 2 )
return
if(istype(P, /obj/item/weapon/screwdriver))
playsound(loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
if(brain.brainmob.mind in ticker.mode:revolutionaries)
ticker.mode:remove_revolutionary(brain.brainmob.mind , 1)
new /mob/living/silicon/ai ( loc, laws, brain )
del(src)

View File

@@ -28,6 +28,13 @@
connectedDoorIds.Add("Atmospheric Storage Rad Shielding")
connectedDoorIds.Add("Construction Storage Rad Shielding")
connectedDoorIds.Add("Engineering Secure Storage")
if("Medbay")
connectedDoorIds.Add("Genetics Outer Shutters")
connectedDoorIds.Add("Genetics Inner Shutters")
connectedDoorIds.Add("Chemistry Outer Shutters")
connectedDoorIds.Add("Observation Shutters")
connectedDoorIds.Add("Patient Room 1 Shutters")
connectedDoorIds.Add("Patient Room 2 Shutters")
//loop through the world, grabbing all the relevant doors
spawn(1)

View File

@@ -211,6 +211,11 @@ About the new airlock wires panel:
return
else /*if (src.justzap)*/
return
else if(user.hallucination > 50 && prob(10) && src.operating == 0)
user << "\red <B>You feel a powerful shock course through your body!</B>"
user.halloss += 10
user.stunned += 10
return
..(user)
@@ -1023,6 +1028,8 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/attackby(C as obj, mob/user as mob)
//world << text("airlock attackby src [] obj [] mob []", src, C, user)
if(istype(C, /obj/item/device/detective_scanner))
return
if (!istype(usr, /mob/living/silicon))
if (src.isElectrified())
if(src.shock(user, 75))

View File

@@ -129,6 +129,8 @@
return 1
/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/device/detective_scanner))
return ..()
if (src.operating)
return
src.add_fingerprint(user)

View File

@@ -176,18 +176,25 @@
newmeat.reagents.add_reagent("nutriment", sourcenutriment / totalslabs) // Thehehe. Fat guys go first
allmeat += newmeat
for (var/mob/M in world)
if (M.client && M.client.holder && (M.client.holder.level != -3))
M << "\red [user.name]/[user.ckey] has gibbed [src.occupant.name]/[src.occupant.ckey]"
src.occupant.death(1)
src.occupant.ghostize()
del(src.occupant)
spawn(src.gibtime)
playsound(src.loc, 'splat.ogg', 50, 1)
operating = 0
var/iterator = 0
for (var/i=1 to allmeat.len)
var/obj/item/meatslab = allmeat[i]
var/turf/Tx = locate(src.x - i, src.y, src.z)
var/turf/Tx = locate(src.x - i + iterator, src.y, src.z)
if(Tx.density)
iterator += 1
Tx = locate(src.x - i + iterator, src.y, src.z)
meatslab.loc = src.loc
meatslab.throw_at(Tx,i,3)
if (!Tx.density)
new /obj/effect/decal/cleanable/blood/gibs(Tx,i)
new /obj/effect/decal/cleanable/blood/gibs(Tx,i + iterator)
src.operating = 0
update_icon()

View File

@@ -11,17 +11,10 @@
if(busy)
M << "\red Someone's already washing something here."
return
var/turf/location = M.loc
if(!isturf(location)) return
usr << "\blue You start washing up."
busy = 1
sleep(40)
busy = 0
if(M.loc != location) return //Person has moved away from the sink
if(do_after(M,40))
M.clean_blood()
if(istype(M, /mob/living/carbon))
var/mob/living/carbon/C = M
@@ -48,6 +41,7 @@
C:head.clean_blood()*/ //- NOPE, Washing machine -Errorage
for(var/mob/V in viewers(src, null))
V.show_message(text("\blue [M] washes up using \the [src]."))
busy = 0
attackby(var/obj/item/O as obj, var/mob/user as mob)
@@ -83,26 +77,20 @@
"\red You have wet \the [O], it shocks you!")
return
var/turf/location = user.loc
if(!isturf(location)) return
var/obj/item/I = O
if(!I || !istype(I,/obj/item)) return
usr << "\blue You start washing up."
busy = 1
sleep(40)
busy = 0
if(user.loc != location) return //User has moved
if(do_after(user,40))
if(!I) return //Item's been destroyed while washing
if(user.get_active_hand() != I) return //Person has switched hands or the item in their hands
O.clean_blood()
user.visible_message( \
"\blue [user] washes \a [I] using \the [src].", \
"\blue You wash \a [I] using \the [src].")
busy = 0
shower
name = "Shower"

View File

@@ -284,6 +284,8 @@
attack_self(var/mob/user as mob, opening=1)
if(src.dat)
cache_imgs(user)
if(pages.len == 0) // For instance, when the book is spawned by admisn
src.gen_pages()
user << browse("<div style='color:#666;font-style:italic;margin-bottom:1em'><div style='float:left'>[title]</div><div style='float:right'>[author]</div></div><div style='clear:both;overflow:scroll'>[pages[cur_page]]</div>[pages.len > 1 ? navbar() : ""]", "window=book;size=600x500")
if(opening)

View File

@@ -132,6 +132,8 @@ MASS SPECTROMETER
return
afterattack(atom/A as obj|turf|area, mob/user as mob)
if(!(locate(A) in oview(1,user)))
return
if(src.loc != user)
return 0
src.add_fingerprint(user)

View File

@@ -13,7 +13,7 @@
var/playsleepseconds = 0.0
var/list/storedinfo = new/list()
var/list/timestamp = new/list()
flags = FPRINT | TABLEPASS| CONDUCT
flags = FPRINT | TABLEPASS | CONDUCT
throwforce = 2
throw_speed = 4
throw_range = 20
@@ -23,18 +23,18 @@
var/ending = copytext(msg, length(msg))
src.timestamp+= src.timerecorded
if (M.stuttering)
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] stammers, \"[msg]\""
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] [M.name] stammers, \"[msg]\""
return
if (M.getBrainLoss() >= 60)
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] gibbers, \"[msg]\""
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] [M.name] gibbers, \"[msg]\""
return
if (ending == "?")
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] asks, \"[msg]\""
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] [M.name] asks, \"[msg]\""
return
else if (ending == "!")
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] exclaims, \"[msg]\""
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] [M.name] exclaims, \"[msg]\""
return
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] says, \"[msg]\""
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] [M.name] says, \"[msg]\""
return
/obj/item/device/taperecorder/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -69,12 +69,12 @@
usr << "\red The tape recorder makes a scratchy noise."
return
src.icon_state = "taperecorderrecording"
if(src.timerecorded < 3600 && src.playing == 0)
if(src.timerecorded < 10800 && src.playing == 0)
usr << "\blue Recording started."
src.recording = 1
src.timestamp+= src.timerecorded
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] Recording started."
for(src.timerecorded, src.timerecorded<3600)
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] Recording started."
for(src.timerecorded, src.timerecorded<10800)
if(src.recording == 0)
break
src.timerecorded++
@@ -96,7 +96,7 @@
if (src.recording == 1)
src.recording = 0
src.timestamp+= src.timerecorded
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] Recording stopped."
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] Recording stopped."
usr << "\blue Recording stopped."
src.icon_state = "taperecorderidle"
return
@@ -149,7 +149,7 @@
src.playing = 1
src.icon_state = "taperecorderplaying"
usr << "\blue Playing started."
for(var/i=1,src.timerecorded<3600,sleep(10 * (src.playsleepseconds) ))
for(var/i=1,src.timerecorded<10800,sleep(10 * (src.playsleepseconds) ))
if (src.playing == 0)
break
if (src.storedinfo.len < i)
@@ -219,12 +219,12 @@
usr << "\red The tape recorder makes a scratchy noise."
return
src.icon_state = "taperecorderrecording"
if(src.timerecorded < 3600 && src.playing == 0)
if(src.timerecorded < 10800 && src.playing == 0)
usr << "\blue Recording started."
src.recording = 1
src.timestamp+= src.timerecorded
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] Recording started."
for(src.timerecorded, src.timerecorded<3600)
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] Recording started."
for(src.timerecorded, src.timerecorded<10800)
if(src.recording == 0)
break
src.timerecorded++
@@ -241,7 +241,7 @@
if (src.recording == 1)
src.recording = 0
src.timestamp+= src.timerecorded
src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] Recording stopped."
src.storedinfo += "\[[time2text(src.timerecorded*10,"hh:mm:ss")]\] Recording stopped."
usr << "\blue Recording stopped."
src.icon_state = "taperecorderidle"
return

View File

@@ -81,6 +81,7 @@
if ((O.client && !( O.blinded )))
O << text("\red [] kicks the display case.", usr)
src.health -= 2
src.add_fingerprint(user)
healthcheck()
return

View File

@@ -195,6 +195,8 @@
return
/obj/item/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/device/detective_scanner))
return
if (istype(W, /obj/item/weapon/packageWrap))
var/location = get_turf(src.loc)
if(istype(src,/obj/item/weapon/storage) && istype(src.loc, /mob)) //Put it into the bag
@@ -439,7 +441,7 @@ mob/proc/flash_weak_pain()
else
M.take_organ_damage(7)
M.eye_blurry += rand(3,4)
M.eye_stat += rand(2,4)
M.eye_stat += rand(5,9)
if (M.eye_stat >= 10)
M.eye_blurry += 15+(0.1*M.eye_blurry)
M.disabilities |= 1

View File

@@ -45,13 +45,10 @@ FINGERPRINT CARD
return
/obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob)
if(!src.registered)
src.registered = input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)
src.assignment = input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant")
src.name = "[src.registered]'s ID Card ([src.assignment])"
user << "\blue You successfully forge the ID card."
else
..()
/obj/item/weapon/card/id/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()

View File

@@ -357,6 +357,9 @@ CIRCULAR SAW
/obj/item/weapon/autopsy_scanner/verb/print_data()
set src in view(usr, 1)
if(usr.stat == 2)
src << "No."
return
var/scan_data = ""
var/n = 1

View File

@@ -19,6 +19,8 @@ SHARDS
title += " ([src.amount] sheet\s left)"
switch(alert(title, "Would you like full tile glass or one direction?", "one direct", "full (2 sheets)", "cancel", null))
if("one direct")
if (src.loc != usr)
return 1
if (src.amount < 1)
return 1
var/list/directions = new/list(cardinal)
@@ -52,6 +54,8 @@ SHARDS
W.anchored = 0
src.use(1)
if("full (2 sheets)")
if (src.loc != usr)
return 1
if (src.amount < 2)
return 1
if (locate(/obj/structure/window) in usr.loc)

View File

@@ -1,5 +1,5 @@
/obj/item/clothing/suit/storage/
/obj/item/clothing/suit/storage
var/obj/screen/storage/boxes
var/obj/screen/close/closer
var/obj/slot1
@@ -95,7 +95,6 @@
return
/obj/item/clothing/suit/storage/proc/orient2hud(mob/user as mob)
if (src == user.l_hand)
src.orient_objs(3, 5, 3, 3)
else if (src == user.r_hand)
@@ -119,9 +118,8 @@
cx = tx
cy--
//Foreach goto(56)
src.closer.screen_loc = text("[],[]", mx, my)
src.closer.screen_loc = text("[],[]", mx+1, my)
return
/*/obj/item/clothing/suit/storage/New()
src.boxes = new /obj/screen/storage( )

View File

@@ -132,6 +132,7 @@
for(var/obj/structure/lattice/L in locate(src.x, src.y, src.z))
del(L)
var/turf/simulated/floor/W = new /turf/simulated/floor( locate(src.x, src.y, src.z) )
W.New()
W.dir = old_dir
if(prior_icon) W.icon_state = prior_icon
@@ -151,6 +152,7 @@
for(var/obj/structure/lattice/L in locate(src.x, src.y, src.z))
del(L)
var/turf/simulated/floor/plating/W = new /turf/simulated/floor/plating( locate(src.x, src.y, src.z) )
W.New()
W.dir = old_dir
if(prior_icon) W.icon_state = prior_icon
@@ -166,6 +168,7 @@
for(var/obj/structure/lattice/L in locate(src.x, src.y, src.z))
del(L)
var/turf/simulated/floor/engine/E = new /turf/simulated/floor/engine( locate(src.x, src.y, src.z) )
E.New()
E.dir = old_dir
E.icon_state = "engine"
@@ -228,12 +231,14 @@
/turf/proc/ReplaceWithSpace()
var/old_dir = dir
var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) )
S.New()
S.dir = old_dir
return S
/turf/proc/ReplaceWithLattice()
var/old_dir = dir
var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) )
S.New()
S.dir = old_dir
new /obj/structure/lattice( locate(src.x, src.y, src.z) )
return S
@@ -241,6 +246,7 @@
/turf/proc/ReplaceWithWall()
var/old_icon = icon_state
var/turf/simulated/wall/S = new /turf/simulated/wall( locate(src.x, src.y, src.z) )
S.New()
S.icon_old = old_icon
S.opacity = 0
S.sd_NewOpacity(1)
@@ -249,6 +255,7 @@
/turf/proc/ReplaceWithRWall()
var/old_icon = icon_state
var/turf/simulated/wall/r_wall/S = new /turf/simulated/wall/r_wall( locate(src.x, src.y, src.z) )
S.New()
S.icon_old = old_icon
S.opacity = 0
S.sd_NewOpacity(1)

View File

@@ -56,6 +56,9 @@
M << browse(null, "window=vote")
M.client.showvote = 0
if(winner == "none")
winner = "default"
calcwin()
if(mode == 2)

View File

@@ -1450,6 +1450,8 @@ datum
M:adjustOxyLoss(-3)
M:heal_organ_damage(3,3)
M:adjustToxLoss(-3)
M:halloss = 0
M:hallucination -= 5
..()
return
@@ -1531,6 +1533,19 @@ datum
for(var/mob/living/carbon/metroid/M in T)
M.adjustToxLoss(rand(15,30))
LSD
name = "LSD"
id = "LSD"
description = "A hallucinogen"
reagent_state = LIQUID
color = "#B31008" // rgb: 139, 166, 233
on_mob_life(var/mob/M)
if(!M) M = holder.my_atom
M:hallucination += 5
..()
return
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
nanites

View File

@@ -417,6 +417,12 @@ datum
required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5)
result_amount = 2
LSD
name = "LSD"
id = "LSD"
result = "LSD"
required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
result_amount = 5
///////////////////////////////////////////////////////////////////////////////////
// foam and foam precursor

View File

@@ -8,6 +8,7 @@ mob/living/carbon/proc/dream()
"a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect",
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying"
)
spawn(0)
for(var/i = rand(1,4),i > 0, i--)
var/dream_image = pick(dreams)
dreams -= dream_image

View File

@@ -13,15 +13,17 @@ Gunshots/explosions/opening doors/less rare audio (done)
mob/living/carbon/var
image/halimage
image/halbody
obj/halitem
hal_screwyhud = 0 //1 - critical, 2 - dead, 3 - oxygen indicator, 4 - toxin indicator
handling_hal = 0
hal_crit = 0
mob/living/carbon/proc/handle_hallucinations()
if(handling_hal) return
handling_hal = 1
while(hallucination > 20)
sleep(rand(200,500))
sleep(rand(200,500)/(hallucination/25))
var/halpick = rand(1,100)
switch(halpick)
if(0 to 15)
@@ -33,6 +35,7 @@ mob/living/carbon/proc/handle_hallucinations()
if(16 to 25)
//Strange items
//src << "Traitor Items"
if(!halitem)
halitem = new
var/list/slots_free = list("1,1","3,1")
if(l_hand) slots_free -= "1,1"
@@ -78,6 +81,7 @@ mob/living/carbon/proc/handle_hallucinations()
if(26 to 40)
//Flashes of danger
//src << "Danger Flash"
if(!halimage)
var/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
possible_points += F
@@ -103,7 +107,7 @@ mob/living/carbon/proc/handle_hallucinations()
if(41 to 65)
//Strange audio
src << "Strange Audio"
//src << "Strange Audio"
switch(rand(1,12))
if(1) src << 'airlock.ogg'
if(2)
@@ -128,11 +132,45 @@ mob/living/carbon/proc/handle_hallucinations()
src << 'Taser.ogg'
//Rare audio
if(12)
switch(rand(1,4))
if(1) src << 'ghost.ogg'
if(2) src << 'ghost2.ogg'
if(3) src << 'Heart Beat.ogg'
if(4) src << 'screech.ogg'
var/list/creepyasssounds = list('ghost.ogg', 'ghost2.ogg', 'Heart Beat.ogg', 'screech.ogg',\
'behind_you1.ogg', 'behind_you2.ogg', 'far_noise.ogg', 'growl1.ogg', 'growl2.ogg',\
'growl3.ogg', 'im_here1.ogg', 'im_here2.ogg', 'i_see_you1.ogg', 'i_see_you2.ogg',\
'look_up1.ogg', 'look_up2.ogg', 'over_here1.ogg', 'over_here2.ogg', 'over_here3.ogg',\
'turn_around1.ogg', 'turn_around2.ogg', 'veryfar_noise.ogg', 'wail.ogg')
src << pick(creepyasssounds)
if(66 to 70)
//Flashes of danger
//src << "Danger Flash"
if(!halbody)
var/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
possible_points += F
var/turf/simulated/floor/target = pick(possible_points)
switch(rand(1,5))
if(1)
halbody = image('human.dmi',target,"husk_l",TURF_LAYER)
if(2,3)
halbody = image('human.dmi',target,"husk_s",TURF_LAYER)
if(4)
halbody = image('alien.dmi',target,"alienother",TURF_LAYER)
if(5)
halbody = image('xcomalien.dmi',target,"chryssalid",TURF_LAYER)
if(client) client.images += halbody
spawn(rand(50,80)) //Only seen for a brief moment.
if(client) client.images -= halbody
halbody = null
if(71 to 75)
//Fake death
src.sleeping_willingly = 1
src.sleeping = 1
hal_crit = 1
hal_screwyhud = 1
spawn(rand(50,100))
src.sleeping_willingly = 0
src.sleeping = 0
hal_crit = 0
hal_screwyhud = 0
handling_hal = 0
@@ -172,4 +210,193 @@ proc/check_panel(mob/M)
if (istype(M, /mob/living/carbon/human) || istype(M, /mob/living/silicon/ai))
if(M.hallucination < 15)
return 1
return 0*/
return 0 */
/obj/fake_attacker
icon = null
icon_state = null
name = ""
desc = ""
density = 0
anchored = 1
opacity = 0
var/mob/living/carbon/human/my_target = null
var/weapon_name = null
var/obj/item/weap = null
var/image/stand_icon = null
var/image/currentimage = null
var/icon/base = null
var/s_tone
var/mob/living/clone = null
var/image/left
var/image/right
var/image/up
var/collapse
var/image/down
var/health = 100
attackby(var/obj/item/weapon/P as obj, mob/user as mob)
step_away(src,my_target,2)
for(var/mob/M in oviewers(world.view,my_target))
M << "\red <B>[my_target] flails around wildly.</B>"
my_target.show_message("\red <B>[src] has been attacked by [my_target] </B>", 1) //Lazy.
//src.health -= P.power
return
HasEntered(var/mob/M, somenumber)
if(M == my_target)
step_away(src,my_target,2)
if(prob(30))
for(var/mob/O in oviewers(world.view , my_target))
O << "\red <B>[my_target] stumbles around.</B>"
New()
spawn(300)
if(my_target)
my_target.hallucinations -= src
del(src)
step_away(src,my_target,2)
proccess()
proc/updateimage()
// del src.currentimage
if(src.dir == NORTH)
del src.currentimage
src.currentimage = new /image(up,src)
else if(src.dir == SOUTH)
del src.currentimage
src.currentimage = new /image(down,src)
else if(src.dir == EAST)
del src.currentimage
src.currentimage = new /image(right,src)
else if(src.dir == WEST)
del src.currentimage
src.currentimage = new /image(left,src)
my_target << currentimage
proc/proccess()
if(!my_target) spawn(5) .()
if(src.health < 0)
collapse()
return
if(get_dist(src,my_target) > 1)
src.dir = get_dir(src,my_target)
step_towards(src,my_target)
updateimage()
else
if(prob(15))
if(weapon_name)
my_target << sound(pick('genhit1.ogg', 'genhit2.ogg', 'genhit3.ogg'))
my_target.show_message("\red <B>[my_target] has been attacked with [weapon_name] by [src.name] </B>", 1)
my_target.halloss += 8
if(prob(20)) my_target.eye_blurry += 3
if(prob(33))
if(!locate(/obj/effect/overlay) in my_target.loc)
fake_blood(my_target)
else
my_target << sound(pick('punch1.ogg','punch2.ogg','punch3.ogg','punch4.ogg'))
my_target.show_message("\red <B>[src.name] has punched [my_target]!</B>", 1)
my_target.halloss += 4
if(prob(33))
if(!locate(/obj/effect/overlay) in my_target.loc)
fake_blood(my_target)
if(prob(15))
step_away(src,my_target,2)
spawn(5) .()
proc/collapse()
collapse = 1
updateimage()
/proc/fake_blood(var/mob/target)
var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc)
O.name = "blood"
var/image/I = image('blood.dmi',O,"floor[rand(1,7)]",O.dir,1)
target << I
spawn(300)
del(O)
return
var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_magazine/a357,\
/obj/item/weapon/gun/energy/crossbow, /obj/item/weapon/melee/energy/sword,\
/obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/emp_kit,\
/obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\
/obj/item/clothing/shoes/syndigaloshes, /obj/item/weapon/card/id/syndicate,\
/obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\
/obj/item/device/chameleon, /obj/item/weapon/card/emag, /obj/item/device/hacktool,\
/obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\
/obj/item/device/radio/headset/traitor, /obj/item/weapon/plastique,\
/obj/item/weapon/syndie/c4explosive, /obj/item/device/powersink,\
/obj/machinery/singularity_beacon/syndicate, /obj/item/weapon/storage/syndie_kit,\
/obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\
/obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/blueprints, /obj/item/weapon/disk/nuclear,\
/obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank)
/proc/fake_attack(var/mob/target)
var/list/possible_clones = new/list()
var/mob/living/carbon/human/clone = null
var/clone_weapon = null
for(var/mob/living/carbon/human/H in world)
if(H.stat || H.lying) continue
possible_clones += H
if(!possible_clones.len) return
clone = pick(possible_clones)
//var/obj/fake_attacker/F = new/obj/fake_attacker(outside_range(target))
var/obj/fake_attacker/F = new/obj/fake_attacker(target.loc)
if(clone.l_hand)
if(!(locate(clone.l_hand) in non_fakeattack_weapons))
clone_weapon = clone.l_hand.name
F.weap = clone.l_hand
else if (clone.r_hand)
if(!(locate(clone.r_hand) in non_fakeattack_weapons))
clone_weapon = clone.r_hand.name
F.weap = clone.r_hand
F.name = clone.name
F.my_target = target
F.weapon_name = clone_weapon
target.hallucinations += F
F.left = image(clone,dir = WEST)
F.right = image(clone,dir = EAST)
F.up = image(clone,dir = NORTH)
F.down = image(clone,dir = SOUTH)
// F.base = new /icon(clone.stand_icon)
// F.currentimage = new /image(clone)
/*
F.left = new /icon(clone.stand_icon,dir=WEST)
for(var/icon/i in clone.overlays)
F.left.Blend(i)
F.up = new /icon(clone.stand_icon,dir=NORTH)
for(var/icon/i in clone.overlays)
F.up.Blend(i)
F.down = new /icon(clone.stand_icon,dir=SOUTH)
for(var/icon/i in clone.overlays)
F.down.Blend(i)
F.right = new /icon(clone.stand_icon,dir=EAST)
for(var/icon/i in clone.overlays)
F.right.Blend(i)
target << F.up
*/
F.updateimage()

View File

@@ -63,7 +63,7 @@ proc/move_mining_shuttle()
/obj/machinery/computer/mining_shuttle/attack_hand(user as mob)
src.add_fingerprint(usr)
var/dat
dat = text("<b>Mining shuttle: <A href='?src=\ref[src];move=[1]'>Call</A></b>")
dat = text("<center>Mining shuttle:<br> <b><A href='?src=\ref[src];move=[1]'>Send</A></b></center>")
user << browse("[dat]", "window=miningshuttle;size=200x100")
/obj/machinery/computer/mining_shuttle/Topic(href, href_list)
@@ -78,17 +78,17 @@ proc/move_mining_shuttle()
return
if (!mining_shuttle_moving)
usr << "\blue shuttle called and will arrive shortly"
usr << "\blue Shuttle recieved message and will be sent shortly."
move_mining_shuttle()
else
usr << "\blue shuttle is already moving"
usr << "\blue Shuttle is already moving."
/obj/machinery/computer/mining_shuttle/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/card/emag))
src.req_access = list()
hacked = 1
usr << "The computer's controls are now all access"
usr << "You fried the consoles ID checking system. It's now available to everyone!"
/******************************Lantern*******************************/

View File

@@ -194,6 +194,7 @@
shroom.pixel_y = 0
W = new /turf/simulated/floor/plating/airless/asteroid( locate(src.x, src.y, src.z) )
W.New()
W.dir = old_dir
W.fullUpdateMineralOverlays()

View File

@@ -1,4 +1,10 @@
/mob/living/carbon/human/death(gibbed)
if(halloss > 0 && (!gibbed))
//hallucination = 0
halloss = 0
// And the suffocation was a hallucination (lazy)
//oxyloss = 0
return
if(src.stat == 2)
return
if(src.healths)

View File

@@ -2376,7 +2376,7 @@ It can still be worn/put on as normal.
src.health = 100
src.stat = 0
return
src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src.getCloneLoss()
src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src.getCloneLoss() -src.halloss
/mob/living/carbon/human/abiotic(var/full_body = 0)

View File

@@ -150,6 +150,24 @@
handle_disabilities()
if(hallucination > 0)
if(hallucinations.len == 0 && hallucination >= 20 && health > 0)
if(prob(5))
fake_attack(src)
//for(var/atom/a in hallucinations)
// a.hallucinate(src)
if(!handling_hal && hallucination > 20)
spawn handle_hallucinations() //The not boring kind!
hallucination -= 2
//if(health < 0)
// for(var/obj/a in hallucinations)
// del a
else
halloss = 0
for(var/atom/a in hallucinations)
del a
if (disabilities & 2)
if ((prob(1) && paralysis < 1 && r_epil < 1))
src << "\red You have a seizure!"
@@ -724,7 +742,7 @@
if(sleeping)
Paralyse(3)
if (prob(10) && health) spawn(0) emote("snore")
if (prob(10) && health && !hal_crit) spawn(0) emote("snore")
if(!src.sleeping_willingly)
src.sleeping--
@@ -953,7 +971,7 @@
if (src.sleep)
if (src.sleep && !hal_crit)
src.sleep.icon_state = text("sleep[]", src.sleeping > 0 ? 1 : 0)
src.sleep.overlays = null
if(src.sleeping_willingly)
@@ -979,6 +997,10 @@
healths.icon_state = "health6"
else
healths.icon_state = "health7"
if(hal_screwyhud == 1)
healths.icon_state = "health6"
if(hal_screwyhud == 2)
healths.icon_state = "health7"
if (nutrition_icon)
switch(nutrition)
@@ -998,8 +1020,8 @@
if(resting || lying || sleeping) rest.icon_state = "rest[(resting || lying || sleeping) ? 1 : 0]"
if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]"
if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]"
if (toxin || hal_screwyhud == 4) toxin.icon_state = "tox[toxins_alert ? 1 : 0]"
if (oxygen || hal_screwyhud == 3) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]"
if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]"
//NOTE: the alerts dont reset when youre out of danger. dont blame me,
//blame the person who coded them. Temporary fix added.

View File

@@ -8,7 +8,7 @@
/mob/living/proc/updatehealth()
if(!src.nodamage)
src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src.cloneloss
src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src.cloneloss - src.halloss
else
src.health = 100
src.stat = 0

View File

@@ -50,15 +50,16 @@
src << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
src << "To use something, simply double-click it."
src << "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI."
src << "Remember to <b>adjust your camera network</b> if you are having difficulty navigating the camera networks with the arrow keys or clicking on certain objects."
if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
show_laws()
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
src << "Remember to <b>adjust your camera network</b> if you are having difficulty navigating the camera networks with the arrow keys or clicking on certain objects.<br>"
src << "<br><b><font color=red>IMPORTANT GAMEPLAY ASPECTS:</font></b>"
src << "1.) Act like an AI. If someone is breaking into your upload, say something like \"Alert. Unauthorised Access Detected: AI Upload.\" not \"Help! Urist is trying to subvert me!\""
src << "2.) Do not watch the traitor like a hawk alerting the station to his/her every move. This relates to 1."
src << "3.) You are theoretically omniscient, but you should not be Beepsky 5000, laying down the law left and right. That is security's job. Instead, try to keep the station productive and effective. (Feel free to report the location of major violence and crimes and all that, just do not be the evil thing looking over peoples shoulders)"
src << "<br>We want everyone to have a good time, so we, the admins, will try to correct you if you stray from these rules. Just try to keep it sensible."
if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
show_laws()
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
job = "AI"
spawn(0)

View File

@@ -194,6 +194,7 @@
var/mob/dead/observer/observer = new()
spawning = 1
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
close_spawn_windows()
var/obj/O = locate("landmark*Observer-Start")

View File

@@ -233,6 +233,8 @@
H.icon_state = "head_f_l"
H.overlays += owner.face_lying
H.transfer_identity(owner)
H.pixel_x = -10
H.pixel_y = 6
var/lol = pick(cardinal)
step(H,lol)

View File

@@ -859,6 +859,7 @@
else
src.malfai = usr
malfai << "Hack complete. The APC is now under your exclusive control."
updateicon()
else if (href_list["occupyapc"])
malfoccupy(usr)

View File

@@ -62,7 +62,7 @@
user.burn_skin(shock_damage)
user.updatehealth()
user.visible_message("\red [user.name] was shocked by the [src.name]!", \
"\red <B>You feel a powerful shock course through your body sending you flying!</B>", \
"\red <B>You feel a powerful shock course through your body, sending you flying!</B>", \
"\red You hear a heavy electrical crack")
var/stun = min(shock_damage, 15)

View File

@@ -1,3 +1,4 @@
var/containment_fail_announced = 0
/*
field_generator power level display
@@ -329,6 +330,14 @@ field_generator power level display
cleanup()
if(!containment_fail_announced)
containment_fail_announced = 1
var/obj/item/device/radio/a = new /obj/item/device/radio(null)
a.config(list("Engineering" = 0))
a.autosay("DANGER! Field failure detected! Immediate response advised!", "Singularity Monitoring Computer", "department")
del(a)
spawn(6000) //10 minutes.
containment_fail_announced = 0
clean_up = 1
for (var/obj/machinery/containment_field/F in fields)
if (isnull(F))

View File

@@ -7,6 +7,7 @@
name = "conveyor belt"
desc = "A conveyor belt."
anchored = 1
layer = 2.7
var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off
var/operable = 1 // true if can operate (no broken segments in this belt run)
var/forwards // this is the default (forward) direction, set by the map dir, can be 0

View File

@@ -185,13 +185,13 @@ datum
build_path = "/obj/item/weapon/circuitboard/secure_data"
atmosalerts
name = "Circuit Design (Atmosphere Alerts Console)"
name = "Circuit Design (Atmosphere Alert)"
desc = "Allows for the construction of circuit boards used to build an atmosphere alert console.."
id = "atmosalerts"
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/atmosphere/alerts"
build_path = "/obj/item/weapon/circuitboard/atmos_alert"
air_management
name = "Circuit Design (Atmospheric Monitor)"

View File

@@ -578,6 +578,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(1.2) //Technology Disk Menu
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A><HR>"
dat += "Disk Contents: (Technology Data Disk)<BR><BR>"
if(t_disk.stored == null)
dat += "The disk has no data stored on it.<HR>"
@@ -590,18 +592,18 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Operations: "
dat += "<A href='?src=\ref[src];updt_tech=1'>Upload to Database</A> || "
dat += "<A href='?src=\ref[src];clear_tech=1'>Clear Disk</A> || "
dat += "<A href='?src=\ref[src];eject_tech=1'>Eject Disk</A><HR>"
dat += "<BR><A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
dat += "<A href='?src=\ref[src];eject_tech=1'>Eject Disk</A>"
if(1.3) //Technology Disk submenu
dat += "<BR><A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=1.2'>Return to Disk Operations</A><HR>"
dat += "Load Technology to Disk:<BR><BR>"
for(var/datum/tech/T in files.known_tech)
dat += "[T.name] "
dat += "<A href='?src=\ref[src];copy_tech=1;copy_tech_ID=[T.id]'>(Copy to Disk)</A><BR>"
dat += "<HR><BR><A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=1.2'>Return to Disk Operations</A>"
if(1.4) //Design Disk menu.
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A><HR>"
if(d_disk.blueprint == null)
dat += "The disk has no data stored on it.<HR>"
dat += "Operations: "
@@ -620,18 +622,18 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "<HR>Operations: "
dat += "<A href='?src=\ref[src];updt_design=1'>Upload to Database</A> || "
dat += "<A href='?src=\ref[src];clear_design=1'>Clear Disk</A> || "
dat += "<A href='?src=\ref[src];eject_design=1'>Eject Disk</A><HR>"
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
dat += "<A href='?src=\ref[src];eject_design=1'>Eject Disk</A>"
if(1.5) //Technology disk submenu
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=1.4'>Return to Disk Operations</A><HR>"
dat += "Load Design to Disk:<BR><BR>"
for(var/datum/design/D in files.known_designs)
dat += "[D.name] "
dat += "<A href='?src=\ref[src];copy_design=1;copy_design_ID=[D.id]'>(Copy to Disk)</A><BR>"
dat += "<HR><A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=1.4'>Return to Disk Operations</A>"
if(1.6) //R&D console settings
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A><HR>"
dat += "R&D Console Setting:<BR><BR>"
if(sync)
dat += "<A href='?src=\ref[src];sync=1'>Sync Database with Network</A><BR>"
@@ -641,9 +643,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "<A href='?src=\ref[src];menu=1.7'>Device Linkage Menu</A><BR>"
dat += "<A href='?src=\ref[src];lock=0.2'>Lock Console</A><BR>"
dat += "<A href='?src=\ref[src];reset=1'>Reset R&D Database.</A><BR>"
dat += "<HR><A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(1.7) //R&D device linkage
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=1.6'>Settings Menu</A><HR> "
dat += "R&D Console Device Linkage Menu:<BR><BR>"
dat += "<A href='?src=\ref[src];find_device=1'>Re-sync with Nearby Devices</A><BR>"
dat += "Linked Devices:<BR>"
@@ -659,8 +662,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "* Circuit Imprinter <A href='?src=\ref[src];disconnect=imprinter'>(Disconnect)</A><BR>"
else
dat += "* (No Circuit Imprinter Linked)<BR>"
dat += "<HR><A href='?src=\ref[src];menu=1.6'>Settings Menu</A> || "
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
////////////////////DESTRUCTIVE ANALYZER SCREENS////////////////////////////
if(2.0)
@@ -672,6 +673,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(2.2)
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A><HR>"
dat += "Deconstruction Menu<HR>"
dat += "Name: [linked_destroy.loaded_item.name]<BR>"
dat += "Origin Tech:<BR>"
@@ -680,14 +682,16 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "* [CallTechName(T)] [temp_tech[T]]<BR>"
dat += "<HR><A href='?src=\ref[src];deconstruct=1'>Deconstruct Item</A> || "
dat += "<A href='?src=\ref[src];eject_item=1'>Eject Item</A> || "
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
/////////////////////PROTOLATHE SCREENS/////////////////////////
if(3.0)
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A><HR>"
dat += "NO PROTOLATHE LINKED TO CONSOLE<BR><BR>"
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(3.1)
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=3.2'>Material Storage</A> || "
dat += "<A href='?src=\ref[src];menu=3.3'>Chemical Storage</A><HR>"
dat += "Protolathe Menu:<BR><BR>"
dat += "<B>Material Amount:</B> [linked_lathe.TotalMaterials()] cm<sup>3</sup> (MAX: [linked_lathe.max_material_storage])<BR>"
dat += "<B>Chemical Volume:</B> [linked_lathe.reagents.total_volume] (MAX: [linked_lathe.reagents.maximum_volume])<HR>"
@@ -722,11 +726,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "* <A href='?src=\ref[src];build=[D.id]'>[temp_dat]</A><BR>"
else
dat += "* [temp_dat]<BR>"
dat += "<HR><A href='?src=\ref[src];menu=3.2'>Material Storage</A> || "
dat += "<A href='?src=\ref[src];menu=3.3'>Chemical Storage</A> || "
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(3.2) //Protolathe Material Storage Sub-menu
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=3.1'>Protolathe Menu</A><HR>"
dat += "Material Storage<BR><HR>"
//Metal
dat += "* [linked_lathe.m_amount] cm<sup>3</sup> of Metal || "
@@ -783,26 +786,25 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(linked_lathe.clown_amount >= 3750) dat += "<A href='?src=\ref[src];lathe_ejectsheet=clown;lathe_ejectsheet_amt=1'>(1 Sheet)</A> "
if(linked_lathe.clown_amount >= 18750) dat += "<A href='?src=\ref[src];lathe_ejectsheet=clown;lathe_ejectsheet_amt=5'>(5 Sheets)</A> "
if(linked_lathe.clown_amount >= 3750) dat += "<A href='?src=\ref[src];lathe_ejectsheet=clown;lathe_ejectsheet_amt=50'>(Max Sheets)</A>"
dat += "<BR>"
dat += "<HR><A href='?src=\ref[src];menu=3.1'>Protolathe Menu</A> | "
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(3.3) //Protolathe Chemical Storage Submenu
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=3.1'>Protolathe Menu</A><HR>"
dat += "Chemical Storage<BR><HR>"
for(var/datum/reagent/R in linked_lathe.reagents.reagent_list)
dat += "Name: [R.name] | Units: [R.volume] "
dat += "<A href='?src=\ref[src];disposeP=[R.id]'>(Purge)</A><BR>"
dat += "<A href='?src=\ref[src];disposeallP=1'><U>Disposal All Chemicals in Storage</U></A><BR>"
dat += "<HR><A href='?src=\ref[src];menu=3.1'>Protolathe Menu</A> | "
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
///////////////////CIRCUIT IMPRINTER SCREENS////////////////////
if(4.0)
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A><HR>"
dat += "NO CIRCUIT IMPRINTER LINKED TO CONSOLE<BR><BR>"
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(4.1)
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=4.3'>Material Storage</A> || "
dat += "<A href='?src=\ref[src];menu=4.2'>Chemical Storage</A><HR>"
dat += "Circuit Imprinter Menu:<BR><BR>"
dat += "Material Amount: [linked_imprinter.TotalMaterials()] cm<sup>3</sup><BR>"
dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]<HR>"
@@ -828,20 +830,19 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "* <A href='?src=\ref[src];imprint=[D.id]'>[temp_dat]</A><BR>"
else
dat += "* [temp_dat]<BR>"
dat += "<HR><A href='?src=\ref[src];menu=4.3'>Material Storage</A> || "
dat += "<A href='?src=\ref[src];menu=4.2'>Chemical Storage</A> || "
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(4.2)
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=4.1'>Imprinter Menu</A><HR>"
dat += "Chemical Storage<BR><HR>"
for(var/datum/reagent/R in linked_imprinter.reagents.reagent_list)
dat += "Name: [R.name] | Units: [R.volume] "
dat += "<A href='?src=\ref[src];disposeI=[R.id]'>(Purge)</A><BR>"
dat += "<A href='?src=\ref[src];disposeallI=1'><U>Disposal All Chemicals in Storage</U></A><BR>"
dat += "<HR><A href='?src=\ref[src];menu=4.1'>Imprinter Menu</A> | "
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
if(4.3)
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A> || "
dat += "<A href='?src=\ref[src];menu=4.1'>Circuit Imprinter Menu</A><HR>"
dat += "Material Storage<BR><HR>"
//Glass
dat += "* [linked_imprinter.g_amount] cm<sup>3</sup> of Glass || "
@@ -863,9 +864,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(linked_imprinter.diamond_amount > 3750) dat += "<A href='?src=\ref[src];imprinter_ejectsheet=diamond;imprinter_ejectsheet_amt=1'>(1 Sheet)</A> "
if(linked_imprinter.diamond_amount > 18750) dat += "<A href='?src=\ref[src];imprinter_ejectsheet=diamond;imprinter_ejectsheet_amt=5'>(5 Sheets)</A> "
if(linked_imprinter.diamond_amount > 3750) dat += "<A href='?src=\ref[src];imprinter_ejectsheet=diamond;imprinter_ejectsheet_amt=50'>(Max Sheets)</A>"
dat += "<BR>"
dat += "<HR><A href='?src=\ref[src];menu=4.1'>Circuit Imprinter Menu</A> | "
dat += "<A href='?src=\ref[src];menu=1.0'>Main Menu</A>"
user << browse("<TITLE>Research and Development Console</TITLE><HR>[dat]", "window=rdconsole;size=575x400")
onclose(user, "rdconsole")

View File

@@ -21,7 +21,7 @@
if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level)
switch(level)
if(SEC_LEVEL_GREEN)
world << "<font size=4 color='red'>Attention! security level lowered to green</font>"
world << "<font size=4 color='red'>Attention! Security level lowered to green</font>"
world << "<font color='red'>[config.alert_desc_green]</font>"
security_level = SEC_LEVEL_GREEN
for(var/obj/machinery/firealarm/FA in world)
@@ -30,10 +30,10 @@
FA.overlays += image('monitors.dmi', "overlay_green")
if(SEC_LEVEL_BLUE)
if(security_level < SEC_LEVEL_BLUE)
world << "<font size=4 color='red'>Attention! security level elevated to blue</font>"
world << "<font size=4 color='red'>Attention! Security level elevated to blue</font>"
world << "<font color='red'>[config.alert_desc_blue_upto]</font>"
else
world << "<font size=4 color='red'>Attention! security level lowered to blue</font>"
world << "<font size=4 color='red'>Attention! Security level lowered to blue</font>"
world << "<font color='red'>[config.alert_desc_blue_downto]</font>"
security_level = SEC_LEVEL_BLUE
for(var/obj/machinery/firealarm/FA in world)

View File

@@ -2,6 +2,7 @@ abi79 - Game Master
arcalane - Game Admin
bobbehluvspropane - Game Admin
cacophony - Game Admin
caelaislinn - Game Master
cajoes - Game Admin
cib - Game Master
compactninja - Game Master

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff