{ "info": { "author": "BLooperZ", "author_email": "blooperz@users.noreply.github.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Topic :: Games/Entertainment", "Topic :: Software Development :: Build Tools", "Topic :: Utilities" ], "description": "# NUTCracker\nTools for editing resources in SCUMM games.\n\n## Features:\n* Extract and Edit fonts for v5-v7 + HE\n* Extract and Edit NUT fonts - v7-v8\n* Extract and Replace SMUSH video frames\n* Compress SMUSH videos (like scummvm-tools)\n* Extract and Rebuild game resources - v5-v8 + HE\n* Extract and Inject text strings - v5-v8 + HE\n* Extract and Replace background and objects images - v5-v8 + HE (option to extract EGA backgrounds)\n* Decompile V5 Scripts to Windex-like (SCUMM debugger from https://quickandeasysoftware.net/monkey-island-2-talkie-prototype) syntax\n\n## Resources\n\n### Extract and rebuild\n\nSupported games: V5-V8, HE\n\nExtract game resources to patch files using:\n```\nnutcracker sputm extract PATH/TO/GAME.000\n```\n*Replace `PATH/TO/GAME.000` to actual game index file (Usually ends with `.000`, `.LA0` or `.HE0`)\n\nThis also creates XML-like file `rpdump.xml` to show which files were extracted.\n\nRebuild game resources from patches (using original resource as reference):\n```\nnutcracker sputm build --ref PATH/TO/GAME.000 GAME\n```\n\n## Fonts\n\n### SPUTM Font (`CHAR` chunks)\n\nSupported games: V5-V7, HE\n\nExtract the fonts using:\n```\nnutcracker sputm fonts_extract PATH/TO/GAME.000\n```\n\n*Replace `PATH/TO/GAME.000` to actual game index file (Usually ends with `.000`, `.LA0` or `.HE0`)\n\nfonts will be extracted as PNG images to directory `GAME/chars` relative to workdir.\n\n*Replace `GAME` with name of the game (e.g. `ATLANTIS` if game index file is `ATLANTIS.000`)\n\nModify the font images with any image editor.\n\nCreate patch files for the modified font:\n```\nnutcracker sputm fonts_inject --ref PATH/TO/GAME.000 GAME\n```\nRebuild game resources\n```\nnutcracker sputm build --ref PATH/TO/GAME.000 GAME\n```\n\n### NUT Fonts\n\nSupported games: V7-V8\n\n#### Decoding\nDecode all NUT files in given directory DATADIR\n```\nnutcracker smush decode DATADIR/*.NUT --nut --target OUTDIR\n```\nCreates a font image file named chars.png in OUTDIR which can be edited using regular image editing software (e.g. GIMP)\n\n#### Encoding\nEncode given font image (PNG_FILE) with given codec number (CODEC) using REF_NUT_FILE as reference\n```\npython -m nutcracker.smush.encode PNG_FILE --target NEW_NUT_FILE --ref REF_NUT_FILE --codec CODEC [--fake CODEC]\n```\nThis will convert font image file back to font file (NEW_NUT_FILE) which can be used in game.\n\nAvailable codecs: \n* 21 (FT + The Dig*)\n* 44 (COMI*)\n\n*FONT3.NUT and the fonts in The Dig was actually encoded using codec 21 method but marked as 44.\nIt can be achieved using `--codec 21 --fake 44`.\nsee examples in [test.bat](test.bat)\n\n## SMUSH Videos\n\n### Decode and Re-encode\n\nSupported games: V7-V8\n\nDecode frames using\n```\nnutcracker smush decode DATADIR/*.SAN --target OUTDIR\n```\nFrames will be extracted as PNG files to `OUTDIR/VIDEO.SAN`\nwhere `VIDEO.SAN` matches the filename of the video.\n\nRe-encode the video using:\n```\npython -m nutcracker.smush.encode_san_seq DATADIR/VIDEO.SAN\n``` \nwhere DATADIR/VIDEO.SAN is path to original SMUSH video file\n\nThe new video will be created as `NEW_VIDEO2.SAN` in workdir\n\n*To reduce result file size, it is recommended to only re-encode modified frames, this can be done by removing unaltered frames from `OUTDIR/VIDEO.SAN`\n\n### Compress\n\nSupported games: V7-V8\n\nCompress video frames using zlib compression, as in scummvm-tools\n```\nnutcracker smush compress DATADIR/*.SAN\n```\n\n## Text\n\n### Extract and Inject script text\n\nSupported games: V5-V8, HE\n\nExtract all texts from game to text file using:\n```\nnutcracker sputm strings_extract --textfile strings.txt PATH/TO/GAME.000\n```\n*Replace `PATH/TO/GAME.000` to actual game index file (Usually ends with `.000`, `.LA0` or `.HE0`)\n\nEdit the text file using regular text editor.\n\nInject the modified text in game resources using:\n```\nnutcracker sputm strings_inject --textfile strings.txt PATH/TO/GAME.000\n```\n\n### Decompile game script\n\nSupported games: V5\n\nDecompile game scripts to script file with Windex-like syntax:\n\n```\npython -m nutcracker.sputm.windex_v5 PATH/TO/GAME.000\n```\n*Replace `PATH/TO/GAME.000` to actual game index file (Usually ends with `.000`, `.LA0` or `.HE0`)\n\n\n## Graphics\n\n### Room background and object images\n\nSupported games: V5-V8, HE\n\nExtract room background and object images using:\n\n```\nnutcracker sputm room decode [--ega] PATH/TO/GAME.000\n```\n*Replace `PATH/TO/GAME.000` to actual game index file (Usually ends with `.000`, `.LA0` or `.HE0`)\n\n*Use the `--ega` if you wish to simulate EGA graphics on games with EGA backward compatibility mode, don't use it if you wish to modify the graphics for injecting modified graphics later\n\nRoom backgrounds and Object images will be extracted as PNG images in `GAME/backgrounds` and `GAME/objects` respectively, where `GAME` is replaced with the name of the game.\n\nModify the image files, it's recommended to use image editor without palette optimization, such as GraphicsGale.\n\nCreate patch files for the modified images using:\n```\nnutcracker sputm room encode --ref PATH/TO/GAME.000 GAME\n```\nRebuild game resources\n```\nnutcracker sputm build --ref PATH/TO/GAME.000 GAME\n```\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "scumm,sputm,smush,lucasarts,humongous", "license": "GPL-3.0-or-later", "maintainer": "", "maintainer_email": "", "name": "nutcracker", "package_url": "https://pypi.org/project/nutcracker/", "platform": "", "project_url": "https://pypi.org/project/nutcracker/", "project_urls": { "repository": "https://github.com/blooperz/nutcracker" }, "release_url": "https://pypi.org/project/nutcracker/0.3.14159/", "requires_dist": [ "numpy (>=1.19.1,<2.0.0)", "parse (>=1.18.0,<2.0.0)", "Pillow (>=8.0.1,<9.0.0)", "typer (>=0.3.2,<0.4.0)", "PyYAML (>=5.4.1,<6.0.0)", "deal (>=4.5.0,<5.0.0)" ], "requires_python": ">=3.9,<4.0", "summary": "Tools for editing resources in SCUMM games.", "version": "0.3.14159", "yanked": false, "yanked_reason": null }, "last_serial": 11886305, "releases": { "0.3.1": [ { "comment_text": "", "digests": { "md5": "19fe60b8daf1d274a6a6358c3e2360ee", "sha256": "98c33b2a649e564b427e88a998c62c1c743fcb0571d9a72e40fc1e1c9491eced" }, "downloads": -1, "filename": "nutcracker-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "19fe60b8daf1d274a6a6358c3e2360ee", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 45582, "upload_time": "2019-10-26T16:51:52", "upload_time_iso_8601": "2019-10-26T16:51:52.056484Z", "url": "https://files.pythonhosted.org/packages/58/51/d779545f6719c4b1f7e2843cb5ced3581667a50834955f1d9d570a9c836b/nutcracker-0.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4a7a099be8cb475491a1a1439d4d28b6", "sha256": "74dc084b8874189628aebdb4a342b09090a279d7b1c6a5ea919f7b33e3b15a4b" }, "downloads": -1, "filename": "nutcracker-0.3.1.tar.gz", "has_sig": false, "md5_digest": "4a7a099be8cb475491a1a1439d4d28b6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 33559, "upload_time": "2019-10-26T16:51:54", "upload_time_iso_8601": "2019-10-26T16:51:54.605207Z", "url": "https://files.pythonhosted.org/packages/8f/98/910e66b925bc544b3e4fdeab761b014ccddbe211c13643cad9159743cc60/nutcracker-0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.11": [ { "comment_text": "", "digests": { "md5": "0ff3ac5406954ba3bc16313e16626dc2", "sha256": "0d53ad87b1b2b3aa4e444841bdb0403b99a9933b7201b2c11a69aac6b017435b" }, "downloads": -1, "filename": "nutcracker-0.3.11-py3-none-any.whl", "has_sig": false, "md5_digest": "0ff3ac5406954ba3bc16313e16626dc2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 45710, "upload_time": "2019-10-26T17:19:58", "upload_time_iso_8601": "2019-10-26T17:19:58.090193Z", "url": "https://files.pythonhosted.org/packages/89/9c/c3c0a21a3934d452bfa8ed7f3152216bca5a82631662a6c3b2e08c27d818/nutcracker-0.3.11-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e1bd4d7a183c571e45f50a21c71ee92a", "sha256": "1f76f3d2f24059d450d3b2f5103c1acc2ecabefc7f1d4bca8c453eabdab881c8" }, "downloads": -1, "filename": "nutcracker-0.3.11.tar.gz", "has_sig": false, "md5_digest": "e1bd4d7a183c571e45f50a21c71ee92a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 33611, "upload_time": "2019-10-26T17:19:59", "upload_time_iso_8601": "2019-10-26T17:19:59.494202Z", "url": "https://files.pythonhosted.org/packages/f9/d0/2b1fc81008071aa1ca4eebe4d2f7f6b5bb61e3ce18c1bb894f858a98f5af/nutcracker-0.3.11.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.12": [ { "comment_text": "", "digests": { "md5": "a8ba92789b3caa15352f8190b52be4e3", "sha256": "0991c739b07cd960dcb1fbbc354505194f75761ddad438e6953b4c3b2275afbb" }, "downloads": -1, "filename": "nutcracker-0.3.12-py3-none-any.whl", "has_sig": false, "md5_digest": "a8ba92789b3caa15352f8190b52be4e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 74328, "upload_time": "2020-03-16T20:45:12", "upload_time_iso_8601": "2020-03-16T20:45:12.630085Z", "url": "https://files.pythonhosted.org/packages/7f/a2/83e06b893cacc0e0940fe9e0977685fe78dcd83e1fec284941584b05b10b/nutcracker-0.3.12-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "19c81db9f3c40a319079744cf77454ab", "sha256": "e884da02718bad4d4772f3a923dc488f16714f6e46465cf685830421d6702cd2" }, "downloads": -1, "filename": "nutcracker-0.3.12.tar.gz", "has_sig": false, "md5_digest": "19c81db9f3c40a319079744cf77454ab", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 55421, "upload_time": "2020-03-16T20:45:14", "upload_time_iso_8601": "2020-03-16T20:45:14.926796Z", "url": "https://files.pythonhosted.org/packages/df/fe/be8258740ea3cdcd2e72f6b53a767c36f529dc745a3ad097591f4abe950b/nutcracker-0.3.12.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.13": [ { "comment_text": "", "digests": { "md5": "8f02f774b947ea008197a9de36d53473", "sha256": "eabe1579b50483fb97edb79c9ef555c27954671eea7f6f3ef404df959400ca62" }, "downloads": -1, "filename": "nutcracker-0.3.13.tar.gz", "has_sig": false, "md5_digest": "8f02f774b947ea008197a9de36d53473", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 57795, "upload_time": "2020-07-31T13:34:10", "upload_time_iso_8601": "2020-07-31T13:34:10.130779Z", "url": "https://files.pythonhosted.org/packages/3b/b4/4cdf07844bde1f12ad888b13e380aa605499e8e66f04c3d8f49845680cf6/nutcracker-0.3.13.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.14": [ { "comment_text": "", "digests": { "md5": "dce04cc2565e977133dc52c8cd5e7473", "sha256": "e167e7591b3077e53215bc2f9363b281603ccf92b80892fa8b1ae7d4526db1a4" }, "downloads": -1, "filename": "nutcracker-0.3.14.tar.gz", "has_sig": false, "md5_digest": "dce04cc2565e977133dc52c8cd5e7473", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 66301, "upload_time": "2020-08-02T18:56:14", "upload_time_iso_8601": "2020-08-02T18:56:14.847636Z", "url": "https://files.pythonhosted.org/packages/77/99/931fe04f5d526e5715bf9777be5998c3d5e250e56453262ff375cc14f3b2/nutcracker-0.3.14.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.141": [ { "comment_text": "", "digests": { "md5": "7791534484063ba2c52dd4db44797b9d", "sha256": "37d4614a544397944cd3d9f2044f77c9f1415805689c9628dc110fa383dfc876" }, "downloads": -1, "filename": "nutcracker-0.3.141-py3-none-any.whl", "has_sig": false, "md5_digest": "7791534484063ba2c52dd4db44797b9d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.9,<4.0", "size": 102397, "upload_time": "2021-02-04T21:02:19", "upload_time_iso_8601": "2021-02-04T21:02:19.222130Z", "url": "https://files.pythonhosted.org/packages/2c/64/a7ccdaab0d7c05ec67af94270c226b36c4b605e1adb59b822d133d2bd642/nutcracker-0.3.141-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "70e4b93f6ebb1cb39f51acf24e7e634e", "sha256": "fc4cef15a0485725c6d12d1de1f5c6527efb0c71f499b23e07c022708331349d" }, "downloads": -1, "filename": "nutcracker-0.3.141.tar.gz", "has_sig": false, "md5_digest": "70e4b93f6ebb1cb39f51acf24e7e634e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.9,<4.0", "size": 74383, "upload_time": "2021-02-04T21:02:21", "upload_time_iso_8601": "2021-02-04T21:02:21.422123Z", "url": "https://files.pythonhosted.org/packages/20/a0/91cdd3a9cdbd368bd9a134b7b78c98a655dba5ff0e75f95b218f595d8eff/nutcracker-0.3.141.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.1415": [ { "comment_text": "", "digests": { "md5": "25f3580d56e1e3a98b73507adc1a4e56", "sha256": "1a8f8f261e79ceb0332d52ba347ac47e902b1d12611488273ac6520ea2e9c1ed" }, "downloads": -1, "filename": "nutcracker-0.3.1415-py3-none-any.whl", "has_sig": false, "md5_digest": "25f3580d56e1e3a98b73507adc1a4e56", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.9,<4.0", "size": 111957, "upload_time": "2021-05-28T14:15:11", "upload_time_iso_8601": "2021-05-28T14:15:11.414366Z", "url": "https://files.pythonhosted.org/packages/e9/42/b40b261222ccbdaf174227ea5d5378a84abb263e000907eba77e8661ba80/nutcracker-0.3.1415-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f3eb05197b0838e5058c545ca4d4e0aa", "sha256": "7f445738c9ce8913fe8b175760e9d322801b244997412b6307b03d02d1e8aec4" }, "downloads": -1, "filename": "nutcracker-0.3.1415.tar.gz", "has_sig": false, "md5_digest": "f3eb05197b0838e5058c545ca4d4e0aa", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.9,<4.0", "size": 85753, "upload_time": "2021-05-28T14:15:16", "upload_time_iso_8601": "2021-05-28T14:15:16.138802Z", "url": "https://files.pythonhosted.org/packages/ad/51/6044d24539921d6aca375a9cf057cdc0a993d6b393956c349fd97695c2cc/nutcracker-0.3.1415.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.14159": [ { "comment_text": "", "digests": { "md5": "de4ff3eeb961edcd86dccc30883747c1", "sha256": "52ce4b999b3a030207af10a7e42da38cae90e568e33365855e67382b25c7f746" }, "downloads": -1, "filename": "nutcracker-0.3.14159-py3-none-any.whl", "has_sig": false, "md5_digest": "de4ff3eeb961edcd86dccc30883747c1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.9,<4.0", "size": 121620, "upload_time": "2021-10-31T22:17:02", "upload_time_iso_8601": "2021-10-31T22:17:02.534693Z", "url": "https://files.pythonhosted.org/packages/8e/34/ed3f8c9888b3db17170eab6e30a401f92ecc4d9edcdb52677ea76475ad8b/nutcracker-0.3.14159-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1dc0958317eca8fb35689ace0f36e70b", "sha256": "68ab00e38129e0e8618f6895dd66461dccc91ec26bb83bb256327a326131de33" }, "downloads": -1, "filename": "nutcracker-0.3.14159.tar.gz", "has_sig": false, "md5_digest": "1dc0958317eca8fb35689ace0f36e70b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.9,<4.0", "size": 96256, "upload_time": "2021-10-31T22:17:05", "upload_time_iso_8601": "2021-10-31T22:17:05.873214Z", "url": "https://files.pythonhosted.org/packages/87/88/51e9815284306c483b7cc7c6017bd3ddb1a5d4a3ddfa48a7e9d7b83de10f/nutcracker-0.3.14159.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "de4ff3eeb961edcd86dccc30883747c1", "sha256": "52ce4b999b3a030207af10a7e42da38cae90e568e33365855e67382b25c7f746" }, "downloads": -1, "filename": "nutcracker-0.3.14159-py3-none-any.whl", "has_sig": false, "md5_digest": "de4ff3eeb961edcd86dccc30883747c1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.9,<4.0", "size": 121620, "upload_time": "2021-10-31T22:17:02", "upload_time_iso_8601": "2021-10-31T22:17:02.534693Z", "url": "https://files.pythonhosted.org/packages/8e/34/ed3f8c9888b3db17170eab6e30a401f92ecc4d9edcdb52677ea76475ad8b/nutcracker-0.3.14159-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1dc0958317eca8fb35689ace0f36e70b", "sha256": "68ab00e38129e0e8618f6895dd66461dccc91ec26bb83bb256327a326131de33" }, "downloads": -1, "filename": "nutcracker-0.3.14159.tar.gz", "has_sig": false, "md5_digest": "1dc0958317eca8fb35689ace0f36e70b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.9,<4.0", "size": 96256, "upload_time": "2021-10-31T22:17:05", "upload_time_iso_8601": "2021-10-31T22:17:05.873214Z", "url": "https://files.pythonhosted.org/packages/87/88/51e9815284306c483b7cc7c6017bd3ddb1a5d4a3ddfa48a7e9d7b83de10f/nutcracker-0.3.14159.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }