general mindustry schematic tools
Diffstat (limited to 'schem_creation/img2json/main.py')
| -rwxr-xr-x | schem_creation/img2json/main.py | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/schem_creation/img2json/main.py b/schem_creation/img2json/main.py new file mode 100755 index 0000000..d16d6c6 --- /dev/null +++ b/schem_creation/img2json/main.py @@ -0,0 +1,258 @@ +#!/bin/python +"""purpose: convert specific image colors to json""" + + +from PIL import Image +import json +from argparse import ArgumentParser +from rich.console import Console +console = Console() + +colors = { + (0, 0, 255): "water", + (110, 112, 128): "additive-reconstructor", + (110, 112, 128): "air-factory", + (154, 149, 128): "alloy-smelter", + (138, 144, 178): "arc", + (78, 79, 88): "armored-conveyor", + (176, 154, 143): "battery-large", + (176, 185, 128): "battery", + (152, 154, 128): "blast-drill", + (161, 154, 159): "blast-mixer", + (82, 82, 92): "boulder", + (152, 154, 164): "bridge-conduit", + (110, 112, 128): "bridge-conveyor", + (156, 182, 164): "coal-centrifuge", + (176, 165, 128): "combustion-generator", + (152, 154, 164): "command-center", + (110, 112, 128): "conduit", + (143, 112, 128): "constructor", + (154, 154, 164): "container", + (78, 79, 88): "conveyor", + (177, 135, 104): "copper-wall-large", + (177, 135, 104): "copper-wall", + (176, 178, 128): "core-foundation", + (176, 182, 128): "core-nucleus", + (176, 182, 159): "core-shard", + (152, 154, 164): "cryofluid-mixer", + (110, 112, 156): "cultivator", + (123, 123, 123): "cyclone", + (128, 112, 128): "deconstructor", + (176, 154, 143): "differential-generator", + (152, 154, 128): "diode", + (168, 136, 128): "disassembler", + (110, 112, 128): "distributor", + (154, 159, 180): "door-large", + (154, 159, 180): "door", + (110, 112, 128): "duct-bridge", + (110, 112, 128): "duct-router", + (82, 83, 93): "duct", + (143, 102, 91): "duo", + (110, 112, 128): "exponential-reconstructor", + (152, 154, 163): "force-projector", + (123, 123, 121): "foreshadow", + (110, 116, 128): "fuse", + (142, 144, 154): "graphite-press", + (110, 112, 128): "ground-factory", + (143, 112, 128): "hail", + (152, 146, 164): "hyper-processor", + (169, 173, 183): "illuminator", + (176, 136, 128): "impact-reactor", + (110, 84, 83): "incinerator", + (152, 154, 164): "interplanetary-accelerator", + (110, 112, 107): "inverted-sorter", + (110, 112, 107): "item-source", + (110, 112, 107): "item-void", + (110, 112, 128): "junction", + (152, 154, 143): "kiln", + (138, 154, 192): "lancer", + (143, 112, 128): "large-constructor", + (86, 86, 102): "large-logic-display", + (152, 146, 164): "laser-drill", + (152, 154, 128): "launch-pad", + (136, 154, 188): "liquid-container-full.png", + (136, 154, 188): "liquid-container", + (176, 185, 192): "liquid-junction", + (110, 112, 128): "liquid-router-full.png", + (110, 112, 128): "liquid-router", + (176, 154, 126): "liquid-source", + (136, 154, 192): "liquid-tank-full.png", + (136, 154, 192): "liquid-tank", + (176, 154, 159): "liquid-void", + (86, 86, 102): "logic-display", + (152, 146, 164): "logic-processor", + (152, 154, 164): "mass-driver", + (152, 135, 108): "mechanical-drill", + (152, 154, 143): "mechanical-pump", + (123, 116, 119): "meltdown", + (176, 149, 128): "melter", + (110, 112, 128): "memory-bank", + (110, 112, 128): "memory-cell", + (132, 174, 144): "mender", + (132, 174, 144): "mend-projector", + (110, 112, 128): "message", + (152, 146, 164): "micro-processor", + (110, 112, 128): "multiplicative-reconstructor", + (110, 112, 128): "multi-press", + (110, 112, 128): "naval-factory", + (152, 154, 164): "oil-extractor", + (53, 53, 53): "ore-coal", + (174, 124, 91): "ore-copper", + (142, 133, 162): "ore-lead", + (155, 146, 139): "ore-scrap", + (205, 159, 207): "ore-thorium", + (96, 107, 184): "ore-titanium", + (176, 154, 128): "overdrive-dome", + (176, 154, 128): "overdrive-projector", + (110, 112, 129): "overflow-gate", + (152, 154, 164): "parallax", + (74, 75, 83): "payload-conveyor", + (106, 107, 128): "payload-loader", + (152, 141, 128): "payload-propulsion-tower", + (110, 112, 128): "payload-router", + (110, 112, 126): "payload-source", + (110, 112, 123): "payload-unloader", + (110, 112, 128): "payload-void", + (136, 154, 192): "phase-conduit", + (176, 154, 128): "phase-conveyor", + (239, 201, 152): "phase-wall-large", + (239, 201, 152): "phase-wall", + (176, 178, 128): "phase-weaver", + (152, 161, 164): "plastanium-compressor", + (74, 75, 83): "plastanium-conveyor", + (203, 216, 126): "plastanium-wall-large", + (203, 216, 126): "plastanium-wall", + (110, 112, 155): "plated-conduit", + (152, 154, 164): "pneumatic-drill", + (176, 185, 128): "power-node-large", + (176, 185, 128): "power-node", + (176, 154, 128): "power-source", + (173, 149, 103): "power-void", + (111, 128, 205): "pulse-conduit", + (110, 112, 128): "pulverizer", + (152, 154, 163): "pyratite-mixer", + (110, 112, 128): "repair-point", + (110, 154, 128): "repair-turret", + (123, 123, 123): "ripple", + (136, 154, 192): "rotary-pump", + (110, 112, 128): "router", + (110, 112, 159): "rtg-generator", + (149, 154, 143): "salvo", + (123, 123, 123): "scatter", + (138, 112, 128): "scorch", + (154, 159, 180): "scrap-wall-gigantic", + (154, 159, 180): "scrap-wall-huge", + (154, 159, 180): "scrap-wall-large", + (154, 159, 180): "scrap-wall", + (152, 154, 164): "segment", + (152, 154, 128): "separator", + (74, 75, 83): "shock-mine", + (111, 112, 126): "silicon-crucible", + (144, 145, 156): "silicon-smelter", + # (110, 112, 128): "solar-panel-large", + # (110, 112, 128): "solar-panel", + # (110, 112, 128): "sorter", + (179, 48, 48): "spawn", + (123, 116, 123): "spectre", + (152, 149, 164): "spore-press", + (152, 154, 164): "steam-generator", + (176, 178, 136): "surge-tower", + (232, 208, 116): "surge-wall-large", + (232, 208, 116): "surge-wall", + (110, 112, 120): "swarmer", + # (110, 112, 128): "switch", + # (110, 112, 128): "tetrative-reconstructor", + (176, 154, 128): "thermal-generator", + (176, 146, 128): "thermal-pump", + (110, 112, 132): "thorium-reactor", + (128, 117, 165): "thorium-wall-large", + (128, 117, 165): "thorium-wall", + (154, 159, 180): "thruster", + (78, 79, 88): "titanium-conveyor", + (104, 116, 196): "titanium-wall-large", + (104, 116, 196): "titanium-wall", + (110, 116, 128): "tsunami", + (110, 112, 126): "underflow-gate", + (152, 154, 159): "unloader", + (173, 157, 164): "vault", + (136, 154, 164): "water-extractor", + (143, 152, 143): "wave", +} + + +def rgb_to_hex(rgb): + """converts rgb to hex""" + return "#%02x%02x%02x" % tuple(rgb) + + +def escape(color, text): + r, g, b = color + return f"\u001b[1m\u001b[38;2;{r};{g};{b}m{text}" + + +if __name__ == "__main__": + parser = ArgumentParser( + "objective(c): convert specific image colors to msch") + parser.add_argument("-i", "--image", dest="image", + help="image(s) to convert, when using multiple images will layer them", nargs="+") + parser.add_argument("-o", "--output", dest="output", + help="output file(s)", type=str) + parser.add_argument("-l", "--list", dest="list", + action="store_true", help="list all colors, and exit") + parser.add_argument("-n", "--name", dest="name", + help="name to use", default="test", nargs="*") + parser.add_argument("-d", "--description", + dest="description", help="description", default="testonks", nargs="*") + + args = parser.parse_args() + args.name = " ".join(args.name) + args.description = " ".join(args.description) + + if args.list: + for key, item in colors.items(): + print(escape(key, f"{item}: {rgb_to_hex(key)}")) + exit(0) + if args.image is None: + raise IOError("image not specified") + if args.output is None: + raise IOError("output not specified") + + out = { + "name": args.name, + "description": args.description, + "tags": ["fuck@you"], + "width": 0, + "height": 0, + "blocks": [] + } + + for i, img in enumerate(args.image): + parsedimg = Image.open(img) + pix = parsedimg.load() + width, height = parsedimg.size + if i != 0: + if width != out["width"] or height != out["height"]: + raise IOError("all images must be the same size!") + out["width"] = width + out["height"] = height + console.log(f"working on image {i+1}: img") + for x in range(width): + for y in range(height): + pixcolor = pix[x, y][:3] # :3 + r, g, b = pixcolor + if pixcolor in colors: + name = colors[pixcolor] + console.log(f"{name} found at {x}, {y}") + out["blocks"].append( + { + "type": name, + "x": x, + "y": y, + "rotation": 0, + "config": 0 + } + ) + + console.log(out) + with open(args.output, "w") as f: + json.dump(out, f) |