#!/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)