From 719002dbee73bd08a4bb8bdd18d946079ecfcd61 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 29 Nov 2011 19:32:07 -0500 Subject: [PATCH] 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