function GameBase::duplicate(%obj) {
	%type = %obj.getclassname();
	%fields = %obj.getObjectField(-1);
	%dup = new (%type)() {
        datablock = %obj.getDatablock();
        };
        for (%i = 0;%i < %fields;%i++) {
	eval(%dup@"."@%obj.getObjectField(%i));
	}       
        %dup.setTransform(%obj.getTransform());      
	return %dup;
}

function GameBase::Store(%obj) {
	%fields = %obj.getObjectField(-1);
	%store = new ScriptObject(StoreObject) {
        classname = %obj.getClassname();
	};
	for (%i = 0;%i < %fields;%i++) {
	eval(%store@"."@%obj.getObjectField(%i));
	}  
	return %store;
}

function SimObject::unStore(%obj) {
	%type = %obj.classname;
	%fields = %obj.getObjectField(-1);
	%dup = new (%type)() {
        datablock = %obj.dataBlock;
        };
        for (%i = 0;%i < %fields;%i++) {
	eval(%dup@"."@%obj.getObjectField(%i));
	}       
        %dup.setTransform(%dup.getTransform());      
	return %dup;
}

