mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 03:27:05 +01:00
Merge branch 'master' of github.com:Baystation12/Baystation12
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
//not a computer
|
||||
obj/machinery/scanner
|
||||
name = "Identity Analyser"
|
||||
var/outputdir = 0
|
||||
icon = 'stationobjs.dmi'
|
||||
icon_state = "scanner_idle"
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/lastuser = null
|
||||
|
||||
obj/machinery/scanner/New()
|
||||
if(!outputdir)
|
||||
switch(dir)
|
||||
if(1)
|
||||
outputdir = 2
|
||||
if(2)
|
||||
outputdir = 1
|
||||
if(4)
|
||||
outputdir = 8
|
||||
if(8)
|
||||
outputdir = 4
|
||||
if(!outputdir)
|
||||
outputdir = 8
|
||||
|
||||
/obj/machinery/scanner/process()
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
use_power(50)
|
||||
|
||||
/obj/machinery/scanner/power_change()
|
||||
if(!powered())
|
||||
spawn(rand(0, 15))
|
||||
icon_state = "scanner_off"
|
||||
stat |= NOPOWER
|
||||
else
|
||||
icon_state = "scanner_idle"
|
||||
stat &= ~NOPOWER
|
||||
|
||||
obj/machinery/scanner/attack_hand(mob/living/carbon/human/user)
|
||||
if(stat & NOPOWER)
|
||||
return
|
||||
if(!ishuman(user) || lastuser == user.real_name)
|
||||
return
|
||||
use_power(500)
|
||||
flick("scanner_on",src)
|
||||
lastuser = user.real_name
|
||||
var/mname = user.real_name
|
||||
var/dna = user.dna.unique_enzymes
|
||||
var/bloodtype = user.b_type
|
||||
var/fingerprint = md5(user.dna.uni_identity)
|
||||
var/list/marks = list()
|
||||
var/age = user.age
|
||||
var/gender = user.gender
|
||||
/* no dbstuff yet
|
||||
var/DBQuery/cquery = dbcon.NewQuery("SELECT * from jobban WHERE ckey='[user.ckey]'")
|
||||
if(!cquery.Execute()) return
|
||||
else
|
||||
while(cquery.NextRow())
|
||||
var/list/row = cquery.GetRowData()
|
||||
marks += row["rank"]
|
||||
*/
|
||||
var/text = {"
|
||||
<font size=4><center>Report</center></font><br>
|
||||
<b><u>Name</u></b>: [mname]
|
||||
<b><u>Age</u></b>: [age]
|
||||
<b><u>Sex</u></b>: [gender]
|
||||
<b><u>DNA</u></b>: [dna]
|
||||
<b><u>Blood Type</u></b>: [bloodtype]
|
||||
<b><u>Fingerprint</u></b>: [fingerprint]
|
||||
|
||||
<b><u>Black Marks</u></b>:<br> "}
|
||||
for(var/A in marks)
|
||||
text += "\red[A]<br>"
|
||||
user << "\blue You feel a sting as the scanner sucks all your information out of you and sticks it in it's database."
|
||||
var/turf/T = get_step(src,outputdir)
|
||||
var/obj/item/weapon/paper/print = new(T)
|
||||
print.name = "[mname] Report"
|
||||
print.info = text
|
||||
print.stamped = 1
|
||||
|
||||
for(var/datum/data/record/test in data_core.general)
|
||||
if (test.fields["name"] == mname)
|
||||
return
|
||||
|
||||
var/datum/data/record/G = new()
|
||||
var/datum/data/record/M = new()
|
||||
var/datum/data/record/S = new()
|
||||
var/datum/data/record/L = new()
|
||||
G.fields["rank"] = "Unassigned"
|
||||
G.fields["name"] = mname
|
||||
G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
|
||||
M.fields["name"] = G.fields["name"]
|
||||
M.fields["id"] = G.fields["id"]
|
||||
S.fields["name"] = G.fields["name"]
|
||||
S.fields["id"] = G.fields["id"]
|
||||
if(gender == FEMALE)
|
||||
G.fields["sex"] = "Female"
|
||||
else
|
||||
G.fields["sex"] = "Male"
|
||||
G.fields["age"] = text("[]", age)
|
||||
G.fields["fingerprint"] = text("[]", fingerprint)
|
||||
G.fields["p_stat"] = "Active"
|
||||
G.fields["m_stat"] = "Stable"
|
||||
M.fields["b_type"] = text("[]", bloodtype)
|
||||
M.fields["b_dna"] = dna
|
||||
M.fields["mi_dis"] = "None"
|
||||
M.fields["mi_dis_d"] = "No minor disabilities have been declared."
|
||||
M.fields["ma_dis"] = "None"
|
||||
M.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
|
||||
M.fields["alg"] = "None"
|
||||
M.fields["alg_d"] = "No allergies have been detected in this patient."
|
||||
M.fields["cdi"] = "None"
|
||||
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
|
||||
M.fields["notes"] = "No notes."
|
||||
S.fields["criminal"] = "None"
|
||||
S.fields["mi_crim"] = "None"
|
||||
S.fields["mi_crim_d"] = "No minor crime convictions."
|
||||
S.fields["ma_crim"] = "None"
|
||||
S.fields["ma_crim_d"] = "No major crime convictions."
|
||||
S.fields["notes"] = "No notes."
|
||||
|
||||
//Begin locked reporting
|
||||
L.fields["name"] = mname
|
||||
L.fields["sex"] = gender
|
||||
L.fields["age"] = age
|
||||
L.fields["id"] = md5("[mname][user.mind.assigned_role]")
|
||||
L.fields["rank"] = "Unknown"
|
||||
L.fields["b_type"] = bloodtype
|
||||
L.fields["b_dna"] = dna
|
||||
L.fields["enzymes"] = user.dna.struc_enzymes
|
||||
L.fields["identity"] = user.dna.uni_identity
|
||||
L.fields["image"] = getFlatIcon(user,0)//What the person looks like. Naked, in this case.
|
||||
//End locked reporting
|
||||
|
||||
data_core.general += G
|
||||
data_core.medical += M
|
||||
data_core.security += S
|
||||
data_core.locked += L
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
if(watch_locations.len>0)
|
||||
loc = pick(watch_locations)
|
||||
|
||||
if(!preferences.savefile_load(src, 0))
|
||||
if(!preferences.savefile_load(src, 1))
|
||||
preferences.ShowChoices(src)
|
||||
if(!client.changes)
|
||||
changes()
|
||||
@@ -43,7 +43,7 @@
|
||||
if(!client.changes && preferences.lastchangelog!=lastchangelog)
|
||||
changes()
|
||||
preferences.lastchangelog = lastchangelog
|
||||
preferences.savefile_save(src)
|
||||
preferences.savefile_save(src, 1)
|
||||
|
||||
new_player_panel()
|
||||
//PDA Resource Initialisation =======================================================>
|
||||
@@ -117,11 +117,12 @@
|
||||
else output += "<b>You are ready</b> (<a href='byond://?src=\ref[src];ready=2'>Cancel</A>)<BR>"
|
||||
|
||||
else
|
||||
output += "<a href='byond://?src=\ref[src];manifest=1'>View the Crew Manifest</A><BR><BR>"
|
||||
output += "<a href='byond://?src=\ref[src];late_join=1'>Join Game!</A><BR>"
|
||||
|
||||
output += "<BR><a href='byond://?src=\ref[src];observe=1'>Observe</A><BR>"
|
||||
|
||||
src << browse(output,"window=playersetup;size=250x210;can_close=0")
|
||||
src << browse(output,"window=playersetup;size=250x233;can_close=0")
|
||||
return
|
||||
|
||||
Stat()
|
||||
@@ -192,6 +193,9 @@
|
||||
if(href_list["late_join"])
|
||||
LateChoices()
|
||||
|
||||
if(href_list["manifest"])
|
||||
ViewManifest()
|
||||
|
||||
if(href_list["SelectedJob"])
|
||||
if(!client.authenticated)
|
||||
src << "You are not authorized to enter the game."
|
||||
@@ -339,6 +343,14 @@
|
||||
|
||||
return new_character
|
||||
|
||||
proc/ViewManifest()
|
||||
var/dat = "<html><body>"
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
for(var/datum/data/record/t in data_core.general)
|
||||
dat += "[t.fields["name"]] - [t.fields["rank"]]<br>"
|
||||
dat += "<br>"
|
||||
|
||||
src << browse(dat, "window=manifest;size=300x420;can_close=1")
|
||||
|
||||
Move()
|
||||
return 0
|
||||
|
||||
@@ -102,6 +102,9 @@ datum/preferences
|
||||
job_engsec_med = 0
|
||||
job_engsec_low = 0
|
||||
|
||||
// slot stuff
|
||||
var/slotname
|
||||
var/curslot = 0
|
||||
|
||||
New()
|
||||
hair_style = new/datum/sprite_accessory/hair/short
|
||||
@@ -172,14 +175,32 @@ datum/preferences
|
||||
src.be_special = 0
|
||||
dat += "<hr>"
|
||||
|
||||
if(!IsGuestKey(user.key))
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;load=1'>Load Setup</a><br>"
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;save=1'>Save Setup</a><br>"
|
||||
// slot options
|
||||
if (!IsGuestKey(user.key))
|
||||
if(!curslot)
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;saveslot=1'>Save Slot 1</a><br>"
|
||||
else
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;saveslot=[curslot]'>Save Slot [curslot]</a><br>"
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;loadslot2=1'>Load</a><br>"
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;createslot=1'>Create New Slot</a><br>"
|
||||
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;reset_all=1'>Reset Setup</a><br>"
|
||||
dat += "</body></html>"
|
||||
|
||||
user << browse(dat, "window=preferences;size=300x710")
|
||||
proc/loadsave(mob/user)
|
||||
var/dat = "<body>"
|
||||
dat += "<tt><center>"
|
||||
|
||||
var/list/slots = savefile_getslots(user)
|
||||
for(var/slot=1, slot<=slots.len, slot++)
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;loadslot=[slot]'>Load Slot [slot] ([slots[slot]]) </a><a href='byond://?src=\ref[user];preferences=1;removeslot=[slot]'>(R)</a><br><br>"
|
||||
|
||||
dat += "<a href='byond://?src=\ref[user];preferences=1;loadslot=CLOSE'>Close</a><br>"
|
||||
dat += "</center></tt>"
|
||||
user << browse(dat, "window=saves;size=300x640")
|
||||
proc/closesave(mob/user)
|
||||
user << browse(null, "window=saves;size=300x640")
|
||||
|
||||
proc/SetChoices(mob/user, changedjob)
|
||||
var/HTML = "<body>"
|
||||
@@ -536,13 +557,51 @@ datum/preferences
|
||||
if(link_tags["b_random_name"])
|
||||
be_random_name = !be_random_name
|
||||
|
||||
// slot links
|
||||
if(!IsGuestKey(user.key))
|
||||
if(link_tags["save"])
|
||||
savefile_save(user)
|
||||
if(link_tags["saveslot"])
|
||||
var/slot = text2num(link_tags["saveslot"])
|
||||
|
||||
else if(link_tags["load"])
|
||||
if(!savefile_load(user, 0))
|
||||
savefile_save(user, slot)
|
||||
|
||||
else if(link_tags["loadslot"])
|
||||
var/slot = text2num(link_tags["loadslot"])
|
||||
if(slot == "CLOSE")
|
||||
closesave(user)
|
||||
return
|
||||
if(!savefile_load(user, slot))
|
||||
alert(user, "You do not have a savefile.")
|
||||
else
|
||||
curslot = slot
|
||||
loadsave(user)
|
||||
if(link_tags["removeslot"])
|
||||
var/slot = text2num(link_tags["removeslot"])
|
||||
if(!slot)
|
||||
return
|
||||
|
||||
savefile_removeslot(user, slot)
|
||||
|
||||
usr << "Slot [slot] Deleted."
|
||||
slot = 1
|
||||
loadsave(usr)
|
||||
if(link_tags["loadslot2"])
|
||||
loadsave(user)
|
||||
if(link_tags["createslot"])
|
||||
var/list/slots = savefile_getslots(user)
|
||||
var/count = slots.len
|
||||
count++
|
||||
if(count > 10)
|
||||
usr << "You have reached the character limit."
|
||||
return
|
||||
var/slotname = input(usr,"Choose a name for your slot","Name","Default")
|
||||
|
||||
savefile_createslot(user, slotname)
|
||||
|
||||
if(!savefile_load(user, count))
|
||||
alert(user, "You do not have a savefile.")
|
||||
else
|
||||
curslot = count
|
||||
closesave(user)
|
||||
|
||||
if(link_tags["reset_all"])
|
||||
gender = MALE
|
||||
|
||||
@@ -4,16 +4,94 @@
|
||||
datum/preferences/proc/savefile_path(mob/user)
|
||||
return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/preferences.sav"
|
||||
|
||||
datum/preferences/proc/savefile_save(mob/user)
|
||||
datum/preferences/proc/savefile_getslots(mob/user)
|
||||
if(IsGuestKey(user.key))
|
||||
return new/list()
|
||||
|
||||
var/path = savefile_path(user)
|
||||
if(!fexists(path))
|
||||
return new/list()
|
||||
|
||||
var/list/slots = new()
|
||||
var/savefile/F = new(path)
|
||||
|
||||
// slot 1
|
||||
slots.Add(F["slotname"] ? F["slotname"] : "Default") // allow old prefs saves to be loaded as slot 1
|
||||
|
||||
// slots 2 - len
|
||||
for(var/slot=2, slot<=F.dir.len, slot++)
|
||||
var/dname = F.dir[slot]
|
||||
if(copytext(dname, 1, 6) == "slot.")
|
||||
slots.Add(copytext(dname, 6))
|
||||
|
||||
return slots
|
||||
|
||||
datum/preferences/proc/savefile_createslot(mob/user, slotname)
|
||||
if(IsGuestKey(user.key))
|
||||
return
|
||||
|
||||
var/path = savefile_path(user)
|
||||
if(!fexists(path))
|
||||
return
|
||||
|
||||
var/savefile/F = new(path)
|
||||
|
||||
// 1st?
|
||||
if(!F["real_name"])
|
||||
F["slotname"] = "Default"
|
||||
randomize_name()
|
||||
else
|
||||
F.dir.Add("slot." + slotname)
|
||||
|
||||
var/list/slots = savefile_getslots(user)
|
||||
savefile_save(user, slots.len)
|
||||
|
||||
datum/preferences/proc/savefile_removeslot(mob/user, slot)
|
||||
if(IsGuestKey(user.key))
|
||||
return
|
||||
|
||||
var/path = savefile_path(user)
|
||||
if(!fexists(path))
|
||||
return
|
||||
|
||||
var/list/slots = savefile_getslots(user)
|
||||
|
||||
if(slot > 1)
|
||||
var/savefile/F = new(path)
|
||||
F.dir.Remove("slot." + slots[slot])
|
||||
else if(slots.len >= 2)
|
||||
// otherwise, we're deleting slot 1, and must move slot 2 to slot 1
|
||||
savefile_load(user, 2)
|
||||
savefile_save(user, 1)
|
||||
|
||||
var/savefile/F = new(path)
|
||||
F["slotname"] = slots[2] // slot 1's name <- slot 2's name
|
||||
F.dir.Remove("slot." + slots[2])
|
||||
else
|
||||
// otherwise, we're wiping the last save (slot 1)
|
||||
// actually no, that makes unintuitive, weird things happen
|
||||
//F["slotname"] = null
|
||||
//F["real_name"] = null
|
||||
user << "You must have at least one slot!"
|
||||
|
||||
datum/preferences/proc/savefile_save(mob/user, slot)
|
||||
if (IsGuestKey(user.key))
|
||||
return 0
|
||||
|
||||
var/savefile/F = new /savefile(src.savefile_path(user))
|
||||
// var/version
|
||||
// F["version"] >> version
|
||||
var/list/slots = savefile_getslots(user)
|
||||
var/savefile/F = new(savefile_path(user))
|
||||
|
||||
// var/version
|
||||
// F["version"] >> version
|
||||
|
||||
F["version"] << SAVEFILE_VERSION_MAX
|
||||
|
||||
// make this compatible with old single-slot system, making slot 1 be in root
|
||||
if(slot != 1)
|
||||
if(slots.len < slot)
|
||||
return 0
|
||||
F.cd = "slot." + slots[slot]
|
||||
|
||||
F["real_name"] << src.real_name
|
||||
F["name_is_always_random"] << src.be_random_name
|
||||
|
||||
@@ -62,13 +140,15 @@ datum/preferences/proc/savefile_save(mob/user)
|
||||
// returns 1 if loaded (or file was incompatible)
|
||||
// returns 0 if savefile did not exist
|
||||
|
||||
datum/preferences/proc/savefile_load(mob/user)
|
||||
datum/preferences/proc/savefile_load(mob/user, slot)
|
||||
if(IsGuestKey(user.key)) return 0
|
||||
|
||||
var/path = savefile_path(user)
|
||||
if(!fexists(path)) return 0
|
||||
if(!fexists(path))
|
||||
// make it then!
|
||||
savefile_save(user, slot)
|
||||
|
||||
var/savefile/F = new /savefile(path)
|
||||
var/savefile/F = new(path)
|
||||
|
||||
var/version = null
|
||||
F["version"] >> version
|
||||
@@ -78,6 +158,15 @@ datum/preferences/proc/savefile_load(mob/user)
|
||||
alert(user, "Your savefile was incompatible with this version and was deleted.")
|
||||
return 0
|
||||
|
||||
// make this compatible with old single-slot system, making slot 1 be in root
|
||||
if(slot == 0)
|
||||
return 0
|
||||
if(slot != 1)
|
||||
var/list/slots = savefile_getslots(user)
|
||||
if(slots.len < slot)
|
||||
return 0
|
||||
F.cd = "slot." + slots[slot]
|
||||
|
||||
F["real_name"] >> src.real_name
|
||||
F["gender"] >> src.gender
|
||||
F["age"] >> src.age
|
||||
|
||||
Reference in New Issue
Block a user