├── .gitattributes ├── .github └── ISSUE_TEMPLATE │ └── bug_report.md ├── .gitignore ├── LICENSE ├── README.md ├── changelog.md ├── data ├── corruptionfix.py ├── data.json ├── decode.py ├── encode.py ├── hashes ├── hashes.py ├── html │ ├── css │ │ ├── items.css │ │ ├── main.css │ │ └── materialize.min.css │ ├── dumpskeleton.html │ ├── favicon.ico │ ├── favicon.png │ ├── index.html │ ├── items.json │ ├── js │ │ ├── jquery-3.2.1.min.js │ │ └── materialize.min.js │ ├── loadsavefile.html │ ├── no settings.html │ └── rsc │ │ ├── Blue_Tech_Symbol.png │ │ ├── Church_Rating_Symbol.png │ │ ├── Copper_Coin_Symbol.png │ │ ├── Copper_Star.png │ │ ├── Empty_Star.png │ │ ├── Gold_Coin_Symbol.png │ │ ├── Gold_Star.png │ │ ├── Green_Tech_Symbol.png │ │ ├── Happiness_or_Friendship_Symbol.png │ │ ├── Icon_skull_wreath_green.png │ │ ├── Red_Tech_Symbol.png │ │ ├── Silver_Coin_Symbol.png │ │ ├── Silver_Star.png │ │ ├── White_Skull_Symbol.png │ │ ├── crafting_skull_3.png │ │ ├── donkey.png │ │ ├── envy.png │ │ ├── gluttony.png │ │ ├── item_source_file.png │ │ ├── lust.png │ │ ├── npc_actor.png │ │ ├── npc_actress.png │ │ ├── npc_astrologer.png │ │ ├── npc_beekeeper.png │ │ ├── npc_bishop.png │ │ ├── npc_blacksmith.png │ │ ├── npc_captain.png │ │ ├── npc_carpenter.png │ │ ├── npc_cultist.png │ │ ├── npc_dig.png │ │ ├── npc_donkey.png │ │ ├── npc_engineer.png │ │ ├── npc_euric.png │ │ ├── npc_farmer.png │ │ ├── npc_farmers son.png │ │ ├── npc_farmers_daughter.png │ │ ├── npc_ghost.png │ │ ├── npc_gypsy.png │ │ ├── npc_hunchback.png │ │ ├── npc_inquisitor.png │ │ ├── npc_light_keeper.png │ │ ├── npc_marquis_teodoro_jr.png │ │ ├── npc_merchant.png │ │ ├── npc_miller.png │ │ ├── npc_mrs chain.png │ │ ├── npc_potter.png │ │ ├── npc_refugee_coffin_maker.png │ │ ├── npc_refugee_cook.png │ │ ├── npc_refugee_tanner.png │ │ ├── npc_royal_box.png │ │ ├── npc_shepard.png │ │ ├── npc_shepherds_wife.png │ │ ├── npc_smiler.png │ │ ├── npc_tavern owner.png │ │ ├── npc_witch.png │ │ ├── npc_wood_cutter.png │ │ ├── p_axeman.png │ │ ├── p_beekeeper2.png │ │ ├── p_big_guy.png │ │ ├── p_blabla.png │ │ ├── p_blacksmith.png │ │ ├── p_brewer.png │ │ ├── p_butcher.png │ │ ├── p_cardinal.png │ │ ├── p_collector.png │ │ ├── p_cook.png │ │ ├── p_cultist.png │ │ ├── p_doctor.png │ │ ├── p_engineer 1.png │ │ ├── p_engineer.png │ │ ├── p_farmer.png │ │ ├── p_fireman.png │ │ ├── p_jevelery.png │ │ ├── p_jeweler.png │ │ ├── p_journalist.png │ │ ├── p_magnifier.png │ │ ├── p_mason 1.png │ │ ├── p_mason.png │ │ ├── p_master_potter 1.png │ │ ├── p_master_potter.png │ │ ├── p_miner.png │ │ ├── p_natural_writer.png │ │ ├── p_naturalist 1.png │ │ ├── p_naturalist.png │ │ ├── p_preacher.png │ │ ├── p_scientist.png │ │ ├── p_shakespear.png │ │ ├── p_skinner.png │ │ ├── p_sword_master.png │ │ ├── p_t_bee.png │ │ ├── p_t_beeswax.png │ │ ├── p_t_butterfly.png │ │ ├── p_t_maggot.png │ │ ├── p_t_moth.png │ │ ├── p_t_pyrite.png │ │ ├── p_wine_master.png │ │ ├── p_wine_master2.png │ │ ├── p_woodworker.png │ │ ├── p_writer.png │ │ ├── p_writer_thief.png │ │ ├── pride.png │ │ ├── sloth.png │ │ ├── unknown_item.png │ │ └── wrath.png ├── itemversion ├── locals.json ├── new_item_data.json ├── tools.py ├── types.py └── version ├── main.py ├── requirements.txt └── saves.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: '' 6 | assignees: NetroScript 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | 15 | Upload a .zip file containing both after saving and before saving with the editor - 16 | 17 | **or** 18 | 19 | Steps to reproduce the behavior: 20 | 1. Go to '...' 21 | 2. Click on '....' 22 | 3. Scroll down to '....' 23 | 4. See error 24 | 25 | **Expected behavior** 26 | A clear and concise description of what you expected to happen. 27 | 28 | **Screenshots** 29 | If applicable, add screenshots to help explain your problem. 30 | 31 | **Please also add the following Information:** 32 | * Used version of the save game editor 33 | * If you are using the Windows version or the python version 34 | * If you have a problem in the editor without anything being shown in the python console, please add your version of Chrome 35 | 36 | **Additional context** 37 | Add any other context about the problem here. 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | .hypothesis/ 50 | .pytest_cache/ 51 | 52 | # Translations 53 | *.mo 54 | *.pot 55 | 56 | # Django stuff: 57 | *.log 58 | local_settings.py 59 | db.sqlite3 60 | 61 | # Flask stuff: 62 | instance/ 63 | .webassets-cache 64 | 65 | # Scrapy stuff: 66 | .scrapy 67 | 68 | # Sphinx documentation 69 | docs/_build/ 70 | 71 | # PyBuilder 72 | target/ 73 | 74 | # Jupyter Notebook 75 | .ipynb_checkpoints 76 | 77 | # IPython 78 | profile_default/ 79 | ipython_config.py 80 | 81 | # pyenv 82 | .python-version 83 | 84 | # celery beat schedule file 85 | celerybeat-schedule 86 | 87 | # SageMath parsed files 88 | *.sage.py 89 | 90 | # Environments 91 | .env 92 | .venv 93 | env/ 94 | venv/ 95 | ENV/ 96 | env.bak/ 97 | venv.bak/ 98 | 99 | # Spyder project settings 100 | .spyderproject 101 | .spyproject 102 | 103 | # Rope project settings 104 | .ropeproject 105 | 106 | # mkdocs documentation 107 | /site 108 | 109 | # mypy 110 | .mypy_cache/ 111 | .dmypy.json 112 | dmypy.json 113 | 114 | # Pyre type checker 115 | .pyre/ 116 | 117 | settings 118 | 119 | # Editor 120 | .idea/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 NetroScript 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Graveyard-Keeper-Savefile-Editor 2 | ================================ 3 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 4 | 5 | * [Introduction](#introduction) 6 | * [Currently Editable](#currently-editable) 7 | * [Screenshots](#screenshots) 8 | * [Installation](#installation) 9 | + [General](#general) 10 | + [Installing the Python version](#installing-the-python-version) 11 | * [Save File Locations](#save-file-locations) 12 | * [Usage](#usage) 13 | * [Changelog](#changelog) 14 | * [Additional Thanks](#additional-thanks-go-to) 15 | * [Manually editing saves](#manually-editing-saves) 16 | * [The application is not working?](#the-application-is-not-working-) 17 | * [Notice](#notice) 18 | * [Building](#building) 19 | 20 | ## Introduction 21 | 22 | This is a save editor for [Graveyard Keeper](https://store.steampowered.com/app/599140/Graveyard_Keeper/). 23 | 24 | The Python version works on Windows, Linux and macOS. 25 | For Windows a `.exe` version available too. 26 | 27 | It can load and save `*.dat` files. 28 | Additionally you can export the loaded save to JSON, which has a similar structure to the original `.json` save files. 29 | (The difference is, that information about types of variables is saved in the file, meaning every value is wrapped in an object). 30 | When exporting to JSON you can also choose `.html` to have a website where you can relatively easily edit the save in the browser console and then export it again. 31 | 32 | **The Application uses a webbrowser as a GUI** (by default Chrome in App Mode, but during development FireFox was tried too - f.e. Opera should work too, but watch out for your Opera version - see [Issue #54](https://github.com/NetroScript/Graveyard-Keeper-Savefile-Editor/issues/54)). 33 | 34 | I want to add I am not responsible if you break your save file, I try to mantain this editor in a way, in which it can't break save files (or not by mistake) but it is still possible that this editor produces a bugged save file (if you for example add an item in a quality in which the item doesn't exist. - although in non expert mode the editor will prevent saving your file when a non existant item is selected). 35 | 36 | That is why you always should **backup your save files**. (In the settings of the editor you can also set the number of backups the editor should create (which are zipped) - on saving the editor all backups are shifted by one, so if set it to 3 backups and save 4 times, your oldest backup is lost). 37 | 38 | But I want to mention the last time someone asked for help due to a save broken by the save editor was in september 2018 and since then I also took additional measures. 39 | 40 | **This Editor supports the DLCs (Stranger Sins + Game Of Crone + Better Save Soul) - in the editor you have toggles to enable or disable DLC Support** 41 | 42 | ## Currently Editable 43 | 44 | * Money 45 | * Red, green, blue technology points 46 | * HP 47 | * Energy 48 | * Current Time 49 | * Your inventory size 50 | * Your inventory items 51 | * Inventories of all (or at least most) storage units 52 | * Your relationships with NPC's (only if you interacted with them before and have more than 0) 53 | * Additionally utilities like: 54 | * Removing all drops 55 | * Setting the worker efficiency to any value you want 56 | * Turning the graves into perfect graves 57 | * Complete the entire tech tree (state is pre DLC) 58 | * Fix if the donkey is stuck 59 | * Reset the morgue body counter should it be broken 60 | * Remove stuck church goes 61 | * Reset your dungeon 62 | 63 | ## Screenshots 64 | 65 | ![Preview](https://i.imgur.com/XZdmo3Z.png) 66 | 67 | ## Installation 68 | 69 | ### General 70 | If you have Python installed, you can directly use the master branch (download [here](https://github.com/NetroScript/Graveyard-Keeper-Savefile-Editor/archive/refs/heads/master.zip)) and go over to [Installing the Python version](#installing-the-python-version). 71 | This method of installation works on any platform (Windows, Linux, macOS). 72 | 73 | **If you are on Windows and do not have Python installed**, you can download a `.zip` file containing a `.exe` instead. You can find this `.zip` file on the [releases page](https://github.com/NetroScript/Graveyard-Keeper-Savefile-Editor/releases). The downloaded archive has a bundled version of Python with all necessary modules. 74 | 75 | ### Installing the Python version 76 | 77 | * Download this as zip and extract it any folder 78 | * Get Python (>=3.4) 79 | * If you are using a macOS/Linux system where `python` is by default Python 2.x, replace `python` with `python3`. Additionally according to users you might also need to install `python-tk` if it is not yet included in your distribution. 80 | * Install dependencies using `python -m pip install -r requirements.txt`. 81 | * Execute the file with `python main.py` (in the console with the folder where main.py resides as working directory - to simplify this just create a `run.bat` (Windows) or `run.sh` (Linux) in the directory with the same content) 82 | * Enjoy 83 | 84 | 85 | ## Save File Locations 86 | 87 | Linux / Ubuntu: 88 | 89 | * `/home/$USER/.config/unity3d/Lazy Bear Games/Graveyard Keeper/` 90 | 91 | MacOS: 92 | 93 | * `/Users/$USER/Library/Application Support/unity.LazyBearGames.GraveyardKeeper/` 94 | 95 | Windows: 96 | 97 | * `C:\Users\%username%\AppData\LocalLow\Lazy Bear Games\Graveyard Keeper` 98 | 99 | 100 | **Warning**: 101 | The application supports variables in the path starting with 0.1.17. If you use an earlier version manually fill in your user name for the variables. 102 | 103 | ## Usage 104 | 105 | Considering the application has a GUI it should be self explanatory. 106 | If a red border appears around an item, it means the save editor doesn't have this item indexed. Either because the item doesn't exist, or it was added in an update which wasn't included yet in the editor. 107 | Same if an item doesn't have a preview image. 108 | 109 | If you want to manually edit save files, when you change values, watch out if you change the type of the variable. F.e. if you would change a value from 0 to 1, the type would change and you would need to manually change the type to the correct one. 110 | For information about the possible types, check `types.py` in the `data` folder. 111 | 112 | 113 | ## Changelog 114 | 115 | Check it [here](https://github.com/NetroScript/Graveyard-Keeper-Savefile-Editor/blob/master/changelog.md). 116 | 117 | 118 | ## Additional Thanks go to 119 | 120 | * Reddit user [aMannus](https://www.reddit.com/user/aMannus) for supplying me a save to implement worker efficiency (40%) 121 | * GitHub user [DeadElle](https://github.com/DeadElle) for supplying me a save with 65% worker efficiency 122 | * All contributers to this repository 123 | 124 | ## Manually editing saves 125 | 126 | If you want to know how to manually edit saves or see some additional infos about the saves you can check out the following document [here](https://github.com/NetroScript/Graveyard-Keeper-Savefile-Editor/blob/master/saves.md). 127 | 128 | 129 | ## The application is not working? 130 | 131 | Supply me a screenshot with the console output (or the copied text). 132 | If you are using the compiled windows version and a black window appears and then disappears it means the application crashes because of some error. 133 | To view the error code to be able to send it to me: 134 | In the folder where you have the .exe file, `Shift + Rightclick` in a free space and in the context menu there should be an option like `Open Command Prompt here` or `Open Powershell here`, click that, begin writing `Graveyard` and then press tab to autocomplete and enter to execute - now you should start the application using that console window. This time the window won't close after execution, meaning you have time to make a screenshot of the error. 135 | 136 | ## Notice 137 | 138 | This repository contains content which I do not own. 139 | Notably all the image files in the `/data/html/rsc` folder. These are by [Lazy Bear Games](http://lazybeargames.com/). 140 | Additionally [jQuery](https://jquery.com/) and [Materialize](https://materializecss.com/) are also used. Their original licenses are still included. 141 | This application uses extracted strings like f.e. localisation files. These are also by [Lazy Bear Games](http://lazybeargames.com/). 142 | If you find any bugs / mistakes, feel free to open issues, or if you know how to fix it yourself, feel free to create a pull request. 143 | 144 | ## Building 145 | 146 | For those interested, here is the command I use to generate the folder which I then zip and upload as release: 147 | 148 | (I have this saved as build.bat in the same folder) 149 | 150 | ```batch 151 | py -3.8 -m eel main.py "./data/html" -n "Graveyard Keeper Savefile Editor" -i "./data/html/favicon.ico" --exclude PyQt5 --exclude win32com --exclude pydoc --exclude lib2to3 -y --additional-hooks-dir=hooks 152 | 153 | copy "%cd%\data\hashes" "%cd%\dist\Graveyard Keeper Savefile Editor\data\hashes" /Y 154 | copy "%cd%\data\locals.json" "%cd%\dist\Graveyard Keeper Savefile Editor\data\locals.json" /Y 155 | copy "%cd%\data\data.json" "%cd%\dist\Graveyard Keeper Savefile Editor\data\data.json" /Y 156 | copy "%cd%\data\version" "%cd%\dist\Graveyard Keeper Savefile Editor\data\version" /Y 157 | copy "%cd%\data\itemversion" "%cd%\dist\Graveyard Keeper Savefile Editor\data\itemversion" /Y 158 | copy "%cd%\data\new_item_data.json" "%cd%\dist\Graveyard Keeper Savefile Editor\data\new_item_data.json" /Y 159 | 160 | pause 161 | ``` 162 | 163 | In the hooks directory there is a file called `hook-eel.py` with the content: 164 | 165 | ```py 166 | from PyInstaller.utils.hooks import collect_all 167 | 168 | datas, binaries, hiddenimports = collect_all('eel') 169 | ``` -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | 0.1.24 2 | ===== 3 | 4 | Improved: 5 | 6 | * It is now possible to have a worker zombie of any efficiency 7 | * At the same time you can now decide how many skulls the bodies in the graves should have 8 | * Utility functions can now be collapsed and expanded 9 | * Loading of .info files (more robust display of the save files, should an error with a single file happen, only that save is missing instead of all) 10 | 11 | Fixed: 12 | 13 | * Before when upgrading to the highest grave decoration, you still had to manually "repair" the top part, this is now fixed and it directly display correctly 14 | * When saving new indexed strings now, they get added correctly to the save file (Unless you used the application to export your save to JSON and then edit yourself and then reimported it, this problem doesn't matter for you) 15 | 16 | 0.1.23 17 | ===== 18 | 19 | Added: 20 | 21 | * Support for items in the new Better Save Soul DLC (considering Autocomplete and icons) 22 | 23 | 0.1.22 24 | ===== 25 | 26 | Added: 27 | 28 | * Preview for items in bags 29 | * Utilities 30 | * Reset dungeon button 31 | 32 | Improved: 33 | 34 | * Greatly improved item deleting and adding, by default it should work much better now, the only problem which might remain is when items are added which have special meta data (like bags), these items need special cases, but for those a working save with the item is needed. Currently supported with special meta data are `bag_universal` and `bag_universal_big` 35 | 36 | 0.1.21 37 | ===== 38 | 39 | Added: 40 | 41 | * Camp storage as editable Inventory 42 | 43 | Improved: 44 | 45 | * In the settings you can now disable and enable your owned DLC's. If a DLC is disabled their item names will not show up in the autocomplete. Additionally based on DLC or non DLC some functionality differs (like perfect decoration for graves) 46 | 47 | 0.1.20 48 | ===== 49 | 50 | Added: 51 | 52 | * Support for the Game of Crone DLC (meaning items, localisation and npcs) 53 | * When exporting as JSON you can now also select `.html` which generates a HTML file where you can relatively easily edit the JSON in your browser 54 | * Utilities 55 | * Remove church visitors stuck in the church 56 | 57 | 0.1.19 58 | ===== 59 | 60 | Improved: 61 | 62 | * In non expert mode you are now warned (red border) about non existant items and you will be unable to save if any exist 63 | * Items which did not show correctly before (like organs) are now shown again 64 | * In the big view of an item you can see the entire item again, instead of only a part of it (for non square items) 65 | * When using the update function for the GUI now the entire GUI is replaced instead of only parts meaning bigger updates can be done using that 66 | 67 | 0.1.18 68 | ===== 69 | 70 | Added: 71 | 72 | * Utilities 73 | * Reset morgue body count to 0 74 | 75 | Improved: 76 | 77 | * Now the remove drops button doesn't bug your morgue (when removing bodies from the floor it will decrease the morgue counter) 78 | * Replaced some NPC images with better ones and added some 79 | * Hints / Warnings are now hidden by default and you can hover to display them so they don't clutter the UI as much with text 80 | * Now the application requests focus when opening file dialogs, so now they don't hide behind tons of windows anymore 81 | 82 | 0.1.17 83 | ===== 84 | 85 | Improved: 86 | 87 | * The editor now tries to automatically get the save file location on the first start of the application 88 | * The save file location field now allows path variables 89 | * The Open button in the settings menu will now start in the directory which is currently in the field 90 | * If you want to use your context menu (to f.e. inspect elements for debugging) you can now press `ALT` once to enable it again 91 | 92 | 0.1.16 93 | ===== 94 | 95 | Added: 96 | 97 | * New items (of version 1.200 / DLC) 98 | 99 | Improved: 100 | 101 | * Instead of having an image for every item a spritesheet is used now which speeds up interface loading times 102 | 103 | 0.1.15 104 | ===== 105 | 106 | Improved: 107 | 108 | * Utilities 109 | * Remove drops button now also removes red, green and blue points 110 | 111 | 0.1.14 112 | ===== 113 | 114 | Added: 115 | 116 | * Utilities 117 | * Fix for a stuck donkey 118 | 119 | 0.1.13 120 | ===== 121 | 122 | Added: 123 | 124 | * Utilities 125 | * Complete tech tree 126 | 127 | Improved: 128 | 129 | * You can now set in settings how many backups are kept, additionally those are zipped now to safe space 130 | * Added hint considering usage of Perfect Body / Grave / ... 131 | * Greatly decreased the time until the GUI is interactable when loading a save 132 | 133 | 0.1.12 134 | ===== 135 | 136 | Added: 137 | 138 | * Utilities 139 | * Set the efficiency of all workers to 40% 140 | * Turn all bodies in your graveyard (in graves) into perfect bodies 141 | * Turn all decorations of your grave into the highest possible grade 142 | * Turn empty graves into a grave with a perfect body and the best decoration 143 | 144 | 0.1.11 145 | ===== 146 | 147 | Improved: 148 | 149 | * BIG Item update - I now took the time to extract all possible item ids, their localisation in english and the item sprite (That doesn't mean you should use all new items, because now the editor also includes f.e. placeholder items which work in the inventory but you should only use items you really want) 150 | * You can now click on the icon of a day to switch to the day (instead of only being able to enter a number) 151 | 152 | Added: 153 | 154 | * Expert Mode, you can now disable all checks and warnings (although because of the item update at the same time, I doubt that you will need it anymore) 155 | 156 | 0.1.10 157 | ===== 158 | 159 | Improved: 160 | 161 | * Browser automatically closes now when the application updated the items 162 | * If over 99 gold coins are set no red underline is shown anymore (and it now also loads higher amounts correclty) 163 | * Should there be no chrome installation or an error happens while opening chrome the default browser will be used now 164 | * Load a .png file as icon if the .ico file is failing (On some Linux distros) 165 | 166 | 0.1.9 167 | ===== 168 | 169 | Fixed: 170 | 171 | * Items / Images (removed / renamed / added items, images) (tool related items) 172 | 173 | Added: 174 | 175 | * The application can now notify you (and update itself) about item changes (previously you only had item changes on the windows version if a complete new version was releases - now track of a itemversion is kept and it will notify you about changes and you can update manually or automatically. Those changes include: wrong item names, missing / wrong item icon, missing / wrong item which you can add to inventories) 176 | 177 | Improved: 178 | 179 | * Some CSS 180 | * Items which were previously undefined in the editor (now not a single item is shown as undefined) 181 | 182 | 0.1.8 183 | ===== 184 | 185 | Fixed: 186 | 187 | * Items / Images (removed / renamed / added items, images) 188 | 189 | Added: 190 | 191 | * You can now edit the ingame time 192 | * You can now edit the "tool" inventory which was added 193 | 194 | Improved: 195 | 196 | * Added some hashes so looking at the generated .json is easier 197 | * Changed the displayed ingame days in the slot loader because for some strange reason the game subtracts 1.5 from the saved value (this editor now does that too) 198 | 199 | 0.1.7 200 | ===== 201 | 202 | Fixed: 203 | 204 | * Items / Images (removed / renamed / added items, images) 205 | * Small bug considering the existance of multiple entries in a list, see more here https://github.com/NetroScript/Graveyard-Keeper-Savefile-Editor/commit/8c0bd69a8df75e09202be00586afee39ed0b7e6f 206 | * Fixing wrong character in object leading to errors when adding items to external storage 207 | * Wrong usage of JQuery leading to the state of the checkbox being read incorrectly 208 | 209 | Added: 210 | 211 | * In the settings menu you can now choose your own port. Additionally you are now able to edit the settings again without deleting the settings file. 212 | * You can now remove item drops from the map. (Intended to reduce lag if you have tons of them somewhere) 213 | 214 | Improved: 215 | 216 | * Wait for input on exception so it is easier to report errors 217 | * Save NaN as null in the JSON so it can be parsed by strict parsers 218 | * More comments for the source code 219 | * Loading circle in the editor so the user knows when he can edit a specific save 220 | * Removed content which wasn't working (perks - now you can only look at them :v) 221 | 222 | 0.1.6 223 | ===== 224 | 225 | Fixed: 226 | 227 | * Items which contain `(` in their names 228 | * Many items 229 | * Removing / adding item names according to their qualities 230 | * Deleting item images which are not really needed 231 | * Adding new items to the editor autocomplete (Wooden planks, Fake coins, Instructions for the key, Cleric's Beginner's Guide) 232 | * Adding some missing images (of items) 233 | * Fixing some names of items 234 | * Save issues when the inventory was empty 235 | 236 | 0.1.5 237 | ===== 238 | 239 | Fixed: 240 | 241 | * A mistake on my side which partly breaks your save file, which was introduced in 9c8be820dba71381a4e4fce4ed64813a39881400 - It is only a small change but an own release because it breaks save files. If your save file was broken by this bug, leave me a message because the fix is rather simple (it is just adding a byte at a specific location). 242 | 243 | 244 | 0.1.4 245 | ===== 246 | 247 | Added: 248 | 249 | * Support for modifying NPC Relationship values 250 | 251 | 252 | 0.1.3 253 | ===== 254 | 255 | Fixed: 256 | 257 | * Bug causing some strings to be saved again in the wrong way. It is strongly advised to update because otherwise you will lose f.e. Comfort of Faith technology after every modification 258 | 259 | 260 | 0.1.2 261 | ===== 262 | 263 | Added: 264 | 265 | * You can now edit and view every storage unit (like trunks, chests, ...) 266 | * The information about a new update available now also displays the changes 267 | 268 | Fixed: 269 | 270 | * Some HTML formatting 271 | * Some items names / icons, including but not limited to restoration tools, coal, clay, jointing, water, simple iron parts, complex iron parts, ... 272 | 273 | 0.1.1 274 | ===== 275 | 276 | Added: 277 | 278 | * Support for item qualities 279 | * Rightful Citizen Papers so you can add them to your save if they were missing 280 | 281 | Fixed: 282 | 283 | * Added some item id's 284 | * Fixed a typo in the Github URL leading to 404 285 | * The church quality and graveyard quality being swapped 286 | * Error which happens when using the application on an early savegame 287 | -------------------------------------------------------------------------------- /data/corruptionfix.py: -------------------------------------------------------------------------------- 1 | # My personal save file from the beginning has an error in the string encoding of the Serializer which is fixed with the following code 2 | # You probably don't need it unless you have the same type of corruption in the savefile 3 | # If you get other errors and know what you are doing, feel free to add a fix for them here 4 | 5 | # To update the description from above. It seems the game used unicode characters when saving, I load the characters 6 | # as Ascii (more or less) meaning in the case of a character having more than 1 Byte it throws an error because it will 7 | # be offset (the word length and read bytes). Because it seems there are only specific characters where this happens 8 | # this code is enough as special cases for the characters which are longer than 1 Byte - in the future it is possible 9 | # that more fixes need to be added 10 | 11 | 12 | # A fix for the direct buffer of the characters 13 | # If a fix was applied we add the original length and buffer so that we can save that information 14 | # before was the bug that we encoded Unicode Characters as Ascii (as single Byte) leading to errors when the game was 15 | # loading the file. 16 | def prefix(buffer, stream, beginning, num): 17 | length = len(buffer) 18 | 19 | buffer_str = str(buffer) 20 | 21 | # print(buffer) 22 | if buffer_str == "[-48, -95, 2, 109, 11, 2, 31, 25, 77, 2, 11, 77, 11, 12, 4, 25]": 23 | buffer.append(stream.read("int8")) 24 | return {"length": length, "buffer": buffer[:]} 25 | if buffer_str.endswith("-47]"): 26 | return {"length": length, "buffer": buffer[:] + [stream.read("int8")]} 27 | if "-47, -127" in buffer_str: 28 | buffer.append(stream.read("int8")) 29 | return {"length": length, "buffer": buffer[:]} 30 | 31 | return False 32 | 33 | 34 | # Here we fix specific strings which are read as ascii but are unicode leading to missing / wrong / too many characters 35 | # Especially notably: Uppercase C 36 | def postfix(string, stream, buffer): 37 | if string == "steep_yellow_blockage_0__destructio": 38 | buffer.append(stream.read("int8")) 39 | return "steep_yellow_blockage_0__destruction" 40 | if string == "C4omfort of fait5": 41 | return "Comfort of faith" 42 | # for debugging purposes to be able to place a breakpoint in this specific case 43 | if "D" in string: 44 | pass 45 | return string.replace("D", "C") 46 | -------------------------------------------------------------------------------- /data/decode.py: -------------------------------------------------------------------------------- 1 | from data.tools import BinaryReader 2 | from data.types import Types 3 | from data.corruptionfix import prefix, postfix 4 | 5 | 6 | class Decoder: 7 | 8 | # On Initialisation we need our Hashes object to be able to translate the numerical hashes to more readable strings 9 | def __init__(self, hashes): 10 | self.hashes = hashes 11 | 12 | # Decode a file, supply the path to the file here 13 | def decode(self, file): 14 | print("Beginning to decode file: " + file) 15 | with open(file, "rb") as f: 16 | # Create a instance of the Binary Reader with the path to our file 17 | b = BinaryReader(f) 18 | print("Extracting String Array") 19 | sd = self.extractserializer(b) 20 | header = dict() 21 | print("Extracting header") 22 | header["offset"] = b.read("int64") 23 | header["version"] = b.read("int32") 24 | 25 | # This is part of the header, I assume the Lazy Bear Games put this in to be able to add more header 26 | # information at a later points. Currently (Game version 1.034) this information is not filled 27 | for i in range(15): 28 | b.read("int32") 29 | # print(header) 30 | # print(sd) 31 | print("Extracting game objects") 32 | 33 | # Deserialize the main save 34 | x = self.deserialize(b, sd, {}) 35 | 36 | # Create the output object 37 | obj = { 38 | "savedata": x, 39 | "header": { 40 | "offset": header["offset"], 41 | "version": header["version"] 42 | }, 43 | "serializer": sd, 44 | "hashes": self.hashes.name_to_hash 45 | } 46 | print("Loaded file: " + file) 47 | return obj 48 | 49 | # A recursive function to which you supply a data object 50 | # For that a layer is supplied, so the function can build the object layer by layer without needing a global object 51 | # The serializer is the extracted string data 52 | def deserialize(self, stream, serializer, layer): 53 | 54 | # Information how many objects are stored in this dataset 55 | n = stream.read("int32") 56 | 57 | if n == -1: 58 | return 59 | # print(num) 60 | # print("Following things are Serialized") 61 | 62 | # Iterate the stored datasets / objects 63 | for i in range(n): 64 | # Extract the hash of the object, this is equal to the property name of the object (f.e. toplevel this would 65 | # be something like the property Inventory of the object GameSave 66 | hash = str(stream.read("int32")) 67 | # Create a copy of the hash 68 | nam = hash 69 | 70 | # If we have a string for the hash we assign this string to nam 71 | if hash in self.hashes.hash_to_name: 72 | nam = self.hashes.hash_to_name[hash] 73 | # print("Hash: " + str(nam)) 74 | # pass 75 | 76 | # In the current layer we create a property with either the hash or the string as key 77 | layer[nam] = dict() 78 | # print("Deserialized Object:") 79 | 80 | # After extracting the information about the current object we now extract it's data 81 | x = self.deserializedata(stream, serializer, layer[nam], hash) 82 | 83 | layer[nam] = x 84 | return layer 85 | 86 | # Deserialize 1 object / value / list / .... 87 | def deserializedata(self, stream, serializer, layer, hash): 88 | 89 | # We extract a Byte which determines which type of object we have 90 | curtype = stream.read("uint8") 91 | 92 | # We assign the type to the hash to be able get the data type just from the hash (in the encoding function) 93 | self.hashes.hash_to_type[hash] = curtype 94 | # print("Datatype: " + str(curtype)) 95 | 96 | # Depending on the Type we extract the data in different ways 97 | if curtype == Types.SmartSerialized: 98 | # As child we have again an object 99 | return {"v": self.deserialize(stream, serializer, layer), "type": curtype} 100 | elif curtype == Types.NullValue: 101 | return {"v": None, "type": curtype} 102 | elif curtype == Types.String: 103 | return {"v": self.extractstring(stream, False), "type": curtype} 104 | elif curtype == Types.String_Empty: 105 | return {"v": "", "type": curtype} 106 | elif curtype == Types.String_Indexed: 107 | return {"v": serializer[stream.read("int32")], "type": curtype} 108 | elif curtype == Types.Int32_0: 109 | return {"v": 0, "type": curtype} 110 | elif curtype == Types.Int32_1: 111 | return {"v": 1, "type": curtype} 112 | elif curtype == Types.Int32: 113 | return {"v": stream.read("int32"), "type": curtype} 114 | elif curtype == Types.Int64: 115 | return {"v": stream.read("int64"), "type": curtype} 116 | elif curtype == Types.Single: 117 | return {"v": stream.read("float"), "type": curtype} 118 | elif curtype == Types.Single_0: 119 | return {"v": 0, "type": curtype} 120 | elif curtype == Types.Single_1: 121 | return {"v": 1, "type": curtype} 122 | elif curtype == Types.Double: 123 | return {"v": stream.read("double"), "type": curtype} 124 | elif curtype == Types.Byte: 125 | return {"v": (stream.read("uint8")).to_bytes(1, byteorder="little"), "type": curtype} 126 | elif curtype == Types.Char: 127 | return {"v": stream.read("char"), "type": curtype} 128 | elif curtype == Types.Bool_True: 129 | return {"v": True, "type": curtype} 130 | elif curtype == Types.Bool_False: 131 | return {"v": False, "type": curtype} 132 | elif curtype == Types.Vector2: 133 | return {"x": stream.read("float"), "y": stream.read("float"), "type": "Vector2"} 134 | elif curtype == Types.Vector2_00: 135 | return {"x": 0, "y": 0, "type": "Vector2"} 136 | elif curtype == Types.Vector2_11: 137 | return {"x": 1, "y": 1, "type": "Vector2"} 138 | elif curtype == Types.Vector3: 139 | return {"x": stream.read("float"), "y": stream.read("float"), "z": stream.read("float"), "type": "Vector3"} 140 | elif curtype == Types.Vector3_000: 141 | return {"x": 0, "y": 0, "z": 0, "type": "Vector3"} 142 | elif curtype == Types.Vector3_111: 143 | return {"x": 1, "y": 1, "z": 1, "type": "Vector3"} 144 | elif curtype == Types.Quaternion: 145 | return {"x" :stream.read("float"), "y": stream.read("float"), "z": stream.read("float"), "n": stream.read("float"), "type": "Quaternion"} 146 | elif curtype == Types.Quaternion_0001: 147 | return {"x": 0, "y": 0, "z": 0, "n": 1, "type": "Quaternion"} 148 | elif curtype == Types.ByteArray: 149 | # Length of the saved array 150 | amount = stream.read("int32") 151 | arr = [] 152 | for i in range(amount): 153 | arr.append((stream.read("uint8")).to_bytes(1, byteorder="little")) 154 | return {"v": arr, "type": curtype} 155 | elif curtype == Types.GenericList: 156 | # Length of the saved array 157 | amount = stream.read("int32") 158 | arr = [] 159 | for i in range(amount): 160 | # Iterate and extract the data of an array 161 | arr.append(self.deserializedata(stream, serializer, {}, hash)) 162 | 163 | return {"v": arr, "type": curtype} 164 | elif curtype == Types.Array: 165 | # Length of the saved array 166 | amount = stream.read("int32") 167 | arr = [] 168 | for i in range(amount): 169 | # Iterate and extract the data of an array 170 | arr.append(self.deserializedata(stream, serializer, {}, hash)) 171 | 172 | return {"v": arr, "type": curtype} 173 | # If it is an unknown data type 174 | else: 175 | print("Datatype: " + str(curtype) + " can not be parsed") 176 | 177 | # Extract the array of strings which is at the end of the save file 178 | def extractserializer(self, stream): 179 | # The position in bytes of the serialized string array 180 | pos = stream.read("int64") 181 | # our current position in the bytes 182 | pos2 = stream.file.tell() 183 | # print(pos2) 184 | # We go to the position in the file stream where the strings are stored 185 | stream.file.seek(pos) 186 | # we read how many strings are stored 187 | n = stream.read("int32") 188 | data = [] 189 | # print(n) 190 | 191 | # We extract every string and push it into our serializer array 192 | for i in range(n): 193 | data.append(self.extractstring(stream, True)) 194 | 195 | # We return to our start position (because after this function the object data will be read) 196 | stream.file.seek(pos2) 197 | return data 198 | 199 | # Function to extract a single string 200 | def extractstring(self, stream, encrypt=False): 201 | 202 | # We extract the length of the string (in Characters, not Bytes, but some Characters have multiple Bytes thats 203 | # why we have the prefix and postfix functions) 204 | n = stream.read("int32") 205 | # print(n) 206 | if(n == -1): 207 | return None 208 | 209 | buffer = [] 210 | out = "" 211 | # store where the string starts in the file stream 212 | beginning = stream.file.tell() 213 | # Create a buffer of bytes in the length of the string 214 | for i in range(n): 215 | # buffer.append(int.from_bytes(stream.read("char"), byteorder="little")) 216 | buffer.append(stream.read("int8")) 217 | 218 | 219 | # We now add buffers and the length of the read to a special object should specific unicode values be detected, 220 | # so we can save the original buffer when encoding again 221 | specialread = prefix(buffer, stream, beginning, len(buffer)) 222 | 223 | # print(num4) 224 | # in the case of the string being encrypted (which is the case in the string array at the end of the save file) 225 | if encrypt: 226 | for i in range(len(buffer)): 227 | num5 = buffer[i] 228 | # Replace the numerical buffer value with the character 229 | if num5 <= 255 and num5 is not 0 and num5 is not 109: 230 | buffer[i] = chr(abs(num5 ^ 0x6D)) 231 | else: 232 | buffer[i] = chr(abs(num5)) 233 | else: 234 | for i in range(len(buffer)): 235 | # Replace the numerical buffer value with the character 236 | buffer[i] = chr(abs(buffer[i])) 237 | 238 | # We combine every char we extracted to our output string 239 | out = ''.join(buffer) 240 | 241 | # Fixing our output string 242 | out = postfix(out, stream, buffer) 243 | 244 | # In the case of a unicode read we return a special object, otherwise we return just the string 245 | if type(specialread) == dict: 246 | out = {"string": out, "length": specialread["length"], "buffer": specialread["buffer"]} 247 | 248 | #print(out) 249 | 250 | return out 251 | -------------------------------------------------------------------------------- /data/encode.py: -------------------------------------------------------------------------------- 1 | from data.tools import BinaryWriter 2 | from data.types import Types 3 | 4 | 5 | class Encoder: 6 | 7 | # On Initialisation we need our Hashes object to be able to translate our converted strings back into the numerical 8 | # values 9 | def __init__(self): 10 | self.hashes = {} 11 | 12 | # Encode a file, supply the path to the file and the data of the save here 13 | def encode(self, file_path, data): 14 | # The hashes of the save are stored in the data, so we set them here 15 | self.hashes = data["hashes"] 16 | # Begin writing to our output file 17 | with open(file_path, "wb") as fi: 18 | print("Beginning to encode to: " + file_path) 19 | # Create a instance of the Binary Writer with the instance of our file 20 | bw = BinaryWriter(fi) 21 | bw.write("int64", 0) 22 | print("Writing header") 23 | bw.write("int64", data["header"]["offset"]) 24 | bw.write("int32", data["header"]["version"]) 25 | 26 | # This is part of the header, I assume the Lazy Bear Games put this in to be able to add more header 27 | # information at a later points. Currently (Game version 1.034) this information is not filled 28 | for i in range(15): 29 | bw.write("int32", 0) 30 | print("Writing gamedata") 31 | self.serialize(data["savedata"], bw, data["serializer"]) 32 | print("Writing strings") 33 | self.insertserializer(bw, data["serializer"]) 34 | print("Finished saving file: " + file_path) 35 | 36 | # A recursive function to turn an object into the binary data in the form of basic values 37 | def serialize(self, data, stream, serializer): 38 | if data is None: 39 | stream.write("int32", -1) 40 | else: 41 | # Save how many properties our object has 42 | stream.write("int32", len(data)) 43 | #print(len(data)) 44 | i = 0 45 | 46 | # Iterate the properties of our object 47 | for key in data: 48 | # If we had our string before turn the string back into the numerical hash 49 | if type(key) is str and key in self.hashes: 50 | hash = int(self.hashes[key]) 51 | else: 52 | hash = int(key) 53 | #print(hash) 54 | # Write the hash to the file 55 | stream.write("int32", hash) 56 | # Start writing the contents of the object to the file 57 | self.serializedata(data[key], stream, serializer, hash) 58 | i+=1 59 | 60 | # Serialize 1 object / value / list / .... 61 | def serializedata(self, data, stream, serializer, hash): 62 | 63 | # In the case of our object being a specific object like a Vector we check if the type of object changed 64 | if type(data) is dict and "type" in data: 65 | if data["type"] == "Vector2": 66 | if data["x"] == 0 and data["y"] == 0: 67 | curtype = Types.Vector2_00.value 68 | elif data["x"] == 1 and data["y"] == 1: 69 | curtype = Types.Vector2_11.value 70 | else: 71 | curtype = Types.Vector2.value 72 | elif data["type"] == "Vector3": 73 | if data["x"] == 0 and data["y"] == 0 and data["z"] == 0: 74 | curtype = Types.Vector3_000.value 75 | elif data["x"] == 1 and data["y"] == 1 and data["z"] == 1: 76 | curtype = Types.Vector3_111.value 77 | else: 78 | curtype = Types.Vector3.value 79 | elif data["type"] == "Quaternion": 80 | if data["x"] == 0 and data["y"] == 0 and data["z"] == 0 and data["n"] == 1: 81 | curtype = Types.Quaternion_0001.value 82 | else: 83 | curtype = Types.Quaternion.value 84 | 85 | # Otherwise if it is our default notation we just use the type which is stored there 86 | if "v" in data: 87 | curtype = data["type"] 88 | data = data["v"] 89 | 90 | # Now we write the type as Byte to the file 91 | stream.write("uint8", curtype) 92 | # Depending on the current type we call the function recursively again or just pass onto the next value 93 | # (In the case of simple values like Null) 94 | if curtype == Types.SmartSerialized: 95 | # Call it again recursively 96 | self.serialize(data, stream, serializer) 97 | elif curtype == Types.NullValue: 98 | pass 99 | elif curtype == Types.String: 100 | self.insertstring(data,stream, False) 101 | elif curtype == Types.String_Empty: 102 | pass 103 | elif curtype == Types.String_Indexed: 104 | 105 | # Here we check additionally if all strings which have a type of Indexed String are actually in the string 106 | # array, if those are not in there, they are added 107 | try: 108 | indx = serializer.index(data) 109 | except ValueError: 110 | indx = -1 111 | 112 | # Check if the string is encoded as a special object 113 | for i in range(len(serializer)): 114 | if type(serializer[i]) == dict: 115 | if data == serializer[i]["string"]: 116 | indx = i 117 | break 118 | 119 | # If it is not encoded as a special object, add it at the end of the string list 120 | if indx == -1: 121 | indx = len(serializer) 122 | serializer.append(data) 123 | 124 | # Save the index of the string within the string array 125 | stream.write("int32", indx) 126 | elif curtype == Types.Int32_0: 127 | pass 128 | elif curtype == Types.Int32_1: 129 | pass 130 | elif curtype == Types.Int32: 131 | stream.write("int32", data) 132 | elif curtype == Types.Int64: 133 | stream.write("int64", data) 134 | elif curtype == Types.Single: 135 | try: 136 | stream.write("float", float(data)) 137 | except TypeError: 138 | stream.write("float", float(0)) 139 | elif curtype == Types.Single_0: 140 | pass 141 | elif curtype == Types.Single_1: 142 | pass 143 | elif curtype == Types.Double: 144 | stream.write("double", data) 145 | elif curtype == Types.Byte: 146 | return stream.write("uint8", data) 147 | elif curtype == Types.Char: 148 | return stream.write("char", data) 149 | elif curtype == Types.Bool_True: 150 | pass 151 | elif curtype == Types.Bool_False: 152 | pass 153 | elif curtype == Types.Vector2: 154 | stream.write("float", data["x"]) 155 | stream.write("float", data["y"]) 156 | elif curtype == Types.Vector2_00: 157 | pass 158 | elif curtype == Types.Vector2_11: 159 | pass 160 | elif curtype == Types.Vector3: 161 | stream.write("float", data["x"]) 162 | stream.write("float", data["y"]) 163 | stream.write("float", data["z"]) 164 | elif curtype == Types.Vector3_000: 165 | pass 166 | elif curtype == Types.Vector3_111: 167 | pass 168 | elif curtype == Types.Quaternion: 169 | stream.write("float", data["x"]) 170 | stream.write("float", data["y"]) 171 | stream.write("float", data["z"]) 172 | stream.write("float", data["n"]) 173 | elif curtype == Types.Quaternion_0001: 174 | pass 175 | elif curtype == Types.ByteArray: 176 | # Save the length of our Array to the file 177 | stream.write("int32", len(data)) 178 | for i in range(len(data)): 179 | stream.write("uint8", data[i]) 180 | elif curtype == Types.GenericList: 181 | # Save the length of our Array to the file 182 | stream.write("int32", len(data)) 183 | # Recursively save every item in the list as new object 184 | for i in range(len(data)): 185 | self.serializedata(data[i], stream, serializer, hash) 186 | elif curtype == Types.Array: 187 | # Save the length of our Array to the file 188 | stream.write("int32", len(data)) 189 | # Recursively save every item in the list as new object 190 | for i in range(len(data)): 191 | self.serializedata(data[i], stream, serializer, hash) 192 | # If it is an unknown data type 193 | else: 194 | print("Datatype: " + str(curtype) + " can not be parsed") 195 | 196 | # Function to save a string to the file 197 | def insertstring(self, string, stream, encrypt=False): 198 | # If the string is non existant write a -1 199 | if string is None: 200 | stream.write("int32", -1) 201 | return 202 | 203 | # If the string was modified while loading (because of Unicode character) we save the original length and byte 204 | # buffer to the file 205 | if type(string) == dict: 206 | stream.write("int32", string["length"]) 207 | for byte in string["buffer"]: 208 | stream.write("int8", byte) 209 | else: 210 | # Otherwise we just save the string length and then write every character as single Byte 211 | stream.write("int32", len(string)) 212 | for char in string: 213 | n = ord(char) 214 | # For the String array at the end of the file we also encode the string 215 | if encrypt: 216 | if n <= 255 and n != 0 and n != 109: 217 | n ^= 0x6D 218 | stream.write("uint8", n) 219 | 220 | # We save our string array at the end of the file 221 | def insertserializer(self, stream, serializer): 222 | # The position of the end of the file 223 | pos = stream.file.tell() 224 | # Then we go to the beginning and save the position of the current end of the file to be able to read the 225 | # serialized Strings first 226 | stream.file.seek(0) 227 | stream.write("int64", pos) 228 | # we now go back to the end of the file 229 | stream.file.seek(pos) 230 | # Write how many strings are contained in the string array 231 | stream.write("int32", len(serializer)) 232 | # Save every string encrypted to the file 233 | for i in range(len(serializer)): 234 | self.insertstring(serializer[i], stream, True) 235 | -------------------------------------------------------------------------------- /data/hashes: -------------------------------------------------------------------------------- 1 | on_key_char_remove 2 | 323863219 3 | 4 | 371857150 5 | tp_to_morgue_locked 6 | 1593646545 7 | ex:mf_preparation_1:bone 8 | 2145119018 9 | lut_line 10 | 342700654 11 | take_tools_from_grave_chest 12 | 276498482 13 | _envy 14 | -1846396293 15 | ex:mf_preparation_1:flesh 16 | -1595082902 17 | parent_gd_point 18 | 442389019 19 | prayed_this_week 20 | 820659941 21 | value 22 | 1803325615 23 | t_start 24 | -790621085 25 | tasks 26 | -1328849604 27 | npcs 28 | 1669718950 29 | go_to_mortuary_after_skull_tech 30 | 1066057076 31 | m_PathID 32 | 1878299160 33 | in_morgue 34 | 1522700323 35 | wop_skin_id 36 | 964212704 37 | dungeons 38 | 517269755 39 | ingot_metal 40 | -1000636667 41 | preset_name 42 | -1524757107 43 | previously_enabled 44 | -1971774530 45 | map 46 | 696029452 47 | nature_weather_line 48 | 708935863 49 | active_now_because_of_events 50 | 115535888 51 | obj_crafts 52 | 1558542769 53 | res 54 | -1273338492 55 | on_skull_talk_autopsi 56 | -1659217962 57 | @actor_2_1e 58 | 569662481 59 | t_wood_small 60 | -722962558 61 | sharp_shovel_0 62 | 2069087019 63 | First slice 64 | -1914483446 65 | _simplified 66 | -945835157 67 | @skull_8_2b_1d 68 | -439024985 69 | ex:mf_preparation_2:skull 70 | -1991906252 71 | game_logics 72 | -749368942 73 | goto_tavern_2 74 | -2108601981 75 | @actress_snake 76 | -439109742 77 | sanity 78 | 718385552 79 | _rel_crafting_skull_3 80 | 1266412151 81 | r 82 | 372029392 83 | state 84 | 1695925803 85 | donkeys 86 | 1023537425 87 | forced_weather_line 88 | -338611781 89 | go_to_talk_with_donkey_first_time 90 | -2094205940 91 | variation_2 92 | -1065419998 93 | t_dec 94 | -1657453103 95 | t_berry 96 | 1588954169 97 | name 98 | -1966748341 99 | ex:mf_preparation_2:skin 100 | 1177178682 101 | enabled 102 | 633313253 103 | _waiting_finish_scripts 104 | -996512673 105 | first_meet_actress 106 | 1040394666 107 | garden_builddesk:p:garden_empty_place 108 | -1884822412 109 | @merchant_2b 110 | 827217609 111 | gd_tag 112 | -594313226 113 | start_pos 114 | -249718945 115 | t_mushroom 116 | 68997963 117 | gone_out_from_house 118 | 305710804 119 | delay 120 | -374486311 121 | current_point_pos 122 | -381830763 123 | tp_from_morgue_only_with_body 124 | 1600499170 125 | player_position 126 | -1684905487 127 | skull_8_2a 128 | -1276688204 129 | t_iron_ore_1 130 | 492807094 131 | _sloth 132 | -414615561 133 | cur_key_char 134 | -1003409265 135 | do_spawn_rednecks 136 | -1509908477 137 | stored_speed 138 | 595307743 139 | Iron 140 | 1400949664 141 | _params 142 | 1686540507 143 | equipped_as 144 | 1936670324 145 | nature_value 146 | 2095605789 147 | _serialize_depth 148 | -182611177 149 | _rel_npc_tavern owner 150 | -1674884486 151 | wood1 152 | 35729554 153 | inventory_size 154 | -1079319534 155 | before_talk_with_donkey 156 | -532427946 157 | met_donkey 158 | 514172797 159 | tools_from_grave_chest_taken_tech 160 | -1513268345 161 | @horadric_2_1h 162 | 306793435 163 | do_not_show_wgo_qualities 164 | 237856889 165 | avaliable 166 | 400215397 167 | starting_quests_in_progress 168 | -177701572 169 | max 170 | 696029444 171 | event_on_complete 172 | 1333067744 173 | _logics 174 | -516369360 175 | cur_bodies_count 176 | 133526049 177 | skull_wait_in_cemetery 178 | -1018889678 179 | The idea of the stone 180 | 1083609439 181 | npc_id 182 | 2002198695 183 | fix_grave_craft_fence 184 | -1168288388 185 | current_pos 186 | 193900562 187 | chance_group 188 | -505841774 189 | bat_remove 190 | 339601406 191 | known_npcs 192 | 773086370 193 | @blacksmith_2_1e 194 | 1927311600 195 | _next_execution_time 196 | -854616709 197 | z 198 | 372029400 199 | tiredness 200 | -658893067 201 | raw_meat_sliced_from_flesh 202 | -54570329 203 | _started 204 | -2117519300 205 | mf_wood_builddesk:p:mf_timber_1_place 206 | -1730353058 207 | tools_from_grave_chest_taken 208 | 1050456254 209 | witch_hill_is_closed 210 | -121486969 211 | self_chance 212 | 108641033 213 | ex:mf_preparation_1:skull 214 | -1991731053 215 | craft 216 | 1944733992 217 | _glut 218 | -239906219 219 | bishop_2_1a 220 | 1747015981 221 | _money 222 | 1593798603 223 | default_value 224 | -1588916777 225 | g 226 | 372029371 227 | _wgos 228 | -757243681 229 | _res_v 230 | -2102433766 231 | tree_apple_growing_2 232 | -245719498 233 | prev_time_of_day 234 | 1643192254 235 | cur_item_dur 236 | 922024594 237 | _progress 238 | -1823983936 239 | @snake_meat 240 | 868531684 241 | astar_dest 242 | -671464174 243 | @horadric_2_1h_4b 244 | 59088682 245 | _res_type 246 | 786093212 247 | _environment_engine_data 248 | 2101092292 249 | active_now_because_of_movement 250 | -1651697332 251 | lut_controller 252 | -655637628 253 | tree_apple_growing_3 254 | 1320364443 255 | ex:mf_preparation_2:flesh 256 | -1595255923 257 | spawner_id 258 | -284448754 259 | inquisitor_waits_under_mountains_2 260 | -1632473337 261 | m_FileID 262 | 880140037 263 | @skull_8_2b_1c 264 | 320489902 265 | available 266 | 358512417 267 | Saw 268 | 696030997 269 | fruit:berry 270 | 1390541066 271 | t_atk 272 | 1783890881 273 | coords 274 | 1791451076 275 | not_available_throw_body 276 | -1402039439 277 | not_first_cellar_visit 278 | -1263092848 279 | dur_item_id 280 | 331555071 281 | quests 282 | 1375397461 283 | Hardspares 284 | -56241091 285 | blacksmith_2_1b 286 | 1872906429 287 | inquisitor_waits_under_mountains 288 | 1368540252 289 | saw_garden 290 | -993962879 291 | t_apple 292 | 520007747 293 | _wrath 294 | -1458264317 295 | grave_top_wd_tab_1 296 | -1391435275 297 | @actor_2_1d 298 | 569662482 299 | craft_tut 300 | -1607458086 301 | on_the_way_now 302 | -267009964 303 | sword_has_fixed 304 | 415073021 305 | mobs 306 | -104784793 307 | multiquality_items 308 | -85996531 309 | common_chance 310 | 1446163744 311 | mf_wood_builddesk:p:mf_stones_1_place 312 | -515930251 313 | cur_gd_point 314 | -1829781173 315 | Gathering 316 | 1555733581 317 | controller_value 318 | 1117268392 319 | get_out_from_house 320 | 1284153409 321 | donkey_on_scene 322 | -103221151 323 | _initialized 324 | -740373821 325 | _simpified_float 326 | -1632835460 327 | is_unique 328 | 1917823332 329 | cur_zone 330 | 2029834873 331 | _pride 332 | 1988694633 333 | _craft_ids 334 | -992182014 335 | cur_item_id 336 | 750312030 337 | _serialized_data 338 | -1100260286 339 | do_dec_now 340 | -606416593 341 | plot_democracy 342 | -2007226903 343 | everyday_cultist_come 344 | -1606936891 345 | path_waypoint 346 | 747455233 347 | variation 348 | 2060104117 349 | go_to_mortuary_after_skull 350 | -2135410375 351 | obj_id 352 | 1756147093 353 | _durability 354 | -425770204 355 | lut_texture 356 | 1961631197 357 | _spawners 358 | -1880827902 359 | interaction_events 360 | -568750086 361 | linked_id 362 | -189991957 363 | fix_grave_craft_cross 364 | 1379287963 365 | goto_tavern 366 | 371772076 367 | ending_quests_in_progress 368 | -250361273 369 | crafts 370 | 115705597 371 | is_crafting 372 | -393310257 373 | custom_tag 374 | -2106114458 375 | flitch 376 | -1222604174 377 | get_out_from_house_tech 378 | -649453138 379 | _succed_quests 380 | 50032810 381 | local_weather_line 382 | -1430146297 383 | in_tavern 384 | -1398152672 385 | _executed_quests 386 | 1745267180 387 | _running_scripts 388 | 191093367 389 | _hp 390 | 1905884715 391 | @skull_8_2b_1b 392 | -1245594039 393 | start_removing_time 394 | -1430352036 395 | ex:mf_preparation_1:skin 396 | 1177183993 397 | church_qual 398 | 1951313913 399 | cur_astar_path 400 | 1807258382 401 | morgue_builddesk:p:corpse_bed_place 402 | -1916306549 403 | y 404 | 372029397 405 | dur_item_dur 406 | 503267637 407 | skull_digged 408 | 2142354140 409 | goto_tavern_tech 410 | -839251081 411 | anchor_custom_tag 412 | -1178937768 413 | graveyard_quality 414 | 1921100443 415 | _expression 416 | -342960047 417 | church_quality 418 | -1694870411 419 | events_json 420 | -2060165302 421 | position 422 | -1906739535 423 | start 424 | -1436242094 425 | anchor_gd_tag 426 | -1406502840 427 | floor_line 428 | -602502875 429 | cur_craft_id 430 | -2068958069 431 | additional_crafts 432 | -1534530133 433 | @horadric_2_1d 434 | -1662575033 435 | tut_build_wndw_not_shown 436 | -499448959 437 | idle_serialized 438 | 1098995945 439 | t_stick 440 | 1487923809 441 | chunk 442 | -31540633 443 | dig_graved_skull 444 | -1148745126 445 | auto_craft_time_spent 446 | -1285366881 447 | min_value 448 | 2098524156 449 | confession_probability 450 | -1499663681 451 | _executing 452 | -281158063 453 | slime_remove 454 | -1845970761 455 | @horadric_2_1e 456 | -96491092 457 | _currnet_quests 458 | -859724264 459 | skull_talk_body 460 | -1155000973 461 | cur_amount 462 | -875160701 463 | _inventory 464 | 1387816353 465 | graveyard_qual 466 | -371851665 467 | in_stored_speed_mode 468 | 679915947 469 | id 470 | 287061489 471 | item_data 472 | -1752493902 473 | tree_apple_growing_1 474 | -1811803439 475 | lock_tp 476 | 620527854 477 | grave_top_wd_tab_1_3 478 | 755977889 479 | skull_8_2b 480 | -1679972731 481 | _lust 482 | -1261543395 483 | movement_component 484 | 852863427 485 | lock_tp_param 486 | -1108988836 487 | using_gd_path 488 | -1686715790 489 | mushroom_spawn 490 | 1827338204 491 | ex:mf_preparation_2:bone 492 | 2145113767 493 | rednecks_spawned 494 | 1312641662 495 | idle_animation 496 | -1244515143 497 | bishop_2_1e 498 | 1747015985 499 | _rel_npc_actor 500 | -284332168 501 | skull_8_2b_1a 502 | -1849811152 503 | temp_morgue_zone 504 | -1091098747 505 | speed 506 | 338261383 507 | _serialized_time_of_day 508 | 650530576 509 | idle 510 | 1266176052 511 | skull_talk_autopsi 512 | -1306861368 513 | fine_tune_z 514 | -1998562764 515 | Grave plate 516 | 797220335 517 | waiting_for_first_bureal 518 | -1185601736 519 | met_bishop 520 | 1146865384 521 | Garden beds 522 | 163412523 523 | spawn_tree 524 | 308533978 525 | always_active 526 | -613830670 527 | _black_list 528 | -409529807 529 | scale 530 | -528916476 531 | @blacksmith_2_1a 532 | -398287228 533 | do_remove_rednecks 534 | 1389828268 535 | skull_talk_after_burial 536 | -2135027223 537 | pos 538 | 1502598840 539 | player_repairs_sword 540 | -971404052 541 | mf_wood_builddesk:p:mf_furnace_0_place 542 | -395530656 543 | has_spawner 544 | 735102125 545 | church_level 546 | -406361548 547 | horadric_2_1f 548 | 1293810705 549 | @actress_2b_1a 550 | -89253859 551 | @skull_8_2a_wine 552 | 1562743816 553 | max_value 554 | -2123671846 555 | forced_value 556 | 896644601 557 | player_repairs_sword_before 558 | -1657844074 559 | _global_seed 560 | -633220984 561 | w 562 | 372029387 563 | x 564 | 372029398 565 | anchor_is_wgo 566 | -1162018212 567 | unique_id 568 | -1137686907 569 | target_gd_point_tag 570 | 2004660467 571 | flower_spawn 572 | -256381631 573 | test_tavern 574 | -465817653 575 | morgue_builddesk:p:mf_preparation_1_place 576 | 2136116218 577 | mf_wood_builddesk:p:mf_beam_gantry_1_place 578 | -1739257696 579 | prev_state 580 | 1947114845 581 | horadric_2_1a 582 | 1293810704 583 | was_in_tavern 584 | 845453654 585 | energy 586 | 97231906 587 | t_stone 588 | -1691298296 589 | _failed_quests 590 | -589803668 591 | The idea of the tree 592 | 1585027894 593 | spawner_coords 594 | 950545937 595 | last_opened_tab 596 | 1647636174 597 | type 598 | 1421151742 599 | chance_to_spawn 600 | -627240070 601 | rotation 602 | -1970430060 603 | anim_state_json 604 | 1940637204 605 | go_to_graveyard_and_talk_with_skull 606 | -1570871214 607 | grave_top_wd_tab_1_2 608 | -1972905466 609 | serialized_states 610 | 1109736545 611 | time_of_day 612 | -1002881040 613 | broken_to_sword 614 | 113626801 615 | multiquality_item_id 616 | -1319372306 617 | _rel_npc_blacksmith 618 | 816851317 619 | key_to_cellar 620 | 298481501 621 | NullValue 622 | 374574464 623 | Bool_True 624 | -1965930333 625 | Bool_False 626 | 1102735602 627 | Int32 628 | -1503481182 629 | Int64 630 | 2031971229 631 | Single 632 | -1160131686 633 | Double 634 | 1952587961 635 | Byte 636 | 1421152560 637 | Char 638 | 681582338 639 | String 640 | -983920443 641 | String_Indexed 642 | -1637402495 643 | String_Empty 644 | 721079499 645 | Json 646 | -1590055560 647 | Vector2 648 | 1335531435 649 | Vector3 650 | 1335531434 651 | Quaternion 652 | 953520486 653 | Int32_0 654 | -1778737571 655 | Int32_1 656 | -1778737570 657 | Single_0 658 | 1082820801 659 | Single_1 660 | -1646062554 661 | Vector2_00 662 | 744456042 663 | Vector2_11 664 | -821627900 665 | Vector3_000 666 | -631212327 667 | Vector3_111 668 | 2097671124 669 | Quaternion_0001 670 | -215993916 671 | GenericList 672 | -1693414625 673 | Array 674 | 1185245981 675 | ByteArray 676 | 120441579 677 | SmartSerialized 678 | -1868283029 679 | unlocked_perks 680 | -707463795 681 | unlocked_works 682 | 938915570 683 | day 684 | 696029164 685 | unlocked_techs 686 | -1209696557 687 | unlocked_crafts 688 | -1971702989 689 | unlocked_works 690 | 938915570 691 | unlocked_phrases 692 | 144965494 693 | black_list_of_phrases 694 | -2127056499 695 | completed_one_time_crafts 696 | -236966110 697 | known_fishes 698 | 464971092 699 | revealed_techs 700 | 1300937796 701 | equipped_items 702 | 661681556 703 | max_hp 704 | -632907985 705 | max_energy 706 | 73146125 707 | max_sanity 708 | 1008857835 709 | dungeon_seed 710 | -1538453392 711 | unique_id_iterator 712 | -373703902 713 | drops 714 | -831214912 715 | _environment_preset 716 | -155304782 717 | buffs 718 | 1124608864 719 | known_npcs 720 | 773086370 721 | gd_points 722 | -283587285 723 | game_version 724 | 1115841171 725 | known_fishes_clear 726 | 1728115654 727 | last_bait_reservoirs 728 | -811864090 729 | last_bait_baits 730 | -1022288963 731 | achievements 732 | 538051562 733 | cur_time 734 | 342791100 735 | day_of_week 736 | -2025282127 737 | known_world_zones 738 | -1111683246 739 | AchievementsSystem 740 | 1862113349 741 | _completed_fully 742 | 698389079 743 | _completed 744 | 296048728 745 | _completed_n 746 | 37076951 747 | _saved_dungeons 748 | 1315785768 749 | is_empty 750 | 977597516 751 | dungeon_preset_name 752 | -1231494588 753 | seed 754 | -158744921 755 | random_calls_count 756 | 333466745 757 | objects 758 | -349241698 759 | is_completed 760 | 64889312 761 | zone_id 762 | 1535673096 763 | drop_zone_id_serialize_depth 764 | 492655729 765 | _serialized_data 766 | -1100260286 767 | _cached_drop_zone_id 768 | -413544678 769 | sub_name 770 | 1472649390 771 | inventory_size 772 | -1079319534 773 | durability 774 | 73672881 775 | durability_state 776 | -419779279 777 | empty 778 | 445638645 779 | is_equipped_to_toolbar 780 | -2144087554 781 | toolbar_index 782 | 1916279834 783 | is_multiquality 784 | -429691215 785 | definition 786 | -679577643 787 | hp 788 | 1543969238 789 | progress 790 | 1836469849 791 | money 792 | 1601797866 793 | is_tech_point 794 | 259306734 795 | _craft_ids 796 | -992182014 797 | additional_crafts 798 | -1534530133 799 | is_building 800 | -1689153513 801 | craft_type 802 | 1601943761 803 | workers 804 | 1783837877 805 | _workers 806 | -631896678 807 | worker_unique_id 808 | -108579474 809 | worker_wgo 810 | -1909916812 811 | _worker_wgo 812 | -655899643 813 | secondary_inventory 814 | 1739710971 815 | inventory 816 | 15320842 817 | _wgo_unique_id 818 | -844617092 819 | start_time 820 | -596434678 821 | start_trigger 822 | 1501541607 823 | success_trigger 824 | -1603458474 825 | fail_trigger 826 | -49911323 827 | start_key 828 | 556849710 829 | rew_on_success_params 830 | -352829007 831 | rew_on_fail_params 832 | -1736364180 833 | one_time_quest 834 | -1960662073 835 | start_script 836 | 219043036 837 | success_script 838 | -395461385 839 | fail_script 840 | 763318088 841 | quest_visible 842 | -130949065 843 | arrow_wgo_custom_tag 844 | 1634024856 845 | arrow_wgo_obj_id 846 | -738569325 847 | success_expressions 848 | 1992720801 849 | fail_expressions 850 | 921052350 -------------------------------------------------------------------------------- /data/hashes.py: -------------------------------------------------------------------------------- 1 | # An object to manage the numerical hashes and their string equivalent 2 | class Hashlist: 3 | 4 | def __init__(self, file): 5 | self.hash_to_name = {} 6 | self.name_to_hash = {} 7 | self.hash_to_type = {} 8 | self.file = file 9 | self.__loadhashes() 10 | 11 | def __loadhashes(self): 12 | # Load the hashes from our text file and save them to the objects 13 | with open(self.file) as f: 14 | lines = f.readlines() 15 | lines = [x.strip() for x in lines] 16 | for i in range(0, len(lines), 2): 17 | try: 18 | string = lines[i] 19 | hash = lines[i+1] 20 | self.hash_to_name[hash] = string 21 | self.name_to_hash[string] = hash 22 | except: 23 | pass 24 | -------------------------------------------------------------------------------- /data/html/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #212121; 3 | zoom: 1.5; 4 | /*Special case for firefox*/ 5 | image-rendering: -moz-crisp-edges 6 | } 7 | 8 | .intro { 9 | padding: 20px; 10 | text-align: center; 11 | background-color: #151515; 12 | margin: 40px 0px; 13 | box-shadow: 0px 0px 10px 5px rgba(0, 0, 0, 0.5); 14 | } 15 | 16 | .con { 17 | color: #e4e4e4; 18 | font-size: 200%; 19 | } 20 | 21 | .settingsform { 22 | margin: 10px 50px; 23 | background-color: #292929; 24 | padding: 20px; 25 | } 26 | 27 | 28 | main .intro h3 { 29 | font-size: 20px !important; 30 | } 31 | 32 | .preswitch { 33 | color: #e4e4e4; 34 | font-size: 18px; 35 | text-align: center; 36 | } 37 | 38 | .settingsform .switch { 39 | text-align: center; 40 | } 41 | 42 | #donebtn { 43 | margin-top:25px; 44 | } 45 | 46 | .settingsform input[type="text"], 47 | .settingsform input[type="number"] { 48 | color: #e4e4e4; 49 | } 50 | 51 | .loadingsave { 52 | margin: 80px auto; 53 | zoom: 200%; 54 | width: 80px; 55 | } 56 | 57 | .gameicon { 58 | display: inline-block; 59 | image-rendering: pixelated; 60 | zoom: 1.5; 61 | transform: translateY(2px); 62 | height: fit-content; 63 | } 64 | 65 | .consaves { 66 | font-size: 75%; 67 | } 68 | 69 | .gameicon.i-church { 70 | zoom: 1.2; 71 | margin-top: 6px; 72 | transform: translateY(4px); 73 | } 74 | 75 | .saveslot { 76 | margin: 20px; 77 | background-color: #1b1b1b; 78 | box-shadow: 0px 0px 4px 1px black; 79 | display: flex; 80 | transition: all 0.5s; 81 | } 82 | 83 | .saveslot:hover { 84 | box-shadow: 0px 0px 4px 1px #11d2c0; 85 | cursor: pointer; 86 | } 87 | 88 | .slotnum { 89 | flex: 1; 90 | max-width: 25%; 91 | min-height: 100%; 92 | } 93 | 94 | .slotnum div { 95 | background-color: #353535; 96 | height: 80px; 97 | width: 80px; 98 | border-radius: 100%; 99 | box-shadow: 0px 0px 5px; 100 | margin: auto; 101 | text-align: center; 102 | line-height: 80px; 103 | text-shadow: 0px 0px 4px black; 104 | font-size: 300%; 105 | } 106 | 107 | .slotcontent { 108 | flex: 1; 109 | padding: 10px; 110 | border-left: 2px dotted white; 111 | } 112 | 113 | .col.slotgraveyard { 114 | margin-top: -10px; 115 | } 116 | 117 | .col.slotchurch { 118 | margin-top: -10px; 119 | } 120 | 121 | .row:nth-child(2) { 122 | margin-bottom: 0px; 123 | } 124 | 125 | .col.slotversion { 126 | text-align: right; 127 | } 128 | 129 | .col.slotversion::before { 130 | content: "v"; 131 | } 132 | 133 | .loadingcon { 134 | width: 80%; 135 | height: 100%; 136 | margin: auto; 137 | } 138 | 139 | .loadingcon .row { 140 | text-align: center; 141 | margin: 20px; 142 | } 143 | 144 | .loadingconwrap { 145 | position: absolute; 146 | left: 50%; 147 | top: 50%; 148 | width: 80%; 149 | transform: translate(-50%, -50%); 150 | } 151 | 152 | .loadingcon .progress { 153 | background-color: #171717; 154 | } 155 | 156 | .saveslot.extra { 157 | padding: 20px; 158 | text-align: center; 159 | } 160 | 161 | .extra div { 162 | text-align: center; 163 | width: 100%; 164 | } 165 | 166 | .gameicon.pre { 167 | position: absolute; 168 | transform: translate(-20px, -3px); 169 | } 170 | 171 | .colorpoints .input-field.col, 172 | .money .input-field.col { 173 | margin: 0px 20px; 174 | flex: 1; 175 | text-align: center; 176 | } 177 | 178 | .row.colorpoints, 179 | .row.money { 180 | display: flex; 181 | } 182 | 183 | .colorpoints input, 184 | .money input { 185 | transform: translateX(10px); 186 | } 187 | 188 | .editsavedata input { 189 | text-align: center; 190 | color: inherit; 191 | } 192 | 193 | .editsavedata { 194 | font-size: 80% 195 | } 196 | 197 | form.s10.col.offset-s1.editsavedata { 198 | color: #e4e4e4 !important; 199 | margin-top: 20px; 200 | } 201 | 202 | .row.hpenergy { 203 | text-align: center; 204 | } 205 | 206 | .editsavedata .helper-text { 207 | color: gray; 208 | } 209 | 210 | .energy { 211 | transform: translateX(-15px); 212 | } 213 | 214 | .row.money { 215 | max-height: 50px; 216 | } 217 | 218 | .intro.lesspadding { 219 | margin: 0px; 220 | margin-bottom: 10px; 221 | } 222 | 223 | .item { 224 | width: 100%; 225 | display: flex; 226 | font-size: 70%; 227 | margin: 10px 0px; 228 | flex-wrap: wrap; 229 | background-color: #131313; 230 | max-height: 500px; 231 | transition: all 0.5s; 232 | } 233 | 234 | .itemimage { 235 | max-width: 80px; 236 | max-height: 80px; 237 | flex: 1; 238 | padding:2px; 239 | } 240 | 241 | .iteminfo { 242 | flex: 1; 243 | display: flex; 244 | flex-direction: column; 245 | padding: 8px; 246 | line-height: 30px; 247 | } 248 | 249 | .itemname { 250 | flex: 1; 251 | text-shadow: 1px 1px #5a5a5a; 252 | cursor:pointer; 253 | } 254 | 255 | .itemmisc { 256 | display: flex; 257 | transform: translateY(3px); 258 | font-size: 80%; 259 | } 260 | 261 | .amount { 262 | flex: 1; 263 | } 264 | 265 | .btncon { 266 | flex: 1; 267 | } 268 | 269 | .btn.repairbtn { 270 | text-transform: none; 271 | padding: 15px 5px; 272 | line-height: 4px; 273 | } 274 | 275 | .amount div { 276 | display: inline-block; 277 | } 278 | 279 | .amount input[type="number"] { 280 | display: inline-block; 281 | width: 80px; 282 | margin-left: 10px; 283 | } 284 | 285 | .itemimage img { 286 | image-rendering: pixelated; 287 | height: 90%; 288 | margin: auto; 289 | left: 50%; 290 | top: 50%; 291 | transform: translate(10%, 10%); 292 | } 293 | 294 | .itemid { 295 | display:inline-block; 296 | color:gray; 297 | text-shadow:none; 298 | } 299 | 300 | .item.add .itemname{ 301 | text-shadow: none; 302 | } 303 | 304 | .itemremove { 305 | width: 25px; 306 | height: 25px; 307 | margin: 4px; 308 | background-color: #cc5454; 309 | box-shadow: #750a0a 0px 1px 0px 2px; 310 | color: white; 311 | font-size: 35px; 312 | cursor: pointer; 313 | line-height: 15px; 314 | text-align: center; 315 | user-select: none; 316 | } 317 | 318 | .item .valign-wrapper { 319 | margin-right: 5px; 320 | } 321 | 322 | .add.perk .btncon { 323 | flex: 0; 324 | } 325 | 326 | .toremove { 327 | max-height: 0px; 328 | overflow: hidden; 329 | transform: rotateX(90deg); 330 | transition: all 0.5s; 331 | } 332 | 333 | .justadded { 334 | animation: add 0.5s; 335 | } 336 | 337 | @keyframes add { 338 | from { 339 | max-height:0px; 340 | transform: rotateX(90deg); 341 | } 342 | to { 343 | max-height:500px; 344 | transform: rotateX(0deg); 345 | } 346 | } 347 | 348 | .currentlyediting { 349 | border: 1px white dotted; 350 | animation: edit 4s infinite; 351 | } 352 | 353 | @keyframes edit { 354 | 0% { 355 | border: 1px white dotted; 356 | } 357 | 50% { 358 | border: 1px rgba(255, 255, 255, 0.05) dotted; 359 | } 360 | } 361 | 362 | .itemname.curactive { 363 | text-shadow: none; 364 | } 365 | 366 | .perks .itemname{ 367 | cursor: default; 368 | } 369 | 370 | .savingcon .col { 371 | margin: 10px auto; 372 | text-align: center; 373 | } 374 | 375 | .sidemenu { 376 | position: fixed; 377 | z-index: 50; 378 | width: 40px; 379 | background-color: #006280; 380 | color: white; 381 | font-weight: 700; 382 | font-size: 20px; 383 | text-align: center; 384 | border-radius: 0px 20px 20px 0px; 385 | cursor: pointer; 386 | left: 0px; 387 | top: 50%; 388 | transform: translateY(-50%); 389 | overflow: hidden; 390 | } 391 | 392 | .sidemenu div { 393 | height: 40px; 394 | line-height: 40px; 395 | transition: background-color 0.5s; 396 | border-bottom: 1px rgba(255, 255, 255, 0.4) dotted; 397 | } 398 | 399 | .sidemenu div:hover { 400 | background-color: rgba(0, 0, 0, 0.4) 401 | } 402 | 403 | .sidemenu div:last-child { 404 | border-bottom: none; 405 | } 406 | .intro.error { 407 | background-color: #562424; 408 | } 409 | 410 | .thankscon ul { 411 | list-style-type: disc; 412 | padding-left: 40px; 413 | padding-right: 15px; 414 | } 415 | 416 | .thankscon li { 417 | list-style-type: disc !important; 418 | margin: 10px 0px; 419 | } 420 | 421 | .thankscon { 422 | font-size: 18px; 423 | } 424 | 425 | .note { 426 | font-size: 50%; 427 | color: gray; 428 | } 429 | .intro.newv { 430 | background-color: #193133; 431 | } 432 | 433 | .itemquality { 434 | z-index: 50; 435 | position:absolute; 436 | width:25px; 437 | height:25px; 438 | background-image: url("/rsc/Empty_Star.png"); 439 | image-rendering: pixelated; 440 | background-size:cover; 441 | transform: translate(50px, 70px); 442 | cursor: pointer; 443 | } 444 | 445 | .gold .itemquality{ 446 | background-image: url("/rsc/Gold_Star.png"); 447 | } 448 | 449 | .silver .itemquality { 450 | background-image: url("/rsc/Silver_Star.png"); 451 | } 452 | 453 | .copper .itemquality { 454 | background-image: url("/rsc/Copper_Star.png"); 455 | } 456 | 457 | .slotgraveyard, 458 | .slotchurch { 459 | padding: 0px !important; 460 | } 461 | 462 | .inventorycon { 463 | background-color: #1b1b1b; 464 | margin: 20px 0px; 465 | } 466 | 467 | .invtinfo { 468 | text-align: center; 469 | padding: 20px; 470 | background-color: #131313; 471 | cursor: pointer; 472 | transition: all 0.5s; 473 | } 474 | 475 | .invtinfo::after { 476 | content: "^"; 477 | font-weight: 800; 478 | font-size: 180%; 479 | position: absolute; 480 | transition: all 0.5s; 481 | right: calc(8.33333% + 30px); 482 | transform: translateY(-15px) rotateZ(180deg) 483 | } 484 | 485 | .active .invtinfo::after { 486 | content: "^"; 487 | transform: translateY(-5px) rotateZ(0deg) 488 | } 489 | 490 | .invt { 491 | padding: 10px; 492 | max-height: 0px; 493 | overflow: hidden; 494 | transition: all 0.5s; 495 | } 496 | 497 | .active .invt { 498 | max-height: 5000px; 499 | overflow: visible; 500 | } 501 | 502 | .additionalitems .itemquality { 503 | position: relative; 504 | } 505 | 506 | .additionalitems .active .itemquality { 507 | position: absolute; 508 | } 509 | 510 | .inventoryminipreview img { 511 | image-rendering: pixelated; 512 | height: 24px; 513 | } 514 | 515 | .inventoryminipreview .item_icon { 516 | width: 25px!important; 517 | height: 25px!important; 518 | display: inline-block !important; 519 | } 520 | 521 | .inventoryminipreview { 522 | padding: 5px; 523 | } 524 | 525 | .changes { 526 | background-color: #142729; 527 | text-align: left; 528 | font-size: 11px; 529 | padding: 8px; 530 | border-radius: 5px; 531 | word-break: break-word; 532 | white-space: pre-wrap; 533 | } 534 | 535 | .npcimage img { 536 | width: 100px; 537 | image-rendering: pixelated; 538 | } 539 | 540 | .relationships .itemmisc { 541 | flex: 1; 542 | } 543 | 544 | .relationships .itemname { 545 | flex: none; 546 | } 547 | 548 | .settingsform input[type="text"]::placeholder { 549 | color: #676767; 550 | font-size: 10px; 551 | } 552 | 553 | .row.port { 554 | margin-top: 25px; 555 | margin-bottom: 0px; 556 | } 557 | 558 | .port .input-field { 559 | transform: translateY(10px); 560 | } 561 | 562 | .port label { 563 | transform: translateY(-24px) scale(0.8) !important; 564 | } 565 | 566 | .misc a { 567 | color: inherit; 568 | } 569 | 570 | .loadingmask { 571 | z-index: 100; 572 | position: fixed; 573 | width: 100%; 574 | height: 100%; 575 | background-color: rgba(255, 255, 255, 0.4); 576 | pointer-events: none; 577 | top: 0px; 578 | left: 0px; 579 | } 580 | 581 | .loading { 582 | zoom: 3; 583 | margin: auto; 584 | } 585 | 586 | .miscbuttons .btn { 587 | text-overflow: ellipsis; 588 | white-space: nowrap; 589 | overflow: hidden; 590 | } 591 | 592 | .toast .confirm { 593 | background-color: #bb5050; 594 | padding: 8px; 595 | font-size: 75%; 596 | text-align: center; 597 | max-width: 80px; 598 | border-radius: 5px; 599 | box-shadow: 2px 2px 0px 0px #903b3b, 4px 4px 0px 0px #7b2e2e; 600 | cursor: pointer; 601 | } 602 | 603 | input[type=range]:focus { 604 | outline: none; 605 | } 606 | 607 | input[type=range]::-webkit-slider-runnable-track { 608 | width: 100%; 609 | height: 5px; 610 | cursor: pointer; 611 | box-shadow: 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0); 612 | background: #78797a; 613 | border-radius: 10.2px; 614 | } 615 | 616 | input[type=range]:focus::-webkit-slider-runnable-track { 617 | background: #858687; 618 | } 619 | 620 | input[type=range] { 621 | border: 0px solid white; 622 | } 623 | 624 | p.timeoutput { 625 | text-align: center; 626 | height: 20px; 627 | font-size: 14px; 628 | margin-top: 0px !important; 629 | transform: translateY(-24px); 630 | } 631 | 632 | .dayindicator { 633 | display: flex; 634 | } 635 | 636 | .day { 637 | flex: 1; 638 | display: flex; 639 | filter: grayscale(1); 640 | transition: filter 0.5s; 641 | } 642 | 643 | .day img { 644 | margin: 0 auto; 645 | cursor: pointer; 646 | } 647 | 648 | .day.active { 649 | filter: grayscale(0); 650 | } 651 | 652 | .equipped-items .amount { 653 | visibility: hidden; 654 | } 655 | 656 | .itemimage .item_icon { 657 | float: left; 658 | } 659 | 660 | .note.hover::before { 661 | content: "Hover"; 662 | position: absolute; 663 | margin-top: -10px; 664 | font-size: 70%; 665 | } 666 | 667 | .note.hover { 668 | transition: all 0.7s; 669 | max-height: 20px; 670 | overflow: hidden; 671 | cursor: pointer; 672 | } 673 | 674 | .note.hover:hover { 675 | max-height: 400px; 676 | } 677 | 678 | .miscbuttons .note { 679 | margin-bottom: 10px; 680 | } 681 | 682 | .miscbuttons .btn { 683 | margin: 10px 0px 10px 0px; 684 | } 685 | 686 | .unknown_item { 687 | border: dotted 2px red; 688 | } 689 | 690 | .confirm.yes, .confirm.no { 691 | margin: 0px 10px; 692 | } 693 | 694 | .item .inventoryminipreview { 695 | flex: 0 0 100%; 696 | background: rgba(0, 0, 0, 0.14); 697 | } 698 | 699 | 700 | ul.collapsible { 701 | border: none; 702 | box-shadow: none; 703 | margin: 0; 704 | } 705 | 706 | .con .collapsible-header { 707 | border: initial; 708 | line-height: initial; 709 | background-color: #1c1c1c; 710 | text-align: center; 711 | width: 100%; 712 | display: block; 713 | box-shadow: 0px 0px 10px 5px rgba(0,0,0, 0.5); 714 | } 715 | 716 | .keyboard-focused .con .collapsible-header { 717 | border: initial; 718 | line-height: initial; 719 | background-color: #1f1f1f; 720 | text-align: center; 721 | width: 100%; 722 | display: block; 723 | box-shadow: 0px 0px 10px 5px rgba(0,0,0, 0.5); 724 | } 725 | 726 | 727 | 728 | .collapsible li { 729 | margin: 20px 0px; 730 | } 731 | 732 | .con .collapsible-body { 733 | border: initial; 734 | } 735 | 736 | .open-close-indicator { 737 | width: 100%; 738 | text-align: center; 739 | color: rgba(255,255,255, 0.1); 740 | font-weight: 900; 741 | height: 0px; 742 | } 743 | 744 | .arrow { 745 | transform: translateY(-15px) rotate(90deg) scaleX(0.5); 746 | transition: all 0.3s; 747 | pointer-events: none; 748 | } 749 | 750 | .active .arrow { 751 | transform: translateY(-15px) rotate(-90deg) scaleX(0.5); 752 | } 753 | 754 | .open-close-indicator .helper { 755 | font-weight: 200; 756 | position: absolute; 757 | width: 100%; 758 | font-size: 13px; 759 | pointer-events: none; 760 | margin-top: -19px; 761 | } 762 | 763 | .worker-efficiency-container { 764 | margin: 0; 765 | padding: 0; 766 | height: 36px; 767 | line-height: 32px; 768 | pointer-events: initial; 769 | } 770 | 771 | input#worker-efficiency, input#gravebody-skulls { 772 | margin: 0!important; 773 | height: 20px; 774 | width: 50px; 775 | color: white; 776 | font-size: 14px; 777 | background-color: rgba(255,255,255,0.1); 778 | font-family: inherit; 779 | text-align: center; 780 | } 781 | 782 | .gameicon.i-white-skull {height: 10px;transform: translateY(6px);zoom: initial;} 783 | 784 | /* Prevent autocomplete from extending outside of the screen, this is a hacky fix making assumption about the size of the surrounding elements */ 785 | .input-field .autocomplete-content { 786 | left: -88px !important; 787 | right: -46px !important; 788 | width: initial !important; 789 | } -------------------------------------------------------------------------------- /data/html/dumpskeleton.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Graveyard Keeper Save File 5 | 28 | 29 | 30 | 31 | 40 | 41 |
42 |

The save data is already dumped in the console in the variable gameSave.

43 | 44 |

For convenience WGO's are also already stored in wgo.

45 | 46 |

Additionally some methods are provided for convenience - you can find them in the second script tag.

47 | 48 |

After you finished the editing you can export it to a JSON file again using the following Button.

49 | 50 |

51 | Export 52 |

53 |
54 | 55 | 75 | 76 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /data/html/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/favicon.ico -------------------------------------------------------------------------------- /data/html/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/favicon.png -------------------------------------------------------------------------------- /data/html/items.json: -------------------------------------------------------------------------------- 1 | { 2 | "items": 3 | [ 4 | "1h_ore_metal", 5 | "accepted_invitation", 6 | "acid", 7 | "alchemy_1_brown", 8 | "alchemy_1_d_blue", 9 | "alchemy_1_d_green", 10 | "alchemy_1_d_violet", 11 | "alchemy_1_green", 12 | "alchemy_1_red", 13 | "alchemy_1_violet", 14 | "alchemy_1_yellow", 15 | "alchemy_1_yellow_electro", 16 | "alchemy_2_brown", 17 | "alchemy_2_d_blue", 18 | "alchemy_2_d_green", 19 | "alchemy_2_d_violet", 20 | "alchemy_2_green", 21 | "alchemy_2_red", 22 | "alchemy_2_violet", 23 | "alchemy_2_yellow", 24 | "alchemy_3_brown", 25 | "alchemy_3_d_blue", 26 | "alchemy_3_d_green", 27 | "alchemy_3_d_violet", 28 | "alchemy_3_green", 29 | "alchemy_3_red", 30 | "alchemy_3_violet", 31 | "alchemy_3_yellow", 32 | "alkali", 33 | "armor_lamellar_1", 34 | "armor_lamellar_2", 35 | "aromatizer", 36 | "ash", 37 | "axe_0", 38 | "axe_1", 39 | "axe_2", 40 | "bait_gem", 41 | "bait_gold", 42 | "bait_steel", 43 | "bat_wing", 44 | "bee", 45 | "beeswax", 46 | "beet_crop", 47 | "beet_seed", 48 | "black_paint", 49 | "blood", 50 | "blood:blood_2_-1", 51 | "blood:blood_3_-1", 52 | "blood:blood_1_0", 53 | "blood:blood_1_1", 54 | "blood:blood_1_2", 55 | "blood:blood_1_3", 56 | "blood:blood_2_0", 57 | "blood:blood_2_1", 58 | "blood:blood_2_2", 59 | "blood:blood_2_3", 60 | "blood:blood_3_0", 61 | "blood:blood_3_1", 62 | "blood:blood_3_2", 63 | "blood:blood_3_3", 64 | "blood:blood_mod", 65 | "bone", 66 | "book_ruined_1", 67 | "bottle_apple_braga", 68 | "bottle_booz_xxx", 69 | "bottle_red_vine:1", 70 | "bottle_red_vine:2", 71 | "bottle_red_vine:3", 72 | "brain_dark", 73 | "bs_letter", 74 | "bust_marble", 75 | "butter", 76 | "butterfly", 77 | "b_faith:1", 78 | "b_faith:2", 79 | "b_faith:3", 80 | "b_faith_money:1", 81 | "b_faith_money:2", 82 | "b_faith_money:3", 83 | "b_money:1", 84 | "b_money:2", 85 | "b_money:3", 86 | "b_pen:1", 87 | "b_pen:2", 88 | "b_pen:3", 89 | "b_plant:1", 90 | "b_plant:2", 91 | "b_plant:3", 92 | "b_shield:1", 93 | "b_shield:2", 94 | "b_shield:3", 95 | "b_sins:1", 96 | "b_sins:2", 97 | "b_sins:3", 98 | "b_skull:1", 99 | "b_skull:2", 100 | "b_skull:3", 101 | "b_star:1", 102 | "b_star:2", 103 | "b_star:3", 104 | "b_sword:1", 105 | "b_sword:2", 106 | "b_sword:3", 107 | "b_village:1", 108 | "b_village:2", 109 | "b_village:3", 110 | "cabbage_crop", 111 | "cabbage_seed", 112 | "calculation_for_mill_fix", 113 | "caldron", 114 | "candle_1", 115 | "candle_2", 116 | "candle_3", 117 | "candle_4", 118 | "candle_6", 119 | "carrot_crop", 120 | "carrot_seed", 121 | "ceramic_1", 122 | "ceramic_2", 123 | "ceramic_3", 124 | "chapter:1", 125 | "chapter:2", 126 | "chapter:3", 127 | "cheese", 128 | "chisel:chisel_1", 129 | "chisel:chisel_2:1", 130 | "chisel:chisel_2:2", 131 | "chisel:chisel_2:3", 132 | "clay", 133 | "water", 134 | "coal", 135 | "coins", 136 | "communion_cookies", 137 | "crop_waste", 138 | "cup_beer:1", 139 | "cup_beer:2", 140 | "cup_beer:3", 141 | "cup_mead:1", 142 | "cup_mead:2", 143 | "cup_mead:3", 144 | "dark_elixir", 145 | "dessert:croissant", 146 | "dessert:jelly_green", 147 | "dessert:jelly_red", 148 | "dessert:muffin", 149 | "dessert:pie", 150 | "dessert:pie_1", 151 | "detail_1", 152 | "detail_2", 153 | "detail_3", 154 | "detail_trash", 155 | "dough", 156 | "dough_2", 157 | "drop_alcohol", 158 | "egg_chicken", 159 | "embalm_-1_-1", 160 | "embalm_-1_1", 161 | "embalm_-2_2", 162 | "embalm_0_1", 163 | "embalm_1_1", 164 | "embalm_2_0", 165 | "embalm_50", 166 | "embalm_stop", 167 | "energy_elixir", 168 | "faceted_diamond", 169 | "faceted_emerald", 170 | "faith", 171 | "fat", 172 | "fat:fat_2_-1", 173 | "fat:fat_3_-1", 174 | "fat:fat_1_0", 175 | "fat:fat_1_1", 176 | "fat:fat_1_2", 177 | "fat:fat_1_3", 178 | "fat:fat_2_0", 179 | "fat:fat_2_1", 180 | "fat:fat_2_2", 181 | "fat:fat_2_3", 182 | "fat:fat_3_0", 183 | "fat:fat_3_1", 184 | "fat:fat_3_2", 185 | "fat:fat_3_3", 186 | "fat:fat_mod", 187 | "fillet_fish:fillet_fish_blue:1", 188 | "fillet_fish:fillet_fish_blue:2", 189 | "fillet_fish:fillet_fish_blue:3", 190 | "fillet_fish:fillet_fish_red:1", 191 | "fillet_fish:fillet_fish_red:2", 192 | "fillet_fish:fillet_fish_red:3", 193 | "firewood", 194 | "fishing_rod_0", 195 | "fishing_rod_1", 196 | "fishing_rod_2", 197 | "fish_anchovy", 198 | "fish_crucian_gold", 199 | "fish_eel", 200 | "fish_frog_green", 201 | "fish_goldfish", 202 | "fish_gudgeon", 203 | "fish_perch", 204 | "fish_tilapia", 205 | "flask_green_l_plus", 206 | "flavor_enhancer", 207 | "flesh", 208 | "flesh:flesh_0_2", 209 | "flesh:flesh_0_3", 210 | "flesh:flesh_1_1", 211 | "flesh:flesh_1_2", 212 | "flesh:flesh_1_3", 213 | "flesh:flesh_2_1", 214 | "flesh:flesh_2_2", 215 | "flesh:flesh_2_3", 216 | "flesh:flesh_3_1", 217 | "flesh:flesh_3_2", 218 | "flesh:flesh_3_3", 219 | "flesh:flesh_mod", 220 | "flitch", 221 | "flour", 222 | "flw_chamomile", 223 | "flw_dandelion", 224 | "flw_poppy", 225 | "flyer:flyer_bad", 226 | "freshener", 227 | "fruit:apple_green_crop", 228 | "fruit:apple_red_crop", 229 | "fruit:berry", 230 | "fruit:grapes_crop:1", 231 | "fruit:grapes_crop:3", 232 | "funeral_urn_1", 233 | "funeral_urn_2", 234 | "glass_0", 235 | "glass_1", 236 | "glass_2", 237 | "glue", 238 | "golden_apple", 239 | "golden_elixir", 240 | "goo", 241 | "grapes_seed:1", 242 | "grapes_seed:2", 243 | "grapes_seed:3", 244 | "grave_bot_mrb_1", 245 | "grave_bot_mrb_2", 246 | "grave_bot_stn_1", 247 | "grave_bot_stn_2", 248 | "grave_bot_wd_1", 249 | "grave_top_mrb_cross_1", 250 | "grave_top_mrb_cross_2", 251 | "grave_top_sarcofag_mrb_1", 252 | "grave_top_sculpt_mrb_1", 253 | "grave_top_sculpt_mrb_2", 254 | "grave_top_sculpt_stn_1", 255 | "grave_top_sculpt_stn_2", 256 | "grave_top_stella_mrb_1", 257 | "grave_top_stella_stn_1", 258 | "grave_top_stn_cross_1", 259 | "grave_top_stn_cross_2", 260 | "grave_top_stn_plate_1", 261 | "grave_top_stn_plate_2", 262 | "grave_top_wd_cross_1", 263 | "grave_top_wd_tab_1", 264 | "growth_enhancer", 265 | "hammer_0", 266 | "hammer_2", 267 | "hearthstone", 268 | "heart_dark", 269 | "hiccup_grass", 270 | "honey", 271 | "hop_crop:1", 272 | "hop_crop:2", 273 | "hop_seed:1", 274 | "hop_seed:3", 275 | "incense_1", 276 | "incense_2", 277 | "infusion", 278 | "ingot_gold", 279 | "ingot_metal", 280 | "ingot_silver", 281 | "ingot_steel", 282 | "ink:ink_jar", 283 | "intestine_dark", 284 | "intestine:intestine_3_3", 285 | "jelly_slug", 286 | "jelly_slug_blue", 287 | "jelly_slug_orange", 288 | "jelly_slug_black", 289 | "jewelry_detail_gold", 290 | "jewelry_detail_silver", 291 | "jug_milk", 292 | "lense", 293 | "lentils_crop:1", 294 | "lentils_crop:2", 295 | "lentils_crop:3", 296 | "lentils_seed:1", 297 | "lentils_seed:2", 298 | "lentils_seed:3", 299 | "lifestone", 300 | "maggot", 301 | "marble", 302 | "marble_gold", 303 | "marble_plate_1", 304 | "marble_plate_2", 305 | "marble_plate_3:2", 306 | "marble_plate_3:3", 307 | "meal:baked_fish", 308 | "meal:baked_meat", 309 | "meal:baked_pumpkin:1", 310 | "meal:baked_pumpkin:2", 311 | "meal:baked_pumpkin:3", 312 | "meal:baked_salmon:1", 313 | "meal:baked_salmon:2", 314 | "meal:baked_salmon:3", 315 | "meal:beet_slice", 316 | "meal:bowl_pumpkin:1", 317 | "meal:bowl_pumpkin:2", 318 | "meal:bowl_pumpkin:3", 319 | "meal:burger:1", 320 | "meal:burger:2", 321 | "meal:burger:3", 322 | "meal:cutlet_carrot", 323 | "meal:honey_fish:1", 324 | "meal:honey_fish:2", 325 | "meal:honey_fish:3", 326 | "meal:lasagne:1", 327 | "meal:lasagne:2", 328 | "meal:lasagne:3", 329 | "meal:nuggets_fish", 330 | "meal:omlette", 331 | "meal:pasta", 332 | "meal:soup_fish", 333 | "meal:soup_red_green:1", 334 | "meal:soup_red_green:2", 335 | "meal:soup_red_green:3", 336 | "meal:soup_red_yellow:1", 337 | "meal:soup_red_yellow:2", 338 | "meal:soup_red_yellow:3", 339 | "meal:soup_yellow_green:1", 340 | "meal:soup_yellow_green:2", 341 | "meal:soup_yellow_green:3", 342 | "meal:baked_kebab_1:1", 343 | "meal:baked_kebab_1:2", 344 | "meal:baked_kebab_1:3", 345 | "mirror_of_pride", 346 | "moth", 347 | "mussels", 348 | "nails", 349 | "nails_bloody", 350 | "necklace", 351 | "nori", 352 | "notes:1", 353 | "notes:2", 354 | "notes:3", 355 | "nugget_gold", 356 | "nugget_silver", 357 | "onion_crop:1", 358 | "onion_crop:2", 359 | "onion_crop:3", 360 | "onion_seed:1", 361 | "onion_seed:2", 362 | "onion_seed:3", 363 | "snack:onion_ring:1", 364 | "snack:onion_ring:2", 365 | "snack:onion_ring:3", 366 | "packet_meat", 367 | "pail_apple_juice", 368 | "pail_berry_juice", 369 | "pail_blood", 370 | "pail_milk", 371 | "pail_water", 372 | "pail_wet_paper", 373 | "parfum_1", 374 | "peat", 375 | "pen_1", 376 | "pen:ink_pen", 377 | "permission", 378 | "pickaxe_0", 379 | "pickaxe_1", 380 | "pickaxe_2", 381 | "picnic_basket", 382 | "polishing_paste", 383 | "potion_berries_juice", 384 | "pot_mana", 385 | "pot_speed", 386 | "powder_gold", 387 | "powder_graphite", 388 | "powder_silver", 389 | "powder_white", 390 | "preservative", 391 | "pumpkin_crop:1", 392 | "pumpkin_crop:2", 393 | "pumpkin_crop:3", 394 | "pumpkin_seed:1", 395 | "pumpkin_seed:2", 396 | "pumpkin_seed:3", 397 | "pyrite", 398 | "quest_cultit_book", 399 | "quest_key_astrologer", 400 | "ques_key_cultist", 401 | "raw_meat_sliced", 402 | "recipe_2min", 403 | "recipe_delicacies", 404 | "recipe_Pies", 405 | "recipe_Sweet", 406 | "recipe_Veg", 407 | "repair_mrb", 408 | "repair_stn", 409 | "roof_tile", 410 | "rope_hemp", 411 | "sack_clock_gold", 412 | "sack_clock_silver", 413 | "sack_star_gold", 414 | "sack_star_silver", 415 | "sand_river", 416 | "science", 417 | "scroll_garden_prop", 418 | "seedling_bush_berry", 419 | "seedling_tree_apple", 420 | "seed_oil", 421 | "shit", 422 | "shovel_0", 423 | "shovel_1", 424 | "shovel_2", 425 | "shr_agaric", 426 | "shr_boletus", 427 | "shr_truffle", 428 | "silk", 429 | "skin_pig", 430 | "skin", 431 | "skin:skin_-1_2", 432 | "skin:skin_-1_3", 433 | "skin:skin_0_1", 434 | "skin:skin_0_2", 435 | "skin:skin_0_3", 436 | "skin:skin_1_1", 437 | "skin:skin_1_2", 438 | "skin:skin_1_3", 439 | "skin:skin_2_1", 440 | "skin:skin_2_2", 441 | "skin:skin_2_3", 442 | "skin:skin_3_1", 443 | "skin:skin_3_2", 444 | "skin:skin_3_3", 445 | "skin:skin_mod", 446 | "skroll_skin_pig", 447 | "skull", 448 | "slime", 449 | "snack:baked_apple", 450 | "snack:baked_kebab_7", 451 | "snack:bowl_sauerkraut", 452 | "snack:bread", 453 | "snack:fried_egg", 454 | "snack:pancakes", 455 | "snack:sandwich", 456 | "snack:toasts:1", 457 | "snack:toasts:2", 458 | "snack:toasts:3", 459 | "soap_pinc", 460 | "spike_1", 461 | "spike_2", 462 | "stamp", 463 | "stick", 464 | "stone_plate_1", 465 | "stone_plate_2", 466 | "stone_plate_3", 467 | "story:1", 468 | "story:2", 469 | "story:3", 470 | "sulfur", 471 | "sword_0", 472 | "sword_1", 473 | "sword_damask", 474 | "sword_damask_gem", 475 | "sword_metal", 476 | "sword_metal_gem", 477 | "sword_steel", 478 | "sword_steel_gem", 479 | "tanning_agent", 480 | "taste_booster:alchemy_1_spice", 481 | "taste_booster:salt", 482 | "techbook_b_1", 483 | "techbook_g_1", 484 | "techbook_r_1", 485 | "thread_1", 486 | "town_pass", 487 | "zombie_juise", 488 | "wchips", 489 | "wheat_crop", 490 | "wheat_seed", 491 | "whetstone", 492 | "white_paint", 493 | "wood1", 494 | "wood_balk_1", 495 | "wood_constr_1", 496 | "wood_magic_1", 497 | "book:book_hard:1", 498 | "book:book_hard:2", 499 | "book:book_hard:3", 500 | "fruit:grapes_crop:2", 501 | "hop_crop:3", 502 | "hop_seed:2", 503 | "marble_plate_3:1", 504 | "rightful_citizen_paper", 505 | "restoration_instrument", 506 | "wooden_plank", 507 | "quest_fake_coins", 508 | "quest_instruction_snake", 509 | "scroll_blue", 510 | "cover:cover_1", 511 | "cover:cover_hard:1", 512 | "cover:cover_hard:2", 513 | "cover:cover_hard:3", 514 | "fork_salty", 515 | "eternal_burning_coil", 516 | "aristocrat_paper", 517 | "spider_web", 518 | "necronomicon", 519 | "endless_book", 520 | "unknown", 521 | "torch", 522 | "hand_tool", 523 | "candle", 524 | "skull_candle", 525 | "priest_cloth", 526 | "toilet_paper", 527 | "barrel", 528 | "barrel2", 529 | "grave_place", 530 | "sandwich", 531 | "bob_hat", 532 | "key_cmmn_1", 533 | "key_cmmn_3", 534 | "key_gold_1", 535 | "key_gold_2", 536 | "key_gold_3", 537 | "key_silv_1", 538 | "key_silv_2", 539 | "key_silv_3", 540 | "fire", 541 | "marketing_point", 542 | "working_zombie_pseudoitem_1", 543 | "working_zombie_on_ground_1", 544 | "porter_backpack", 545 | "insertion_button_pseudoitem", 546 | "blessing_commerce", 547 | "scroll_graveyard_prop", 548 | "bishop_license", 549 | "merchant_traide_license", 550 | "alice_paper", 551 | "actors_song", 552 | "sextant", 553 | "hunters_medallion", 554 | "hamp_seed:1", 555 | "hamp_seed:2", 556 | "hamp_seed:3", 557 | "hamp_crop:1", 558 | "hamp_crop:2", 559 | "hamp_crop:3", 560 | "box_vegetables_silver", 561 | "box_vegetables_gold", 562 | "box_goods", 563 | "sack_clear", 564 | "ore_metal", 565 | "2h_ore_silver", 566 | "graphite", 567 | "bijouterie_gold", 568 | "broken_sword", 569 | "fish_bream:1", 570 | "fish_bream:2", 571 | "fish_sardine:1", 572 | "fish_sardine:2", 573 | "fish_tuna:1", 574 | "fish_tuna:2", 575 | "fish_pike:1", 576 | "fish_pike:2", 577 | "fish_crucian_silver:1", 578 | "fish_crucian_silver:2", 579 | "fish_salmon:2", 580 | "fish_salmon:3", 581 | "fish_sturgeon:2", 582 | "fish_sturgeon:3", 583 | "fish_carp", 584 | "wood", 585 | "carved_wood:1", 586 | "carved_wood:2", 587 | "carved_wood:3", 588 | "owl_wood", 589 | "repair_wdn", 590 | "stone", 591 | "1h_stone", 592 | "1h_marble", 593 | "1h_marble_gold", 594 | "marble_gold_plate_1", 595 | "marble_gold_plate_2", 596 | "marble_gold_plate_3", 597 | "obsidian", 598 | "1h_obsidian", 599 | "obsidian_plate_1", 600 | "obsidian_plate_2", 601 | "obsidian_plate_3", 602 | "jug_empty", 603 | "fillet_fish_white", 604 | "meal:bowl_lentil:1", 605 | "meal:bowl_lentil:2", 606 | "meal:bowl_lentil:3", 607 | "meal:baked_kebab_2:1", 608 | "meal:baked_kebab_2:2", 609 | "meal:baked_kebab_2:3", 610 | "meal:baked_kebab_5:1", 611 | "meal:baked_kebab_5:2", 612 | "meal:baked_kebab_5:3", 613 | "dessert:pie_2:1", 614 | "dessert:pie_2:2", 615 | "dessert:pie_2:3", 616 | "dinner:1", 617 | "dinner:2", 618 | "dinner:3", 619 | "baked_kebab_3", 620 | "baked_kebab_4", 621 | "baked_kebab_6", 622 | "bottle_apple_juice", 623 | "bottle_berry_juice", 624 | "bottle_berry_braga", 625 | "pail_grape_juice:1", 626 | "pail_grape_juice:2", 627 | "pail_grape_juice:3", 628 | "bottle_grape_juice:1", 629 | "bottle_grape_juice:2", 630 | "bottle_grape_juice:3", 631 | "pail_beer:1", 632 | "pail_beer:2", 633 | "pail_beer:3", 634 | "hop_honey:1", 635 | "hop_honey:2", 636 | "hop_honey:3", 637 | "bottle_booz_empty", 638 | "bottle_empty_1", 639 | "bottle_empty_2", 640 | "bowl_empty", 641 | "crab", 642 | "cup_empty", 643 | "food_empty_plate_1", 644 | "pail_dirt", 645 | "pail_braga", 646 | "pail_empty", 647 | "paper_clean", 648 | "book_soft:1", 649 | "book_soft:2", 650 | "book_soft:3", 651 | "note_wasted", 652 | "techbook_g_2", 653 | "techbook_b_2", 654 | "techbook_r_2", 655 | "scroll_2", 656 | "test_paper", 657 | "test_scroll", 658 | "drop_oil", 659 | "alchemy_2_empty", 660 | "alchemy_3_empty", 661 | "goo_alcohol", 662 | "goo_ash", 663 | "goo_blood", 664 | "goo_brown", 665 | "goo_d_blue", 666 | "goo_d_green", 667 | "goo_d_violet", 668 | "goo_diamond", 669 | "goo_gold", 670 | "goo_graphite", 671 | "goo_green", 672 | "goo_oil", 673 | "goo_red", 674 | "goo_salt", 675 | "goo_silver", 676 | "goo_spice", 677 | "goo_violet", 678 | "goo_water", 679 | "goo_white", 680 | "goo_yellow", 681 | "goo_yellow_electro", 682 | "pot_heal", 683 | "pot_sweat", 684 | "pot_appetite", 685 | "pot_heal_long", 686 | "pot_damage", 687 | "pot_berserk", 688 | "pot_armor", 689 | "building_permission", 690 | "raw_stone", 691 | "stone_plate", 692 | "cobblestone", 693 | "preach_1", 694 | "preach_2", 695 | "b_empty", 696 | "b_circle:1", 697 | "b_circle:2", 698 | "b_circle:3", 699 | "b_techpoint_blue:1", 700 | "b_techpoint_blue:2", 701 | "b_techpoint_blue:3", 702 | "b_techpoint_green:1", 703 | "b_techpoint_green:2", 704 | "b_techpoint_green:3", 705 | "b_techpoint_red:1", 706 | "b_techpoint_red:2", 707 | "b_techpoint_red:3", 708 | "b_random:1", 709 | "b_random:2", 710 | "b_random:3", 711 | "b_ghost:1", 712 | "b_ghost:2", 713 | "b_ghost:3", 714 | "b_cross:1", 715 | "b_cross:2", 716 | "b_cross:3", 717 | "b_energy:1", 718 | "b_energy:2", 719 | "b_energy:3", 720 | "body", 721 | "unknown_body_part", 722 | "lungs_dark", 723 | "brain:brain_0_0", 724 | "brain:brain_1_1", 725 | "brain:brain_2_-1", 726 | "brain:brain_0_2", 727 | "brain:brain_2_0", 728 | "brain:brain_0_1", 729 | "brain:brain_2_1", 730 | "brain:brain_2_2", 731 | "brain:brain_-2_3", 732 | "brain:brain_4_1", 733 | "brain:brain_3_3", 734 | "brain:brain_0_3", 735 | "brain:brain_1_0", 736 | "brain:brain_1_2", 737 | "brain:brain_1_3", 738 | "brain:brain_2_3", 739 | "brain:brain_3_0", 740 | "brain:brain_3_1", 741 | "brain:brain_3_2", 742 | "brain:brain_3_-1", 743 | "brain:brain_-1_3", 744 | "brain:brain_4_2", 745 | "brain:brain_4_3", 746 | "heart:heart_0_0", 747 | "heart:heart_1_1", 748 | "heart:heart_2_-1", 749 | "heart:heart_0_2", 750 | "heart:heart_2_0", 751 | "heart:heart_0_1", 752 | "heart:heart_2_1", 753 | "heart:heart_2_2", 754 | "heart:heart_-2_3", 755 | "heart:heart_4_1", 756 | "heart:heart_3_3", 757 | "heart:heart_0_3", 758 | "heart:heart_1_0", 759 | "heart:heart_1_2", 760 | "heart:heart_1_3", 761 | "heart:heart_2_3", 762 | "heart:heart_3_0", 763 | "heart:heart_3_1", 764 | "heart:heart_3_2", 765 | "heart:heart_3_-1", 766 | "heart:heart_-1_3", 767 | "heart:heart_4_2", 768 | "heart:heart_4_3", 769 | "intestine:intestine_0_0", 770 | "intestine:intestine_1_1", 771 | "intestine:intestine_2_-1", 772 | "intestine:intestine_0_2", 773 | "intestine:intestine_2_0", 774 | "intestine:intestine_0_1", 775 | "intestine:intestine_2_1", 776 | "intestine:intestine_2_2", 777 | "intestine:intestine_-2_3", 778 | "intestine:intestine_4_1", 779 | "intestine:intestine_3_3", 780 | "intestine:intestine_0_3", 781 | "intestine:intestine_1_0", 782 | "intestine:intestine_1_2", 783 | "intestine:intestine_1_3", 784 | "intestine:intestine_2_3", 785 | "intestine:intestine_3_0", 786 | "intestine:intestine_3_1", 787 | "intestine:intestine_3_2", 788 | "intestine:intestine_3_-1", 789 | "intestine:intestine_-1_3", 790 | "intestine:intestine_4_2", 791 | "intestine:intestine_4_3", 792 | "organs:organs_1", 793 | "surgeon_mistake", 794 | "lungs:lungs_1", 795 | "scalp", 796 | "face", 797 | "tongue", 798 | "eye", 799 | "ribs", 800 | "pelvis", 801 | "liver", 802 | "kidneys", 803 | "bud", 804 | "humerus", 805 | "forearm", 806 | "hand", 807 | "muscle", 808 | "human flesh", 809 | "human blood", 810 | "silver_elixir", 811 | "test_paper:1", 812 | "test_paper:2", 813 | "test_paper:3", 814 | "test_scroll:1", 815 | "test_scroll:2", 816 | "test_scroll:3", 817 | "pseudo_item_qual_2", 818 | "pseudo_item_qual_4", 819 | "pseudo_item_qual_10", 820 | "nitroglycerine", 821 | "recipe_Jelly", 822 | "recipe_honey", 823 | "recipe_pot_speed", 824 | "bartender_doll", 825 | "tavern_reputation_item", 826 | "huge_carrot", 827 | "millers_invitation", 828 | "dagger_baron", 829 | "honey_plaster", 830 | "honey_barrel", 831 | "curtain_blue", 832 | "obsidian_research", 833 | "scroll_for_hunchback", 834 | "pie_with_poison", 835 | "vases_with_poison", 836 | "rat_for_dig", 837 | "rand_alchemy_unlock", 838 | "rat:rat_in_jar_0", 839 | "rat:rat_in_jar_1", 840 | "rat:rat_in_jar_2", 841 | "rat:rat_in_jar_3", 842 | "rat:rat_in_jar_4", 843 | "rat:rat_in_jar_5", 844 | "rat_status:satisfied", 845 | "rat_status:normal", 846 | "rat_status:hungry", 847 | "rat_status:very_hungry", 848 | "rat_status:critically_hungry", 849 | "rat_buff:speed_training_1", 850 | "rat_buff:speed_training_2", 851 | "rat_buff:speed_training_3", 852 | "rat_buff:dog_training_1", 853 | "rat_buff:dog_training_2", 854 | "rat_buff:dog_training_3", 855 | "rat_buff:fast", 856 | "rat_buff:obedient", 857 | "tr_red_eye", 858 | "tr_flask", 859 | "tr_door_hinge", 860 | "tr_helmet", 861 | "tr_picklock", 862 | "tr_medallion", 863 | "tr_dagger", 864 | "tr_buckle", 865 | "tr_clay_shards", 866 | "tr_red_eye_amulet", 867 | "tr_handcuff", 868 | "tr_pickaxe", 869 | "tr_key", 870 | "tr_resin_pot", 871 | "tr_bellas_ring", 872 | "tr_signet", 873 | "tr_brick", 874 | "box_beer_1", 875 | "box_beer_2", 876 | "box_beer_3", 877 | "box_foodstuff_1", 878 | "box_foodstuff_2", 879 | "box_foodstuff_3", 880 | "box_mead_1", 881 | "box_mead_2", 882 | "box_mead_3", 883 | "box_booz", 884 | "box_wine_1", 885 | "box_wine_2", 886 | "box_wine_3", 887 | "foodstuff_1", 888 | "foodstuff_2", 889 | "foodstuff_3", 890 | "tavern_food_1", 891 | "tavern_food_2", 892 | "tavern_food_3", 893 | "worker_invisible_overhead", 894 | "worker_invisible_ground", 895 | "ice_axe", 896 | "snack:grated_carrot", 897 | "snack:grated_beetroot", 898 | "snack:boiled_egg", 899 | "snack:vegetable_salad:1", 900 | "snack:vegetable_salad:2", 901 | "snack:vegetable_salad:3", 902 | "meal:cheese_pie", 903 | "meal:creamy_vegetable_soup:1", 904 | "meal:creamy_vegetable_soup:2", 905 | "meal:creamy_vegetable_soup:3", 906 | "meal:lentil_porridge:1", 907 | "meal:lentil_porridge:2", 908 | "meal:lentil_porridge:3", 909 | "meal:greek_lentil_soup:1", 910 | "meal:greek_lentil_soup:2", 911 | "meal:greek_lentil_soup:3", 912 | "meal:vegetable_patty:1", 913 | "meal:vegetable_patty:2", 914 | "meal:vegetable_patty:3", 915 | "meal:mushroom_patty", 916 | "meal:сheese_patty", 917 | "meal:vegetable_stew:1", 918 | "meal:vegetable_stew:2", 919 | "meal:vegetable_stew:3", 920 | "meal:cream_of_mushroom_soup", 921 | "meal:lentil_cutlets:1", 922 | "meal:lentil_cutlets:2", 923 | "meal:lentil_cutlets:3", 924 | "dessert:cheesecake", 925 | "dessert:panna_cotta", 926 | "dessert:honey_pudding", 927 | "dessert:berry_pudding", 928 | "dessert:honey_cake", 929 | "recipe_simple_snacks", 930 | "recipe_vegetable_set", 931 | "recipe_milk_processing", 932 | "recipe_in_lentil_we_trust", 933 | "recipe_patties", 934 | "recipe_cheese_dishes", 935 | "recipe_jelly_desserts", 936 | "grave_bot_mrb_3", 937 | "grave_bot_mrb_4", 938 | "grave_bot_mrb_5", 939 | "grave_bot_stn_3", 940 | "grave_bot_stn_4", 941 | "grave_bot_stn_5", 942 | "grave_top_highangel_mrb_1", 943 | "grave_top_highangel_stn_1", 944 | "grave_top_memorial_mrb_1", 945 | "grave_top_memorial_stn_1", 946 | "grave_top_womansaver_mrb_1", 947 | "grave_top_womansaver_stn_1", 948 | "recipe_advanced_gravestones", 949 | "recipe_advanced_gravestones_2", 950 | "recipe_stone_statues", 951 | "recipe_marble_statues", 952 | "recipe_marble_fences", 953 | "body_guard", 954 | "teleport_scroll", 955 | "refugee_happiness_item", 956 | "refugee_happiness_slot_item", 957 | "refugee_tent_place_available_item", 958 | "refugee_tent_place_busy_item", 959 | "donkey_lock_wool", 960 | "garlic_bunch", 961 | "vampire_jaw", 962 | "vampire_sunscreen", 963 | "memory_potion_receipt", 964 | "book_of_receipts", 965 | "skeleton_leg", 966 | "vampires_blackened_boot", 967 | "witchers_eye", 968 | "memory_potion", 969 | "details_pile", 970 | "memory_powder", 971 | "pagan_amulet", 972 | "scroll_ghoul", 973 | "dark_gold_cloak", 974 | "death_emulsion", 975 | "unicorn_horn", 976 | "jelly_splinter", 977 | "magic_pumpkin", 978 | "first_letter", 979 | "second_letter", 980 | "third_letter", 981 | "revolutionary_banner", 982 | "battle_horseshoes", 983 | "bank_check", 984 | "carl_bounded", 985 | "aphorisms", 986 | "note_from_unknown_1", 987 | "note_from_unknown_2", 988 | "note_from_unknown_3", 989 | "bag_alchemy", 990 | "bag_farming", 991 | "bag_fishing", 992 | "bag_tools", 993 | "bag_potions", 994 | "bag_builder", 995 | "bag_food", 996 | "bag_universal", 997 | "bag_universal_big", 998 | "recipe_bag_alchemy", 999 | "recipe_bag_farming", 1000 | "recipe_bag_fishing", 1001 | "recipe_bag_tools", 1002 | "recipe_bag_potions", 1003 | "recipe_bag_builder", 1004 | "recipe_bag_food", 1005 | "recipe_bag_universal", 1006 | "recipe_bag_universal_big", 1007 | "ash_on_shawl", 1008 | "b_grat_points_incr:1", 1009 | "b_grat_points_incr:2", 1010 | "b_grat_points_incr:3", 1011 | "b_sin_shard:1", 1012 | "b_sin_shard:2", 1013 | "b_sin_shard:3", 1014 | "b_souls:1", 1015 | "b_souls:2", 1016 | "b_souls:3", 1017 | "blue_paint", 1018 | "brown_paint", 1019 | "d_green_paint", 1020 | "d_violet_paint", 1021 | "diamond_paint", 1022 | "envy_charged_shard", 1023 | "gerry_tooth", 1024 | "glass_broken", 1025 | "global_control", 1026 | "gluttony_charged_shard", 1027 | "gratitude_as_item", 1028 | "grave_bot_mrb_6", 1029 | "grave_bot_mrb_7", 1030 | "grave_bot_mrb_8", 1031 | "grave_bot_stn_6", 1032 | "grave_bot_stn_7", 1033 | "grave_bot_stn_8", 1034 | "grave_top_sculpt_mrb_4", 1035 | "grave_top_sculpt_mrb_5", 1036 | "grave_top_sculpt_stn_4", 1037 | "grave_top_sculpt_stn_5", 1038 | "green_paint", 1039 | "lost_book_part", 1040 | "lust_charged_shard", 1041 | "note_with_rumors", 1042 | "ode_for_bishop", 1043 | "pride_charged_shard", 1044 | "red_paint", 1045 | "sauce_for_meal", 1046 | "sin_shard", 1047 | "sin_shard_body_part", 1048 | "sloth_charged_shard", 1049 | "soul_harmed", 1050 | "soul_harmed_body_part", 1051 | "soul_healed", 1052 | "souls_zone_key", 1053 | "spice_paint", 1054 | "violet_paint", 1055 | "wrath_charged_shard", 1056 | "yellow_paint" 1057 | ], 1058 | "perks": 1059 | [ 1060 | "p_axeman", 1061 | "p_beekeeper2", 1062 | "p_big_guy", 1063 | "p_blabla", 1064 | "p_blacksmith", 1065 | "p_brewer", 1066 | "p_butcher", 1067 | "p_cardinal", 1068 | "p_collector", 1069 | "p_cook", 1070 | "p_cultist", 1071 | "p_doctor", 1072 | "p_engineer 1", 1073 | "p_engineer", 1074 | "p_farmer", 1075 | "p_fireman", 1076 | "p_jevelery", 1077 | "p_jeweler", 1078 | "p_journalist", 1079 | "p_magnifier", 1080 | "p_mason 1", 1081 | "p_mason", 1082 | "p_master_potter 1", 1083 | "p_master_potter", 1084 | "p_miner", 1085 | "p_naturalist 1", 1086 | "p_naturalist", 1087 | "p_natural_writer", 1088 | "p_preacher", 1089 | "p_scientist", 1090 | "p_shakespear", 1091 | "p_skinner", 1092 | "p_sword_master", 1093 | "p_wine_master", 1094 | "p_wine_master2", 1095 | "p_woodworker", 1096 | "p_writer", 1097 | "p_writer_thief" 1098 | ], 1099 | "relationships": { 1100 | "_rel_npc_blacksmith": { 1101 | "name": "Blacksmith" 1102 | }, 1103 | "_rel_npc_inquisitor": { 1104 | "name": "Inquisitor" 1105 | }, 1106 | "_rel_npc_tavern owner": { 1107 | "name": "Horadric" 1108 | }, 1109 | "_rel_npc_bishop": { 1110 | "name": "Bishop" 1111 | }, 1112 | "_rel_npc_royal_box": { 1113 | "name": "Royal Box" 1114 | }, 1115 | "_rel_npc_astrologer": { 1116 | "name": "Astrologer" 1117 | }, 1118 | "rel_npc_shepherd": { 1119 | "name": "Shepard" 1120 | }, 1121 | "_rel_npc_carpenter": { 1122 | "name": "Cory" 1123 | }, 1124 | "_rel_npc_dig": { 1125 | "name": "Dig" 1126 | }, 1127 | "_rel_npc_farmers son": { 1128 | "name": "Farmer's Son" 1129 | }, 1130 | "_rel_npc_mrs chain": { 1131 | "name": "Mrs. Chain" 1132 | }, 1133 | "_rel_npc_actor": { 1134 | "name": "Actor" 1135 | }, 1136 | "_rel_wood_cutter": { 1137 | "name": "Wood Cutter" 1138 | }, 1139 | "_rel_npc_engineer": { 1140 | "name": "Tress" 1141 | }, 1142 | "_rel_npc_miller": { 1143 | "name": "Miller" 1144 | }, 1145 | "_rel_npc_captain": { 1146 | "name": "Captain" 1147 | }, 1148 | "_rel_npc_farmers_daughter": { 1149 | "name": "Farmers Daughter" 1150 | }, 1151 | "_rel_npc_potter": { 1152 | "name": "Potter" 1153 | }, 1154 | "_rel_npc_merchant": { 1155 | "name": "Merchant" 1156 | }, 1157 | "_rel_npc_cultist": { 1158 | "name": "Cultist" 1159 | }, 1160 | "_rel_npc_light_keeper": { 1161 | "name": "Lighthouse Keeper" 1162 | }, 1163 | "_rel_npc_actress": { 1164 | "name": "Actress" 1165 | }, 1166 | "_rel_npc_shepherds_wife": { 1167 | "name": "Rosa" 1168 | }, 1169 | "_rel_npc_farmer": { 1170 | "name": "Farmer" 1171 | }, 1172 | "_rel_npc_witch": { 1173 | "name": "Witch" 1174 | } 1175 | }, 1176 | "technologies1": 1177 | [ 1178 | "p_t_beeswax", 1179 | "p_t_bee", 1180 | "p_t_butterfly", 1181 | "p_t_marble_gold", 1182 | "p_t_silver_ore", 1183 | "p_t_sulfur", 1184 | "p_t_obsidian", 1185 | "p_t_diamond", 1186 | "p_t_lifestone", 1187 | "p_t_graphite", 1188 | "p_t_maggot", 1189 | "p_t_emerald", 1190 | "p_t_pyrite", 1191 | "p_t_moth", 1192 | "p_t_old_books", 1193 | "p_t_gold_ore" 1194 | ], 1195 | "Comment1": "The technologies is for unlocked technologies, the technologies1 are the technologies saved in the inventory. But because I don't know conditions for it and didn't finish the game yet, I won't include them.", 1196 | "technologies": { 1197 | 1198 | }, 1199 | "Comment2": "Same as above", 1200 | "crafts": { 1201 | 1202 | }, 1203 | "Comment3": "There also seems to exist storage_1 as storage, but no idea what kind of game object that is", 1204 | "storage": [ 1205 | "mf_box_stuff", 1206 | "chest", 1207 | "rack_alchemy", 1208 | "obj_church_scroll_cabinet", 1209 | "obj_church_bookcase", 1210 | "rack_organs", 1211 | "refugee_camp_depot" 1212 | ] 1213 | } 1214 | -------------------------------------------------------------------------------- /data/html/loadsavefile.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Graveyard Keeper Savefile Editor | Save games 16 | 17 | 18 | 19 |
20 |
21 |
22 |
23 |

Following save files are available:

24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |

My thanks for the following stuff:

44 |
45 |
46 |
    47 |
  • 48 | Lazy Bear Games for making such a great game. 49 |
  • 50 |
  • 51 | tinyBuild for publishing it. 52 |
  • 53 |
  • 54 | Graveyard Keeper WIKI for having such great resources which I could use to check my code and 55 | already extracting the game icons + naming them, so I didn't have to try to extract the sprite atlas 56 | information (at least for earlier versions of the editor). 57 |
  • 58 |
  • 59 | Eel for making it easy for me to create a HTML GUI in a python script. 60 |
  • 61 |
  • 62 | JQuery and 63 | Materialize for making it easier to create the HTML content. 64 |
  • 65 |
66 |
67 |
68 |

Notes:

69 |
70 |
71 |
    72 |
  • 73 | If you have a save file which could help (for example a more up to date body of a perfect worker or the entire tech tree with all DLCs), 74 | feel free to upload your save to an issue. I will take the data from that save then to improve 75 | the several features of this save editor. 76 |
  • 77 |
  • 78 | Every loaded save file is kept in memory, meaning you can expect almost up to 200 MB per save file which you load. 79 |
  • 80 |
  • 81 | No sprites / images used, were created by me, they are from 82 | Lazy Bear Games 83 |
  • 84 |
  • 85 | Additionally the localization file is extracted from 86 | Lazy Bear Games 87 |
  • 88 |
  • 89 | You are able change all the values in the editor, but especially values like items can't be perfectly recreated and there 90 | might be bugs with them if you add new items (Because I can't reproduce the specific item types which 91 | may contain specific values, the script uses the last item in your inventory, duplicates it and replace 92 | it's item ID, amount and durability). Additionally like the Wiki mentions in the article about save 93 | file editing, it might be that some of your changes don't work because you didn't fulfill previous 94 | requirements. 95 |
  • 96 |
  • 97 | If you change the energy or your hp to a value above 100, your maximal hp / energy is set to the same value, if you want 98 | to reset it again, just set your hp or energy again to 100. 99 |
  • 100 |
  • 101 | If you find bugs or have feature requests (like an idea to add a functionality) feel free to report them on the 102 | GitHub Page. 103 |
  • 104 |
105 |
106 |
107 |

Miscellaneous:

108 |
109 | 114 |
115 | 116 | 117 |
118 | 119 | 315 | 316 | 317 | 318 | -------------------------------------------------------------------------------- /data/html/no settings.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Graveyard Keeper Savefile Editor | Welcome 17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 |

Hey, seems like you are using this Application for the first time, meaning you now have the chance to set 25 | some options. If the application automatically set a save folder please also check it to be sure that it is correct.

26 |
27 |
28 |
29 |
30 |
31 |
32 | 33 | 34 | Open 35 | 36 |
37 |
38 |
39 |
Check for Updates on application start
40 |
41 | 47 |
48 |
49 |
50 |
51 | 52 | 53 | 54 |
55 |
56 |
57 |
Enable "Expert" mode
58 |
59 | 65 |
66 |
This disables all the checks the application does for invalid data, meaning the likelihood of you breaking 67 | your save with a non existent item f.e. is increased. But if you know the internal id of an item and it doesn't 68 | exist, you can add it with this option. This option does not require an application restart, but it requires a 69 | page reload (so that the settings are loaded again). 70 |
71 |
72 |
73 |
Stranger Sins Support
74 |
75 | 81 |
82 |
Game Of Crone Support
83 |
84 | 90 |
91 |
Better Save Soul Support
92 |
93 | 99 |
100 |
This allows you to select which DLC you own. 101 |
Depending on owned DLC different autocomplete names are shown. 102 | Additionally some buttons have different functionality depending on the DLCs. 103 |
104 |
105 |
106 |
107 | 108 | 109 | 110 |
111 |
Backup saves are automatically zipped with deflate to save space on the disk. It is intended and correct that the name within the zip is always the same ([...].back_1). 112 |
113 |
114 |
115 |
116 |
117 |
118 | Done 119 |
120 | 121 |
122 | 123 |
124 | 125 | 226 | 227 | 228 | 229 | -------------------------------------------------------------------------------- /data/html/rsc/Blue_Tech_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Blue_Tech_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/Church_Rating_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Church_Rating_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/Copper_Coin_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Copper_Coin_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/Copper_Star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Copper_Star.png -------------------------------------------------------------------------------- /data/html/rsc/Empty_Star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Empty_Star.png -------------------------------------------------------------------------------- /data/html/rsc/Gold_Coin_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Gold_Coin_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/Gold_Star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Gold_Star.png -------------------------------------------------------------------------------- /data/html/rsc/Green_Tech_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Green_Tech_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/Happiness_or_Friendship_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Happiness_or_Friendship_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/Icon_skull_wreath_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Icon_skull_wreath_green.png -------------------------------------------------------------------------------- /data/html/rsc/Red_Tech_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Red_Tech_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/Silver_Coin_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Silver_Coin_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/Silver_Star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/Silver_Star.png -------------------------------------------------------------------------------- /data/html/rsc/White_Skull_Symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/White_Skull_Symbol.png -------------------------------------------------------------------------------- /data/html/rsc/crafting_skull_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/crafting_skull_3.png -------------------------------------------------------------------------------- /data/html/rsc/donkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/donkey.png -------------------------------------------------------------------------------- /data/html/rsc/envy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/envy.png -------------------------------------------------------------------------------- /data/html/rsc/gluttony.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/gluttony.png -------------------------------------------------------------------------------- /data/html/rsc/item_source_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/item_source_file.png -------------------------------------------------------------------------------- /data/html/rsc/lust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/lust.png -------------------------------------------------------------------------------- /data/html/rsc/npc_actor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_actor.png -------------------------------------------------------------------------------- /data/html/rsc/npc_actress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_actress.png -------------------------------------------------------------------------------- /data/html/rsc/npc_astrologer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_astrologer.png -------------------------------------------------------------------------------- /data/html/rsc/npc_beekeeper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_beekeeper.png -------------------------------------------------------------------------------- /data/html/rsc/npc_bishop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_bishop.png -------------------------------------------------------------------------------- /data/html/rsc/npc_blacksmith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_blacksmith.png -------------------------------------------------------------------------------- /data/html/rsc/npc_captain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_captain.png -------------------------------------------------------------------------------- /data/html/rsc/npc_carpenter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_carpenter.png -------------------------------------------------------------------------------- /data/html/rsc/npc_cultist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_cultist.png -------------------------------------------------------------------------------- /data/html/rsc/npc_dig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_dig.png -------------------------------------------------------------------------------- /data/html/rsc/npc_donkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_donkey.png -------------------------------------------------------------------------------- /data/html/rsc/npc_engineer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_engineer.png -------------------------------------------------------------------------------- /data/html/rsc/npc_euric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_euric.png -------------------------------------------------------------------------------- /data/html/rsc/npc_farmer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_farmer.png -------------------------------------------------------------------------------- /data/html/rsc/npc_farmers son.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_farmers son.png -------------------------------------------------------------------------------- /data/html/rsc/npc_farmers_daughter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_farmers_daughter.png -------------------------------------------------------------------------------- /data/html/rsc/npc_ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_ghost.png -------------------------------------------------------------------------------- /data/html/rsc/npc_gypsy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_gypsy.png -------------------------------------------------------------------------------- /data/html/rsc/npc_hunchback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_hunchback.png -------------------------------------------------------------------------------- /data/html/rsc/npc_inquisitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_inquisitor.png -------------------------------------------------------------------------------- /data/html/rsc/npc_light_keeper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_light_keeper.png -------------------------------------------------------------------------------- /data/html/rsc/npc_marquis_teodoro_jr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_marquis_teodoro_jr.png -------------------------------------------------------------------------------- /data/html/rsc/npc_merchant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_merchant.png -------------------------------------------------------------------------------- /data/html/rsc/npc_miller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_miller.png -------------------------------------------------------------------------------- /data/html/rsc/npc_mrs chain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_mrs chain.png -------------------------------------------------------------------------------- /data/html/rsc/npc_potter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_potter.png -------------------------------------------------------------------------------- /data/html/rsc/npc_refugee_coffin_maker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_refugee_coffin_maker.png -------------------------------------------------------------------------------- /data/html/rsc/npc_refugee_cook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_refugee_cook.png -------------------------------------------------------------------------------- /data/html/rsc/npc_refugee_tanner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_refugee_tanner.png -------------------------------------------------------------------------------- /data/html/rsc/npc_royal_box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_royal_box.png -------------------------------------------------------------------------------- /data/html/rsc/npc_shepard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_shepard.png -------------------------------------------------------------------------------- /data/html/rsc/npc_shepherds_wife.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_shepherds_wife.png -------------------------------------------------------------------------------- /data/html/rsc/npc_smiler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_smiler.png -------------------------------------------------------------------------------- /data/html/rsc/npc_tavern owner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_tavern owner.png -------------------------------------------------------------------------------- /data/html/rsc/npc_witch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_witch.png -------------------------------------------------------------------------------- /data/html/rsc/npc_wood_cutter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/npc_wood_cutter.png -------------------------------------------------------------------------------- /data/html/rsc/p_axeman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_axeman.png -------------------------------------------------------------------------------- /data/html/rsc/p_beekeeper2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_beekeeper2.png -------------------------------------------------------------------------------- /data/html/rsc/p_big_guy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_big_guy.png -------------------------------------------------------------------------------- /data/html/rsc/p_blabla.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_blabla.png -------------------------------------------------------------------------------- /data/html/rsc/p_blacksmith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_blacksmith.png -------------------------------------------------------------------------------- /data/html/rsc/p_brewer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_brewer.png -------------------------------------------------------------------------------- /data/html/rsc/p_butcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_butcher.png -------------------------------------------------------------------------------- /data/html/rsc/p_cardinal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_cardinal.png -------------------------------------------------------------------------------- /data/html/rsc/p_collector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_collector.png -------------------------------------------------------------------------------- /data/html/rsc/p_cook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_cook.png -------------------------------------------------------------------------------- /data/html/rsc/p_cultist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_cultist.png -------------------------------------------------------------------------------- /data/html/rsc/p_doctor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_doctor.png -------------------------------------------------------------------------------- /data/html/rsc/p_engineer 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_engineer 1.png -------------------------------------------------------------------------------- /data/html/rsc/p_engineer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_engineer.png -------------------------------------------------------------------------------- /data/html/rsc/p_farmer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_farmer.png -------------------------------------------------------------------------------- /data/html/rsc/p_fireman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_fireman.png -------------------------------------------------------------------------------- /data/html/rsc/p_jevelery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_jevelery.png -------------------------------------------------------------------------------- /data/html/rsc/p_jeweler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_jeweler.png -------------------------------------------------------------------------------- /data/html/rsc/p_journalist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_journalist.png -------------------------------------------------------------------------------- /data/html/rsc/p_magnifier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_magnifier.png -------------------------------------------------------------------------------- /data/html/rsc/p_mason 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_mason 1.png -------------------------------------------------------------------------------- /data/html/rsc/p_mason.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_mason.png -------------------------------------------------------------------------------- /data/html/rsc/p_master_potter 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_master_potter 1.png -------------------------------------------------------------------------------- /data/html/rsc/p_master_potter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_master_potter.png -------------------------------------------------------------------------------- /data/html/rsc/p_miner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_miner.png -------------------------------------------------------------------------------- /data/html/rsc/p_natural_writer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_natural_writer.png -------------------------------------------------------------------------------- /data/html/rsc/p_naturalist 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_naturalist 1.png -------------------------------------------------------------------------------- /data/html/rsc/p_naturalist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_naturalist.png -------------------------------------------------------------------------------- /data/html/rsc/p_preacher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_preacher.png -------------------------------------------------------------------------------- /data/html/rsc/p_scientist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_scientist.png -------------------------------------------------------------------------------- /data/html/rsc/p_shakespear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_shakespear.png -------------------------------------------------------------------------------- /data/html/rsc/p_skinner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_skinner.png -------------------------------------------------------------------------------- /data/html/rsc/p_sword_master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_sword_master.png -------------------------------------------------------------------------------- /data/html/rsc/p_t_bee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_t_bee.png -------------------------------------------------------------------------------- /data/html/rsc/p_t_beeswax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_t_beeswax.png -------------------------------------------------------------------------------- /data/html/rsc/p_t_butterfly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_t_butterfly.png -------------------------------------------------------------------------------- /data/html/rsc/p_t_maggot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_t_maggot.png -------------------------------------------------------------------------------- /data/html/rsc/p_t_moth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_t_moth.png -------------------------------------------------------------------------------- /data/html/rsc/p_t_pyrite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_t_pyrite.png -------------------------------------------------------------------------------- /data/html/rsc/p_wine_master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_wine_master.png -------------------------------------------------------------------------------- /data/html/rsc/p_wine_master2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_wine_master2.png -------------------------------------------------------------------------------- /data/html/rsc/p_woodworker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_woodworker.png -------------------------------------------------------------------------------- /data/html/rsc/p_writer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_writer.png -------------------------------------------------------------------------------- /data/html/rsc/p_writer_thief.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/p_writer_thief.png -------------------------------------------------------------------------------- /data/html/rsc/pride.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/pride.png -------------------------------------------------------------------------------- /data/html/rsc/sloth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/sloth.png -------------------------------------------------------------------------------- /data/html/rsc/unknown_item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/unknown_item.png -------------------------------------------------------------------------------- /data/html/rsc/wrath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetroScript/Graveyard-Keeper-Savefile-Editor/82c88dab0897c4472c77d24e6f25c71ca1e177c2/data/html/rsc/wrath.png -------------------------------------------------------------------------------- /data/itemversion: -------------------------------------------------------------------------------- 1 | 1 - Added the item Version System - After updating manually don't forget to update the itemversion file too. 2 | 2 - Changed wrong internal name for the item flyer, the first version of the prayer for imagination; Added icon for building_permission 3 | 3 - Added endless notebook 4 | 4 - This is a note that starting with version 0.1.16 the way changed how items are displayed, so for future item updates you need atleast 0.1.16 version. Additionally I want to mention 0.1.18 fixes the application not checking correctly if there is an update available (sorry for that) | DO NOT DO AN AUTOMATIC UPDATE HERE (THEN YOUR ITEM DISPLAY WILL BREAK) -------------------------------------------------------------------------------- /data/new_item_data.json: -------------------------------------------------------------------------------- 1 | { 2 | "bag_universal": {"type": 250,"v": {"1068875674":{"v":"","type":11},"id":{"v":"bag_universal","type":10},"value":{"v":1,"type":17},"min_value":{"v":null,"type":0},"max_value":{"v":null,"type":0},"linked_id":{"v":-1,"type":3},"self_chance":{"v":{"_expression":{"v":"","type":11},"_simplified":{"v":false,"type":2},"_simpified_float":{"v":0,"type":18},"default_value":{"v":0,"type":18}},"type":250},"common_chance":{"v":{"_expression":{"v":"","type":11},"_simplified":{"v":false,"type":2},"_simpified_float":{"v":0,"type":18},"default_value":{"v":0,"type":18}},"type":250},"chance_group":{"v":-1,"type":3},"is_unique":{"v":false,"type":2},"multiquality_items":{"v":[],"type":100},"equipped_as":{"v":{"1826761547":{"v":0,"type":16}},"type":250},"worker_unique_id":{"v":-1,"type":4},"_params":{"v":{"_res_type":{"v":[{"v":"inventory_size","type":10}],"type":100},"_res_v":{"v":[{"v":9,"type":5}],"type":100},"_hp":{"v":0,"type":18},"_progress":{"v":0,"type":18},"_money":{"v":0,"type":18},"_durability":{"v":1,"type":19}},"type":250},"inventory":{"v":[],"type":100},"secondary_inventory":{"v":[],"type":100},"_serialize_depth":{"v":0,"type":16},"sub_name":{"v":"","type":11}}}, 3 | "bag_universal_big": {"type": 250,"v": {"1068875674":{"v":"","type":11},"id":{"v":"bag_universal_big","type":10},"value":{"v":1,"type":17},"min_value":{"v":null,"type":0},"max_value":{"v":null,"type":0},"linked_id":{"v":-1,"type":3},"self_chance":{"v":{"_expression":{"v":"","type":11},"_simplified":{"v":false,"type":2},"_simpified_float":{"v":0,"type":18},"default_value":{"v":0,"type":18}},"type":250},"common_chance":{"v":{"_expression":{"v":"","type":11},"_simplified":{"v":false,"type":2},"_simpified_float":{"v":0,"type":18},"default_value":{"v":0,"type":18}},"type":250},"chance_group":{"v":-1,"type":3},"is_unique":{"v":false,"type":2},"multiquality_items":{"v":[],"type":100},"equipped_as":{"v":{"1826761547":{"v":0,"type":16}},"type":250},"worker_unique_id":{"v":-1,"type":4},"_params":{"v":{"_res_type":{"v":[{"v":"inventory_size","type":10}],"type":100},"_res_v":{"v":[{"v":12,"type":5}],"type":100},"_hp":{"v":0,"type":18},"_progress":{"v":0,"type":18},"_money":{"v":0,"type":18},"_durability":{"v":1,"type":19}},"type":250},"inventory":{"v":[],"type":100},"secondary_inventory":{"v":[],"type":100},"_serialize_depth":{"v":0,"type":16},"sub_name":{"v":"","type":11}}} 4 | } -------------------------------------------------------------------------------- /data/tools.py: -------------------------------------------------------------------------------- 1 | import struct 2 | 3 | # An array to convert the different data types to the struct character and their byte length 4 | structtypes = { 5 | 'int8': ['b', 1], 6 | 'uint8': ['B', 1], 7 | 'int16': ['h', 2], 8 | 'uint16': ['H', 2], 9 | 'int32': ['i', 4], 10 | 'uint32': ['I', 4], 11 | 'int64': ['q', 8], 12 | 'uint64': ['Q', 8], 13 | 'float': ['f', 4], 14 | 'double': ['d', 8], 15 | 'char': ['s', 1] 16 | } 17 | 18 | 19 | # Read Binary Data 20 | class BinaryReader: 21 | 22 | def __init__(self, file): 23 | self.file = file 24 | 25 | def read(self, typ): 26 | form, size = structtypes[typ] 27 | val = self.file.read(size) 28 | return struct.unpack(form, val)[0] 29 | 30 | 31 | # Write Binary Data 32 | class BinaryWriter: 33 | 34 | def __init__(self, file): 35 | self.file = file 36 | 37 | def write(self, typ, val): 38 | form = structtypes[typ][0] 39 | self.file.write(struct.pack(form, val)) 40 | -------------------------------------------------------------------------------- /data/types.py: -------------------------------------------------------------------------------- 1 | from enum import IntEnum 2 | from json import load 3 | 4 | 5 | # The possible serialisation types the game uses and their binary value (as int) 6 | class Types(IntEnum): 7 | NullValue = 0, 8 | Bool_True = 1, 9 | Bool_False = 2, 10 | Int32 = 3, 11 | Int64 = 4, 12 | Single = 5, 13 | Double = 6, 14 | Byte = 7, 15 | Char = 8, 16 | String = 9, 17 | String_Indexed = 10, 18 | String_Empty = 11, 19 | Json = 12, 20 | Vector2 = 13, 21 | Vector3 = 14, 22 | Quaternion = 15, 23 | Int32_0 = 16, 24 | Int32_1 = 17, 25 | Single_0 = 18, 26 | Single_1 = 19, 27 | Vector2_00 = 20, 28 | Vector2_11 = 21, 29 | Vector3_000 = 22, 30 | Vector3_111 = 23, 31 | Quaternion_0001 = 24, 32 | GenericList = 100, 33 | Array = 101, 34 | ByteArray = 102, 35 | SmartSerialized = 250 36 | 37 | 38 | # The localisation is english and I have to say I don't know if they are all correct and 39 | # they are not complete, considering I mostly was in it for the items and perks and so on 40 | # But still they may contain spoilers considering quite a few dialogues and so on are in 41 | # them so read it at your own risk 42 | with open("./data/locals.json", encoding="utf8") as f: 43 | id_to_name = load(f) 44 | 45 | # Generic game information 46 | with open("./data/html/items.json", encoding="utf8") as f: 47 | gamedata = load(f) 48 | 49 | with open("./data/data.json", encoding="utf8") as f: 50 | jsongamedata = load(f) 51 | 52 | # Load a list with default items, if those items have special attributes which would otherwise not work 53 | # (using the default item) 54 | with open("./data/new_item_data.json", encoding="utf8") as f: 55 | item_fallback_data = load(f) 56 | 57 | # A example item in the case of the inventory being empty and people wanting to add items to it 58 | fallback_item = { 59 | "type": 250, 60 | "v": { 61 | "value": { 62 | "type": 3, 63 | "v": 6 64 | }, 65 | "linked_id": { 66 | "type": 3, 67 | "v": -1 68 | }, 69 | "self_chance": { 70 | "type": 250, 71 | "v": { 72 | "_simpified_float": { 73 | "type": 18, 74 | "v": 0 75 | }, 76 | "_simplified": { 77 | "type": 2, 78 | "v": False 79 | }, 80 | "_expression": { 81 | "type": 11, 82 | "v": "" 83 | }, 84 | "default_value": { 85 | "type": 18, 86 | "v": 0 87 | } 88 | } 89 | }, 90 | "15320842": { 91 | "type": 100, 92 | "v": [] 93 | }, 94 | "equipped_as": { 95 | "type": 250, 96 | "v": { 97 | "1826761547": { 98 | "type": 16, 99 | "v": 0 100 | } 101 | } 102 | }, 103 | "_params": { 104 | "type": 250, 105 | "v": { 106 | "_hp": { 107 | "type": 18, 108 | "v": 0 109 | }, 110 | "_progress": { 111 | "type": 18, 112 | "v": 0 113 | }, 114 | "_durability": { 115 | "type": 19, 116 | "v": 1 117 | }, 118 | "_res_v": { 119 | "type": 100, 120 | "v": [] 121 | }, 122 | "_money": { 123 | "type": 18, 124 | "v": 0 125 | }, 126 | "_res_type": { 127 | "type": 100, 128 | "v": [] 129 | } 130 | } 131 | }, 132 | "chance_group": { 133 | "type": 3, 134 | "v": -1 135 | }, 136 | "sub_name": { 137 | "type": 11, 138 | "v": "" 139 | }, 140 | "is_unique": { 141 | "type": 2, 142 | "v": False 143 | }, 144 | "max_value": { 145 | "type": 0, 146 | "v": None 147 | }, 148 | "id": { 149 | "type": 10, 150 | "v": "wooden_plank" 151 | }, 152 | "min_value": { 153 | "type": 0, 154 | "v": None 155 | }, 156 | "common_chance": { 157 | "type": 250, 158 | "v": { 159 | "_simpified_float": { 160 | "type": 18, 161 | "v": 0 162 | }, 163 | "_simplified": { 164 | "type": 2, 165 | "v": False 166 | }, 167 | "_expression": { 168 | "type": 11, 169 | "v": "" 170 | }, 171 | "default_value": { 172 | "type": 18, 173 | "v": 0 174 | } 175 | } 176 | }, 177 | "multiquality_items": { 178 | "type": 100, 179 | "v": [] 180 | }, 181 | "_serialize_depth": { 182 | "type": 16, 183 | "v": 0 184 | }, 185 | "1068875674": { 186 | "type": 11, 187 | "v": "" 188 | } 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /data/version: -------------------------------------------------------------------------------- 1 | 0.1.24 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | psutil>=5.4.8 2 | Eel>=0.9.10 3 | setuptools 4 | packaging -------------------------------------------------------------------------------- /saves.md: -------------------------------------------------------------------------------- 1 | Information about additional edits which are possible in the JSON file 2 | ====================================================================== 3 | 4 | World game objects 5 | ------------------ 6 | 7 | In the file save (exportet as JSON) you have in `savedata->map->v->_wgos->v` a list with all "World Game Objects" of the game. 8 | Those include all interactable objects and more. The game saves the location of those. These include f.e. spots where hiccup grass grows, meaning you could change its location next to your house or even duplicate the objects (is what I assume, I didn't try it) 9 | Other interesting things you could change there are f.e. location of built objects, teleport spots (?, ids teleport_hatch, teleport_inside, teleport_outside, teleport_point - 1 teleport_hatch / teleport_inside / teleport_outside corresponds with 1 teleport_point because they have the same custom tag, meaning you probably can create new teleport points f.e. 1 infront of your house to the lighthouse) or NPC objects. 10 | Meaning if your NPC is broken you could try replacing it's data with the data from a save where it is not broken. (As far as I can tell no achievement or progress related data is stored in them, but I only took a look at a early game save). 11 | 12 | A list of a 10 Minute save with all the possible world game object ids and their amounts would be (as JSON): 13 | 14 | ```JSON 15 | {"swamp_table_constr":1,"swamp_bridge":1,"teleport_outside":13,"teleport_point":41,"mushroom_1":72,"fence_stone_h":14,"fence_wood_anc_b_1":20,"fence_wood_anc_r_2":3,"fence_wood_anc_f_1":16,"fence_wood_anc_b_0":5,"fence_wood_anc_b_10":4,"fence_wood_anc_f_0":2,"fence_wood_anc_r_10":2,"fence_wood_anc_r_4":1,"fence_wood_anc_r_1":6,"fence_wood_anc_r_0":1,"fence_wood_anc_l_10":3,"fence_wood_anc_l_2":2,"fence_wood_anc_l_1":6,"fence_wood_anc_f_10":3,"fence_wood_anc_f_6":6,"fence_wood_anc_f_4":4,"fence_wood_anc_b_5":2,"fence_wood_anc_b_4":3,"fence_wood_anc_b_2":3,"bat_test":10,"bonfire_burning":2,"mining_builddesk_broken":1,"d_obj_spiral_stair_stn_in_1":3,"teleport_inside":21,"teleport_hatch":5,"garden_builddesk_broken":1,"fence_wood_anc_l_0":5,"fence_wood_anc_l_4":5,"graveyard_zone_lvlup2":1,"graveyard_builddesk":1,"mf_wood_builddesk":1,"morgue_builddesk_broken":1,"church_builddesk":1,"cellar_builddesk":1,"tree_2_6":49,"tree_tiny_2":89,"tree_2_2":114,"tree_tiny_1":107,"tree_1_3":99,"bush_4":32,"bush_horizontal_3":42,"garden_grapes_broken":8,"flower_small_1":68,"flower_small_3":75,"flower_small_2":84,"flower_small_4":54,"flower_small_5":78,"flower_small_6":50,"flower_small_8":59,"flower_small_9":55,"roof_1":4,"beehouse_broken":4,"beegarden_table_broken":1,"tree_garden_builddesk":1,"stone_2":40,"tree_huge_1":10,"tree_old_2":23,"bush_5":219,"flower_small_7":83,"tree_old_1":24,"tree_old_3":21,"cremation_builddesk":1,"old_wood_stump_1":26,"old_wood_swamp_set_1":23,"old_wood_swamp_set_2":28,"wood_obstacle_steep_el":1,"wood_obstacle_v":1,"bush_horizontal_1":17,"bush_1_berry":7,"stone_4":30,"stone_3":19,"decor_stone":21,"stone_5":20,"stone_1":27,"land_clay_spot_1":2,"church_0":1,"npc_royal_box":1,"tree_mid_strip_1":17,"tree_3_1":43,"tree_mid_strip_2":17,"water_well":3,"mf_grindstone_1":2,"village_wc_Face":3,"house_1":1,"mf_box_stuff":4,"cooking_bonfire":2,"garden_of_stones_place":1,"witch_hut":1,"npc_witch":1,"church_closed_door":1,"morgue_1":1,"ruin_0":3,"morgue_throw_in_broken":1,"iron_ore":32,"stone_ore":3,"pile_of_sand":5,"lying_rock":1,"vegit_bracken_1":7,"vegit_bracken_2":43,"tree_2_1":35,"tree_2_4":73,"tree_3_4":23,"tree_3_3":34,"tree_1_2":76,"tree_2_5":50,"tree_3_2":39,"tree_tiny_3":83,"tree_1_1":55,"tree_1_4":54,"tree_3_3_stump":2,"tree_3_4_stump":3,"tree_1_1_stump":3,"bush_plump_2":36,"bush_2":100,"bush_horizontal_2":21,"bush_2_berry":10,"bush_3_berry":14,"mushroom_2":47,"hiccup_grass_3":4,"hiccup_grass_2":6,"hiccup_grass_1":8,"gate_wood_new_f_0":1,"fence_stone_v":5,"grave_ground":13,"lantern_obj":9,"tree_2_1_stump":8,"mf_timber_1":1,"mf_stones_1":1,"bridge_stn_broken":1,"tree_3_1_stump":4,"roof_2":3,"swamp_fishing_spot":1,"throw_body_river":1,"Tavern":1,"lantern_2":1,"mf_stones_1_decor":2,"mf_ore_1_complete_decor":6,"village_wc_Rgh":8,"stone_workshop_1":1,"village_house_1":2,"village_wc_Face_2":3,"village_house_2":1,"tree_3_4_bees_done":2,"tree_2_4_stump":2,"tree_2_5_stump":3,"tree_3_1_bees":1,"village_mill":1,"village_farmer_house_sml":1,"mole":3,"mill_broken_obj":1,"mf_anvil_2_decor":2,"mf_anvil_1_decor":1,"mf_anvil_3_decor":1,"mf_wood_panel_2_complete":1,"mf_coal_1_decor":2,"smithy_1":1,"barrel":14,"village_house_3":1,"garden_pumpkin_ready_village":4,"beehouse_decor":6,"garden_pumpkin":4,"tree_1_2_stump":1,"decor_tree_apple_1_flower":3,"tree_3_1_bees_done":3,"village_house_4":2,"npc_beekeeper":1,"garden_cabbage_ready_village":18,"village_house_5":1,"garden_carrot_ready_village":3,"garden_carrot":17,"garden_beet":14,"village_house_6":1,"garden_beet_ready_village":1,"garden_onion":11,"garden_grapes":3,"garden_lentils":9,"garden_cabbage_ready":2,"garden_cabbage":13,"village_house_7":1,"ruins_el_2":9,"garden_onion_ready_village":1,"garden_lentils_ready_village":1,"decor_tree_apple_2_green":2,"decor_tree_apple_3_red":1,"decor_tree_apple_1_red":4,"decor_tree_apple_2_flower":3,"camp_barrel_wagon":3,"village_farmer_house_mid":1,"village_henhouse":2,"village_hut_1":1,"egg_seller":1,"camp_horse_parking":1,"camp_tent_db_1":2,"camp_tent_df_1":1,"camp_tent_vf_1":2,"camp_tent_vf_2":1,"camp_wagon_chest_d":2,"camp_wagon_stuff":3,"camp_wagon_stuff_2":1,"campfire":2,"tree_1_4_stump":1,"storage_1":1,"decor_land_clay_spot_1":2,"mf_potter_wheel_1_decor":1,"npc_potter":1,"npc_shepherd":1,"npc_shepherds_wife":1,"farm":1,"sealman_house":1,"mf_timber_1_decor":2,"mf_beam_gantry_1_decor":2,"tree_2_2_stump":1,"garden_cannabis":11,"decor_mf_vine_press":1,"npc_dig":1,"village_pithos":1,"ruins_pillar_2":5,"burn_0":1,"tree_3_2_stump":1,"bonfire_smoldering":1,"npc_guard_9":1,"npc_guard_10":1,"forpost":1,"hatch_from_morgue":1,"mine":1,"sawmill_1":1,"big_broken_bridge":1,"lighthouse":1,"tree_1_3_stump":1,"ruins_viaduct_1":2,"ruins_viaduct_5":1,"ruins_viaduct_6":3,"ruins_viaduct_7":1,"ruins_viaduct_2":1,"ruins_pillar_1":7,"ruins_pillar_5":3,"ruins_pillar_6":3,"ruins_el_1":7,"turnpike_close":3,"nameplate_2":1,"npc_actor":1,"npc_gypsy":1,"npc_wood_cutter":1,"donkey":1,"npc_miller":1,"npc_blacksmith":1,"npc_farmer":1,"npc_tavern owner":1,"npc_captain":1,"npc_mrs chain":1,"npc_guard":1,"npc_guard_3":1,"npc_guard_4":1,"npc_guard_5":1,"npc_carpenter":1,"npc_engineer":1,"npc_farmers son":1,"talking_skull":1,"npc_redneck_1":1,"npc_redneck_2":1,"npc_redneck_3":1,"npc_redneck_4":1,"npc_redneck_5":1,"npc_redneck_6":1,"npc_guard_2":1,"npc_citizen_1":1,"npc_citizen_2":1,"npc_citizen_3":1,"npc_citizen_4":1,"npc_citizen_5":1,"npc_citizen_6":1,"npc_guard_torch":1,"npc_citizen_woman_1":1,"npc_citizen_woman_2":2,"npc_guard_6":1,"npc_guard_7":1,"npc_guard_8":1,"npc_alice":1,"npc_satyr":1,"npc_lilya":1,"npc_ghost":1,"npc_hunchback":1,"decor_tree_apple_2_red":4,"decor_tree_apple_3_green":4,"decor_tree_apple_1_green":6,"tree_apple_1_3_1":3,"tree_apple_1_3_3":2,"tree_apple_1_3_stump":3,"tree_apple_1_3_0":2,"fence_wood_anc_f_2":1,"garden_empty":1,"npc_light_keeper":1,"telescope":1,"tree_2_6_stump":1,"tree_3_3_squirrel":1,"village_lake_fishing_spot":1,"portal_marble":1,"marble_heap_mid_1":1,"marble_heap_mid_2":1,"marble_stand_inactive":1,"decor_tree_apple_3_flower":1,"steep_coal":2,"mf_stone_pile_1":1,"sea_fishing_spot":1,"witch_pylon":1,"mf_chocks_1_decor":1,"scarecrow":1,"river_fishing_spot":1,"idle_points_stock":3,"mining_hut":1,"steep_end_blue_L_obstruction":1,"steep_yellow_blockage":2,"steep_yellow_blockage_inactive":1,"steep_yellow_blockage_R_o":1,"tree_3_2_bees_done":2,"tree_3_3_bees_done":1,"tree_old_3_stump":1,"steep_marble":1,"steep_iron":1,"steep_stone":1,"mine_zombie":1,"barrel01_broken":5,"barrel03_broken":3,"tree_big_sawmill":1,"zombie_sawmill_unfinished_placer":1,"waterfall_fishing_spot":1,"bed":2,"cupboard":1,"oven":1,"hatch":2,"cooking_table":1,"cooking_stand":1,"chest":2,"stranger":1,"storage_builddesk":1,"box_pallet":1,"cashbox":1,"working_table":1,"empty":3,"dungeon_stairs":3,"barrel02_broken":6,"blockage_H_low":1,"mf_preparation_1":1,"mf_alchemy_survey":1,"church_candle":4,"bookcase_F_damaged":2,"bookcase_F_broken":2,"morgue_throw_out_broken":1,"d_obj_spiral_stair_stn_out_1":1,"flour_bag":3,"blockage_V_low":1,"dungeon_enter":1,"blockage_V_high":1,"blockage_H_high":2,"dungeon_obj_rack02":1,"dungeon_obj_vase02":3,"dungeon_obj_bench01_broken":1,"dungeon_grille_closed":2,"dungeon_grille_opened":2,"dungeon_obj_vase01_broken":3,"dungeon_obj_vase03":1,"dungeon_obj_vase01":1,"dungeon_obj_vase04":2,"dungeon_obj_table02":1,"dungeon_obj_chair_02_broken":1,"table_cultist_quest":1,"floor_grid_fire":1,"wall_cellar_1tile":1,"bookcase_F_broken_custom_zombie":1,"alchemy_builddesk":1,"sacrifice_builddesk":1,"zombie_in_mortuary":1,"church_pulpit":1,"church_bench":2,"church_altar":1,"donat_box_inside":1,"tavern_door03":2,"tavern_table":5,"bed_no_sleep_1":1,"obj_church_bookcase":1,"dungeon_obj_table05":1,"bed_no_sleep_2":1,"dungeon_obj_table01":1,"tavern_writers_table":1,"tavern_cupboard":1,"mining_hut_bed":1,"nameplate_1":1,"npc_bishop":1,"npc_actress":1,"npc_merchant":1,"npc_cultist":1,"npc_inquisitor":1,"npc_astrologer":1,"crafting_skull_3":1,"mf_chocks_1":1} 16 | ``` 17 | 18 | With this data (because all of them contain a location) it should be possible to recreate your current world map if you extract the base map (the underground) + the sprites of the id's. 19 | 20 | You can also generate this list by yourself, if you export as JSON and then select the `.html` export. If you open that in the browser, the code to generate that list is shown in the console. 21 | 22 | Achievements 23 | ------------ 24 | 25 | The number progress of achievements is stored in `savedata->achievements->v` 26 | If you f.e. started to catch 200 fish, you could find the entry with "fish_200" in `_completed->v` and at the same index in `_completed_n->v` you can set it f.e. to 199 and then fish 1 more fish to get the achievement. 27 | Same is possible with other achievements. 28 | 29 | Workers 30 | ------- 31 | 32 | References to your worker zombies are stored in `savedata->workers`. They are still saved within the wgo object. 33 | 34 | 35 | They have inventories and sub inventories. F.e. they have an inventory which contains `portable_backpack` - this backpack can contain other items. (Which Porter Workers are currently transporting) 36 | 37 | 38 | It is also possible to get information about the workers you have within a save. If you want to know for example what the efficiencies of your workers are, you can use the following code. (In the provided HTML export, because that contains the utility function used and the correct variables): 39 | 40 | ```JavaScript 41 | // Iterate all the objects in the world 42 | wgo.forEach((entry) => { 43 | // Save the ID of our object to a name for easier access 44 | const name = entry.v.obj_id.v; 45 | 46 | // If the ID is a worker zombie, we print out the object and the efficiency, and all used items of the worker 47 | if(name === "worker_zombie_1") 48 | { 49 | console.log(entry) 50 | // getValueForParamKey is one of the provided utility functions in a HTML exported save 51 | console.log(getValueForParamKey(entry.v["-1126421579"].v._params, "working_k")) 52 | // For every inventory item object, we map the object to the actual item ID 53 | console.log(entry.v["-1126421579"].v.inventory.v.map(item => item.v.id.v)) 54 | } 55 | }); 56 | ``` 57 | 58 | Unlocked Technologies 59 | --------------------- 60 | 61 | In `savedata->unlocked_techs` are your unlocked technologies (obviously), but the editor doesn't feature anything there because you can simply give you red, green and blue points to get them. 62 | 63 | 64 | ___________________________________________________________ 65 | 66 | If someone else wants to extend this information about additional data in the save, feel free to do so. --------------------------------------------------------------------------------