Here's an example in use: var bshields = bshields || {}; bshields.Collision = (function() { 'use strict'; var version = 2.2, behaviors = { DONT_MOVE: 1, WARN_PLAYER: 2, STOP_AT_WALL: 4 }, config = {}, configDefaults = { pathColor: '#ff00ff', layer: 'walls', behavior: behaviors.STOP_AT_WALL | behaviors.WARN_PLAYER }; Object.defineProperties(config, { pathColor: { get: function() { var stPathColor = state.bshields.Collision.config.pathColor; if (/* stPathColor has an invalid value */) return configDefaults.pathColor; /* ensure stPathColor is in correct format */ return stPathColor; } }, layer: { get: function() { var stLayer = state.bshields.Collision.config.layer; if (/* stLayer has an invalid value */) return configDefaults.layer; return stLayer; } }, behavior: { get: function() { var stBehavior = state.bshields.Collision.config.behavior; if (!stBehavior) return configDefaults.behavior; /* map string value stBehavior to integer return value */ } } }); // script contents // config.pathColor, config.layer, and config.behavior are referenced function checkInstall() { if (!state.bshields || !state.bshields.Collision || !state.bshields.Collision.version || state.bshields.Collision.version !== version) { state.bshields = state.bshields || {}; state.bshields.Collision = { version: version, gcUpdated: 0, config: {} }; } checkGlobalConfig(); } function checkGlobalConfig() { var gc = globalconfig && globalconfig.collisiondetection, st = state.bshields.Collision; if (gc && gc.lastsaved && gc.lastsaved > st.gcUpdated) { st.gcUpdated = gc.lastsaved; st.config.pathColor = gc['Path Color']; st.config.layer = gc.Layer; st.config.behavior = gc.Behavior; } } return { checkInstall: checkInstall, registerEventHandlers: registerEventHandlers }; }()); on('ready', function() { 'use strict'; bshields.Collision.checkInstall(); bshields.Collision.registerEventHandlers(); }); "useroptions": [ { "name": "Path Color", "type": "text", "default": "#ff00ff", "description": ... }, { "name": "Layer", "type": "select", "options": ["all", "walls", "gmlayer", "objects", "map"], "default": "walls", "description": ... }, { "name": "Behavior", "type": "select", "options": ["Don't Move", "Warn Player", "Stop at Wall", "Don't Move & Warn Player", "Warn Player & Stop at Wall"], "default": "Warn Player & Stop at Wall", "description": ... }], The above script doesn't do it, but the gc.lastsaved check also lets you modify values in-play without overwriting them whenever you reload, while still overwriting them if you change the user options.