Skip to content

Instantly share code, notes, and snippets.

@lukas2511
Last active February 16, 2022 11:41
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 lukas2511/2784166f24529f0850879dba33c659de to your computer and use it in GitHub Desktop.
Save lukas2511/2784166f24529f0850879dba33c659de to your computer and use it in GitHub Desktop.
WorkAdventure video to map converter script thingie
#!/bin/bash
# don't set these too large, maps get huuuuuuge
WIDTH=-1
HEIGHT=72
DURATION=60
rm -rf frames
mkdir -p frames
ffmpeg -y -i video.mp4 \
-t ${DURATION} \
-filter_complex "[0:v:0] scale=${WIDTH}:${HEIGHT},setsar=1:1 [scaled]; [scaled] hue=s=0 [blacknwhite]" \
-map "[blacknwhite]" \
"frames/frame-%05d.png" \
-map "0:a:0" \
"audio.mp3"
#python render.py
#!/usr/bin/env python3
import copy
import json
from PIL import Image, ImageDraw
import glob
import tqdm
import base64
MAP_COPYRIGHT = 'Original video and music by [...]'
frames = []
im = Image.open("frames/frame-00001.png")
WIDTH = im.width
HEIGHT = im.height
TILESIZE = 8
framebuffer = []
def addframe(buffer):
frames.append(copy.deepcopy(buffer))
tileim = Image.new("RGBA", (TILESIZE*256, TILESIZE))
tiledraw = ImageDraw.Draw(tileim)
for c in range(256):
tiledraw.rectangle([(c*TILESIZE, 0), (TILESIZE*(c+1)-1, TILESIZE-1)], fill=(c, c, c))
tileim.save("blackwhite.png")
for png in tqdm.tqdm(sorted(glob.glob("frames/frame-*.png"))):
im = Image.open(png)
pixels = list(im.getdata())
for i, v in enumerate(pixels):
if v != 0:
pixels[i] = pixels[i][0]
framebuffer = [pixels[i * WIDTH:(i + 1) * WIDTH] for i in range(HEIGHT)]
addframe(framebuffer)
tileset = {}
tileset["columns"] = 256
tileset["firstgid"] = 1
tileset["image"] = "blackwhite.png"
tileset["imageheight"] = TILESIZE*HEIGHT
tileset["imagewidth"] = TILESIZE*256
tileset["margin"] = 0
tileset["name"] = "pixel"
tileset["spacing"] = 0
tileset["tilecount"] = (WIDTH*HEIGHT)
tileset["tileheight"] = TILESIZE
tileset["tilewidth"] = TILESIZE
tileset["tiles"] = []
tileset["type"] = "tileset"
tileset["version"] = "1.6"
tileset["properties"] = [{'name': 'tilesetCopyright', 'value': 'CC0', 'type': 'string'}]
i = 256
for y in range(HEIGHT):
for x in range(WIDTH):
pixel = {}
pixel["id"] = i
pixel["animation"] = []
for frame in frames:
pixel["animation"].append({"duration": 100, "tileid": frame[y][x]})
if i == 0:
pixel["properties"] = [{"name": "startLayer", "type": "bool", "value": True}]
tileset["tiles"].append(pixel)
i += 1
#open("pixel.json", "w").write(json.dumps(tileset))
tiled = {}
tiled["compressionlevel"] = -1
tiled["height"] = HEIGHT
tiled["width"] = WIDTH + 8
tiled["infinite"] = False
tiled["layers"] = []
tiled["nextlayerid"] = 39
tiled["nextobjectid"] = 9
tiled["orientation"] = "orthogonal"
tiled["renderorder"] = "right-down"
tiled["tiledversion"] = "1.7.2"
tiled["tileheight"] = TILESIZE
tiled["tilewidth"] = TILESIZE
tiled["tilesets"] = []
tiled["tilesets"].append(tileset)
tiled["type"] = "map"
tiled["version"] = "1.6"
tiled["properties"] = [
{'name': 'mapName', 'type': 'string', 'value': 'fnord'},
{'name': 'mapDescription', 'type': 'string', 'value': 'fnord'},
{'name': 'mapCopyright', 'type': 'string', 'value': MAP_COPYRIGHT},
]
layer = {}
layer["data"] = list(range(1+256, (WIDTH * HEIGHT) + 1 + 256))
layer["height"] = HEIGHT
layer["width"] = WIDTH
layer["id"] = 4
layer["name"] = "floor"
layer["opacity"] = 1
layer["type"] = "tilelayer"
layer["visible"] = True
layer["x"] = 0
layer["y"] = 0
tiled["layers"].append(layer)
layer = {}
layer["height"] = HEIGHT
layer["width"] = WIDTH
layer["objects"] = [{
"height": HEIGHT-1,
"width": WIDTH-1,
"x": 1,
"y": 1,
"id": -999,
"name": "",
"properties": [{
"name": "getBadge",
"type": "string",
"value": "tZbY2PLoh8qokm3saUQAe8VtksVGLLdEthlButD631eEIiwAkK",
}],
"rotation": 0,
"type": "",
"visible": True,
}]
layer["id"] = -998
layer["name"] = "badge"
layer["opacity"] = 1
layer["type"] = "objectgroup"
layer["visible"] = True
layer["x"] = 1
layer["y"] = 1
tiled["layers"].append(layer)
layer = {}
layer["data"] = [0] * (50*50)
layer["data"][0] = 1
layer["height"] = 50
layer["width"] = 50
layer["id"] = 6
layer["name"] = "start"
layer["opacity"] = 0
layer["type"] = "tilelayer"
layer["visible"] = True
layer["x"] = 0
layer["y"] = 0
layer["properties"] = [{"name": "startLayer", "type": "bool", "value": True}]
tiled["layers"].append(layer)
layer = {}
layer["id"] = 2
layer["name"] = "floorLayer"
layer["opacity"] = 1
layer["type"] = "objectgroup"
layer["visible"] = True
layer["x"] = 0
layer["y"] = 0
layer["draworder"] = "topdown"
layer["objects"] = []
tiled["layers"].append(layer)
layer = {}
layer["data"] = [1] * (WIDTH*HEIGHT)
layer["height"] = HEIGHT
layer["width"] = WIDTH
layer["id"] = 22
layer["name"] = "audio"
layer["opacity"] = 0
layer["type"] = "tilelayer"
layer["visible"] = True
layer["x"] = 0
layer["y"] = 0
layer["properties"] = []
layer["properties"].append({"name": "playAudio", "type": "string", "value": "audio.mp3"})
layer["properties"].append({"name": "audioLoop", "type": "bool", "value": True})
layer["properties"].append({"name": "audioVolume", "type": "float", "value": 0.2})
tiled["layers"].append(layer)
layer = {}
layer["data"] = [0] * (HEIGHT * (WIDTH+8))
for x in range(0, (64 // TILESIZE)):
for y in range(0, (64 // TILESIZE)):
layer["data"][(WIDTH + 8) * y + (x + WIDTH)] = (WIDTH*HEIGHT) + 1337 + x + (64 // TILESIZE) * y
layer["height"] = HEIGHT
layer["width"] = WIDTH + 8
layer["id"] = 1337
layer["name"] = "exit"
layer["opacity"] = 1
layer["type"] = "tilelayer"
layer["visible"] = True
layer["x"] = 5
layer["y"] = 5
layer["properties"] = [{"name": "exitUrl", "type": "string", "value": "main.json#secret"}]
tiled["layers"].append(layer)
tileset = {}
tileset["columns"] = 64 / TILESIZE
tileset["firstgid"] = (WIDTH*HEIGHT) + 1337
tileset["image"] = "exit.png"
tileset["imageheight"] = 64
tileset["imagewidth"] = 64
tileset["margin"] = 0
tileset["name"] = "exit"
tileset["spacing"] = 0
tileset["tilecount"] = (64 / TILESIZE) * (64 / TILESIZE)
tileset["tileheight"] = TILESIZE
tileset["tilewidth"] = TILESIZE
tileset["type"] = "tileset"
tileset["version"] = "1.6"
tileset["properties"] = [{'name': 'tilesetCopyright', 'value': 'CC0', 'type': 'string'}]
tiled["tilesets"].append(tileset)
open("secret.json", "w").write(json.dumps(tiled, separators=(',', ':')))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment