Copy project

This commit is contained in:
schmelczerandras 2020-04-19 12:48:06 +02:00
commit 26a0fd884f
173 changed files with 157458 additions and 1 deletions

110
sprite_generator/main.py Normal file
View file

@ -0,0 +1,110 @@
import os
import zipfile
from typing import Tuple
from PIL import Image
import io
from math import ceil
c_header = """#include "sprites.h"
#include <avr/eeprom.h>
// AUTO-GENERATED
"""
h_header = """#ifndef SPRITES_H
#define SPRITES_H
#include <avr/io.h>
// AUTO-GENERATED
"""
h_footer = """
#endif
"""
def generate_content(sprites_directory: str) -> Tuple[str, str]:
output_h = h_header
output_c = c_header
for entry in os.scandir(sprites_directory):
delta_output_h, delta_output_c = process_spritesheet(entry)
output_h += delta_output_h
output_c += delta_output_c
output_h += h_footer
return output_h, output_c
def process_spritesheet(entry) -> Tuple[str, str]:
sprites_name, _ = entry.name.split('.')
sprites_zip = zipfile.ZipFile(entry.path, 'r')
width, height = read_sprite(sprites_zip, sprites_zip.filelist[0]).size
declaration = f'const uint16_t {sprites_name}[{len(sprites_zip.filelist)}][{width}][{ceil(height / 8)}]'
output_h = declaration + ';\n'
output_c = declaration + ' EEMEM = {' + process_sprites(sprites_zip) + '};\n'
return output_h, output_c
def process_sprites(sprites_zip) -> str:
output = ''
width, height = read_sprite(sprites_zip, sprites_zip.filelist[0]).size
for sprite in sprites_zip.filelist:
output += '{'
pixels = list(read_sprite(sprites_zip, sprite).getdata())
for x in range(width):
output += '{'
for y in range(0, height, 8):
fill_bits = ''.join(
reversed([
('1' if is_filled(pixels[(y + i) * width + x]) else '0') if (y + i) * width + x < len(pixels) else '0'
for i in range(8)
])
)
inverted_mask_bits = ''.join(
reversed([
('0' if is_translucent(pixels[(y + i) * width + x]) else '1') if (y + i) * width + x < len(pixels) else '0'
for i in range(8)
])
)
output += f'{binary_to_hex_with_prefix(inverted_mask_bits + fill_bits)},'
output = output[:-1] + '},'
output = output[:-1] + '},'
return output[:-1]
def read_sprite(sprites_zip, entry):
return Image.open(io.BytesIO(sprites_zip.read(entry.filename)))
def is_translucent(pixel: Tuple[int, int, int, int]) -> bool:
r, g, b, a = pixel
return a == 0
def is_filled(pixel: Tuple[int, int, int, int]) -> bool:
r, g, b, a = pixel
return r != 0 or g != 0 or b != 0
def binary_to_hex_with_prefix(binary: str) -> str:
return hex(int(binary, 2))
if __name__ == '__main__':
dot_h, dot_c = generate_content('spritesheets')
with open('output/sprites.h', 'w+') as f:
f.write(dot_h)
with open('output/sprites.c', 'w+') as f:
f.write(dot_c)

View file

@ -0,0 +1,16 @@
#include "sprites.h"
#include <avr/eeprom.h>
// AUTO-GENERATED
const uint16_t small_character_moving[4][5][1] EEMEM = {{{0x606},{0x1f1d},{0xf0b},{0x1f1d},{0x606}},{{0x606},{0x1f1d},{0xf0b},{0xf0d},{0x1616}},{{0x606},{0x1f1d},{0xf0b},{0x1f1d},{0x606}},{{0x606},{0xf0d},{0x1f1b},{0x1f1d},{0x606}}};
const uint16_t spaceship_idle[1][36][3] EEMEM = {{{0x404,0x1414,0x1010},{0x404,0x3e3e,0x1010},{0xceca,0xffff,0x3828},{0xee6a,0xff8a,0x3929},{0xff3b,0xff09,0x7f6f},{0xff91,0xff08,0x7f44},{0xff51,0xff08,0x7f44},{0xff31,0xff08,0x7f44},{0xff1f,0xff08,0x7f7c},{0xf111,0xff08,0x4744},{0xf010,0xff08,0x704},{0xf010,0xfff8,0x707},{0xf010,0xff28,0x705},{0xf010,0xfff8,0x707},{0xf010,0xff08,0x704},{0xf010,0xff08,0x704},{0xf010,0xff08,0x704},{0xf010,0xff08,0x704},{0xf414,0xff08,0x1714},{0xf414,0xff08,0x1714},{0xfc1c,0xff08,0x1f1c},{0xfc1c,0xff08,0x1f1c},{0xf818,0xff08,0xf0c},{0xf010,0xff08,0x704},{0xf010,0xff08,0x704},{0xf010,0xff08,0x704},{0xf010,0xff0c,0x704},{0xf010,0xff0a,0x704},{0xf0b0,0xff1f,0x706},{0xe020,0xff1c,0x302},{0xe060,0xff1c,0x303},{0xc0c0,0xff9c,0x101},{0x8080,0xffdd,0x0},{0x0,0x7f7f,0x0},{0x0,0x1c1c,0x0},{0x0,0x808,0x0}}};
const uint16_t table[1][3][1] EEMEM = {{{0x707},{0x101},{0x101}}};
const uint16_t exhaust[1][5][1] EEMEM = {{{0x404},{0xe0e},{0xe0e},{0x1f1f},{0x404}}};
const uint16_t small_asteroid[7][8][1] EEMEM = {{{0x1c1c},{0x7e7e},{0xfef2},{0xfffb},{0xffff},{0xffdf},{0x7e7e},{0x3c3c}},{{0x0},{0x3c3c},{0x7e72},{0x7e7a},{0x7e7e},{0x7e5e},{0x3c3c},{0x0}},{{0x0},{0x0},{0x3030},{0x7878},{0x7c7c},{0x7c5c},{0x3838},{0x0}},{{0x0},{0x0},{0x3030},{0x3838},{0x3838},{0x1010},{0x0},{0x0}},{{0x0},{0x3030},{0x4848},{0x4444},{0x4444},{0x2828},{0x1010},{0x0}},{{0x2828},{0x8484},{0x8080},{0x0},{0x8282},{0x4444},{0x2828},{0x0}},{{0x202},{0x0},{0x0},{0x0},{0x0},{0x0},{0x8181},{0x4242}}};
const uint16_t stars[3][3][1] EEMEM = {{{0x202},{0x707},{0x202}},{{0x505},{0x202},{0x505}},{{0x0},{0x303},{0x303}}};
const uint16_t heart_blinking[2][7][1] EEMEM = {{{0x606},{0x909},{0x1111},{0x2222},{0x1111},{0x909},{0x606}},{{0x606},{0xf0f},{0x1f1f},{0x3e3e},{0x1f1f},{0xf0f},{0x606}}};
const uint16_t beds[1][8][1] EEMEM = {{{0x707},{0xc0c},{0x2424},{0x2424},{0x2424},{0x2424},{0x2424},{0x2424}}};
const uint16_t turret_controller[1][7][1] EEMEM = {{{0x3030},{0x808},{0xf0f},{0x101},{0x101},{0x101},{0x101}}};

View file

@ -0,0 +1,19 @@
#ifndef SPRITES_H
#define SPRITES_H
#include <avr/io.h>
c
// AUTO-GENERATED
const uint16_t small_character_moving[4][5][1];
const uint16_t spaceship_idle[1][36][3];
const uint16_t table[1][3][1];
const uint16_t exhaust[1][5][1];
const uint16_t small_asteroid[7][8][1];
const uint16_t stars[3][3][1];
const uint16_t heart_blinking[2][7][1];
const uint16_t beds[1][8][1];
const uint16_t turret_controller[1][7][1];
#endif

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"asteroid_exploding","description":"","fps":2,"height":16,"width":16,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":4,\"chunks\":[{\"layout\":[[0],[1],[2],[3]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAQCAYAAACm53kpAAAA90lEQVRYR81W2w2DMAwsg3QBlkQs2QUYpMiokSxq5xz3opovwLFzd/Ejy6Pos+7Hu0F7bc+lfcv7HbLYrP8Ral/BIk4z1mRJ9IRBOMW3hAC/kEAkkX2KADp9BUA2PT3wTMFMAe71h1TUdiuVs+nd25cV02woeuOR0+uBYgEeOYzIWq8Erg687kc4fRFBZI+AnbHGFUDI6zGENkcEkR3FZ46+FsucAtn6RwSRvYwAo0C0ml6/YJPPYrT8aGPQI1mZvAhCE+DTNK/m2TKhOnm6ALocohegjEgZH69sqBmQqc0MmYxPWQEyojF8moh/zwBUNsx7v3VlPwESvqu48OEMjQAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[4,4]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"asteroid_idle","description":"","fps":2,"height":16,"width":16,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":5,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAQCAYAAACBSfjBAAABU0lEQVRYR+WY6w2DMAyEyyAswJKIJVmAQVqBGmRSP+4cUlVqf7Y5J/5ysZMOD+MzLdtT+2mdx8HS/OP3KgwLXgGEQPRitOgR7Tc38gIwAicX5iWCxGnRRxDL/NG4O0CfAJGkI4BMDC05VG+BaXV9Bmga4D6ZTARN3toEVl9DRPWIK7VYlu4AiE5uNZWsPrsBPdxbcmNd/AFwnceT07Rsoav3ZOSkjL6AYPUewGj+qPZ6ek17Sf59LA9oCDzDkbDeA+jNjwBk9eUkFoCaHgIYWk4MqN3HaGUNzZSAbA2sa7dcc7SOJoDazjAALT1ag2s9C1Dq7+ziTU1EO4KMC7NNxHJR5CDPfVETub0Lsw6owd6tJ5zsPkXZJ2zKgS3XiJYaVDYh6qTWdYs5HejY1EU6U0OsC7S2UNYFaLI9xtFv4exNHnFPjwR7x6T+jUHg9V7wr8V/ATFxHiBoK+IWAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[5,5]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"beds","description":"","fps":12,"height":6,"width":8,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAK0lEQVQYV2MU2HXq/wc3M0YGHICRKAW4dIPEwUbjMwWn3TBT4QpApmCzCgCBQhEt85lnxgAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"New Piskel","description":"","fps":22,"height":8,"width":8,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":5,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAICAYAAACLUr1bAAAAaklEQVQ4T2NkgAK9VQ//w9gg+lKYPCMyf6DkwY5AtxzmMJgjB1KeEWY5yDHY2MiOHQh5uKOQo3MwsVGiGD1KBwMfHILI0TvQUYpu/+B3IHIxgxylyMUMLJSxqSVGP6ykgMUUehGGLI/OBgD6G/rpqiNnggAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[4,5,null]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"command_panel","description":"","fps":12,"height":4,"width":7,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAYAAABCxiV9AAAAJ0lEQVQYV2NkgALTDc//nw6QZITxQTScg1MSJAFSiaETpgOmANlYACwPEtDjAtnZAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"exhaust","description":"","fps":12,"height":5,"width":5,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAJUlEQVQYV2NkQAKGe979P+8ixMgIEgNxYHJgQWQBmAR2ldjMBADQSBLgD+ED8QAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"heart","description":"","fps":2,"height":6,"width":7,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":2,\"chunks\":[{\"layout\":[[0],[1]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAGCAYAAADzG6+8AAAATUlEQVQoU2NkYGBgkGjf8R9Ev6j0YERm45MDKwRpgClCZoPEcAEUjciKYDbj1IhuEzE2g1wFdiKyYmSnI8vB2DCvwDVisxnd6TBNIHEAp/5As2kjDcEAAAAASUVORK5CYII=\"}]}"],"hiddenFrames":[""]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"small_asteroid","description":"","fps":4,"height":8,"width":8,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":7,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4],[5],[6]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAICAYAAACs/DyzAAAAvUlEQVRIS9WU0Q2AIAxEZQhHci7jXI7EEJoSzxy1RQgmql/iAfZxR8NAz7isG4ZxngJrf3sXFmFIEAzGIAyp57x1ACgcdeqxNiyg8DhPSRuXNTNLQI5NLroFSfs1J8Bb2wKlk5YBajiZzIAWvBdxrLV072DwnYE8h0rO8T9PQO+OAdDSSxHWgKWIW8XWAtz1BvMOSlzhlgUI3QOs0LP4liLY7eCTTaanC7esrXVX5p0n+ZUuaUWOm08LnCRsB3pexamFdPIEAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[""]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"small_character_moving","description":"","fps":5,"height":5,"width":5,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":4,\"chunks\":[{\"layout\":[[0],[1],[2],[3]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAATElEQVQoU2NkYGBgED/z/z+IBoGXJoyMlIgxggx7acIIMhRkGJiGGkyWGNhAZANgLiVXjCLvYQsauIGgsIN6H0UMpglZHlkdsqEgNQBJ/mXI+vzKNgAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"spaceship_idle","description":"","fps":0,"height":23,"width":36,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAA/ElEQVRIS92WUQ6EIAxEJfGUHtBTmrCBWB1KS4pUNpE/CdjHdCgNCxvrHiOfS9/HFoI07z13BUGQY7tjr3ucBpMOFwgEIfDUViCu7FNF3RViSnenudqgecjTKy31CiCevjNdnixL+icNCaxKGXnpDRjuTen2FkCzYAiM1EKlKqC3lRHqXp4iqAyk1SBX8zR+hqXlqkMn5SyGIg6mrlLoL0QQtEsh8pe3z1SFtOeD3wrv9BYegmDRApTWeCrEr75aGCUveaesWYfw+rdefij7Q/6XYHL7IRQqNXUeCpnfMvTS0NENm02vvVfHONwPfb5jNGSsucTcMT7tkXsBf0C4ysAeuee1AAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"spaceship_idle","description":"","fps":0,"height":23,"width":36,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAABB0lEQVRIS92WXRKDIAyEZcZTekBP6QydWGPDEiBg5KG+lfLzZROWhAW+dY8Rx+j3sYWgjXuP3YdIkGP7nb3ucRoMBRcYRELIqK1AqOyoou4KgdLdac4WlGrIs1Zq6iVAmL4rXZ4sC+3JnwaWpYxr6Q0YrE3t9iZAM2BkoKyWVCoDmqEM2opU6gQqeZBr8XzPObdEi5HWcvuQNtETiJWXRY37U+oyhTwhRvbqUkhGWXL2FkSXQq1DwENaZ5v/T2qIV1FhW4BojudNxKtfNEYtPI+Utcyx+nQovZK0fXNKSsFVndqSOg+FzG+ZBHoUumGx6bX36hgf90N/3zEaMladYu4YR3vkXsAPx8fWwKypZRQAAAAASUVORK5CYII=\"}]}"],"hiddenFrames":[]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"stars","description":"","fps":5,"height":3,"width":3,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":3,\"chunks\":[{\"layout\":[[0],[1],[2]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAADCAYAAABBCiV2AAAAKElEQVQYV2NkYGBg0Oy///96oSIjNhokD5YAMUAAWSFMM1gRPpNgmgGXCyUwWpMkWwAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"table","description":"","fps":12,"height":3,"width":3,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAYAAABWKLW/AAAAGklEQVQYV2OUXPHtPwMUMII4zyO4GEF8FA4A35gKulFMUFMAAAAASUVORK5CYII=\"}]}"],"hiddenFrames":[]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"tree_creation","description":"","fps":8,"height":16,"width":8,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":9,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4],[5],[6],[7],[8]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAAAQCAYAAAC1MDndAAAAxklEQVRYR+2X2wmAMAxF7QBO6Q4O4Q5O6QBKC4FQTW9fhGrshyDRj5ycG9FN/wkE5m0/OYpjXZy/DxfrJ4ZDPDwkM4AkQyQ4BMkEoJQhZgBJhjztFx6hTwGiZmiBUqMpQ8wAqjUEAUL1oXaQhxDbIVmCLOpVHwoQTRNB0qy/ChACiOrSDost5QNQBZSKEGout+6f62nY5wBJcPgyLgGoCijXAtRkSYP8N2qIiGnESBNgsUE5n2LNCbcagt6/ARrZgNaI1kTsAp0eIOzLT+G1AAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[9,null]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"tree_dying","description":"","fps":6,"height":16,"width":8,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":4,\"chunks\":[{\"layout\":[[0],[1],[2],[3]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAAiElEQVRIS2NkgALerrn/YWwQ/bksmRGZ//8/A4o8IyMDVeTBhqBbDrMY5giQ5Xzdc5Hdw/CpNJkB5gh0x8EUEiPPiMtymCEgi9AtR5ZDdhVMHUgPsYBqDsAWQsQ4Yvg4AORbsqJgwBMhKdkQ2YdUzYbojkAvA2gpj1KYwLLkqANGQ2A0BOgZAgDP2+UFIl4BHQAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[""]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"tree_falling_leaf","description":"","fps":6,"height":16,"width":8,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":9,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4],[5],[6],[7],[8]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAAAQCAYAAAC1MDndAAAAmElEQVRYR2NkgALerrn/YWwQ/bksmRGZP1LlwYGA7nlYwMACaSTLM+LyPHLqGcns0QAiEPujATQaQJQVEKOFNIFKCl6Vj9RqnFAzB2tbB1sbCCQGC0R0eXRLhpM8UQFEKABAATdcA5AqAYQvAGGBh9wgHUopjOYBhK27MpSy8KAIoMGchYdEAA1kFh7yAUTrLDwiAoiSLAwACTDY7MnyCD8AAAAASUVORK5CYII=\"}]}"],"hiddenFrames":[null]}}

View file

@ -0,0 +1 @@
{"modelVersion":2,"piskel":{"name":"turret_controller","description":"","fps":12,"height":6,"width":7,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAGCAYAAAAPDoR2AAAAK0lEQVQYV2NkgALTV5/+w9gwmhFZ8rQYH5wPEicsCTMSQydIAl0Qbic+SQAqjBcXJX5MQQAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[]}}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.