From f8e55520fae72a36066191fc52cd17d389dc3235 Mon Sep 17 00:00:00 2001
From: MouseOfLight <MouseOfLight@gmail.com>
Date: Thu, 31 Oct 2019 21:06:53 -0700
Subject: [PATCH] Updated standard V proxy to instead be a property that
 returns the object directly, unless a story proxy is defined for read-only
 and cheater.

---
 src/js/proxies.js | 52 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 38 insertions(+), 14 deletions(-)

diff --git a/src/js/proxies.js b/src/js/proxies.js
index 194ea9f1954..3317bcab6d5 100644
--- a/src/js/proxies.js
+++ b/src/js/proxies.js
@@ -1,34 +1,58 @@
-window.StoryProxyWritable = new Proxy({}, {
+window.createReadonlyProxy = function(target) {
+    if(target.__isReadonlyProxy) return target;
+    return new Proxy(target, {
         get:function(o, prop) {
-            return State.variables[prop];
+            if(prop == '__isReadonlyProxy') return true;
+            return createReadonlyProxy(o[prop]);
         },
         set:function(o, prop, value) {
-            State.variables[prop] = value;
-            return true;
+            return false;
         },
         deleteProperty:function(o, prop) {
-            delete State.variables[prop];
-            return true;
+            return false;
         }
-    });
-window.StoryProxyReadOnly = new Proxy({}, {
+    })
+};
+window.createCheatProxy = function(target) {
+    if(target.__isCheatProxy) return target;
+    return new Proxy(target, {
         get:function(o, prop) {
-            return State.variables[prop];
+            if(prop == '__isCheatProxy') return true;
+            return createCheatProxy(o[prop]);
         },
         set:function(o, prop, value) {
-            return false;
+            o[prop] = value;
+            State.variables.cheater = 1;
+            return true;
         },
         deleteProperty:function(o, prop) {
+            delete o[prop];
+            State.variables.cheater = 1;
             return false;
         }
-    });
-window.V = window.StoryProxyWritable;
+    })
+}
+Object.defineProperty(window, "V", {
+    get: function() {
+        if(window.storyProxy != null) return window.storyProxy;
+        return State.variables;
+    }
+});
 window.runWithReadonlyProxy = function(callback)
 {
-    window.V = window.StoryProxyReadOnly;
+    window.storyProxy = createReadonlyProxy(State.variables);
+    try {
+        callback();
+    } finally {
+        window.storyProxy = null;
+    }
+}
+window.runWithCheatProxy = function(callback)
+{
+    window.storyProxy = createCheatProxy(State.variables);
     try {
         callback();
     } finally {
-        window.V = window.StoryProxyWritable;
+        window.storyProxy = null;
     }
 }
-- 
GitLab