/* /lib/persist.c
* from the Dead Souls Object Library
* provides object persistance
* created by Beek@Dead Souls 950528
*/
#include "include/persist.h"
#include <config.h>
private int SaveRecurse;
private static int Retain = RETAIN_ON_QUIT;
mixed *Saved = ({});
string GetShort();
static int eventConvertObject(mixed val, int recurse){
string *flat = ({});
mixed *tmp;
if( val[0] != base_name(this_object()) ) error("Invalid save string.\n");
tmp = map(Saved, (: functionp($1) ? evaluate($1, "loading") : $1 :));
foreach(mixed elem in tmp){
if( arrayp(elem) ) flat += elem;
else flat += ({ elem });
}
flat -= ({ 0 });
if( sizeof(flat) != sizeof(val[1]) ) error("Invalid save string size.\n");
for(int i = 0; i < sizeof(flat); i++ ) store_variable(flat[i], val[1][i]);
if( sizeof(val) == 3 ){
foreach(string obdata in val[2]){
object ob;
val = restore_variable(obdata);
ob = new(val[0]);
ob->eventLoadObject(val, 1);
}
}
if( recurse ) eventMove(previous_object());
return 1;
}
int eventLoadObject(mixed val, int recurse){
mixed *tmp;
string *flat = ({});
mixed data;
data = val;
/* This converst NM IV - IVr2.2 data into NM data */
if( arrayp(data) ) return eventConvertObject(data, recurse);
if( data["#base_name#"] != base_name(this_object()) )
error("Invalid save string.\n");
tmp = map(Saved, (: functionp($1) ? evaluate($1, "loading") : $1 :));
foreach(mixed elem in tmp){
if( arrayp(elem) ) flat += elem;
else flat += ({ elem });
}
flat -= ({ 0 });
foreach(string var, val in data){
if( var[0] == '#' ) continue;
catch(store_variable(var, val));
}
if( data["#inventory#"] ){
foreach(mixed obdata in data["#inventory#"]){
object ob;
val = restore_variable(obdata);
if( arrayp(val) ){
catch(ob = new(val[0]));
}
else {
catch(ob = new(val["#base_name#"]));
}
if( ob ){
ob->eventLoadObject(val, 1);
}
}
}
if( recurse ){
object prev = previous_object();
if( !eventMove(prev) ){
call_out(function(object p){
object env;
if(p && objectp(p)) env = environment(p);
else return;
if( !env ){
p->eventPrint("You lose " + GetShort() + ".");
}
else {
p->eventPrint("You drop " + GetShort() + ".");
eventMove(env);
}
}, 1, prev);
}
}
}
static mixed *AddSave(mixed *vars){ return (Saved += vars); }
mixed *GetSave(){ return copy(Saved); }
static int SetSaveRecurse(int flag){ return (SaveRecurse = flag); }
string GetSaveString(){
mixed *tmp;
string *flat = ({});
mapping mp = ([]);
tmp = map(Saved, (: functionp($1) ? evaluate($1, "saving") : $1 :));
foreach(mixed elem in tmp){
if( arrayp(elem) ) flat += elem;
else flat += ({ elem });
}
if(flat && sizeof(flat)){
flat -= ({ 0 });
foreach(mixed var in flat){
if(stringp(var)) mp[var] = fetch_variable(var);
}
}
mp["#base_name#"] = base_name(this_object());
if( SaveRecurse )
mp["#inventory#"] = (string *)all_inventory()->GetSaveString() - ({ 0 });
return save_variable(mp);
}
int SetRetain(int i){
if(i) Retain = 1;
else Retain = 0;
return Retain;
}
int GetRetain(){
return Retain;
}