Skip to content

Commit

Permalink
feat: sheet_converter handles experimental format
Browse files Browse the repository at this point in the history
  • Loading branch information
jgabaut committed Jan 31, 2025
1 parent 85f1d1a commit 6d603f1
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 25 deletions.
78 changes: 63 additions & 15 deletions s4c/core/sheet_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,17 @@
from PIL import Image
from .utils import convert_mode_lit
from .utils import print_animation_header
from .utils import print_heading
from .utils import print_impl_ending
from .utils import get_converted_char
from .utils import new_char_map
from .utils import log_wrong_argnum
from .utils import intparse_args
from .utils import SheetArgs

## The file format version.
FILE_VERSION = "0.2.2"
SCRIPT_VERSION = "0.1.0"
FILE_VERSION = "0.2.3"
SCRIPT_VERSION = "0.1.1"
F_STR_ARGS = "<mode> <sheet> <sprite_width> <sprite_heigth> <separator_size> <start_x> <start_y>"
EXPECTED_ARGS = 7

Expand All @@ -65,9 +67,9 @@ def usage():
sep size,\
left corner of first sprite's X, Y."
print(f"Wrong arguments. Needed: {f_string_usage}")
print(f"\nUsage:\tpython {os.path.basename(__file__)} {F_STR_ARGS}")
print(f"\nUsage:\tpython {os.path.basename(__file__)} [--s4c_path <s4c_path] {F_STR_ARGS}")
print("\n mode:\n\t s4c-file\n\t C-header\n\t C-impl")

sys.exit(1)

def print_sprites(mode, sprites, target_name):
"""! Prints the wanted mode output for passed sprites array."""
Expand Down Expand Up @@ -109,7 +111,13 @@ def parse_sprite(sprite, rgb_palette, char_map):
return chars


def convert_spritesheet(mode, filename, s: SheetArgs):
def convert_spritesheet(mode, filename, s: SheetArgs, *args):
if mode not in ('s4c', 'header', 'cfile', 'header-exp', 'cfile-exp') :
print(f"Unexpected mode value in convert_spritesheet(): {mode}")
usage()
if mode in ('header-exp', 'cfile-exp') and len(args) < 1:
print(f"Missing s4c_path in convert_spritesheet(): {mode}")
usage()
"""! Converts a spritesheet to a 3D char array repr of pixel color.
The prints it with the needed brackets and commas.
Depending on mode (s4c-file, C-header, C-impl) there will be a different output.
Expand All @@ -122,14 +130,11 @@ def convert_spritesheet(mode, filename, s: SheetArgs):
img = Image.open(filename)
sprites = []

img = img.convert('P', palette=Image.Palette.ADAPTIVE, colors=256)
palette = img.getpalette()
rgb_palette = [(palette[n], palette[n+1], palette[n+2]) for n in range(0, len(palette), 3)]
# Create the char_map dictionary based on the color values
char_map = new_char_map(rgb_palette)

#for i in range(img.size[1] // (sprite_h + sep_size * (sprites_per_column - 1))):

target_palette = (0,0,0)
target_sprites = []
for k in range((img.size[0] - s.start_x + s.sep_size) // (s.sprite_width + s.sep_size)):
for j in range((img.size[1] - s.start_y + s.sep_size) // (s.sprite_height + s.sep_size)):
spr_x = s.start_x + j * (s.sprite_width + s.sep_size)
Expand All @@ -139,11 +144,40 @@ def convert_spritesheet(mode, filename, s: SheetArgs):
# + (sep_size if k > 0 else 0)
sprite = img.crop((spr_x, spr_y, spr_x + s.sprite_width , spr_y + s.sprite_height))

chars = parse_sprite(sprite, rgb_palette, char_map)
sprite = sprite.convert('P', palette=Image.Palette.ADAPTIVE, colors=256)
palette = sprite.getpalette()
rgb_palette = [(palette[n], palette[n+1], palette[n+2]) for n in range(0, len(palette), 3)]

sprites.append(chars)
# Create the char_map dictionary based on the color values
char_map = new_char_map(rgb_palette)

print_sprites(mode, sprites, target_name)
chars = parse_sprite(sprite, rgb_palette, char_map)

if len(target_sprites) == 0:
target_palette = rgb_palette
target_sprites.append([chars, sprite.size[0], sprite.size[1],
rgb_palette, len(rgb_palette)])
else:
if rgb_palette != target_palette: #Must have same palette as first sprite
print(f"\n\n[ERROR] at file #{target_sprites.len()}: palette mismatch\n")
print(f"\texpected: {target_palette}")
print(f"\tfound: {rgb_palette}\n")
print("You must have all frames using the same palette.\n")
return False

sprites.append(chars)
target_sprites.append([chars, sprite.size[0], sprite.size[1],
rgb_palette, len(rgb_palette)])

#print_sprites(mode, sprites, target_name)
if len(args) == 0:
callargs = ("NONE")
else:
callargs = args
if print_heading(mode, target_name, FILE_VERSION, (len(target_sprites), target_sprites[0][4]), callargs[0]):
return True
print_impl_ending(mode, target_name, len(target_sprites), target_sprites)
return True

def main(argv):
"""! Main program entry."""
Expand All @@ -152,8 +186,22 @@ def main(argv):
print(f"sheet_converter v{SCRIPT_VERSION}")
print(f"FILE_VERSION v{FILE_VERSION}")
sys.exit(0)
log_wrong_argnum(EXPECTED_ARGS, argv)
usage()
elif len(argv)-1 == EXPECTED_ARGS+2:
if argv[1] == "--s4c-path":
s4c_path = argv[2]
else:
print("HEREW")
log_wrong_argnum(EXPECTED_ARGS, argv)
usage()
mode = argv[3]
mode = convert_mode_lit(mode)
filename = argv[4]
ints = intparse_args(argv[5], argv[6], argv[7], argv[8], argv[9])
convert_spritesheet(mode,filename,SheetArgs(ints[0],ints[1],ints[2],ints[3],ints[4]),s4c_path)
else:
log_wrong_argnum(EXPECTED_ARGS, argv)
print("HERE")
usage()
else:
mode = argv[1]
mode = convert_mode_lit(mode)
Expand Down
18 changes: 11 additions & 7 deletions s4c/core/sprites.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def usage():
print("\n mode: \n\ts4c-file\n\tC-header\n\tC-impl")
sys.exit(1)

def convert_sprite(file,chars):
def convert_sprite(file):
"""! Takes a image and converts each pixel to a char for its color (closest match to char_map).
@param file The image file to convert.
Expand All @@ -90,6 +90,7 @@ def convert_sprite(file,chars):

# Convert each pixel to its corresponding character representation
r, g, b = 0, 0, 0
chars = []
for y in range(img.size[1]): #Height
line = ""
for x in range(img.size[0]): #Width
Expand Down Expand Up @@ -136,13 +137,12 @@ def print_converted_sprites(mode, direc, *args):
key=lambda f:
int(re.search(r'\d+', f).group()))):
# convert a sprite and print the result
chars = []
(conv_chars, frame_width, frame_height, rbg_palette,
palette_size) = convert_sprite(file,chars)
palette_size) = convert_sprite(file)
if idx == 0:
target_palette = rbg_palette
target_sprites.append([conv_chars, frame_width, frame_height,
rbg_palette, palette_size, chars])
rbg_palette, palette_size])
else:
if rbg_palette != target_palette: #Must have same palette as first sprite
print(f"\n\n[ERROR] at file #{idx}: {file}: palette mismatch\n")
Expand All @@ -151,12 +151,16 @@ def print_converted_sprites(mode, direc, *args):
print("You must have all frames using the same palette.\n")
return False
target_sprites.append([conv_chars, frame_width, frame_height,
rbg_palette, palette_size, chars])
rbg_palette, palette_size])

# Start file output, beginning with version number

if print_heading(mode, target_name, FILE_VERSION, (frames, target_sprites[0][4]), args[0]):
return True
if len(args) == 0:
callargs = ("NONE")
else:
callargs = args
if print_heading(mode, target_name, FILE_VERSION, (frames, target_sprites[0][4]), callargs[0]):
return True
print_impl_ending(mode, target_name, frames, target_sprites)
return True

Expand Down
6 changes: 3 additions & 3 deletions s4c/core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ def print_impl_ending(mode, target_name, num_frames, target_sprites):
@param target_name The name for the target
@param num_frames The number of frames
@param target_sprites Array matrix: [conv_chars, frame_width, frame_height,
rgb_palette, palette_size, chars]
rgb_palette, palette_size]
"""
target_name.replace("-","_")
if mode == "cfile":
Expand All @@ -158,12 +158,12 @@ def print_impl_ending(mode, target_name, num_frames, target_sprites):
print(f"\t//Frame {idx}")
if mode == "cfile":
print("\t{")
for row in target[5]:
for row in target[0]:
print("\t\t\""+row+"\",")
elif mode == "cfile-exp":
print("\t(S4C_Sprite) {")
print("\t\t.data = {")
for row in target[5]:
for row in target[0]:
print("\t\t\t{ \""+row+"\" },")
print("\t\t},")
print(f"\t\t.frame_height = {target[2]},")
Expand Down

0 comments on commit 6d603f1

Please sign in to comment.