From 69aa606ec467a4e6528035a3f214873d6dc308d3 Mon Sep 17 00:00:00 2001
From: FarawayVision <stmobo@gmail.com>
Date: Fri, 3 May 2019 23:40:10 -0400
Subject: [PATCH] Add optional persistence for markers

---
 js/save.js          | 15 ++++++++--
 js/spniBehaviour.js | 69 ++++++++++++++++++++++++++++++++++-----------
 2 files changed, 64 insertions(+), 20 deletions(-)

diff --git a/js/save.js b/js/save.js
index 2d0b141f8ed..4cf30fa1ed0 100644
--- a/js/save.js
+++ b/js/save.js
@@ -224,7 +224,7 @@ function Save() {
             charID = collectible.player.id;
         }
         
-        localStorage.setItem(prefix+charID+collectible.id, counter.toString());
+        localStorage.setItem(prefix+'collectibles.'+charID+collectible.id, counter.toString());
     }
     
     this.getCollectibleCounter = function (collectible) {
@@ -235,10 +235,19 @@ function Save() {
             charID = collectible.player.id;
         }
         
-        var ctr = localStorage.getItem(prefix+charID+collectible.id);
+        var ctr = localStorage.getItem(prefix+'collectibles.'+charID+collectible.id);
         
         return parseInt(ctr, 10) || 0;
     }
+    
+    this.getPersistentMarker = function (player, name) {
+        var ctr = localStorage.getItem(prefix+'markers.'+player.id+'.'+name);
+        return parseInt(ctr, 10) || 0;
+    }
+    
+    this.setPersistentMarker = function (player, name, value) {
+        localStorage.setItem(prefix+'markers.'+player.id+'.'+name, value.toString());
+    }
 
     /** Serializes the localStorage into a base64-encoded JSON string */
     this.serializeLocalStorage = function () {
@@ -407,4 +416,4 @@ _utf8_decode : function (utftext) {
     return string;
 }
 
-}
\ No newline at end of file
+}
diff --git a/js/spniBehaviour.js b/js/spniBehaviour.js
index 2adb4e615b3..b98e26cac33 100644
--- a/js/spniBehaviour.js
+++ b/js/spniBehaviour.js
@@ -216,6 +216,7 @@ function State($xml, addedTags, removedTags) {
 
     var collectibleId = $xml.attr('collectible') || undefined;
     var collectibleOp = $xml.attr('collectible-value') || undefined;
+    var persistMarker = $xml.attr('persist-marker') === 'true';
     var markerOp = $xml.attr('marker');
 
     if (collectibleId) {
@@ -239,12 +240,12 @@ function State($xml, addedTags, removedTags) {
             }
         }
     }
-
+    
     if (markerOp) {
         var match = markerOp.match(/^(?:(\+|\-)([\w\-]+)(\*?)|([\w\-]+)(\*?)\s*\=\s*(\-?\w+|~?\w+~))$/);
         var name;
         
-        this.marker = {name: null, perTarget: false, op: null, val: null};
+        this.marker = {name: null, perTarget: false, persistent: persistMarker, op: null, val: null};
         
         if (match) {
             this.marker.perTarget = !!(match[3] || match[5]);
@@ -281,21 +282,25 @@ State.prototype.evaluateMarker = function (self, opp) {
             name = getTargetMarker(name, opp);
         }
         
-        if(!self.markers[name]) {
-            return 1;
+        if (this.marker.persistent) {
+            var curVal = save.getPersistentMarker(self, name);
         } else {
-            return parseInt(self.markers[name], 10) + 1;
+            var curVal = parseInt(self.markers[name], 10) || 0;
         }
+        
+        return !curVal ? 1 : curVal + 1;
     } else if (this.marker.op === '-') {
         if (this.marker.perTarget && opp) {
             name = getTargetMarker(name, opp);
         }
         
-        if(!self.markers[name]) {
-            return 0;
+        if (this.marker.persistent) {
+            var curVal = save.getPersistentMarker(self, name);
         } else {
-            return parseInt(self.markers[name], 10) - 1;
+            var curVal = parseInt(self.markers[name], 10) || 0;
         }
+        
+        return !curVal ? 0 : curVal - 1;
     } else if (this.marker.op === '=') {
         if (typeof(this.marker.val) === 'number') return this.marker.val;
         
@@ -317,7 +322,12 @@ State.prototype.applyMarker = function (self, opp) {
         name = getTargetMarker(name, opp);
     }
     
-    self.markers[name] = this.evaluateMarker(self, opp);
+    var newVal = this.evaluateMarker(self, opp);
+    if (this.marker.persistent) {
+        save.setPersistentMarker(self, name, newVal);
+    } else {
+        self.markers[name] = newVal;
+    }
 }
 
 State.prototype.expandDialogue = function(self, target) {
@@ -395,18 +405,28 @@ function expandPlayerVariable(split_fn, args, self, target) {
             return "collectible"; // no collectible ID supplied
         }
     case 'marker':
+    case 'persistent':
         var markerName = split_fn[1];
         if (markerName) {
             var marker;
             if (target) {
-                marker = target.markers[getTargetMarker(markerName, target)];
+                var targetedName = getTargetMarker(markerName, target);
+                if (fn === 'persistent') {
+                    marker = save.getPersistentMarker(target, targetedName);
+                } else {
+                    marker = target.markers[targetedName];
+                }
             }
             if (!marker) {
-                marker = target.markers[markerName] || "";
+                if (fn === 'persistent') {
+                    marker = save.getPersistentMarker(target, markerName);
+                } else {
+                    marker = target.markers[markerName];
+                }
             }
-            return marker;
+            return marker || "";
         } else {
-            return "marker"; //didn't supply a marker name
+            return fn; //didn't supply a marker name
         }
     case 'tag':
         return target.hasTag(split_fn[1]) ? 'true' : 'false';
@@ -492,18 +512,33 @@ function expandDialogue (dialogue, self, target) {
                 }
                 break;
             case 'marker':
+            case 'persistent':
                 fn = fn_parts[0];  // make sure to keep the original string case intact 
                 if (fn) {
                     var marker;
+                    
                     if (target) {
-                        marker = self.markers[getTargetMarker(fn, target)];
+                        var targetedName = getTargetMarker(fn, target);
+                        if (variable.toLowerCase() === 'persistent') {
+                            marker = save.getPersistentMarker(self, targetedName);
+                        } else {
+                            marker = self.markers[targetedName];
+                        }
                     }
+                    
                     if (!marker) {
-                        marker = self.markers[fn] || "";
+                        if (variable.toLowerCase() === 'persistent') {
+                            marker = save.getPersistentMarker(self, fn);
+                        } else {
+                            marker = self.markers[fn];
+                        }
                     }
-                    substitution = marker;
+                    
+                    console.log("reading "+variable.toLowerCase());
+                    
+                    substitution = marker || "";
                 } else {
-                    substitution = "marker"; //didn't supply a marker name
+                    substitution = variable.toLowerCase(); //didn't supply a marker name
                 }
                 break;
             case 'background':
-- 
GitLab