Skip to content

Instantly share code, notes, and snippets.

@FelixWolf
Created October 25, 2022 11:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FelixWolf/ee9751c6fe8cf700a0568312af6758ca to your computer and use it in GitHub Desktop.
Save FelixWolf/ee9751c6fe8cf700a0568312af6758ca to your computer and use it in GitHub Desktop.
Bramble Maze
#!/usr/bin/env python3
from PIL import Image
import struct
palette = [
0x00000000, 0x000001ff, 0xfffffeff, 0xb57b4aff, 0xf0e0c0ff, 0xa88068ff,
0x784830ff, 0x906810ff, 0xe08048ff, 0xf0e8e8ff, 0xc07800ff, 0x18a800ff,
0x502818ff, 0x604808ff, 0xb09058ff, 0x3888c8ff, 0xe06068ff, 0x108000ff,
0xd6d6ceff, 0xb53129ff, 0x940808ff, 0xb50000ff, 0xad2910ff, 0xbd4218ff,
0xe74a52ff, 0xb53910ff, 0xce4a52ff, 0xbd3918ff, 0x943110ff, 0xd67318ff,
0xa53918ff, 0xde7b42ff, 0x9c4218ff, 0xe7844aff, 0xbd5a18ff, 0xce6318ff,
0x522110ff, 0xef9408ff, 0xad8c73ff, 0xc66329ff, 0xde7331ff, 0x8c4a29ff,
0xe78442ff, 0x943131ff, 0xff9452ff, 0xc66b39ff, 0xf78c52ff, 0x735a18ff,
0x633918ff, 0xbd7300ff, 0xef8c52ff, 0xad6331ff, 0xce7b63ff, 0xc69439ff,
0xb5735aff, 0xbd4242ff, 0xce8c6bff, 0xbd7329ff, 0xdead18ff, 0xa5846bff,
0x6b5a4aff, 0xceb594ff, 0xb5a584ff, 0xb59c7bff, 0xffb55aff, 0xdead31ff,
0xffc642ff, 0xa58c73ff, 0xbd9c73ff, 0xadad63ff, 0x947321ff, 0xad7b63ff,
0xbdb57bff, 0xd6c663ff, 0xa5a57bff, 0x8c735aff, 0x84634aff, 0x4a2910ff,
0xc68c21ff, 0xf7bd18ff, 0xefe794ff, 0xad947bff, 0x948c63ff, 0xcec694ff,
0xf7e773ff, 0xd6c694ff, 0xc6ce7bff, 0xf7de4aff, 0xffff00ff, 0xffe74aff,
0xc6c610ff, 0xdec6adff, 0xce7b7bff, 0xc6bd9cff, 0xb59c84ff, 0xefe7bdff,
0x636b5aff, 0x6b734aff, 0xf7de63ff, 0x948c10ff, 0xbdc663ff, 0x9c8c29ff,
0x949442ff, 0xffde31ff, 0xdebd4aff, 0x9cad00ff, 0xc6ce94ff, 0xd6ceadff,
0xbdad94ff, 0x737b21ff, 0x7ba542ff, 0xceb59cff, 0x637b5aff, 0x525a39ff,
0x525a21ff, 0x94a552ff, 0xe7de00ff, 0x637b39ff, 0xadc694ff, 0xa5b57bff,
0xbdad39ff, 0x42ad29ff, 0xffef73ff, 0x63ad52ff, 0xffe763ff, 0xbdbd4aff,
0x94ad31ff, 0xadad4aff, 0x5a8429ff, 0xadb508ff, 0x4abd29ff, 0xc6b594ff,
0x5aa54aff, 0x526b21ff, 0x317b21ff, 0x94bd6bff, 0x295a18ff, 0x527b4aff,
0x52a542ff, 0x188408ff, 0x188c08ff, 0xefe7ceff, 0xadb59cff, 0x4a2110ff,
0x526b52ff, 0x8c947bff, 0x84a584ff, 0x182118ff, 0x738c6bff, 0x94a563ff,
0x396331ff, 0x397b31ff, 0x398c31ff, 0x186b10ff, 0x31ce5aff, 0x18a508ff,
0x9cc694ff, 0x6bad63ff, 0x42a55aff, 0x213118ff, 0x395239ff, 0x39d663ff,
0x84bd7bff, 0x214a18ff, 0x31b552ff, 0x216b29ff, 0x297321ff, 0x42bd63ff,
0x105a08ff, 0x084a08ff, 0x083908ff, 0x7bce73ff, 0x39bd5aff, 0xadd6a5ff,
0x315231ff, 0x39944aff, 0xad9c84ff, 0x6b8463ff, 0x73b57bff, 0x9cb5a5ff,
0x7b947bff, 0x94b594ff, 0xa5bdadff, 0x4a6b4aff, 0xa5ad7bff, 0x425a4aff,
0x426b42ff, 0xadf79cff, 0x395a42ff, 0x94c694ff, 0xd6c6adff, 0x7b8c7bff,
0x73736bff, 0xbdceb5ff, 0x637b6bff, 0x314a39ff, 0x102910ff, 0xc6d6c6ff,
0x4a634aff, 0xbdd6b5ff, 0x7b9484ff, 0x293921ff, 0xc6c69cff, 0x395a63ff,
0x94a594ff, 0xadc6adff, 0x8c9c8cff, 0xbdbdb5ff, 0x9cb59cff, 0x5a849cff,
0x634a31ff, 0xadceb5ff, 0x101810ff, 0x213929ff, 0x8cadb5ff, 0xa5ada5ff,
0x42738cff, 0x949c94ff, 0x4a4a39ff, 0x314229ff, 0x42737bff, 0x5a7b84ff,
0xdeceb5ff, 0xd6deceff, 0xd6d6b5ff, 0xcebda5ff, 0x395a73ff, 0xada594ff,
0x211808ff, 0x394a39ff, 0x314242ff, 0x102129ff, 0xc69c94ff, 0x426b7bff,
0xbd9c8cff, 0x213152ff, 0xd69494ff, 0x000800ff, 0xef636bff, 0x314252ff,
0x10186bff, 0x421810ff, 0x2973a5ff, 0x294a6bff, 0x10184aff, 0x081031ff,
0x212118ff, 0x21316bff, 0x424242ff, 0xff737bff, 0x212121ff, 0xff8c8cff,
0x292121ff, 0x317bbdff, 0xe7d6bdff, 0xf7f7efff
]
with open("L3_06.X3D", "rb") as f:
assert f.read(4) == b"X3DM"
mWidth, mHeight = struct.unpack("<2H", f.read(4))
f.read(6)
mdata = list(f.read(mWidth*mHeight).decode())
textures = {}
f.read(2)
for i in range(41):
data = f.read(128*128)
if not data:
break
im = Image.frombytes('P', (128,128), data)
im.putpalette(struct.pack(">{}I".format(len(palette)), *palette), rawmode="RGBA")
im = im.transpose(4)
footer = f.read(4)
textures[chr(footer[2])] = im
im = Image.new("RGBA", (64*128,64*128))
i = 0
for y in range(mHeight):
print("")
for x in range(mWidth):
tex = mdata[i]
print(tex, end="")
if tex != " " and tex != "\0" and tex != "<":
im.paste(textures[tex], (128*x, 128*y))
i += 1
print("")
im.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment