{"version":3,"sources":["jsdelivr-header.js","/npm/@tom-konda/cty2json@1.0.7/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,aASA,MAAM,eAAiB,MACnB,MAAM,EAAuB,IACzB,MAAkD,EAAiB,IACnE,IAAI,EAAS,EACb,MAAM,EAAW,CACb,SAAU,EACV,YAAa,CAAC,EACd,SAAU,CAAC,EACX,SAAU,IAAI,MAAM,IAEpB,EAAK,WARuF,QAgB5F,EAAS,KAEb,EAAS,SAAW,EAAK,WACzB,MAEM,EAAkB,IACpB,MAAM,EAAc,EAAK,MAAM,EAAQ,EAH2D,KAI5F,EAAqB,EAAS,YAC9B,EAAe,CACjB,CAAC,GAAW,CACR,UAAW,GACX,WAAY,KAGpB,IAAK,IAAI,EAAI,EAAG,EAXO,MAWmB,EAClC,EAZ8C,IAa9C,EAAa,GAAU,WAAW,QAAQ,IAAI,SAAS,EAhCzC,EAgCsD,EAhCtD,GAgCgG,SAAS,GAAG,IAG1H,EAAa,GAAU,YAAY,QAAQ,IAAI,SAAS,EAnC1C,EAmCuD,EAnCvD,GAmCiG,SAAS,GAAG,IAGnI,EAAS,YAAc,OAAO,OAAO,OAAO,OAAO,CAAC,EAAG,GAAqB,GAC5E,GApBkG,GAoBvE,EAE/B,EAAe,eACf,EAAe,cACf,EAAe,cACf,EAAe,SACf,EAAe,aACf,EAAe,aACf,MACM,EAAW,EAAK,MAAM,EAAQ,EADU,KAE9C,GAF8C,IAG9C,MAAM,EAAc,CAAC,EAAU,EAAY,KACvC,MAAM,EAAkB,EAAS,SACjC,IAAI,EAAQ,EACZ,OAAQ,GACJ,KAAK,EACD,EAAQ,IAAI,SAAS,EAvDP,EAuDiB,EAvDjB,GAuDoE,SAAS,GAAG,GAC9F,MACJ,KAAK,EACD,EAAQ,IAAI,SAAS,EA1DP,EA0DiB,EAAgC,GAAuB,SAAS,GAAG,GAE1G,EAAS,SAAW,OAAO,OAAO,OAAO,OAAO,CAAC,EAAG,GAAkB,CAAE,CAAC,GAAW,GAAQ,EAEhG,EAAY,cAAe,EAAG,GAC9B,EAAY,cAAe,EAAG,GAC9B,EAAY,cAAe,EAAG,GAC9B,EAAY,SAAU,EAAG,GACzB,EAAY,SAAU,EAAG,GACzB,EAAY,SAAU,EAAG,GACzB,EAAY,WAAY,EAAG,GAC3B,EAAY,YAAa,GAAI,GAC7B,EAAY,cAAe,GAAI,GAC/B,EAAY,eAAgB,GAAI,GAChC,EAAY,WAAY,GAAI,GAC5B,EAAY,eAAgB,GAAI,GAChC,EAAY,YAAa,GAAI,GAC7B,EAAY,YAAa,GAAI,GAC7B,EAAY,YAAa,GAAI,GAC7B,EAAY,SAAU,GAAI,GAC1B,EAAY,eAAgB,GAAI,GAChC,EAAY,aAAc,GAAI,GAC9B,EAAY,WAAY,GAAI,GAC5B,EAAY,UAAW,GAAI,GAC3B,EAAY,MAAO,GAAI,GACvB,EAAY,YAAa,GAAI,GAE7B,EAAY,gBAAiB,GAAI,GACjC,EAAY,cAAe,GAAI,GAC/B,EAAY,mBAAoB,GAAI,GACpC,MAEM,EAAW,EAAK,MAAM,EAAQ,EADd,MAGtB,IAAK,IAAI,EAAI,EAAG,EAAI,IAAkB,EAAG,CACrC,EAAS,SAAS,GAAK,GACvB,IAAK,IAAI,EAAI,EAAG,EA9FyB,MA8FJ,EAAG,CACpC,MAAM,EAAO,IAAI,SAAS,EA/FR,GA+FmB,EAAI,EAAiB,GA/FxC,GA+FmF,SAAS,GAAG,GACjH,EAAS,SAAS,GAAG,GAAK,CACtB,SAAiB,KAAP,EACV,WAAY,QAAQ,GAAQ,GAAK,GACjC,SAAU,QAAQ,GAAQ,GAAK,GAC/B,YAAa,QAAQ,GAAQ,GAAK,GAClC,YAAa,QAAQ,GAAQ,GAAK,GAClC,WAAY,QAAQ,GAAQ,GAAK,GAEzC,CACJ,CACA,OAAO,CAAQ,EAGnB,MAAO,CACH,QAAS,EACT,eAHoB,GAAS,KAAK,UAAU,EAAoB,GAAO,KAAM,MAKpF,EAnHsB,GAqHvB,OAAO,QAAU","file":"/npm/@tom-konda/cty2json@1.0.7/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@tom-konda/cty2json@1.0.7/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\n/**\n * Cty2JSON ver 1.0.7\n * Copyright (C) 2015-2021 Tom Konda\n * Released under the GPLv3 license\n * See https://www.gnu.org/licenses/gpl-3.0.en.html\n */\n\nconst cty2JSONStatic = (() => {\n    const Cty2JSONAnalyzeData = (data) => {\n        const SHORT_BYTE_LENGTH = 2, DEFAULT_WIDTH = 120, DEFAULT_HEIGHT = 100, SOME_EDITION_FILESIZE = 27120;\n        let offset = 0;\n        const cityData = {\n            fileSize: 0,\n            historyData: {},\n            miscData: {},\n            tileData: new Array(DEFAULT_HEIGHT),\n        };\n        if (data.byteLength > SOME_EDITION_FILESIZE) {\n            // Set 128-byte offset because of following comment in Micropolis.java.\n            // ref: https://github.com/jason17055/micropolis-java/blob/9f6ddb4b5f36a005fe4c4f77488d7969eabf0797/src/micropolisj/engine/Micropolis.java#L2254\n            // some editions of the classic Simcity game\n            // start the file off with a 128-byte header,\n            // but otherwise use the same format as us,\n            // so read in that 128-byte header and continue\n            // as before.\n            offset = 128;\n        }\n        cityData.fileSize = data.byteLength;\n        const HISTORY_DATA_COUNT = 240, HALF_HISTORY_DATA_COUNT = HISTORY_DATA_COUNT / 2, HISTORY_DATA_BYTE = HISTORY_DATA_COUNT * SHORT_BYTE_LENGTH;\n        // Get history graph data from city\n        const getHistoryData = (property) => {\n            const historyData = data.slice(offset, offset + HISTORY_DATA_BYTE);\n            const currentHistoryData = cityData.historyData;\n            const propertyData = {\n                [property]: {\n                    '10years': [],\n                    '120years': [],\n                }\n            };\n            for (let i = 0; i < HISTORY_DATA_COUNT; ++i) {\n                if (i < HALF_HISTORY_DATA_COUNT) {\n                    propertyData[property]['10years'].unshift(new DataView(historyData, i * SHORT_BYTE_LENGTH, SHORT_BYTE_LENGTH).getInt16(0, false));\n                }\n                else {\n                    propertyData[property]['120years'].unshift(new DataView(historyData, i * SHORT_BYTE_LENGTH, SHORT_BYTE_LENGTH).getInt16(0, false));\n                }\n            }\n            cityData.historyData = Object.assign(Object.assign({}, currentHistoryData), propertyData);\n            offset += HISTORY_DATA_BYTE;\n        };\n        getHistoryData('residential');\n        getHistoryData('commercial');\n        getHistoryData('industrial');\n        getHistoryData('crime');\n        getHistoryData('pollution');\n        getHistoryData('landValue');\n        const MISC_DATA_COUNT = 120, MISC_DATA_BYTE = MISC_DATA_COUNT * SHORT_BYTE_LENGTH;\n        const miscData = data.slice(offset, offset + MISC_DATA_BYTE);\n        offset += MISC_DATA_BYTE;\n        const getMiscData = (property, miscOffset, length) => {\n            const currentMiscData = cityData.miscData;\n            let value = 0;\n            switch (length) {\n                case 1:\n                    value = new DataView(miscData, miscOffset * SHORT_BYTE_LENGTH, SHORT_BYTE_LENGTH).getInt16(0, false);\n                    break;\n                case 2:\n                    value = new DataView(miscData, miscOffset * SHORT_BYTE_LENGTH, SHORT_BYTE_LENGTH * 2).getInt32(0, false);\n            }\n            cityData.miscData = Object.assign(Object.assign({}, currentMiscData), { [property]: value });\n        };\n        getMiscData('RPopulation', 2, 1);\n        getMiscData('CPopulation', 3, 1);\n        getMiscData('IPopulation', 4, 1);\n        getMiscData('RValve', 5, 1);\n        getMiscData('CValve', 6, 1);\n        getMiscData('IValve', 7, 1);\n        getMiscData('cityTime', 8, 2);\n        getMiscData('crimeRamp', 10, 1);\n        getMiscData('polluteRamp', 11, 1);\n        getMiscData('landValueAve', 12, 1);\n        getMiscData('crimeAve', 13, 1);\n        getMiscData('pollutionAve', 14, 1);\n        getMiscData('gameLevel', 15, 1);\n        getMiscData('cityClass', 16, 1);\n        getMiscData('cityScore', 17, 1);\n        getMiscData('budget', 50, 2);\n        getMiscData('autoBulldoze', 52, 1);\n        getMiscData('autoBudget', 53, 1);\n        getMiscData('autoGoto', 54, 1);\n        getMiscData('soundOn', 55, 1);\n        getMiscData('tax', 56, 1);\n        getMiscData('gameSpeed', 57, 1);\n        // Following three values are ratio of n to 65536\n        getMiscData('policeCovered', 58, 2);\n        getMiscData('fireCovered', 60, 2);\n        getMiscData('transportCovered', 62, 2);\n        const MAP_DATA_COUNT = DEFAULT_WIDTH * DEFAULT_HEIGHT;\n        const MAP_DATA_BYTE = MAP_DATA_COUNT * SHORT_BYTE_LENGTH;\n        const tileData = data.slice(offset, offset + MAP_DATA_BYTE);\n        // Get Tile Data\n        for (let y = 0; y < DEFAULT_HEIGHT; ++y) {\n            cityData.tileData[y] = [];\n            for (let x = 0; x < DEFAULT_WIDTH; ++x) {\n                const tile = new DataView(tileData, (x * DEFAULT_HEIGHT + y) * SHORT_BYTE_LENGTH, SHORT_BYTE_LENGTH).getInt16(0, false);\n                cityData.tileData[y][x] = {\n                    building: tile & 1023,\n                    zoneCenter: Boolean(tile >> 10 & 1),\n                    animated: Boolean(tile >> 11 & 1),\n                    bulldozable: Boolean(tile >> 12 & 1),\n                    combustible: Boolean(tile >> 13 & 1),\n                    conductive: Boolean(tile >> 14 & 1),\n                };\n            }\n        }\n        return cityData;\n    };\n    const outputJSONText = (data) => JSON.stringify(Cty2JSONAnalyzeData(data), null, '  ');\n    return {\n        analyze: Cty2JSONAnalyzeData,\n        outputJSONText: outputJSONText,\n    };\n})();\n\nmodule.exports = cty2JSONStatic;\n"]}