playscii/formats/out_ans.py

62 lines
2.1 KiB
Python

from art_export import ArtExporter
WIDTH = 80
ENCODING = 'cp1252' # old default
ENCODING = 'us-ascii' # DEBUG
ENCODING = 'latin_1' # DEBUG - seems to handle >128 chars ok?
class ANSExporter(ArtExporter):
format_name = 'ANSI'
format_description = """
Classic scene format using ANSI standard codes.
Assumes 80 columns, DOS character set and EGA palette.
Exports active layer of active frame.
"""
file_extension = 'ans'
def get_display_command(self, fg, bg):
"return a display command sequence string for given colors"
# reset colors on every tile
s = chr(27) + chr(91) + '0;'
if fg >= 8:
s += '1;'
fg -= 8
if bg >= 8:
s += '5;'
bg -= 8
s += '%s;' % (fg + 30)
s += '%s' % (bg + 40)
s += 'm'
return s
def write(self, data):
self.outfile.write(data.encode(ENCODING))
def run_export(self, out_filename, options):
# binary file; encoding into ANSI bytes happens just before write
self.outfile = open(out_filename, 'wb')
layer = self.art.active_layer
frame = self.art.active_frame
for y in range(self.art.height):
for x in range(WIDTH):
# cut off tiles beyond supported width
if x >= self.art.width - 1:
continue
char, fg, bg, xform = self.art.get_tile_at(frame, layer, x, y)
# offset palette indices so 0 = black not transparent
fg -= 1
bg -= 1
# write a display command every tile
# works fine, though it's a larger file - any real downside to this?
self.write(self.get_display_command(fg, bg))
# write the character for this tile
if char > 31:
self.write(chr(char))
else:
# special (top row) chars won't display in terminal anyway
self.write(chr(0))
# carriage return + line feed
self.outfile.write(b'\r\n')
self.outfile.close()
return True