From fbf18ddd7e82a0be1ddb3f8879ae89bb5303f63c Mon Sep 17 00:00:00 2001 From: Miniature Date: Wed, 9 Nov 2011 00:20:02 +1030 Subject: [PATCH 1/5] Arrivals scanner --- baystation12.dme | 1 + code/game/machinery/scanner.dm | 117 +++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 code/game/machinery/scanner.dm diff --git a/baystation12.dme b/baystation12.dme index 1e8635b68d0..e654cf02ac9 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -441,6 +441,7 @@ #include "code\game\machinery\rechargestation.dm" #include "code\game\machinery\requests_console.dm" #include "code\game\machinery\robot_fabricator.dm" +#include "code\game\machinery\scanner.dm" #include "code\game\machinery\seed_extractor.dm" #include "code\game\machinery\shieldgen.dm" #include "code\game\machinery\sink.dm" diff --git a/code/game/machinery/scanner.dm b/code/game/machinery/scanner.dm new file mode 100644 index 00000000000..c07587ee787 --- /dev/null +++ b/code/game/machinery/scanner.dm @@ -0,0 +1,117 @@ +obj/machinery/scanner + name = "Scanner" + var/outputdir = 0 + icon = 'computer.dmi' + icon_state = "aiupload" + 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/attack_hand(mob/living/carbon/human/user) + if(!ishuman(user) || lastuser == user.real_name) + return + 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 + 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 = {" +
Report

+ Name: [mname] + Age: [age] + Sex: [gender] + DNA: [dna] + Blood Type: [bloodtype] + Fingerprint: [fingerprint] + + Black Marks:
"} + for(var/A in marks) + text += "\red[A]
" + 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"] = H.real_name + 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(H.gender == FEMALE) + G.fields["sex"] = "Female" + else + G.fields["sex"] = "Male" + G.fields["age"] = text("[]", H.age) + G.fields["fingerprint"] = text("[]", md5(H.dna.uni_identity)) + G.fields["p_stat"] = "Active" + G.fields["m_stat"] = "Stable" + M.fields["b_type"] = text("[]", H.b_type) + M.fields["b_dna"] = H.dna.unique_enzymes + 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"] = H.real_name + L.fields["sex"] = H.gender + L.fields["age"] = H.age + L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") + L.fields["rank"] = H.mind.assigned_role + L.fields["b_type"] = H.b_type + L.fields["b_dna"] = H.dna.unique_enzymes + L.fields["enzymes"] = H.dna.struc_enzymes + L.fields["identity"] = H.dna.uni_identity + L.fields["image"] = H_icon//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 + + From d4ae76820bbb9f1fef730a0d58d54b8d309c3d58 Mon Sep 17 00:00:00 2001 From: Miniature Date: Tue, 29 Nov 2011 19:29:56 +1030 Subject: [PATCH 2/5] Fixedish the arrivals scanner, still need to add circuitboard to it --- code/game/machinery/scanner.dm | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/code/game/machinery/scanner.dm b/code/game/machinery/scanner.dm index c07587ee787..43155f9980c 100644 --- a/code/game/machinery/scanner.dm +++ b/code/game/machinery/scanner.dm @@ -30,12 +30,14 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) 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 = {"
Report

Name: [mname] @@ -64,22 +66,22 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) var/datum/data/record/S = new() var/datum/data/record/L = new() G.fields["rank"] = "Unassigned" - G.fields["name"] = H.real_name + 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(H.gender == FEMALE) + if(gender == FEMALE) G.fields["sex"] = "Female" else G.fields["sex"] = "Male" - G.fields["age"] = text("[]", H.age) - G.fields["fingerprint"] = text("[]", md5(H.dna.uni_identity)) + 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("[]", H.b_type) - M.fields["b_dna"] = H.dna.unique_enzymes + 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" @@ -97,16 +99,16 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) S.fields["notes"] = "No notes." //Begin locked reporting - L.fields["name"] = H.real_name - L.fields["sex"] = H.gender - L.fields["age"] = H.age - L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") - L.fields["rank"] = H.mind.assigned_role - L.fields["b_type"] = H.b_type - L.fields["b_dna"] = H.dna.unique_enzymes - L.fields["enzymes"] = H.dna.struc_enzymes - L.fields["identity"] = H.dna.uni_identity - L.fields["image"] = H_icon//What the person looks like. Naked, in this case. + 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 From 1c01524055d49759ea58f79c2fc87497ad51bf39 Mon Sep 17 00:00:00 2001 From: Miniature Date: Wed, 30 Nov 2011 01:19:41 +1030 Subject: [PATCH 3/5] Arrivals scanner stuff, now has sprite, new name, and uses power Just needs jobban stuff, then should be fine to add to a map --- code/game/machinery/scanner.dm | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/scanner.dm b/code/game/machinery/scanner.dm index 43155f9980c..857ed1dbbfc 100644 --- a/code/game/machinery/scanner.dm +++ b/code/game/machinery/scanner.dm @@ -1,11 +1,13 @@ +//not a computer obj/machinery/scanner - name = "Scanner" + name = "Identity Analyser" var/outputdir = 0 - icon = 'computer.dmi' - icon_state = "aiupload" + icon = 'stationobjs.dmi' + icon_state = "scanner_idle" density = 1 anchored = 1 var/lastuser = null + obj/machinery/scanner/New() if(!outputdir) switch(dir) @@ -19,9 +21,28 @@ obj/machinery/scanner/New() 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 From 719002dbee73bd08a4bb8bdd18d946079ecfcd61 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 29 Nov 2011 19:32:07 -0500 Subject: [PATCH 4/5] Added multiple character slots! --- code/modules/mob/new_player/new_player.dm | 4 +- code/modules/mob/new_player/preferences.dm | 73 +++++++++++++-- code/modules/mob/new_player/savefile.dm | 103 +++++++++++++++++++-- 3 files changed, 164 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 7a3395921b1..7bb2222f1ff 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -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 =======================================================> diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm index 6c8b2c9a173..de97f31b6d4 100644 --- a/code/modules/mob/new_player/preferences.dm +++ b/code/modules/mob/new_player/preferences.dm @@ -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 += "
" - if(!IsGuestKey(user.key)) - dat += "Load Setup
" - dat += "Save Setup
" + // slot options + if (!IsGuestKey(user.key)) + if(!curslot) + dat += "Save Slot 1
" + else + dat += "Save Slot [curslot]
" + dat += "Load
" + dat += "Create New Slot
" dat += "Reset Setup
" dat += "" user << browse(dat, "window=preferences;size=300x710") + proc/loadsave(mob/user) + var/dat = "" + dat += "
" + + var/list/slots = savefile_getslots(user) + for(var/slot=1, slot<=slots.len, slot++) + dat += "Load Slot [slot] ([slots[slot]]) (R)

" + + dat += "Close
" + dat += "
" + 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 = "" @@ -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 diff --git a/code/modules/mob/new_player/savefile.dm b/code/modules/mob/new_player/savefile.dm index 5a206f2e0db..4f9678e09a2 100644 --- a/code/modules/mob/new_player/savefile.dm +++ b/code/modules/mob/new_player/savefile.dm @@ -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 From 13ab6b5e5664e493ba764fee79f9519d705d0736 Mon Sep 17 00:00:00 2001 From: CompactNinja Date: Wed, 30 Nov 2011 14:48:14 +1030 Subject: [PATCH 5/5] Crew manifest on join screen. Signed-off-by: CompactNinja --- code/modules/mob/new_player/new_player.dm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 7bb2222f1ff..a1575253ed9 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -117,11 +117,12 @@ else output += "You are ready (Cancel)
" else + output += "View the Crew Manifest

" output += "Join Game!
" output += "
Observe
" - 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 = "" + dat += "

Crew Manifest

" + for(var/datum/data/record/t in data_core.general) + dat += "[t.fields["name"]] - [t.fields["rank"]]
" + dat += "
" + + src << browse(dat, "window=manifest;size=300x420;can_close=1") Move() return 0