diff --git a/.itch.toml b/.itch.toml new file mode 100644 index 0000000..60e7fb4 --- /dev/null +++ b/.itch.toml @@ -0,0 +1,4 @@ + +[[actions]] +name = "play" +path = "playscii/playscii_linux.sh" diff --git a/README.md b/README.md new file mode 100644 index 0000000..1099bbc --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# PLAYSCII - an ASCII art and game creation tool + +Playscii (pronounced play-skee) is an art, animation, and game creation tool. +The latest version will always be available here: + +* [http://jp.itch.io/playscii](http://jp.itch.io/playscii) +* [https://heptapod.host/jp-lebreton/playscii](https://heptapod.host/jp-lebreton/playscii) + +Playscii's main website is here: + +* [https://jplebreton.com/playscii/](https://jplebreton.com/playscii/) + +## Offline documentation + +Playscii now includes its own HTML documentation, which you can find in the +docs/html/ subfolder of the folder where this README resides. + +## Online documentation + +The latest version of the HTML documentation resides here: + +[https://jplebreton.com/playscii/howto_main.html](https://jplebreton.com/playscii/howto_main.html) + +## Bugs + +If you run into any issues with Playscii, please report a bug here: + +[https://heptapod.host/jp-lebreton/playscii/issues](https://heptapod.host/jp-lebreton/playscii/issues) + +## Roadmap + +For possible future features see Playscii's Trello: + +[https://trello.com/b/BLQBXn5H/playscii](https://trello.com/b/BLQBXn5H/playscii) + +Please don't take anything there as a promise, though. If you'd find something +on there especially valuable, feel free to vote or comment! + +## Contact + +If you've made something cool with Playscii and/or have any suggestions on how +to improve it, please let JP know! + +[https://jplebreton.com/#contact_email](https://jplebreton.com/#contact_email) diff --git a/art.py b/art.py new file mode 100644 index 0000000..6edfb09 --- /dev/null +++ b/art.py @@ -0,0 +1,1250 @@ +import os.path, json, time, traceback +import random # import random only so art scripts don't have to +import numpy as np + +from edit_command import CommandStack, EntireArtCommand +from image_export import write_thumbnail + +# X, Y, Z +VERT_LENGTH = 3 +# 4 verts in a quad +VERT_STRIDE = 4 * VERT_LENGTH +# elements: 3 verts per tri * 2 tris in a quad +ELEM_STRIDE = 6 +# UVs: 2 floats per vert * 4 verts in a quad +UV_STRIDE = 2 * 4 + +# starting document defaults +DEFAULT_CHARSET = 'c64_petscii' +DEFAULT_PALETTE = 'c64_original' +DEFAULT_WIDTH, DEFAULT_HEIGHT = 40, 25 +DEFAULT_ART_FILENAME = 'new' + +DEFAULT_FRAME_DELAY = 0.1 +DEFAULT_LAYER_Z = 0 +DEFAULT_LAYER_Z_OFFSET = 0.5 + +ART_DIR = 'art/' +ART_FILE_EXTENSION = 'psci' + +THUMBNAIL_CACHE_DIR = 'thumbnails/' + +ART_SCRIPT_DIR = 'artscripts/' +SCRIPT_FILE_EXTENSION = 'arsc' + +# flip/rotate UV constants +UV_NORMAL = 0 +UV_ROTATE90 = 1 +UV_ROTATE180 = 2 +UV_ROTATE270 = 3 +UV_FLIPX = 4 +UV_FLIPY = 5 +# (flip X & Y is identical to rotate 180) +# not sure what to call these, but - results for X and Y flip of rotated chars: +UV_FLIP90 = 6 +UV_FLIP270 = 7 + +uv_names = { + UV_NORMAL: 'Normal', + UV_ROTATE90: 'Rotate 90', + UV_ROTATE180: 'Rotate 180', + UV_ROTATE270: 'Rotate 270', + UV_FLIPX: 'Flip X', + UV_FLIPY: 'Flip Y', + UV_FLIP90: 'Flipped90', + UV_FLIP270: 'Flipped270' +} + +uv_types = { + UV_NORMAL: (0, 0, 1, 0, 0, 1, 1, 1), + UV_ROTATE90: (0, 1, 0, 0, 1, 1, 1, 0), + UV_ROTATE180: (1, 1, 0, 1, 1, 0, 0, 0), + UV_ROTATE270: (1, 0, 1, 1, 0, 0, 0, 1), + UV_FLIPX: (1, 0, 0, 0, 1, 1, 0, 1), + UV_FLIPY: (0, 1, 1, 1, 0, 0, 1, 0), + UV_FLIP90: (0, 0, 0, 1, 1, 0, 1, 1), + UV_FLIP270: (1, 1, 1, 0, 0, 1, 0, 0) +} + +# reverse dict for easy (+ fast?) lookup in eg get_char_transform_at +uv_types_reverse = { + uv_types[UV_NORMAL]: UV_NORMAL, + uv_types[UV_ROTATE90]: UV_ROTATE90, + uv_types[UV_ROTATE180]: UV_ROTATE180, + uv_types[UV_ROTATE270]: UV_ROTATE270, + uv_types[UV_FLIPX]: UV_FLIPX, + uv_types[UV_FLIPY]: UV_FLIPY, + uv_types[UV_FLIP90]: UV_FLIP90, + uv_types[UV_FLIP270]: UV_FLIP270 +} + + +class Art: + """ + Art asset: + Contains the data that is modified by user edits and gets saved to disk. + Data stored as arrays that TileRenderables use to populate their buffers. + + assumptions: + - an Art contains 1 or more frames + - each frame contains 1 or more layers + - each layer is a rectangular grid of Width * Height tiles + - each tile has: character, foreground color, background color, & transform + - char/color tile values are expressed as indices into charset / palette + - all layers in an Art are the same dimensions + """ + quad_width,quad_height = 1.0, 1.0 + "size of each tile in world space" + log_size_changes = False + recalc_quad_height = True + log_creation = False + + def __init__(self, filename, app, charset, palette, width, height): + "Creates a new, blank document with given parameters." + self.valid = False + if filename and not filename.endswith('.%s' % ART_FILE_EXTENSION): + filename += '.%s' % ART_FILE_EXTENSION + self.filename = filename + self.app = app + # save "time loaded" for menu sorting + self.time_loaded = 0 + self.charset, self.palette = charset, palette + self.command_stack = CommandStack(self) + self.unsaved_changes = False + self.width, self.height = width, height + # selected char/fg/bg/xform + self.selected_char = self.charset.get_char_index('A') or 2 + self.selected_fg_color = self.palette.lightest_index + self.selected_bg_color = self.palette.darkest_index + self.selected_xform = UV_NORMAL + # camera position - updated in Art.update, saved in .psci + self.update_saved_camera(self.app.camera) + # set True when camera "zoom extents" toggles on + self.camera_zoomed_extents = False + # cached camera position from before "zoom extents" invoked + self.non_extents_camera_x = self.non_extents_camera_y = 0 + self.non_extents_camera_z = self.app.camera.start_zoom + # list of char/fg/bg arrays, one for each frame + self.chars, self.fg_colors, self.bg_colors = [], [], [] + # char transforms: UV coords, plus map (unused by renderer) for fast access + self.uv_mods, self.uv_maps = [], [] + # table of {frame_number: bool} changed frames, processed each update() + self.char_changed_frames, self.uv_changed_frames = {}, {} + self.fg_changed_frames, self.bg_changed_frames = {}, {} + self.renderables = [] + "List of TileRenderables using us - each new Renderable adds itself" + self.instances = [] + "List of ArtInstances using us as their source" + # init frames and layers - ArtFromDisk has its own logic for this + self.init_layers() + self.init_frames() + # support non-square characters: + # derive quad_height from chars aspect; quad_width always 1.0 + if self.recalc_quad_height: + self.quad_height *= self.charset.char_height / self.charset.char_width + # running scripts and timing info + self.scripts = [] + self.script_rates = [] + self.scripts_next_exec_time = [] + # tell renderables to rebind vert and element buffers next update + self.geo_changed = True + # run update once before renderables initialize so they have + # something to bind + self.first_update() + if self.log_creation and not self.app.game_mode: + self.log_init() + self.valid = True + + def log_init(self): + self.app.log('created new document:') + self.app.log(' character set: %s' % self.charset.name) + self.app.log(' palette: %s' % self.palette.name) + self.app.log(' width/height: %s x %s' % (self.width, self.height)) + self.app.log(' frames: %s' % self.frames) + self.app.log(' layers: %s' % self.layers) + + def init_layers(self): + self.layers = 1 + # current layer being edited + self.active_layer = 0 + # lists of layer Z values and names + self.layers_z = [DEFAULT_LAYER_Z] + self.layers_visibility = [True] + self.layer_names = ['Layer 1'] + + def init_frames(self): + self.frames = 0 + # current frame being edited + self.active_frame = 0 + # list of frame delays + self.frame_delays = [] + # add one frame to start + self.add_frame_to_end(DEFAULT_FRAME_DELAY, False) + # clear our single layer to a sensible BG color + self.clear_frame_layer(0, 0, bg_color=self.palette.darkest_index) + + def first_update(self): + self.update() + + def insert_frame_before_index(self, index, delay=DEFAULT_FRAME_DELAY, log=True): + "Add a blank frame at the specified index (len+1 to add to end)." + self.frames += 1 + self.frame_delays.insert(index, delay) + tiles = self.layers * self.width * self.height + shape = (self.layers, self.height, self.width, 4) + fg, bg = 0, 0 + if self.app.ui: + fg = self.app.ui.selected_fg_color + bg = self.app.ui.selected_bg_color + new_char = np.zeros(shape, dtype=np.float32) + new_fg = np.full(shape, fg, dtype=np.float32) + new_bg = np.full(shape, bg, dtype=np.float32) + new_uv = np.full(shape, UV_NORMAL, dtype=np.uint32) + self.chars.insert(index, new_char) + self.fg_colors.insert(index, new_fg) + self.bg_colors.insert(index, new_bg) + self.uv_maps.insert(index, new_uv) + # UV init is more complex than just all zeroes + self.uv_mods.insert(index, self.new_uv_layers(self.layers)) + # all but lowest layer = transparent + for l in range(1, self.layers): + self.clear_frame_layer(index, l, 0, fg) + self.mark_all_frames_changed() + # set new frame as active + if self.app.ui and self is self.app.ui.active_art: + self.app.ui.set_active_frame(index) + if log: + self.app.log('Created new frame at index %s' % str(index)) + + def add_frame_to_end(self, delay=DEFAULT_FRAME_DELAY, log=True): + "Add a blank frame at the end of the current animation." + self.insert_frame_before_index(self.frames, delay, log) + + def duplicate_frame(self, src_frame_index, dest_frame_index=None, delay=None): + "Create a duplicate of given frame at given index." + # stick new frame at end if no destination index given + dest_frame_index = dest_frame_index if dest_frame_index is not None else self.frames + # copy source frame's delay if none given + delay = delay or self.frame_delays[src_frame_index] + self.frames += 1 + self.frame_delays.insert(dest_frame_index, delay) + # copy source frame's char/color arrays + self.chars.insert(dest_frame_index, self.chars[src_frame_index].copy()) + self.uv_mods.insert(dest_frame_index, self.uv_mods[src_frame_index].copy()) + self.uv_maps.insert(dest_frame_index, self.uv_maps[src_frame_index].copy()) + self.fg_colors.insert(dest_frame_index, self.fg_colors[src_frame_index].copy()) + self.bg_colors.insert(dest_frame_index, self.bg_colors[src_frame_index].copy()) + self.mark_all_frames_changed() + # set new frame as active + if self is self.app.ui.active_art: + self.app.ui.set_active_frame(dest_frame_index-1) + self.app.log('Duplicated frame %s at frame %s' % (src_frame_index+1, dest_frame_index)) + + def delete_frame_at(self, index): + "Delete frame at given index." + self.chars.pop(index) + self.fg_colors.pop(index) + self.bg_colors.pop(index) + self.uv_mods.pop(index) + self.uv_maps.pop(index) + self.frames -= 1 + self.mark_all_frames_changed() + if self is self.app.ui.active_art: + self.app.ui.set_active_frame(index) + + def move_frame_to_index(self, src_index, dest_index): + "Move frame at given index to new given index." + char_data = self.chars.pop(src_index) + fg_data = self.fg_colors.pop(src_index) + bg_data = self.bg_colors.pop(src_index) + uv_data = self.uv_mods.pop(src_index) + uv_map_data = self.uv_maps.pop(src_index) + self.chars.insert(dest_index, char_data) + self.fg_colors.insert(dest_index, fg_data) + self.bg_colors.insert(dest_index, bg_data) + self.uv_mods.insert(dest_index, uv_data) + self.uv_maps.insert(dest_index, uv_map_data) + self.mark_all_frames_changed() + + def add_layer(self, z=None, name=None): + "Add a new layer with given Z with given name." + # offset Z from last layer's Z if none given + z = z if z is not None else self.layers_z[-1] + DEFAULT_LAYER_Z_OFFSET + # index isn't user-facing, z is what matters + index = self.layers - 1 + # duplicate_layer increases self.layers by 1 + self.duplicate_layer(index, z, name) + for frame in range(self.frames): + self.clear_frame_layer(frame, self.layers-1, 0) + # set new layer as active + if self is self.app.ui.active_art: + self.app.ui.set_active_layer(index+1) + + def duplicate_layer(self, src_index, z=None, new_name=None): + "Duplicate layer with given index. Duplicate uses given Z and name." + def duplicate_layer_array(array): + src_data = np.array([array[src_index]]) + return np.append(array, src_data, 0) + for frame in range(self.frames): + self.chars[frame] = duplicate_layer_array(self.chars[frame]) + self.fg_colors[frame] = duplicate_layer_array(self.fg_colors[frame]) + self.bg_colors[frame] = duplicate_layer_array(self.bg_colors[frame]) + self.uv_mods[frame] = duplicate_layer_array(self.uv_mods[frame]) + self.uv_maps[frame] = duplicate_layer_array(self.uv_maps[frame]) + self.layers += 1 + z = z if z is not None else self.layers_z[src_index] + self.layers_z.append(z) + self.layers_visibility.append(True) + new_name = new_name or 'Copy of %s' % self.layer_names[src_index] + self.layer_names.append(new_name) + # rebuild geo with added verts for new layer + self.geo_changed = True + # set new layer as active + if self is self.app.ui.active_art: + self.app.ui.set_active_layer(self.layers - 1) + # don't log new layers created on the fly in game mode + if not self.app.game_mode: + self.app.log('Added new layer %s' % new_name) + self.set_unsaved_changes(True) + + def clear_frame_layer(self, frame, layer, bg_color=0, fg_color=None): + "Clear given layer of given frame to transparent BG + no characters." + # "clear" UVs to UV_NORMAL + for y in range(self.height): + for x in range(self.width): + self.uv_mods[frame][layer][y][x] = uv_types[UV_NORMAL] + self.uv_maps[frame][layer][y][x] = UV_NORMAL + self.chars[frame][layer][y][x] = 0 + self.fg_colors[frame][layer][y][x] = fg_color or 0 + self.bg_colors[frame][layer][y][x] = bg_color + # tell this frame to update + self.char_changed_frames[frame] = True + self.fg_changed_frames[frame] = True + self.bg_changed_frames[frame] = True + self.uv_changed_frames[frame] = True + + def delete_layer(self, index): + "Delete layer at given index." + for frame in range(self.frames): + self.chars[frame] = np.delete(self.chars[frame], index, 0) + self.fg_colors[frame] = np.delete(self.fg_colors[frame], index, 0) + self.bg_colors[frame] = np.delete(self.bg_colors[frame], index, 0) + self.uv_mods[frame] = np.delete(self.uv_mods[frame], index, 0) + self.uv_maps[frame] = np.delete(self.uv_maps[frame], index, 0) + self.layers_z.pop(index) + self.layers_visibility.pop(index) + self.layer_names.pop(index) + self.layers -= 1 + self.geo_changed = True + self.mark_all_frames_changed() + if self.active_layer > self.layers - 1: + self.app.ui.set_active_layer(self.layers - 1) + self.set_unsaved_changes(True) + + def set_charset(self, new_charset, log=False): + "Set Art to use given character set (referenced by object, not name)." + if new_charset is self.charset: + return + self.charset = new_charset + if self.recalc_quad_height: + self.quad_width = 1.0 + self.quad_height = 1.0 * (self.charset.char_height / self.charset.char_width) + self.set_unsaved_changes(True) + self.geo_changed = True + if log: + self.app.ui.message_line.post_line('Character set changed to %s' % self.charset.name) + + def set_charset_by_name(self, new_charset_name): + charset = self.app.load_charset(new_charset_name) + self.set_charset(charset) + self.app.ui.popup.set_active_charset(charset) + + def set_palette(self, new_palette, log=False): + "Set Art to use given color palette (referenced by object, not name)." + if new_palette is self.palette: + return + self.palette = new_palette + self.set_unsaved_changes(True) + if log: + self.app.ui.message_line.post_line('Color palette changed to %s' % self.palette.name) + + def set_palette_by_name(self, new_palette_name): + palette = self.app.load_palette(new_palette_name) + self.set_palette(palette) + self.app.ui.popup.set_active_palette(palette) + + def set_active_frame(self, new_frame): + "Set frame at given index for active editing in Art Mode." + new_frame %= self.frames + # bail if frame is still the same, eg we only have 1 frame + if new_frame == self.active_frame: + # return whether or not we actually changed frames + return False + self.active_frame = new_frame + # update our renderables + for r in self.renderables: + r.set_frame(self.active_frame) + return True + + def set_active_layer(self, new_layer): + "Set layer at given index for active editing in Art Mode." + self.active_layer = min(max(0, new_layer), self.layers-1) + + def crop(self, new_width, new_height, origin_x=0, origin_y=0): + x0, y0 = origin_x, origin_y + x1, y1 = x0 + new_width, y0 + new_height + crop_x = new_width < self.width + crop_y = new_height < self.height + for frame in range(self.frames): + for array in [self.chars, self.fg_colors, self.bg_colors, + self.uv_mods, self.uv_maps]: + if crop_x: + array[frame] = array[frame].take(range(x0, x1), axis=2) + if crop_y: + array[frame] = array[frame].take(range(y0, y1), axis=1) + + def expand(self, new_width, new_height, bg_fill): + x_add = new_width - self.width + y_add = new_height - self.height + #print('%s expand: %sw + %s = %s, %sh + %s = %s' % (self.filename, + # self.width, x_add, new_width, self.height, y_add, new_height)) + def expand_array(array, fill_value, stride): + # add columns (increasing width) + if x_add > 0: + # before height has changed, take care not to append + # incorrectly sized columns + h = new_height if new_height < self.height else self.height + add_shape = (self.layers, h, x_add, stride) + add = np.full(add_shape, fill_value, dtype=np.float32) + array = np.append(array, add, 2) + # add rows (increasing height) + if y_add > 0: + add_shape = (self.layers, y_add, new_width, stride) + add = np.full(add_shape, fill_value, dtype=np.float32) + array = np.append(array, add, 1) + # can't modify passed array in-place + return array + for frame in range(self.frames): + self.chars[frame] = expand_array(self.chars[frame], 0, 4) + fg, bg = 0, 0 + if self.app.ui: + fg = self.app.ui.selected_fg_color + # fill with BG color? ResizeArtDialog can specify this + # if not, blank bg for all new tiles (original default behavior) + if bg_fill: + bg = self.app.ui.selected_bg_color + self.fg_colors[frame] = expand_array(self.fg_colors[frame], fg, 4) + self.bg_colors[frame] = expand_array(self.bg_colors[frame], bg, 4) + self.uv_mods[frame] = expand_array(self.uv_mods[frame], uv_types[UV_NORMAL], UV_STRIDE) + self.uv_maps[frame] = expand_array(self.uv_maps[frame], UV_NORMAL, 4) + + def mark_frame_changed(self, frame): + "Given frame at given index as changed for next render." + self.char_changed_frames[frame] = True + self.fg_changed_frames[frame] = True + self.bg_changed_frames[frame] = True + self.uv_changed_frames[frame] = True + + def mark_all_frames_changed(self): + "Mark all frames as changed for next render." + for frame in range(self.frames): + self.mark_frame_changed(frame) + + def resize(self, new_width, new_height, origin_x=0, origin_y=0, bg_fill=False): + """ + Crop and/or expand Art to new given dimensions, with optional new + top left tile if cropping. Calls crop() and expand(), so no need to + call those directly. + """ + if new_width < self.width or new_height < self.height: + self.crop(new_width, new_height, origin_x, origin_y) + if new_width > self.width or new_height > self.height: + self.expand(new_width, new_height, bg_fill) + self.width, self.height = new_width, new_height + # tell all frames they've changed, rebind buffers + self.geo_changed = True + self.mark_all_frames_changed() + + def build_geo(self): + """ + (Re)build the vertex and element arrays used by all layers. + Run if the Art has untracked changes to size or layer count. + """ + shape = (self.layers, self.height, self.width, VERT_STRIDE) + self.vert_array = np.empty(shape, dtype=np.float32) + all_elems_size = self.layers * self.width * self.height * ELEM_STRIDE + self.elem_array = np.empty(shape=all_elems_size, dtype=np.uint32) + # generate geo according to art size + # vert_index corresponds to # of verts, loc_index to position in array + # (given that each vert has 3 components) + vert_index = 0 + elem_index = 0 + for layer in range(self.layers): + for tile_y in range(self.height): + for tile_x in range(self.width): + # vertices + left_x = tile_x * self.quad_width + top_y = tile_y * -self.quad_height + right_x = left_x + self.quad_width + bottom_y = top_y - self.quad_height + x0,y0 = left_x, top_y + x1,y1 = right_x, top_y + x2,y2 = left_x, bottom_y + x3,y3 = right_x, bottom_y + # Z of all layers is 0, layer Z set in shader + verts = [x0, y0, 0] + verts += [x1, y1, 0] + verts += [x2, y2, 0] + verts += [x3, y3, 0] + self.vert_array[layer][tile_y][tile_x] = verts + # vertex elements + elements = [vert_index, vert_index+1, vert_index+2] + elements += [vert_index+1, vert_index+2, vert_index+3] + self.elem_array[elem_index:elem_index+ELEM_STRIDE] = elements + elem_index += ELEM_STRIDE + # 4 verts in a quad + vert_index += 4 + + def new_uv_layers(self, layers): + "Return given # of layer's worth of vanilla UV array data." + shape = (layers, self.height, self.width, UV_STRIDE) + array = np.zeros(shape, dtype=np.float32) + # default new layer of UVs to "normal" transform + uvs = uv_types[UV_NORMAL] + for layer in range(layers): + for y in range(self.height): + for x in range(self.width): + array[layer][y][x] = uvs + return array + + def is_tile_inside(self, x, y): + "Return True if given x,y tile coord is within our bounds." + return 0 <= x < self.width and 0 <= y < self.height + + # get methods + def get_char_index_at(self, frame, layer, x, y): + "Return character index for given frame/layer/x,y tile." + return int(self.chars[frame][layer][y][x][0]) + + def get_fg_color_index_at(self, frame, layer, x, y): + "Return foreground color index for given frame/layer/x,y tile." + return int(self.fg_colors[frame][layer][y][x][0]) + + def get_bg_color_index_at(self, frame, layer, x, y): + "Return background color index for given frame/layer/x,y tile." + return int(self.bg_colors[frame][layer][y][x][0]) + + def get_char_transform_at(self, frame, layer, x, y): + "Return character transform enum for given frame/layer/x,y tile." + # read from mapping, rather than casting raw UV coords for tuple key + return self.uv_maps[frame][layer][y][x][0] + + def get_tile_at(self, frame, layer, x, y): + """ + Return (char index, fg color index, bg color index, transform) tuple + for given frame/layer/x,y tile. + """ + char = self.get_char_index_at(frame, layer, x, y) + fg = self.get_fg_color_index_at(frame, layer, x, y) + bg = self.get_bg_color_index_at(frame, layer, x, y) + xform = self.get_char_transform_at(frame, layer, x, y) + return char, fg, bg, xform + + # set methods + def set_char_index_at(self, frame, layer, x, y, char_index): + "Set character index for given frame/layer/x,y tile." + self.chars[frame][layer][y][x] = char_index + # next update, tell renderables on the changed frame to update buffers + self.char_changed_frames[frame] = True + + def set_color_at(self, frame, layer, x, y, color_index, fg=True): + """ + Set (fg or bg) color index for given frame/layer/x,y tile. + Foreground or background specified with "fg" boolean. + """ + if color_index is None: return + # modulo to resolve any negative indices + if 0 < color_index >= len(self.palette.colors): + color_index %= len(self.palette.colors) + # no functional differences between fg and bg color update, + # so use the same code path with different parameters + update_array = self.fg_colors[frame] if fg else self.bg_colors[frame] + update_array[layer][y][x] = color_index + self.fg_changed_frames[frame] = True + self.bg_changed_frames[frame] = True + + def set_all_non_transparent_colors(self, new_color_index): + """ + Set color index for all non-transparent (index 0) colors on all tiles + on all frames and layers. + """ + for frame, layer, x, y in TileIter(self): + # non-transparent color could be FG or BG + char, fg, bg, xform = self.get_tile_at(frame, layer, x, y) + change_fg = bg == 0 + self.set_color_at(frame, layer, x, y, new_color_index, change_fg) + + def set_all_bg_colors(self, new_color_index, exclude_layers=[]): + "Set background color index for all tiles on all frames and layers." + for frame, layer, x, y in TileIter(self): + # exclude all layers named in list + if self.layer_names[layer] in exclude_layers: + continue + self.set_color_at(frame, layer, x, y, new_color_index, fg=False) + + def set_char_transform_at(self, frame, layer, x, y, transform): + """ + Set character transform (X/Y flip, 0/90/180/270 rotate) for given + frame/layer/x,y tile. + """ + self.uv_mods[frame][layer][y][x] = uv_types[transform] + # keep mapping, used only for quick access, in sync + self.uv_maps[frame][layer][y][x] = transform + self.uv_changed_frames[frame] = True + + def set_tile_at(self, frame, layer, x, y, char_index=None, fg=None, bg=None, + transform=None, set_all=False): + """ + Convenience function for setting all tile attributes (character index, + foreground and background color, and transofmr) at once. + """ + # speedier path if we know all tile attributes will change, + # eg command undo/apply + if set_all: + self.set_char_index_at(frame, layer, x, y, char_index) + self.set_color_at(frame, layer, x, y, fg, True) + self.set_color_at(frame, layer, x, y, bg, False) + self.set_char_transform_at(frame, layer, x, y, transform) + return + if char_index is not None: + self.set_char_index_at(frame, layer, x, y, char_index) + if fg is not None: + self.set_color_at(frame, layer, x, y, fg, True) + if bg is not None: + self.set_color_at(frame, layer, x, y, bg, False) + if transform is not None: + self.set_char_transform_at(frame, layer, x, y, transform) + + def flip_all_xforms(self, flip_dict): + # kinda ugly brute force approach: individually set all tiles in all + # layers in all frames :/ + for frame in range(self.frames): + for layer in range(self.layers): + for y in range(self.height): + for x in range(self.width): + self.set_char_transform_at(frame, layer, x, y, flip_dict[self.get_char_transform_at(frame, layer, x, y)]) + + def flip_horizontal(self, frame, layer): + "Mirrors Art left-to-right." + command = EntireArtCommand(self) + command.save_tiles(before=True) + for a in [self.chars, self.fg_colors, self.bg_colors, self.uv_mods, self.uv_maps]: + a[frame][layer] = np.fliplr(a[frame][layer]) + if self.app.ui.flip_affects_xforms: + flips = { + UV_NORMAL: UV_FLIPX, + UV_FLIPX: UV_NORMAL, + UV_FLIPY: UV_ROTATE180, + UV_ROTATE180: UV_FLIPY, + UV_ROTATE90: UV_FLIP90, + UV_FLIP90: UV_ROTATE90, + UV_ROTATE270: UV_FLIP270, + UV_FLIP270: UV_ROTATE270 + } + self.flip_all_xforms(flips) + self.mark_frame_changed(frame) + self.set_unsaved_changes(True) + command.save_tiles(before=False) + self.command_stack.commit_commands([command]) + + def flip_vertical(self, frame, layer): + "Flips Art upside down." + command = EntireArtCommand(self) + command.save_tiles(before=True) + for a in [self.chars, self.fg_colors, self.bg_colors, self.uv_mods, self.uv_maps]: + a[frame][layer] = np.flipud(a[frame][layer]) + if self.app.ui.flip_affects_xforms: + flips = { + UV_NORMAL: UV_FLIPY, + UV_FLIPY: UV_NORMAL, + UV_FLIPX: UV_ROTATE180, + UV_ROTATE180: UV_FLIPX, + # vertical flip of rotated characters: use inverted (180) "flip" + UV_ROTATE90: UV_FLIP270, + UV_FLIP270: UV_ROTATE90, + UV_ROTATE270: UV_FLIP90, + UV_FLIP90: UV_ROTATE270 + } + self.flip_all_xforms(flips) + self.mark_frame_changed(frame) + self.set_unsaved_changes(True) + command.save_tiles(before=False) + self.command_stack.commit_commands([command]) + + def shift(self, frame, layer, amount_x, amount_y): + "Shift + wrap art on given frame and layer by given amount in X and Y." + for a in [self.chars, self.fg_colors, self.bg_colors, self.uv_mods, self.uv_maps]: + a[frame][layer] = np.roll(a[frame][layer], amount_x, 1) + a[frame][layer] = np.roll(a[frame][layer], amount_y, 0) + self.mark_frame_changed(frame) + + def shift_all_frames(self, amount_x, amount_y): + "Shift + wrap art in X and Y on all frames and layers." + for frame in range(self.frames): + for layer in range(self.layers): + self.shift(frame, layer, amount_x, amount_y) + + def update_saved_camera(self, camera): + self.camera_x, self.camera_y, self.camera_z = camera.x, camera.y, camera.z + + def update_selected_tile_attributes(self): + self.selected_char = self.app.ui.selected_char + self.selected_fg_color = self.app.ui.selected_fg_color + self.selected_bg_color = self.app.ui.selected_bg_color + self.selected_xform = self.app.ui.selected_xform + + def changed_this_frame(self): + return self.geo_changed or \ + True in self.char_changed_frames.values() or \ + True in self.fg_changed_frames.values() or \ + True in self.bg_changed_frames.values() or \ + True in self.uv_changed_frames.values() + + def update(self): + self.update_scripts() + # update our camera if we're active + if not self.app.game_mode and self.app.ui and self.app.ui.active_art is self: + self.update_saved_camera(self.app.camera) + self.update_selected_tile_attributes() + # update our renderables if they're on a frame whose char/colors changed + if self.geo_changed: + self.build_geo() + for r in self.renderables: + if self.geo_changed: + r.update_geo_buffers() + self.geo_changed = False + do_char = self.char_changed_frames[r.frame] + do_uvs = self.uv_changed_frames[r.frame] + do_fg = self.fg_changed_frames[r.frame] + do_bg = self.bg_changed_frames[r.frame] + if do_char or do_fg or do_bg or do_uvs: + r.update_tile_buffers(do_char, do_uvs, do_fg, do_bg) + # update instances if we chaned + if self.changed_this_frame() and self.instances: + for instance in self.instances: + if instance.update_when_source_changes: + instance.restore_from_source() + # empty table of changed frames + for f in range(self.frames): + self.char_changed_frames[f] = False + self.fg_changed_frames[f] = False + self.bg_changed_frames[f] = False + self.uv_changed_frames[f] = False + self.updated_this_tick = True + + def save_to_file(self): + """ + Write this Art to disk. + Build a dict serializing all this art's data and write it to a file. + """ + # if trying to save to a dir that doesn't exist, switch file to the + # Art Mode documents dir, which we should assume does exist + filedir = os.path.dirname(self.filename) + if not os.path.exists(filedir): + #self.app.log('Tried to save to directory %s which does not exist!' % filedir, error=True) + new_path = self.app.documents_dir + ART_DIR + os.path.basename(self.filename) + self.set_filename(new_path) + start_time = time.time() + # cursor might be hovering, undo any preview changes + for edit in self.app.cursor.preview_edits: + edit.undo() + d = {'width': self.width, 'height': self.height, + 'charset': self.charset.name, 'palette': self.palette.name, + 'active_frame': self.active_frame, + 'active_layer': self.active_layer, + 'camera': (self.camera_x, self.camera_y, self.camera_z), + 'selected_char': int(self.selected_char), + 'selected_fg_color': int(self.selected_fg_color), + 'selected_bg_color': int(self.selected_bg_color), + 'selected_xform': int(self.selected_xform) + } + # preferred character set and palette, default used if not found + # remember camera location + # frames and layers are dicts w/ lists of their data + a few properties + frames = [] + for frame_index in range(self.frames): + frame = { 'delay': self.frame_delays[frame_index] } + layers = [] + for layer_index in range(self.layers): + layer = {'z': self.layers_z[layer_index], + 'visible': int(self.layers_visibility[layer_index]), + 'name': self.layer_names[layer_index] + } + tiles = [] + for y in range(self.height): + for x in range(self.width): + char = int(self.chars[frame_index][layer_index][y][x][0]) + fg = int(self.fg_colors[frame_index][layer_index][y][x][0]) + bg = int(self.bg_colors[frame_index][layer_index][y][x][0]) + # use get method for transform, data's not simply an int + xform = int(self.get_char_transform_at(frame_index, layer_index, x, y)) + tiles.append({'char': char, 'fg': fg, 'bg': bg, 'xform': xform}) + layer['tiles'] = tiles + layers.append(layer) + frame['layers'] = layers + frames.append(frame) + d['frames'] = frames + # MAYBE-TODO: below gives not-so-pretty-printing, find out way to control + # formatting for better output + json.dump(d, open(self.filename, 'w'), sort_keys=True, indent=1) + end_time = time.time() + self.set_unsaved_changes(False) + #self.app.log('saved %s to disk in %.5f seconds' % (self.filename, end_time - start_time)) + self.app.log('saved %s' % self.filename) + # remove old thumbnail + thumb_dir = self.app.cache_dir + THUMBNAIL_CACHE_DIR + if os.path.exists(self.filename): + old_thumb_filename = thumb_dir + self.app.get_file_hash(self.filename) + '.png' + if os.path.exists(old_thumb_filename): + os.remove(old_thumb_filename) + # write thumbnail + new_thumb_filename = thumb_dir + self.app.get_file_hash(self.filename) + '.png' + write_thumbnail(self.app, self.filename, new_thumb_filename) + # thumbnail write process actually sets active frame! set it back + for r in self.renderables: + r.set_frame(self.active_frame) + + def ALT_save_to_file(self): + # TEST alt save format research + # main idea: save flat lists of char/fg/bg/xform per-frame-per-layer + # savetest.psci: 500x300x5, 38s vs 8.6s save, 63MB vs 33MB (vs 11MB w/ indent=None) + # TODO: + # - test read perf too + # - save version checking (if none found in PSCI, assume v1) + # - support multiple save+load code paths for different save versions + def get_flat_int_list(layer_array): + return list(map(int, layer_array.flatten()))[::4] + start_time = time.time() + d = {'width': self.width, 'height': self.height, + 'charset': self.charset.name, 'palette': self.palette.name, + 'active_frame': self.active_frame, + 'active_layer': self.active_layer, + 'camera': (self.camera_x, self.camera_y, self.camera_z) + } + frames = [] + for frame_index in range(self.frames): + frame = { 'delay': self.frame_delays[frame_index] } + layers = [] + for layer_index in range(self.layers): + layer = {'z': self.layers_z[layer_index], + 'visible': int(self.layers_visibility[layer_index]), + 'name': self.layer_names[layer_index] + } + # compile lists-of-ints for chars, colors, xforms + layer['chars'] = get_flat_int_list(self.chars[frame_index][layer_index]) + layer['fgs'] = get_flat_int_list(self.fg_colors[frame_index][layer_index]) + layer['bgs'] = get_flat_int_list(self.bg_colors[frame_index][layer_index]) + layer['xforms'] = get_flat_int_list(self.uv_maps[frame_index][layer_index]) + layers.append(layer) + frame['layers'] = layers + frames.append(frame) + d['frames'] = frames + json.dump(d, open(self.filename + '2', 'w'), sort_keys=True, indent=None) + end_time = time.time() + self.app.log('ALT saved %s to disk in %.5f seconds' % (self.filename, end_time - start_time)) + + def set_unsaved_changes(self, new_status): + "Mark this Art as having unsaved changes in Art Mode." + if new_status == self.unsaved_changes: + return + self.unsaved_changes = new_status + self.app.update_window_title() + + def set_filename(self, new_filename): + "Change Art's filename to new given string." + # append extension if missing + if not new_filename.endswith('.' + ART_FILE_EXTENSION): + new_filename += '.' + ART_FILE_EXTENSION + # if no dir given, assume documents/art/ dir + if os.path.basename(new_filename) == new_filename: + new_dir = self.app.documents_dir + # documents/game/art if game loaded + if self.app.gw.game_dir is not None: + new_dir = self.app.gw.game_dir + new_dir += ART_DIR + new_filename = new_dir + new_filename + # TODO: check if file already exists? warn user? + # (probably better to do this in new art / save as + self.filename = new_filename + + def run_script(self, script_filename, log=True, allow_undo=True): + """ + Run a script on this Art. Scripts contain arbitrary python expressions, + executed within Art's scope. Don't run art scripts you don't trust! + """ + script_filename = self.get_valid_script_filename(script_filename) + if not script_filename: + return + # remove any cursor-hover changes to art in memory + for edit in self.app.cursor.preview_edits: + edit.undo() + # create a command for undo/redo stack + if allow_undo: + command = EntireArtCommand(self) + command.save_tiles(before=True) + # catch and log any exception + try: + # run script + exec(open(script_filename).read()) + # (assume script changed art) + self.unsaved_changes = True + logline = 'Executed %s' % script_filename + if log: self.app.log(logline) + error = False + except Exception as e: + error = True + logline = 'Error executing %s:' % script_filename + self.app.log(logline) + # skip first 3 lines of callstack before artscript exec + for line in traceback.format_exc().split('\n')[3:]: + if line.strip(): + self.app.log(line.rstrip()) + # write "after" state of command and commit + if allow_undo: + command.save_tiles(before=False) + self.command_stack.commit_commands([command]) + self.app.ui.message_line.post_line(logline, error=error) + + def is_script_running(self, script_filename): + "Return True if script with given filename is currently running." + script_filename = self.get_valid_script_filename(script_filename) + return script_filename and script_filename in self.scripts + + def get_valid_script_filename(self, script_filename): + if not type(script_filename) is str: return None + return self.app.find_filename_path(script_filename, ART_SCRIPT_DIR, + SCRIPT_FILE_EXTENSION) + + def run_script_every(self, script_filename, rate=0.1): + "Start a script running on this Art at a regular rate." + script_filename = self.get_valid_script_filename(script_filename) + if not script_filename: + return + if script_filename in self.scripts: + self.app.log('script %s is already running.' % script_filename) + return + # add to "scripts currently running" list + self.scripts.append(script_filename) + self.script_rates.append(rate) + # set next time + next_run = (self.app.get_elapsed_time() / 1000) + rate + self.scripts_next_exec_time.append(next_run) + + def stop_script(self, script_filename): + "Halt this Art's execution of script with given filename." + # remove from running scripts, rate list, next_exec list + script_filename = self.get_valid_script_filename(script_filename) + if not script_filename: + return + if not script_filename in self.scripts: + self.app.log("script %s exists but isn't running." % script_filename) + return + script_index = self.scripts.index(script_filename) + self.scripts.pop(script_index) + self.script_rates.pop(script_index) + self.scripts_next_exec_time.pop(script_index) + + def stop_all_scripts(self): + "Halt all art scripts executing on this Art." + for script_filename in self.scripts: + self.stop_script(script_filename) + + def update_scripts(self): + if len(self.scripts) == 0: + return + # don't run on game art while paused + if self.app.game_mode and self.app.gw.paused: + return + for i,script in enumerate(self.scripts): + if (self.app.get_elapsed_time() / 1000) > self.scripts_next_exec_time[i]: + # execute script directly; don't use formal safeguards of run_script + exec(open(script).read()) + self.unsaved_changes = True + self.scripts_next_exec_time[i] += self.script_rates[i] + + def clear_line(self, frame, layer, line_y, fg_color_index=None, + bg_color_index=None): + "Clear characters on given horizontal line, to optional given colors." + # TODO: use numpy slicing to do this much more quickly! + for x in range(self.width): + self.set_char_index_at(frame, layer, x, line_y, 0) + if fg_color_index: + self.set_color_at(frame, layer, x, line_y, fg_color_index) + if bg_color_index: + self.set_color_at(frame, layer, x, line_y, bg_color_index, False) + + def write_string(self, frame, layer, x, y, text, fg_color_index=None, + bg_color_index=None, right_justify=False): + """ + Write given string starting at given frame/layer/x,y tile, with + optional given colors, left-justified by default. + Any characters not in character set's mapping data are ignored. + """ + if y >= self.height: + return + x %= self.width + if right_justify: + x_offset = -len(text) + else: + x_offset = 0 + # never let string drawing go out of bounds + text = text[:self.width - (x+x_offset)] + for char in text: + idx = self.charset.get_char_index(char) + self.set_char_index_at(frame, layer, x+x_offset, y, idx) + if fg_color_index is not None: + self.set_color_at(frame, layer, x+x_offset, y, fg_color_index, True) + if bg_color_index is not None: + self.set_color_at(frame, layer, x+x_offset, y, bg_color_index, False) + x_offset += 1 + + def composite_to(self, src_frame, src_layer, src_x, src_y, width, height, + dest_art, dest_frame, dest_layer, dest_x, dest_y): + for y in range(src_y, src_y + height): + for x in range(src_x, src_x + width): + # never try to write out of bounds on dest art; let user be lazy + if x < 0 or x >= dest_art.width or y < 0 or y >= dest_art.height: + continue + # only consider non-blank characters + if self.get_char_index_at(src_frame, src_layer, x, y) == 0: + continue + # skip tiles with transparent FG + # TODO: decide if there's a reasonable behavior here + if self.get_fg_color_index_at(src_frame, src_layer, x, y) == 0: + continue + ch, fg, bg, xform = self.get_tile_at(src_frame, src_layer, x, y) + # get coords in dest art space + dx = dest_x + (x - src_x) + dy = dest_y + (y - src_y) + # transparent bg -> keep dest bg, else use entire src tile + if self.get_bg_color_index_at(src_frame, src_layer, x, y) == 0: + bg = dest_art.get_bg_color_index_at(dest_frame, dest_layer, + dx, dy) + dest_art.set_tile_at(dest_frame, dest_layer, dx, dy, + ch, fg, bg, xform) + + def composite_from(self, src_art, src_frame, src_layer, src_x, src_y, + width, height, dest_frame, dest_layer, dest_x, dest_y): + src_art.composite_to(src_frame, src_layer, src_x, src_y, width, height, + self, dest_frame, dest_layer, dest_x, dest_y) + + def get_filtered_tiles(self, frame, layer, char_value, invert_filter=False): + "Return list of (x,y) tile coords that match (or don't) a char value." + tiles = [] + for y in range(self.height): + for x in range(self.width): + char = self.get_char_index_at(frame, layer, x, y) + if (not invert_filter and char == char_value) or \ + (invert_filter and char != char_value): + tiles.append((x, y)) + return tiles + + def get_blank_tiles(self, frame, layer): + "Return a list of (x,y) tile coords whose character is blank (0)." + return self.get_filtered_tiles(frame, layer, 0) + + def get_nonblank_tiles(self, frame, layer): + "Return a list of (x,y) tile coords whose character is NOT blank (0)." + return self.get_filtered_tiles(frame, layer, 0, invert_filter=True) + + def get_simple_name(self): + return os.path.splitext(os.path.basename(self.filename))[0] + + +class ArtFromDisk(Art): + "Subclass of Art that loads from a file. Main difference is initialization." + def __init__(self, filename, app): + self.valid = False + try: + d = json.load(open(filename)) + except: + return + width = d['width'] + height = d['height'] + charset = app.load_charset(d['charset']) + if not charset: + app.log('Character set %s not found!' % d['charset']) + return + palette = app.load_palette(d['palette']) + if not palette: + app.log('Palette %s not found!' % d['palette']) + return + # store loaded data for init_layers/frames + self.loaded_data = d + # base Art class initializes all vars, thereafter we just populate + Art.__init__(self, filename, app, charset, palette, + width, height) + # still loading... + self.valid = False + if not self.app.override_saved_camera: + cam = d['camera'] + self.camera_x, self.camera_y, self.camera_z = cam[0], cam[1], cam[2] + else: + self.update_saved_camera(self.app.camera) + # read saved tile attributes, which won't exist in pre-0.9.6 PSCI files + if 'selected_char' in d: + self.selected_char = d['selected_char'] + if 'selected_fg_color' in d: + self.selected_fg_color = d['selected_fg_color'] + if 'selected_bg_color' in d: + self.selected_bg_color = d['selected_bg_color'] + if 'selected_xform' in d: + self.selected_xform = d['selected_xform'] + # update renderables with new data + self.update() + # signify to app that this file loaded successfully + self.valid = True + + def log_init(self): + self.app.log('Loaded %s from disk:' % filename) + self.app.log(' character set: %s' % self.charset.name) + self.app.log(' palette: %s' % self.palette.name) + self.app.log(' width/height: %s x %s' % (self.width, self.height)) + self.app.log(' frames: %s' % self.frames) + self.app.log(' layers: %s' % self.layers) + + def init_layers(self): + frames = self.loaded_data['frames'] + # number of layers should be same for all frames + self.layers = len(frames[0]['layers']) + self.layers_z, self.layers_visibility, self.layer_names = [], [], [] + for i,layer in enumerate(frames[0]['layers']): + self.layers_z.append(layer['z']) + self.layers_visibility.append(bool(layer.get('visible', 1))) + layer_num = str(i + 1) + self.layer_names.append(layer.get('name', 'Layer %s' % layer_num)) + active_layer = self.loaded_data.get('active_layer', 0) + self.set_active_layer(active_layer) + + def init_frames(self): + frames = self.loaded_data['frames'] + self.frames = len(frames) + self.active_frame = 0 + self.frame_delays = [] + # build tile data arrays from frame+layer lists + shape = (self.layers, self.height, self.width, 4) + for frame in frames: + self.frame_delays.append(frame['delay']) + chars = np.zeros(shape, dtype=np.float32) + uvs = self.new_uv_layers(self.layers) + uv_maps = np.zeros(shape, dtype=np.uint32) + fg_colors = chars.copy() + bg_colors = chars.copy() + for layer_index,layer in enumerate(frame['layers']): + x, y = 0, 0 + for tile in layer['tiles']: + chars[layer_index][y][x] = tile['char'] + fg_colors[layer_index][y][x] = tile['fg'] + bg_colors[layer_index][y][x] = tile['bg'] + uvs[layer_index][y][x] = uv_types[tile.get('xform', UV_NORMAL)] + uv_maps[layer_index][y][x] = tile.get('xform', UV_NORMAL) + x += 1 + if x >= self.width: + x = 0 + y += 1 + self.chars.append(chars) + self.fg_colors.append(fg_colors) + self.bg_colors.append(bg_colors) + self.uv_mods.append(uvs) + self.uv_maps.append(uv_maps) + # set active frame properly + active_frame = self.loaded_data.get('active_frame', 0) + self.set_active_frame(active_frame) + + def first_update(self): + # do nothing on first update during Art.init; we update after loading + pass + + +class ArtInstance(Art): + """ + Deep copy / clone of a source Art that can hold unique changes and be + restored to its source. + """ + update_when_source_changes = True + "Set False if you want to manually update this Art." + def __init__(self, source): + self.source = source + # unique(?) filename + self.filename = '%s_Instance%i' % (source.filename, time.time()) + self.app = source.app + self.instances = None + self.char_changed_frames, self.uv_changed_frames = {}, {} + self.fg_changed_frames, self.bg_changed_frames = {}, {} + # init lists that should be retained across refreshes + self.scripts = [] + self.script_rates = [] + self.scripts_next_exec_time = [] + self.renderables = [] + # instances shouldn't have instances; cause user problems if attempted + self.instances = None + self.restore_from_source() + self.source.instances.append(self) + + def set_unsaved_changes(self, new_status): + pass + + def restore_from_source(self): + "Restore ArtInstance to its source Art's new values." + # copy common references/values + for prop in ['app', 'width', 'height', 'charset', 'palette', + 'quad_width', 'quad_height', 'layers', 'frames']: + setattr(self, prop, getattr(self.source, prop)) + # copy lists + self.layers_z = self.source.layers_z[:] + self.layers_visibility = self.source.layers_visibility[:] + self.layer_names = self.source.layer_names[:] + self.frame_delays = self.source.frame_delays[:] + # deep copy tile data lists + self.chars, self.fg_colors, self.bg_colors = [], [], [] + self.uv_mods, self.uv_maps = [], [] + for frame_chars in self.source.chars: + self.chars.append(frame_chars.copy()) + for frame_uvs in self.source.uv_mods: + self.uv_mods.append(frame_uvs.copy()) + for frame_uv_maps in self.source.uv_maps: + self.uv_maps.append(frame_uv_maps.copy()) + for frame_fg_colors in self.source.fg_colors: + self.fg_colors.append(frame_fg_colors.copy()) + for frame_bg_colors in self.source.bg_colors: + self.bg_colors.append(frame_bg_colors.copy()) + self.geo_changed = True + self.mark_all_frames_changed() + self.update() + + +class TileIter: + "Iterator for iterating over all tiles in all layers and frames in an Art." + def __init__(self, art): + self.width, self.height = art.width, art.height + self.frames, self.layers = art.frames, art.layers + + def __iter__(self): + self.frame, self.layer = 0, 0 + self.x, self.y = -1, 0 + return self + + def __next__(self): + self.x += 1 + if self.x >= self.width: + self.x = 0 + self.y += 1 + if self.y >= self.height: + self.y = 0 + self.layer += 1 + if self.layer >= self.layers: + self.layer = 0 + self.frame += 1 + if self.frame >= self.frames: + raise StopIteration + return self.frame, self.layer, self.x, self.y diff --git a/art/blob_shadow.psci b/art/blob_shadow.psci new file mode 100644 index 0000000..b243dee --- /dev/null +++ b/art/blob_shadow.psci @@ -0,0 +1,122 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 2.0, + -2.0, + 3.50242610515142 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 104, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 134, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 177, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 177, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 136, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 4, + "palette": "c64_original", + "width": 4 +} \ No newline at end of file diff --git a/art/default_player_stand.psci b/art/default_player_stand.psci new file mode 100644 index 0000000..38035c4 --- /dev/null +++ b/art/default_player_stand.psci @@ -0,0 +1,33 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1, + -1.0, + 8.989488752238989 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 252, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/art/game_object_default.psci b/art/game_object_default.psci new file mode 100644 index 0000000..536dcec --- /dev/null +++ b/art/game_object_default.psci @@ -0,0 +1,694 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 9.78410337431772, + -4.180414323343156, + 11.151385425870988 + ], + "charset": "ui", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 128, + "fg": 10, + "xform": 2 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 11, + "xform": 3 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 31, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 32, + "fg": 4, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 28, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 48, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 39, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 2, + "xform": 5 + }, + { + "bg": 1, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 73, + "fg": 2, + "xform": 5 + }, + { + "bg": 1, + "char": 100, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 5 + }, + { + "bg": 1, + "char": 94, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 92, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 2, + "xform": 5 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 14, + "xform": 1 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 15, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 131, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 5, + "palette": "c64_original", + "width": 11 +} \ No newline at end of file diff --git a/art/hello1.psci b/art/hello1.psci new file mode 100644 index 0000000..6897600 --- /dev/null +++ b/art/hello1.psci @@ -0,0 +1,8265 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 4.0, + -4.0, + 5.625 + ], + "charset": "c64_edscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 72, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 14, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 119, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 121, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 122, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.25 + }, + { + "name": "Layer 3", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 26, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 61, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.5 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 69, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 14, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 119, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 121, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 122, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.25 + }, + { + "name": "Layer 3", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 26, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 61, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.5 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 14, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 119, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 121, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 122, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.25 + }, + { + "name": "Layer 3", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 26, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 61, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.5 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 14, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 119, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 121, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 122, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.25 + }, + { + "name": "Layer 3", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 27, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 68, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.5 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 79, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 14, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 119, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 121, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 122, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.25 + }, + { + "name": "Layer 3", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 27, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 68, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.5 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 119, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 121, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 122, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.25 + }, + { + "name": "Layer 3", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 27, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 68, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.5 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 14, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 119, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 14, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 121, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 122, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.25 + }, + { + "name": "Layer 3", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 26, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 61, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.5 + } + ] + } + ], + "height": 8, + "palette": "c64_edscii", + "selected_bg_color": 1, + "selected_char": 14, + "selected_fg_color": 16, + "selected_xform": 0, + "width": 8 +} \ No newline at end of file diff --git a/art/loc_marker.psci b/art/loc_marker.psci new file mode 100644 index 0000000..834dae6 --- /dev/null +++ b/art/loc_marker.psci @@ -0,0 +1,81 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1.5, + -1.5, + 7.369075414190879 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 30, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 31, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 75, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 31, + "fg": 16, + "xform": 2 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 30, + "fg": 13, + "xform": 2 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 3, + "palette": "c64_original", + "width": 3 +} \ No newline at end of file diff --git a/art/new.psci b/art/new.psci new file mode 100644 index 0000000..5c8923d --- /dev/null +++ b/art/new.psci @@ -0,0 +1,9631 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 20, + -15, + 16 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 155, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 155, + "fg": 4, + "xform": 0 + }, + { + "bg": 7, + "char": 155, + "fg": 5, + "xform": 0 + }, + { + "bg": 7, + "char": 155, + "fg": 8, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 16, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 12, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 1, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 25, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 19, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 3, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 9, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 9, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 155, + "fg": 3, + "xform": 0 + }, + { + "bg": 7, + "char": 155, + "fg": 6, + "xform": 0 + }, + { + "bg": 7, + "char": 155, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 155, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 23, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 139, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 140, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 33, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 16, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 139, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 152, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 1, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 19, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 3, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 9, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 9, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 44, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 140, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 44, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 131, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 134, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 140, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 139, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 5, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 149, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 152, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 139, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 135, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 3, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 135, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 44, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 6, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 3, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 4, + "xform": 0 + }, + { + "bg": 7, + "char": 134, + "fg": 5, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 6, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 8, + "xform": 0 + }, + { + "bg": 7, + "char": 148, + "fg": 9, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 131, + "fg": 11, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 12, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 13, + "xform": 0 + }, + { + "bg": 7, + "char": 139, + "fg": 14, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 7, + "char": 44, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 131, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 2, + "fg": 15, + "xform": 0 + }, + { + "bg": 2, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 3, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 4, + "char": 138, + "fg": 15, + "xform": 0 + }, + { + "bg": 5, + "char": 134, + "fg": 15, + "xform": 0 + }, + { + "bg": 6, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 148, + "fg": 15, + "xform": 0 + }, + { + "bg": 9, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 10, + "char": 131, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 11, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 12, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 13, + "char": 139, + "fg": 15, + "xform": 0 + }, + { + "bg": 14, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 16, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 15, + "char": 13, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 142, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 148, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 146, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 132, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 129, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 148, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 147, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 147, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 142, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 141, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 47, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 15, + "char": 5, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 141, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 147, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 132, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 145, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 143, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 16, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 15, + "char": 19, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 143, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 128, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 130, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 132, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 129, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 128, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 145, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 143, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 138, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 135, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 131, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 139, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 15, + "char": 13, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 136, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 131, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 131, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 139, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 132, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 140, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 142, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 148, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 146, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 132, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 47, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 15, + "char": 146, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 135, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 136, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 133, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 147, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 43, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 128, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 145, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 145, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 142, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 150, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 138, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 132, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 152, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 146, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 143, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 135, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 149, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 150, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 148, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 131, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 16, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 138, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 145, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 148, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 131, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 135, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 140, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 148, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 150, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 135, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 147, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 139, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 16, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 139, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 152, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 146, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 136, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 131, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 142, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 73, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 74, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 73, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 74, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 8, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 128, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 149, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 132, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 133, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 148, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 141, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 33, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 93, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 89, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 90, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 95, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 84, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 83, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 84, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 83, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 103, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 88, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 100, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 115, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 99, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 88, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 89, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 99, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 89, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 69, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 74, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 99, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 100, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 99, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 99, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 100, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 100, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 7, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 99, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 155, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 99, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 155, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 155, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 155, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 155, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 155, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 76, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 155, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 40, + "palette": "c64_original", + "selected_bg_color": 7, + "selected_char": 8, + "selected_fg_color": 15, + "selected_xform": 0, + "width": 40 +} \ No newline at end of file diff --git a/art/owell.ed b/art/owell.ed new file mode 100644 index 0000000..dd08969 Binary files /dev/null and b/art/owell.ed differ diff --git a/art/trigger_default.psci b/art/trigger_default.psci new file mode 100644 index 0000000..b315508 --- /dev/null +++ b/art/trigger_default.psci @@ -0,0 +1,226 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 2.0, + -2.0, + 11.149579543758225 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 94, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 20, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 20, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 18, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 9, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 7, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 9, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 7, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 5, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 7, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 4, + "palette": "c64_original", + "width": 4 +} \ No newline at end of file diff --git a/art/world_properties_object.psci b/art/world_properties_object.psci new file mode 100644 index 0000000..07b86c8 --- /dev/null +++ b/art/world_properties_object.psci @@ -0,0 +1,117 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 2.5, + -1.5, + 8.762620393409348 + ], + "charset": "ui", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 50, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 42, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 45, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 39, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 31, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 130, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 7, + "xform": 4 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 7, + "xform": 5 + }, + { + "bg": 7, + "char": 129, + "fg": 6, + "xform": 5 + }, + { + "bg": 1, + "char": 128, + "fg": 7, + "xform": 2 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 3, + "palette": "c64_original", + "width": 5 +} \ No newline at end of file diff --git a/art_export.py b/art_export.py new file mode 100644 index 0000000..1aca9c3 --- /dev/null +++ b/art_export.py @@ -0,0 +1,57 @@ + +import traceback + +from art import ART_DIR + +class ArtExporter: + + """ + Class for exporting an Art into a non-Playscii format. + Export logic happens in run_export; exporter authors simply extend this + class, override run_export and the class properties below. + """ + + format_name = 'ERROR - ArtExporter.format_name' + "User-visible name for this format, shown in export chooser." + format_description = "ERROR - ArtExporter.format_description" + "String (can be triple-quoted) describing format, shown in export chooser." + file_extension = '' + "Extension to give the exported file, sans dot." + options_dialog_class = None + "UIDialog subclass exposing export options to user." + + def __init__(self, app, out_filename, options={}): + self.app = app + self.art = self.app.ui.active_art + # add file extension to output filename if not present + if self.file_extension and not out_filename.endswith('.%s' % self.file_extension): + out_filename += '.%s' % self.file_extension + # output filename in documents/art dir + if not out_filename.startswith(self.app.documents_dir + ART_DIR): + out_filename = self.app.documents_dir + ART_DIR + out_filename + self.success = False + "Set True on successful export." + # store final filename for log messages + self.out_filename = out_filename + # remove any cursor-hover changes to art in memory + for edit in self.app.cursor.preview_edits: + edit.undo() + try: + if self.run_export(out_filename, options): + self.success = True + else: + line = '%s failed to export %s, see console for errors' % (self.__class__.__name__, out_filename) + self.app.log(line) + self.app.ui.message_line.post_line(line, hold_time=10, error=True) + except: + for line in traceback.format_exc().split('\n'): + self.app.log(line) + # store last used export options for "Export last" + self.app.last_export_options = options + + def run_export(self, out_filename, options): + """ + Contains the actual export logic. Write data based on current art, + return success. + """ + return False diff --git a/art_import.py b/art_import.py new file mode 100644 index 0000000..137e9be --- /dev/null +++ b/art_import.py @@ -0,0 +1,88 @@ + +import os, traceback + +from art import Art, ART_FILE_EXTENSION, DEFAULT_CHARSET, DEFAULT_PALETTE +from ui_file_chooser_dialog import GenericImportChooserDialog + +class ArtImporter: + + """ + Class for creating a new Art from data in non-Playscii format. + Import logic happens in run_import; importer authors simply extend this + class, override run_import and the class properties below. + """ + + format_name = 'ERROR - ArtImporter.format_name' + "User-visible name for this format, shown in import chooser." + format_description = "ERROR - ArtImporter.format_description" + "String (can be triple-quoted) describing format, shown in import chooser." + allowed_file_extensions = [] + "List of file extensions for this format - if empty, any file is accepted." + file_chooser_dialog_class = GenericImportChooserDialog + """ + BaseFileChooserDialog subclass for picking files. Only needed for things + like custom preview images. + """ + options_dialog_class = None + "UIDialog subclass exposing import options to user." + generic_error = '%s failed to import %s' + # if False (eg bitmap conversion), "Imported successfully" message + # won't show on successful creation + completes_instantly = True + + def __init__(self, app, in_filename, options={}): + self.app = app + new_filename = '%s.%s' % (os.path.splitext(in_filename)[0], + ART_FILE_EXTENSION) + self.art = self.app.new_art(new_filename) + # use charset and palette of existing art + charset = self.app.ui.active_art.charset if self.app.ui.active_art else self.app.load_charset(DEFAULT_CHARSET) + self.art.set_charset(charset) + palette = self.app.ui.active_art.palette if self.app.ui.active_art else self.app.load_palette(DEFAULT_PALETTE) + self.art.set_palette(palette) + self.app.set_new_art_for_edit(self.art) + self.art.clear_frame_layer(0, 0, 1) + self.success = False + "Set True on successful import." + # run_import returns success, log it separately from exceptions + try: + if self.run_import(in_filename, options): + self.success = True + except: + for line in traceback.format_exc().split('\n'): + self.app.log(line) + if not self.success: + line = self.generic_error % (self.__class__.__name__, in_filename) + self.app.log(line) + self.app.close_art(self.art) + # post message now after close_art sets active art back + self.app.ui.message_line.post_line(line, error=True) + return + # tidy final result, whether or not it was successful + # TODO: GROSS! figure out why this works but + # art.geo_changed=True and art.mark_all_frames_changed() don't! + self.app.ui.erase_selection_or_art() + self.app.ui.undo() + # adjust for new art size and set it active + self.app.ui.adjust_for_art_resize(self.art) + self.app.ui.set_active_art(self.art) + + def set_art_charset(self, charset_name): + "Convenience function for setting charset by name from run_import." + self.art.set_charset_by_name(charset_name) + + def set_art_palette(self, palette_name): + "Convenience function for setting palette by name from run_import." + self.art.set_palette_by_name(palette_name) + + def resize(self, new_width, new_height): + "Convenience function for resizing art from run_import" + self.art.resize(new_width, new_height) + self.app.ui.adjust_for_art_resize(self.art) + + def run_import(self, in_filename, options): + """ + Contains the actual import logic. Read input file, set Art + size/charset/palette, set tiles from data, return success. + """ + return False diff --git a/artscripts/c64_ed_to_orig.arsc b/artscripts/c64_ed_to_orig.arsc new file mode 100644 index 0000000..899d738 --- /dev/null +++ b/artscripts/c64_ed_to_orig.arsc @@ -0,0 +1,28 @@ + +# convert from C64 EDSCII to C64 original color palettes + +color_map = { + 1: 1, + 2: 3, + 3: 5, + 4: 7, + 5: 6, + 6: 8, + 7: 12, + 8: 16, + 9: 10, + 10: 9, + 11: 11, + 12: 15, + 13: 14, + 14: 4, + 15: 13, + 16: 2 +} + +for frame, layer, x, y in TileIter(self): + ch, fg, bg, xf = self.get_tile_at(frame, layer, x, y) + fg = color_map.get(fg, 0) + bg = color_map.get(bg, 0) + self.set_color_at(frame, layer, x, y, fg, fg=True) + self.set_color_at(frame, layer, x, y, bg, fg=False) diff --git a/artscripts/c64_fade.arsc b/artscripts/c64_fade.arsc new file mode 100644 index 0000000..de033be --- /dev/null +++ b/artscripts/c64_fade.arsc @@ -0,0 +1,28 @@ + +# palette-specific (c64 original) fade to black + +color_ramps = { + 2: 16, + 3: 10, + 4: 15, + 5: 12, + 6: 12, + 7: 12, + 8: 9, + 9: 10, + 10: 12, + 11: 3, + 12: 1, + 13: 12, + 14: 6, + 15: 7, + 16: 13 +} + +for frame, layer, x, y in TileIter(self): + fg = self.get_fg_color_index_at(frame, layer, x, y) + fg = color_ramps.get(fg, 1) + self.set_color_at(frame, layer, x, y, fg, fg=True) + bg = self.get_bg_color_index_at(frame, layer, x, y) + bg = color_ramps.get(bg, 1) + self.set_color_at(frame, layer, x, y, bg, fg=False) diff --git a/artscripts/conway.arsc b/artscripts/conway.arsc new file mode 100644 index 0000000..e45634c --- /dev/null +++ b/artscripts/conway.arsc @@ -0,0 +1,39 @@ +# conway's game of life + +# naive, super slow implementation for proof-of-concept +# (accessing char array would probably be way faster!) +for frame, layer, x, y in TileIter(self): + dead = self.get_char_index_at(frame, layer, x, y) == 0 + # N, NE, E, SE, S, SW, W, NW + neighbor_offsets = [(0, -1), (1, -1), (1, 0), (1, 1), + (0, 1), (-1, 1), (-1, 0), (-1, -1)] + neighbors = 0 + neighbor_chars = [] + neighbor_colors = [] + for offset in neighbor_offsets: + check_x, check_y = x + offset[0], y + offset[1] + # don't check at edges + if not (0 < check_x < self.width and 0 < check_y < self.height): + continue + neighbor_char = self.get_char_index_at(frame, layer, check_x, check_y) + if neighbor_char != 0: + neighbors += 1 + # remember neighbor char in case we come alive + neighbor_chars.append(neighbor_char) + fg = self.get_fg_color_index_at(frame, layer, check_x, check_y) + neighbor_colors.append(fg) + bg = self.get_bg_color_index_at(frame, layer, check_x, check_y) + neighbor_colors.append(bg) + # rule #4: any dead cell with exactly 3 neighbors becomes alive + if dead and neighbors == 3: + # pick a random neighbord character to be + self.set_char_index_at(frame, layer, x, y, random.choice(neighbor_chars)) + change_fg = random.choice([False, True]) + self.set_color_at(frame, layer, x, y, random.choice(neighbor_colors), change_fg) + # rule #3: any living cell with >3 neighbors dies from overcrowding + elif neighbors > 3: + self.set_char_index_at(frame, layer, x, y, 0) + # rule #1: any living cell with <2 neighbors dies from underpopulation + elif neighbors < 2: + self.set_char_index_at(frame, layer, x, y, 0) + # rule #2: any living cell with 2 or 3 neighbors survives diff --git a/artscripts/dissolv.arsc b/artscripts/dissolv.arsc new file mode 100644 index 0000000..14125b1 --- /dev/null +++ b/artscripts/dissolv.arsc @@ -0,0 +1,23 @@ + +# quickie dissolve effect + +frame, layer = 0, 0 + +left_x = int(self.width / 2) +top_y = int(self.height / 2) + +for x in range(int(self.width / 2)): + for y in range(self.height): + char = self.get_char_index_at(frame, layer, x, y) + char = max(0, char - 1) + if x > 0: + self.set_char_index_at(frame, layer, x - 1, y, char) + self.set_char_index_at(frame, layer, x, y, 0) + +for x in range(self.width - 1, int(self.width / 2), -1): + for y in range(self.height): + char = self.get_char_index_at(frame, layer, x, y) + char = max(0, char - 1) + if x < self.width - 1: + self.set_char_index_at(frame, layer, x + 1, y, char) + self.set_char_index_at(frame, layer, x, y, 0) diff --git a/artscripts/evap.arsc b/artscripts/evap.arsc new file mode 100644 index 0000000..1e74826 --- /dev/null +++ b/artscripts/evap.arsc @@ -0,0 +1,14 @@ + +# quickie "evaporate" effect + +spesh_idx = 127 + +for frame, layer, x, y in TileIter(self): + char = self.get_char_index_at(frame, layer, x, y) + if char != spesh_idx and char != 0: + self.set_char_index_at(frame, layer, x, y, spesh_idx) + elif y < self.height - 1: + c,f,b,xf = self.get_tile_at(frame, layer, x, y+1) + self.set_tile_at(frame, layer, x, y, c, f, b) + elif y == self.height - 1: + self.set_char_index_at(frame, layer, x, y, 0) diff --git a/artscripts/hello1.arsc b/artscripts/hello1.arsc new file mode 100644 index 0000000..fe4bff6 --- /dev/null +++ b/artscripts/hello1.arsc @@ -0,0 +1,202 @@ +# hello1 test art generator script +# every line in this file must be a valid python expression. +# "self" is the Art that's running us, +# so we have full access to its namespace! + +# sets some test data: +# c64_edscii charset & palette +# add tiles/layers if not 8x8, 3 layers + +self.set_charset_by_name('c64_edscii') +self.set_palette_by_name('c64_edscii') + +if self.layers < 3: + self.add_layer(0.25) + self.add_layer(0.5) + +if self.width < 8 or self.height < 8: + self.resize(8, 8) + +# clear 1st layer to black, 2nd and 3rd to transparent +self.clear_frame_layer(0, 0, self.palette.darkest_index) +self.clear_frame_layer(0, 1) +self.clear_frame_layer(0, 2) +# write white text onto 3 layers +color = self.palette.lightest_index +self.write_string(0, 0, 1, 1, 'Hello.', color) +self.set_char_transform_at(0, 0, 2, 1, UV_ROTATE90) +# draw snaky ring thingy +# color ramp: 2, 10, 6, 13, 14, 12, 3, back to 2 +# top +self.set_tile_at(0, 1, 1, 3, 119, 2) +self.set_tile_at(0, 1, 2, 3, 102, 10) +self.set_tile_at(0, 1, 3, 3, 102, 6) +self.set_tile_at(0, 1, 4, 3, 102, 13) +self.set_tile_at(0, 1, 5, 3, 120, 14) +# sides +self.set_tile_at(0, 1, 1, 4, 145, 3) +self.set_tile_at(0, 1, 5, 4, 145, 12) +self.set_tile_at(0, 1, 1, 5, 145, 12) +self.set_tile_at(0, 1, 5, 5, 145, 3) +# bottom +self.set_tile_at(0, 1, 1, 6, 121, 14) +self.set_tile_at(0, 1, 2, 6, 102, 13) +self.set_tile_at(0, 1, 3, 6, 102, 6) +self.set_tile_at(0, 1, 4, 6, 102, 10) +self.set_tile_at(0, 1, 5, 6, 122, 2) +# :] +char = self.charset.get_char_index(':') +self.set_tile_at(0, 2, 3, 4, char, color) +char = self.charset.get_char_index(']') +self.set_tile_at(0, 2, 4, 4, char, color) + +# add frames and animate 'em +self.duplicate_frame(0) +self.duplicate_frame(0) +self.duplicate_frame(0) +self.duplicate_frame(0) +self.duplicate_frame(0) +self.duplicate_frame(0) + +# cycle capitals through "hello" text +h = self.charset.get_char_index('h') +char = self.charset.get_char_index('E') +self.set_char_index_at(1, 0, 2, 1, char) +self.set_char_index_at(1, 0, 1, 1, h) +char = self.charset.get_char_index('L') +self.set_char_index_at(2, 0, 3, 1, char) +self.set_char_index_at(2, 0, 1, 1, h) +self.set_char_index_at(3, 0, 4, 1, char) +self.set_char_index_at(3, 0, 1, 1, h) +char = self.charset.get_char_index('O') +self.set_char_index_at(4, 0, 5, 1, char) +self.set_char_index_at(4, 0, 1, 1, h) +char = self.charset.get_char_index('!') +self.set_char_index_at(5, 0, 6, 1, char) +self.set_char_index_at(5, 0, 1, 1, h) +self.set_char_index_at(6, 0, 1, 1, h) +# make smiley go from ;] to :D +char = self.charset.get_char_index(';') +self.set_char_index_at(3, 2, 3, 4, char) +self.set_char_index_at(4, 2, 3, 4, char) +self.set_char_index_at(5, 2, 3, 4, char) +char = self.charset.get_char_index('D') +self.set_char_index_at(3, 2, 4, 4, char) +self.set_char_index_at(4, 2, 4, 4, char) +self.set_char_index_at(5, 2, 4, 4, char) +self.set_char_transform_at(4, 2, 4, 4, UV_FLIPX) +# cycle colors for snaky thing +# +# frame 1 top +# +self.set_color_at(1, 1, 1, 3, 10) +self.set_color_at(1, 1, 2, 3, 6) +self.set_color_at(1, 1, 3, 3, 13) +self.set_color_at(1, 1, 4, 3, 14) +self.set_color_at(1, 1, 5, 3, 12) +# frame 1 sides +self.set_color_at(1, 1, 1, 4, 2) +self.set_color_at(1, 1, 5, 4, 3) +self.set_color_at(1, 1, 1, 5, 3) +self.set_color_at(1, 1, 5, 5, 2) +# frame 1 bottom +self.set_color_at(1, 1, 1, 6, 12) +self.set_color_at(1, 1, 2, 6, 14) +self.set_color_at(1, 1, 3, 6, 13) +self.set_color_at(1, 1, 4, 6, 6) +self.set_color_at(1, 1, 5, 6, 10) +# +# frame 2 top +# +self.set_color_at(2, 1, 1, 3, 6) +self.set_color_at(2, 1, 2, 3, 13) +self.set_color_at(2, 1, 3, 3, 14) +self.set_color_at(2, 1, 4, 3, 12) +self.set_color_at(2, 1, 5, 3, 3) +# frame 2 sides +self.set_color_at(2, 1, 1, 4, 10) +self.set_color_at(2, 1, 5, 4, 2) +self.set_color_at(2, 1, 1, 5, 2) +self.set_color_at(2, 1, 5, 5, 10) +# frame 2 bottom +self.set_color_at(2, 1, 1, 6, 3) +self.set_color_at(2, 1, 2, 6, 12) +self.set_color_at(2, 1, 3, 6, 14) +self.set_color_at(2, 1, 4, 6, 13) +self.set_color_at(2, 1, 5, 6, 6) +# +# frame 3 top +# +self.set_color_at(3, 1, 1, 3, 13) +self.set_color_at(3, 1, 2, 3, 14) +self.set_color_at(3, 1, 3, 3, 12) +self.set_color_at(3, 1, 4, 3, 3) +self.set_color_at(3, 1, 5, 3, 2) +# frame 3 sides +self.set_color_at(3, 1, 1, 4, 6) +self.set_color_at(3, 1, 5, 4, 10) +self.set_color_at(3, 1, 1, 5, 10) +self.set_color_at(3, 1, 5, 5, 6) +# frame 3 bottom +self.set_color_at(3, 1, 1, 6, 2) +self.set_color_at(3, 1, 2, 6, 3) +self.set_color_at(3, 1, 3, 6, 12) +self.set_color_at(3, 1, 4, 6, 14) +self.set_color_at(3, 1, 5, 6, 13) +# +# frame 4 top +# +self.set_color_at(4, 1, 1, 3, 14) +self.set_color_at(4, 1, 2, 3, 12) +self.set_color_at(4, 1, 3, 3, 3) +self.set_color_at(4, 1, 4, 3, 2) +self.set_color_at(4, 1, 5, 3, 10) +# frame 4 sides +self.set_color_at(4, 1, 1, 4, 13) +self.set_color_at(4, 1, 5, 4, 6) +self.set_color_at(4, 1, 1, 5, 6) +self.set_color_at(4, 1, 5, 5, 13) +# frame 4 bottom +self.set_color_at(4, 1, 1, 6, 10) +self.set_color_at(4, 1, 2, 6, 2) +self.set_color_at(4, 1, 3, 6, 3) +self.set_color_at(4, 1, 4, 6, 12) +self.set_color_at(4, 1, 5, 6, 14) +# +# frame 5 top +# +self.set_color_at(5, 1, 1, 3, 12) +self.set_color_at(5, 1, 2, 3, 3) +self.set_color_at(5, 1, 3, 3, 2) +self.set_color_at(5, 1, 4, 3, 10) +self.set_color_at(5, 1, 5, 3, 6) +# frame 5 sides +self.set_color_at(5, 1, 1, 4, 14) +self.set_color_at(5, 1, 5, 4, 13) +self.set_color_at(5, 1, 1, 5, 13) +self.set_color_at(5, 1, 5, 5, 14) +# frame 5 bottom +self.set_color_at(5, 1, 1, 6, 6) +self.set_color_at(5, 1, 2, 6, 10) +self.set_color_at(5, 1, 3, 6, 2) +self.set_color_at(5, 1, 4, 6, 3) +self.set_color_at(5, 1, 5, 6, 12) +# +# frame 6 top +# +self.set_color_at(6, 1, 1, 3, 3) +self.set_color_at(6, 1, 2, 3, 2) +self.set_color_at(6, 1, 3, 3, 10) +self.set_color_at(6, 1, 4, 3, 6) +self.set_color_at(6, 1, 5, 3, 13) +# frame 6 sides +self.set_color_at(6, 1, 1, 4, 12) +self.set_color_at(6, 1, 5, 4, 14) +self.set_color_at(6, 1, 1, 5, 14) +self.set_color_at(6, 1, 5, 5, 12) +# frame 6 bottom +self.set_color_at(6, 1, 1, 6, 13) +self.set_color_at(6, 1, 2, 6, 6) +self.set_color_at(6, 1, 3, 6, 10) +self.set_color_at(6, 1, 4, 6, 2) +self.set_color_at(6, 1, 5, 6, 3) diff --git a/artscripts/mutate.arsc b/artscripts/mutate.arsc new file mode 100644 index 0000000..2c6bd02 --- /dev/null +++ b/artscripts/mutate.arsc @@ -0,0 +1,13 @@ + +# mutate! +# change a random tile on a random layer + +x = random.randint(0, self.width-1) +y = random.randint(0, self.height-1) +layer = random.randint(0, self.layers-1) +char = random.randint(0, 128) +color_index = self.palette.get_random_color_index() +self.set_char_index_at(0, layer, x, y, char) +self.set_color_at(0, layer, x, y, color_index) +color_index = self.palette.get_random_color_index() +self.set_color_at(0, layer, x, y, color_index, False) diff --git a/audio.py b/audio.py new file mode 100644 index 0000000..cf03c5e --- /dev/null +++ b/audio.py @@ -0,0 +1,145 @@ + +import ctypes +from sdl2 import sdlmixer + +class PlayingSound: + "represents a currently playing sound" + def __init__(self, filename, channel, game_object, looping=False): + self.filename = filename + self.channel = channel + self.go = game_object + self.looping = looping + +class AudioLord: + + sample_rate = 44100 + + def __init__(self, app): + self.app = app + # initialize audio + sdlmixer.Mix_Init(sdlmixer.MIX_INIT_OGG|sdlmixer.MIX_INIT_MOD) + sdlmixer.Mix_OpenAudio(self.sample_rate, sdlmixer.MIX_DEFAULT_FORMAT, + 2, 1024) + self.reset() + # sound callback + # retain handle to C callable even though we don't use it directly + self.sound_cb = ctypes.CFUNCTYPE(None, ctypes.c_int)(self.channel_finished) + sdlmixer.Mix_ChannelFinished(self.sound_cb) + + def channel_finished(self, channel): + # remove sound from dicts of playing channels and sounds + old_sound = self.playing_channels.pop(channel) + self.playing_sounds[old_sound.filename].remove(old_sound) + # remove empty list + if self.playing_sounds[old_sound.filename] == []: + self.playing_sounds.pop(old_sound.filename) + + def reset(self): + self.stop_all_music() + self.stop_all_sounds() + # current playing sounds, of form: + # {'filename': [list of PlayingSound objects]} + self.playing_sounds = {} + # current playing channels, of form: + # {channel_number: PlayingSound object} + self.playing_channels = {} + # handle init case where self.musics doesn't exist yet + if hasattr(self, 'musics'): + for music in self.musics.values(): + sdlmixer.Mix_FreeMusic(music) + self.musics = {} + if hasattr(self, 'sounds'): + for sound in self.sounds.values(): + sdlmixer.Mix_FreeChunk(sound) + self.sounds = {} + + def register_sound(self, sound_filename): + if sound_filename in self.sounds: + return self.sounds[sound_filename] + new_sound = sdlmixer.Mix_LoadWAV(bytes(sound_filename, 'utf-8')) + self.sounds[sound_filename] = new_sound + return new_sound + + def object_play_sound(self, game_object, sound_filename, + loops=0, allow_multiple=False): + # TODO: volume param? sdlmixer.MIX_MAX_VOLUME if not specified + # bail if same object isn't allowed to play same sound multiple times + if not allow_multiple and sound_filename in self.playing_sounds: + for playing_sound in self.playing_sounds[sound_filename]: + if playing_sound.go is game_object: + return + sound = self.register_sound(sound_filename) + channel = sdlmixer.Mix_PlayChannel(-1, sound, loops) + # add sound to dicts of playing sounds and channels + new_playing_sound = PlayingSound(sound_filename, channel, game_object, + loops == -1) + if sound_filename in self.playing_sounds: + self.playing_sounds[sound_filename].append(new_playing_sound) + else: + self.playing_sounds[sound_filename] = [new_playing_sound] + self.playing_channels[channel] = new_playing_sound + + def object_stop_sound(self, game_object, sound_filename): + if not sound_filename in self.playing_sounds: + return + # stop all instances of this sound object might be playing + for sound in self.playing_sounds[sound_filename]: + if game_object is sound.go: + sdlmixer.Mix_HaltChannel(sound.channel) + + def object_stop_all_sounds(self, game_object): + sounds_to_stop = [] + for sound_filename,sounds in self.playing_sounds.items(): + for sound in sounds: + if sound.go is game_object: + sounds_to_stop.append(sound_filename) + for sound_filename in sounds_to_stop: + self.object_stop_sound(game_object, sound_filename) + + def stop_all_sounds(self): + sdlmixer.Mix_HaltChannel(-1) + + def set_music(self, music_filename): + if music_filename in self.musics: + return + new_music = sdlmixer.Mix_LoadMUS(bytes(music_filename, 'utf-8')) + self.musics[music_filename] = new_music + + def start_music(self, music_filename, loops=-1): + # TODO: fade in support etc + music = self.musics[music_filename] + sdlmixer.Mix_PlayMusic(music, loops) + self.current_music = music_filename + + def pause_music(self): + if self.current_music: + sdlmixer.Mix_PauseMusic() + + def resume_music(self): + if self.current_music: + sdlmixer.Mix_ResumeMusic() + + def stop_music(self, music_filename): + # TODO: fade out support + sdlmixer.Mix_HaltMusic() + self.current_music = None + + def is_music_playing(self): + return bool(sdlmixer.Mix_PlayingMusic()) + + def resume_music(self): + if self.current_music: + sdlmixer.Mix_ResumeMusic() + + def stop_all_music(self): + sdlmixer.Mix_HaltMusic() + self.current_music = None + + def update(self): + if self.current_music and not self.is_music_playing(): + self.current_music = None + + def destroy(self): + self.reset() + sdlmixer.Mix_CloseAudio() + sdlmixer.Mix_Quit() diff --git a/binds.cfg.default b/binds.cfg.default new file mode 100644 index 0000000..5bc6584 --- /dev/null +++ b/binds.cfg.default @@ -0,0 +1,177 @@ +# DEFAULT BIND FILE TEMPLATE, DO NOT MODIFY +# user keybinds file +# accepted modifiers: ctrl, alt, shift +# keys must be equivalent to output of sdl2.SDL_GetKeyName(), +# eg return, tab, backspace + +self.edit_bind_src = { + 'ctrl q' : 'quit', + '`' : 'toggle_console', + 'ctrl m' : 'import_file', + 'ctrl e' : ('export_file_last', 'edit_art_for_selected_objects'), + 'ctrl -' : 'decrease_ui_scale', + 'ctrl =' : 'increase_ui_scale', + 'alt return': 'toggle_fullscreen', + '1' : 'decrease_brush_size', + '2' : 'increase_brush_size', + '3' : 'cycle_char_forward', + 'shift 3' : 'cycle_char_backward', + '4' : 'cycle_fg_forward', + 'shift 4' : 'cycle_fg_backward', + '5' : 'cycle_bg_forward', + 'shift 5' : 'cycle_bg_backward', + '6' : 'cycle_xform_forward', + 'shift 6' : 'cycle_xform_backward', + 'c' : 'toggle_affects_char', + 'f' : 'toggle_affects_fg', + 'b' : 'toggle_affects_bg', + # bind can also be a tuple of function names + 'x' : ('toggle_affects_xform', 'game_frob'), + 'z' : ('toggle_zoom_extents', 'game_grab'), + 'shift r' : 'toggle_crt', + 'a' : 'select_pencil_tool', + 'e' : 'select_erase_tool', + 'r' : 'select_rotate_tool', + 't' : 'select_text_tool', + 's' : 'select_select_tool', + 'ctrl x' : 'cut_selection', + 'ctrl c' : 'copy_selection', + 'v' : 'select_paste_tool', + 'ctrl v' : 'select_paste_tool', + 'i' : 'select_fill_tool', + 'escape' : 'cancel', + 'ctrl d' : 'select_none', + 'ctrl a' : 'select_all', + 'ctrl i' : 'select_invert', + 'delete' : 'erase_selection_or_art', + 'backspace': 'erase_selection_or_art', + 'g' : 'toggle_game_mode', + 'shift e' : 'toggle_game_edit_ui', + 'ctrl shift g': 'set_game_dir', + 'ctrl g' : 'load_game_state', + 'f2' : 'reset_game', + 'space' : 'toggle_picker', + 'w' : 'swap_fg_bg_colors', + 'ctrl s' : 'save_current', + 'shift u' : 'toggle_ui_visibility', + 'shift g' : 'toggle_grid_visibility', + ',' : 'previous_frame', + '.' : 'next_frame', + 'p' : 'toggle_anim_playback', + '[' : 'previous_layer', + ']' : 'next_layer', + 'shift ctrl tab': 'previous_art', + 'ctrl tab' : 'next_art', + 'ctrl z' : 'undo', + 'shift ctrl z': 'redo', + 'q' : 'quick_grab', + 'shift t' : 'toggle_camera_tilt', + 'shift i' : 'toggle_overlay_image', + '=' : 'camera_zoom_in_proportional', + '-' : 'camera_zoom_out_proportional', + 'return' : 'select_or_paint', + 'shift return': 'add_to_list_selection', + 'ctrl return': 'remove_from_list_selection', + 'f12' : 'screenshot', + 'ctrl shift m' : 'run_test_mutate', + 'up' : 'arrow_up', + 'down' : 'arrow_down', + 'left' : 'arrow_left', + 'right' : 'arrow_right', + 'home' : 'center_cursor_in_art', + 'l' : 'cycle_inactive_layer_visibility', + 'alt f' : 'open_file_menu', + 'alt e' : 'open_edit_menu', + 'alt t' : 'open_tool_menu', + 'alt v' : 'open_view_menu', + 'alt a' : 'open_art_menu', + 'alt r' : 'open_frame_menu', + 'alt l' : 'open_layer_menu', + 'alt c' : 'open_char_color_menu', + 'alt g' : 'open_game_menu', + 'alt h' : 'open_help_menu', + 'alt s' : 'open_state_menu', + 'alt w' : 'open_world_menu', + 'alt o' : 'open_object_menu', + 'ctrl o' : 'open_art', + 'ctrl n' : 'new_art', + 'ctrl w' : 'close_art', + 'f1' : 'open_help_docs', + 'ctrl k' : 'crop_to_selection', + 'ctrl r' : 'resize_art', + 'ctrl t' : 'run_art_script_last', + 'ctrl f' : 'add_frame', + 'ctrl l' : ('add_layer', 'select_objects'), + 'ctrl h' : 'choose_charset', + 'ctrl p' : ('choose_palette', 'choose_spawn_object_class'), + 'o' : 'toggle_onion_visibility', + 'f5' : 'toggle_all_origin_viz', + 'f6' : 'toggle_all_bounds_viz', + 'f7' : 'toggle_all_collision_viz', + 'f8' : 'toggle_debug_text', + 'f9' : 'toggle_fps_counter', + 'f3' : 'toggle_collision_on_selected', + 'tab' : 'switch_edit_panel_focus', + 'shift tab': 'switch_edit_panel_focus_reverse', + # commands that don't have a shortcut still need to be declared + # bind strings preceded by a _ will not be displayed + '_saveas' : 'save_art_as', + '_grab' : 'select_grab_tool', + '_switch_art' : 'art_switch_to', + '_switch_layer' : 'layer_switch_to', + '_layer_viz' : 'toggle_layer_visibility', + '_hidden_layers': 'toggle_hidden_layers_visible', + '_website' : 'open_website', + '_docs' : 'generate_docs', + '_dup_frame' : 'duplicate_frame', + '_frame_delay' : 'change_frame_delay', + '_frame_delay_all': 'change_frame_delay_all', + '_frame_index' : 'change_frame_index', + '_delete_frame' : 'delete_frame', + '_dup_layer' : 'duplicate_layer', + '_layer_name' : 'change_layer_name', + '_layer_z' : 'change_layer_z', + '_delete_layer' : 'delete_layer', + '_pal_from_file': 'palette_from_file', + '_cycle_onion_frames': 'cycle_onion_frames', + '_cycle_onion_display': 'cycle_onion_ahead_behind', + '_open_game_assets' : 'open_all_game_assets', + '_export_file' : 'export_file', + '_import_file': 'import_file', + '_revert' : 'revert_art', + '_new_game' : 'new_game_dir', + '_duplicate_objects': 'duplicate_selected_objects', + '_edit_world' : 'edit_world_properties', + '_save_game' : 'save_game_state', + '_change_room' : 'change_current_room', + '_change_room_to': 'change_current_room_to', + '_add_room' : 'add_room', + '_remove_room' : 'remove_current_room', + '_room_objects' : 'set_room_objects', + '_object_rooms' : 'set_object_rooms', + '_show_all_rooms': 'toggle_all_rooms_visible', + '_set_room_cam' : 'set_room_camera_marker', + '_obj_to_cam' : 'objects_to_camera', + '_cam_to_obj' : 'camera_to_objects', + '_add_to_room' : 'add_selected_to_room', + '_remove_from_room': 'remove_selected_from_room', + '_room_edge_warps': 'set_room_edge_warps', + '_room_bounds' : 'set_room_bounds_obj', + '_room_cameras' : 'toggle_room_camera_changes', + '_list_room_objs': 'toggle_list_only_room_objects', + '_rename_room' : 'rename_current_room', + '_toggle_debug_objects': 'toggle_debug_objects', + '_toggle_picker_hold': 'toggle_picker_hold', + '_set_camera_zoom': 'set_camera_zoom', + '_toggle_bg_texture': 'toggle_bg_texture', + '_run_art_script': 'run_art_script', + '_art_flip_horizontal': 'art_flip_horizontal', + '_art_flip_vertical': 'art_flip_vertical', + '_art_toggle_flip_affects_xforms': 'art_toggle_flip_affects_xforms', + '_edit_cfg': 'edit_cfg', + '_select_overlay_image': 'select_overlay_image', + '_set_overlay_image_opacity': 'set_overlay_image_opacity', + '_set_overlay_image_scaling': 'set_overlay_image_scaling', + '_toggle_art_toolbar': 'toggle_art_toolbar', + '_cycle_fill_boundary_mode': 'cycle_fill_boundary_mode' +} diff --git a/build_mac.sh b/build_mac.sh new file mode 100755 index 0000000..5fb6e5b --- /dev/null +++ b/build_mac.sh @@ -0,0 +1,7 @@ +pyinstaller playscii_mac.spec +cd dist/Playscii.app/Contents/MacOS/ +ln -s libSDL2-2.0.0.dylib libSDL2.dylib +ln -s libSDL2_mixer-2.0.0.dylib libSDL2_mixer.dylib +cd ../../../../ +hdiutil create -ov -size 110m -srcfolder dist/Playscii.app/ playscii_mac-`cat version`.dmg + diff --git a/build_windows.bat b/build_windows.bat new file mode 100644 index 0000000..b59a597 --- /dev/null +++ b/build_windows.bat @@ -0,0 +1,37 @@ +@echo off + +set BUILD_EXE_PATH=dist\playscii.exe +set OUTPUT_DIR=dist\playscii\ +set ICON_PATH=ui\playscii.ico +set XCOPY_INCLUDE=win_xcopy_include +set XCOPY_EXCLUDE=win_xcopy_exclude +set COPY_INCLUDE=win_copy_include + +echo Creating new build... + +REM ==== -F = everything in one file; -w = no console window; -i = path to icon +python -m PyInstaller -F -w -i %ICON_PATH% --exclude-module pdoc playscii.py +echo Build done! + +REM ==== move build so that ZIP will have a subdir enclosing everything +mkdir %OUTPUT_DIR% +move %BUILD_EXE_PATH% %OUTPUT_DIR% + +echo ----------- + +echo Copying external files... +REM ==== xcopy dirs recursively +for /f "tokens=*" %%i in (%XCOPY_INCLUDE%) DO ( +echo %%i +xcopy /E/Y "%%i" "%OUTPUT_DIR%\%%i" /exclude:%XCOPY_EXCLUDE% +) +REM ==== regular copy files (non-recursively) +for /f "tokens=*" %%i in (%COPY_INCLUDE%) DO ( +echo %%i +copy /Y "%%i" %OUTPUT_DIR% > NUL +) + +echo ----------- +echo Done! + +pause diff --git a/camera.py b/camera.py new file mode 100644 index 0000000..cd50c17 --- /dev/null +++ b/camera.py @@ -0,0 +1,303 @@ +import math +import numpy as np +import vector + +def clamp(val, lowest, highest): + return min(highest, max(lowest, val)) + +class Camera: + + # good starting values + start_x,start_y = 0,0 + start_zoom = 2.5 + x_tilt, y_tilt = 0, 0 + # pan/zoom speed tuning + mouse_pan_rate = 10 + pan_accel = 0.005 + base_max_pan_speed = 0.8 + pan_friction = 0.1 + # min/max zoom % between which pan speed variation scales + pan_min_pct = 25.0 + pan_max_pct = 200.0 + # factor by which zoom level modifies pan speed + pan_zoom_increase_factor = 16 + zoom_accel = 0.1 + max_zoom_speed = 2.5 + zoom_friction = 0.1 + # kill velocity if below this + min_velocity = 0.05 + # map extents + # starting values only, bounds are generated according to art size + min_x,max_x = -10, 50 + min_y,max_y = -50, 10 + use_bounds = True + min_zoom,max_zoom = 1, 1000 + # matrices -> worldspace renderable vertex shader uniforms + fov = 90 + near_z = 0.0001 + far_z = 100000 + + def __init__(self, app): + self.app = app + self.reset() + self.max_pan_speed = self.base_max_pan_speed + + def reset(self): + self.x, self.y = self.start_x, self.start_y + self.z = self.start_zoom + # store look vectors so world/screen space conversions can refer to it + self.look_x, self.look_y, self.look_z = None,None,None + self.vel_x, self.vel_y, self.vel_z = 0,0,0 + self.mouse_panned, self.moved_this_frame = False, False + # GameObject to focus on + self.focus_object = None + self.calc_projection_matrix() + self.calc_view_matrix() + + def calc_projection_matrix(self): + self.projection_matrix = self.get_perspective_matrix() + + def calc_view_matrix(self): + eye = vector.Vec3(self.x, self.y, self.z) + up = vector.Vec3(0, 1, 0) + target = vector.Vec3(eye.x + self.x_tilt, eye.y + self.y_tilt, 0) + # view axes + forward = (target - eye).normalize() + side = forward.cross(up).normalize() + upward = side.cross(forward) + m = [[side.x, upward.x, -forward.x, 0], + [side.y, upward.y, -forward.y, 0], + [side.z, upward.z, -forward.z, 0], + [-eye.dot(side), -eye.dot(upward), eye.dot(forward), 1]] + self.view_matrix = np.array(m, dtype=np.float32) + self.look_x, self.look_y, self.look_z = side, upward, forward + + def get_perspective_matrix(self): + zmul = (-2 * self.near_z * self.far_z) / (self.far_z - self.near_z) + ymul = 1 / math.tan(self.fov * math.pi / 360) + aspect = self.app.window_width / self.app.window_height + xmul = ymul / aspect + m = [[xmul, 0, 0, 0], + [ 0, ymul, 0, 0], + [ 0, 0, -1, -1], + [ 0, 0, zmul, 0]] + return np.array(m, dtype=np.float32) + + def get_ortho_matrix(self, width=None, height=None): + width, height = width or self.app.window_width, height or self.app.window_height + m = np.eye(4, 4, dtype=np.float32) + left, bottom = 0, 0 + right, top = width, height + far_z, near_z = -1, 1 + x = 2 / (right - left) + y = 2 / (top - bottom) + z = -2 / (self.far_z - self.near_z) + wx = -(right + left) / (right - left) + wy = -(top + bottom) / (top - bottom) + wz = -(self.far_z + self.near_z) / (self.far_z - self.near_z) + m = [[ x, 0, 0, 0], + [ 0, y, 0, 0], + [ 0, 0, z, 0], + [wx, wy, wz, 0]] + return np.array(m, dtype=np.float32) + + def pan(self, dx, dy, keyboard=False): + # modify pan speed based on zoom according to a factor + m = (self.pan_zoom_increase_factor * self.z) / self.min_zoom + self.vel_x += dx * self.pan_accel * m + self.vel_y += dy * self.pan_accel * m + # for brevity, app passes in whether user appears to be keyboard editing + if keyboard: + self.app.keyboard_editing = True + + def zoom(self, dz, keyboard=False, towards_cursor=False): + self.vel_z += dz * self.zoom_accel + # pan towards cursor while zooming? + if towards_cursor: + dx = self.app.cursor.x - self.x + dy = self.app.cursor.y - self.y + self.pan(dx, dy, keyboard) + if keyboard: + self.app.keyboard_editing = True + + def get_current_zoom_pct(self): + "returns % of base (1:1) for current camera" + return (self.get_base_zoom() / self.z) * 100 + + def get_base_zoom(self): + "returns camera Z needed for 1:1 pixel zoom" + wh = self.app.window_height + ch = self.app.ui.active_art.charset.char_height + # TODO: understand why this produces correct result for 8x8 charsets + if ch == 8: + ch = 16 + return wh / ch + + def set_to_base_zoom(self): + self.z = self.get_base_zoom() + + def zoom_proportional(self, direction): + "zooms in or out via increments of 1:1 pixel scales for active art" + if not self.app.ui.active_art: + return + self.app.ui.active_art.camera_zoomed_extents = False + base_zoom = self.get_base_zoom() + # build span of all 1:1 zoom increments + zooms = [] + m = 1 + while base_zoom / m > self.min_zoom: + zooms.append(base_zoom / m) + m *= 2 + zooms.reverse() + m = 1 + while base_zoom * m < self.max_zoom: + zooms.append(base_zoom * m) + m *= 2 + # set zoom to nearest increment in direction we're heading + if direction > 0: + zooms.reverse() + for zoom in zooms: + if self.z > zoom: + self.z = zoom + break + elif direction < 0: + for zoom in zooms: + if self.z < zoom: + self.z = zoom + break + # kill all Z velocity for camera so we don't drift out of 1:1 + self.vel_z = 0 + + def find_closest_zoom_extents(self): + def corners_on_screen(): + art = self.app.ui.active_art + z = art.layers_z[-1] + x1, y1 = art.renderables[0].x, art.renderables[0].y + left, top = vector.world_to_screen_normalized(self.app, x1, y1, z) + x2 = x1 + art.width * art.quad_width + y2 = y1 - art.height * art.quad_height + right, bot = vector.world_to_screen_normalized(self.app, x2, y2, z) + #print('(%.3f, %.3f) -> (%.3f, %.3f)' % (left, top, right, bot)) + # add 1 tile of UI chars to top and bottom margins + top_margin = 1 - self.app.ui.menu_bar.art.quad_height + bot_margin = -1 + self.app.ui.status_bar.art.quad_height + return left >= -1 and top <= top_margin and \ + right <= 1 and bot >= bot_margin + # zoom out from minimum until all corners are visible + self.z = self.min_zoom + # recalc view matrix each move so projection stays correct + self.calc_view_matrix() + tries = 0 + while not corners_on_screen() and tries < 30: + self.zoom_proportional(-1) + self.calc_view_matrix() + tries += 1 + + def toggle_zoom_extents(self, override=None): + art = self.app.ui.active_art + if override is not None: + art.camera_zoomed_extents = not override + if art.camera_zoomed_extents: + # restore cached position + self.x, self.y, self.z = art.non_extents_camera_x, art.non_extents_camera_y, art.non_extents_camera_z + else: + art.non_extents_camera_x, art.non_extents_camera_y, art.non_extents_camera_z = self.x, self.y, self.z + # center camera on art + self.x = (art.width * art.quad_width) / 2 + self.y = -(art.height * art.quad_height) / 2 + self.find_closest_zoom_extents() + # kill all camera velocity when snapping + self.vel_x, self.vel_y, self.vel_z = 0, 0, 0 + art.camera_zoomed_extents = not art.camera_zoomed_extents + + def window_resized(self): + self.calc_projection_matrix() + + def set_zoom(self, z): + # TODO: set lerp target, clear if keyboard etc call zoom() + self.z = z + + def set_loc(self, x, y, z): + self.x, self.y, self.z = x, y, (z or self.z) # z optional + + def set_loc_from_obj(self, game_object): + self.set_loc(game_object.x, game_object.y, game_object.z) + + def set_for_art(self, art): + # set limits + self.max_x = art.width * art.quad_width + self.min_y = -art.height * art.quad_height + # use saved pan/zoom + self.set_loc(art.camera_x, art.camera_y, art.camera_z) + + def mouse_pan(self, dx, dy): + "pan view based on mouse delta" + if dx == 0 and dy == 0: + return + m = ((1 * self.pan_zoom_increase_factor) * self.z) / self.min_zoom + m /= self.max_zoom + self.x -= dx / self.mouse_pan_rate * m + self.y += dy / self.mouse_pan_rate * m + self.vel_x = self.vel_y = 0 + self.mouse_panned = True + + def update(self): + # zoom-proportional pan scale is based on art + if self.app.ui.active_art: + speed_scale = clamp(self.get_current_zoom_pct(), + self.pan_min_pct, self.pan_max_pct) + self.max_pan_speed = self.base_max_pan_speed / (speed_scale / 100) + else: + self.max_pan_speed = self.base_max_pan_speed + # remember last position to see if it changed + self.last_x, self.last_y, self.last_z = self.x, self.y, self.z + # if focus object is set, use it for X and Y transforms + if self.focus_object: + # track towards target + # TODO: revisit this for better feel later + dx, dy = self.focus_object.x - self.x, self.focus_object.y - self.y + l = math.sqrt(dx ** 2 + dy ** 2) + if l != 0 and l > 0.1: + il = 1 / l + dx *= il + dy *= il + self.x += dx * self.pan_friction + self.y += dy * self.pan_friction + else: + # clamp velocity + self.vel_x = clamp(self.vel_x, -self.max_pan_speed, self.max_pan_speed) + self.vel_y = clamp(self.vel_y, -self.max_pan_speed, self.max_pan_speed) + # apply friction + self.vel_x *= 1 - self.pan_friction + self.vel_y *= 1 - self.pan_friction + if abs(self.vel_x) < self.min_velocity: + self.vel_x = 0 + if abs(self.vel_y) < self.min_velocity: + self.vel_y = 0 + # if camera moves, we're not in zoom-extents state anymore + if self.app.ui.active_art and (self.vel_x or self.vel_y): + self.app.ui.active_art.camera_zoomed_extents = False + # move + self.x += self.vel_x + self.y += self.vel_y + # process Z separately + self.vel_z = clamp(self.vel_z, -self.max_zoom_speed, self.max_zoom_speed) + self.vel_z *= 1 - self.zoom_friction + if abs(self.vel_z) < self.min_velocity: + self.vel_z = 0 + # as bove, if zooming turn off zoom-extents state + if self.vel_z and self.app.ui.active_art: + self.app.ui.active_art.camera_zoomed_extents = False + self.z += self.vel_z + # keep within bounds + if self.use_bounds: + self.x = clamp(self.x, self.min_x, self.max_x) + self.y = clamp(self.y, self.min_y, self.max_y) + self.z = clamp(self.z, self.min_zoom, self.max_zoom) + # set view matrix from xyz + self.calc_view_matrix() + self.moved_this_frame = self.mouse_panned or self.x != self.last_x or self.y != self.last_y or self.z != self.last_z + self.mouse_panned = False + + def log_loc(self): + self.app.log('camera x=%s, y=%s, z=%s' % (self.x, self.y, self.z)) diff --git a/charset.py b/charset.py new file mode 100644 index 0000000..75bdcfe --- /dev/null +++ b/charset.py @@ -0,0 +1,191 @@ +import os.path, string, time +from PIL import Image + +from texture import Texture + +CHARSET_DIR = 'charsets/' +CHARSET_FILE_EXTENSION = 'char' + + +class CharacterSetLord: + + # time in ms between checks for hot reload + hot_reload_check_interval = 2 * 1000 + + def __init__(self, app): + self.app = app + self.last_check = 0 + + def check_hot_reload(self): + if self.app.get_elapsed_time() - self.last_check < self.hot_reload_check_interval: + return + self.last_check = self.app.get_elapsed_time() + changed = None + for charset in self.app.charsets: + if charset.has_updated(): + changed = charset.filename + # reload data and image even if only one changed + try: + success = charset.load_char_data() + if success: + self.app.log('CharacterSetLord: success reloading %s' % charset.filename) + else: + self.app.log('CharacterSetLord: failed reloading %s' % charset.filename, True) + except: + self.app.log('CharacterSetLord: failed reloading %s' % charset.filename, True) + + +class CharacterSet: + + transparent_color = (0, 0, 0) + + def __init__(self, app, src_filename, log): + self.init_success = False + self.app = app + self.filename = self.app.find_filename_path(src_filename, CHARSET_DIR, + CHARSET_FILE_EXTENSION) + if not self.filename: + self.app.log("Couldn't find character set data %s" % self.filename) + return + self.name = os.path.basename(self.filename) + self.name = os.path.splitext(self.name)[0] + # image filename discovered by character data load process + self.image_filename = None + # remember last modified times for data and image files + self.last_data_change = os.path.getmtime(self.filename) + self.last_image_change = 0 + # do most stuff in load_char_data so we can hot reload + if not self.load_char_data(): + return + # report + if log and not self.app.game_mode: + self.app.log("loaded charmap '%s' from %s:" % (self.name, self.filename)) + self.report() + self.init_success = True + + def load_char_data(self): + "carries out majority of CharacterSet init, including loading image" + char_data_src = open(self.filename, encoding='utf-8').readlines() + # allow comments: discard any line in char data starting with // + # (make sure this doesn't muck up legit mapping data) + char_data = [] + for line in char_data_src: + if not line.startswith('//'): + char_data.append(line) + # first line = image file + # hold off assigning to self.image_filename til we know it's valid + img_filename = self.app.find_filename_path(char_data.pop(0).strip(), CHARSET_DIR, 'png') + if not img_filename: + self.app.log("Couldn't find character set image %s" % self.image_filename) + return False + self.image_filename = img_filename + # now that we know the image file's name, store its last modified time + self.last_image_change = os.path.getmtime(self.image_filename) + # second line = character set dimensions + second_line = char_data.pop(0).strip().split(',') + self.map_width, self.map_height = int(second_line[0]), int(second_line[1]) + self.char_mapping = {} + index = 0 + for line in char_data: + # strip newlines from mapping + for char in line.strip('\r\n'): + if not char in self.char_mapping: + self.char_mapping[char] = index + index += 1 + if index >= self.map_width * self.map_height: + break + # if no lower case included, map upper to lower & vice versa + has_upper, has_lower = False, False + for line in char_data: + for char in line: + if char.isupper(): + has_upper = True + elif char.islower(): + has_lower = True + if has_upper and not has_lower: + for char in string.ascii_lowercase: + # set may not have all letters + if not char.upper() in self.char_mapping: + continue + self.char_mapping[char] = self.char_mapping[char.upper()] + elif has_lower and not has_upper: + for char in string.ascii_uppercase: + if not char.lower() in self.char_mapping: + continue + self.char_mapping[char] = self.char_mapping[char.lower()] + # last valid index a character can be + self.last_index = self.map_width * self.map_height + # load image + self.load_image_data() + self.set_char_dimensions() + # store base filename for easy comparisons with not-yet-loaded sets + self.base_filename = os.path.splitext(os.path.basename(self.filename))[0] + return True + + def load_image_data(self): + # load and process image + img = Image.open(self.image_filename) + img = img.convert('RGBA') + # flip for openGL + img = img.transpose(Image.FLIP_TOP_BOTTOM) + self.image_width, self.image_height = img.size + # any pixel that is "transparent color" will be made fully transparent + # any pixel that isn't will be opaque + tinted FG color + for y in range(self.image_height): + for x in range(self.image_width): + # TODO: PIL pixel access shows up in profiler, use numpy array + # assignment instead + color = img.getpixel((x, y)) + if color[:3] == self.transparent_color[:3]: + # MAYBE-TODO: does keeping non-alpha color improve sampling? + img.putpixel((x, y), (color[0], color[1], color[2], 0)) + self.texture = Texture(img.tobytes(), self.image_width, self.image_height) + # flip image data back and save it for later, eg image conversion + img = img.transpose(Image.FLIP_TOP_BOTTOM) + self.image_data = img + + def set_char_dimensions(self): + # store character dimensions and UV size + self.char_width = int(self.image_width / self.map_width) + self.char_height = int(self.image_height / self.map_height) + self.u_width = self.char_width / self.image_width + self.v_height = self.char_height / self.image_height + + def report(self): + self.app.log(' source texture %s is %s x %s pixels' % (self.image_filename, self.image_width, self.image_height)) + self.app.log(' char pixel width/height is %s x %s' % (self.char_width, self.char_height)) + self.app.log(' char map width/height is %s x %s' % (self.map_width, self.map_height)) + self.app.log(' last character index: %s' % self.last_index) + + def has_updated(self): + "return True if source image file has changed since last check" + # tolerate bad filenames in data, don't check stamps on nonexistent ones + if not self.image_filename or not os.path.exists(self.filename) or \ + not os.path.exists(self.image_filename): + return False + data_changed = os.path.getmtime(self.filename) > self.last_data_change + img_changed = os.path.getmtime(self.image_filename) > self.last_image_change + if data_changed: + self.last_data_change = time.time() + if img_changed: + self.last_image_change = time.time() + return data_changed or img_changed + + def get_char_index(self, char): + return self.char_mapping.get(char, 0) + + def get_solid_pixels_in_char(self, char_index): + "Returns # of solid pixels in character at given index" + tile_x = int(char_index % self.map_width) + tile_y = int(char_index / self.map_width) + x_start = self.char_width * tile_x + x_end = x_start + self.char_width + y_start = self.char_height * tile_y + y_end = y_start + self.char_height + pixels = 0 + for x in range(x_start, x_end): + for y in range(y_start, y_end): + color = self.image_data.getpixel((x, y)) + if color[3] > 0: + pixels += 1 + return pixels diff --git a/charsets/agat.char b/charsets/agat.char new file mode 100644 index 0000000..9e39ec1 --- /dev/null +++ b/charsets/agat.char @@ -0,0 +1,9 @@ +// Agat (Soviet Apple II clone) +agat.png +16, 6 + !"#$%^'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\]^_ +`abcdefghijklmno +pqrstuvwxyz{|}~ diff --git a/charsets/agat.png b/charsets/agat.png new file mode 100644 index 0000000..ff1c521 Binary files /dev/null and b/charsets/agat.png differ diff --git a/charsets/amiga_topaz.char b/charsets/amiga_topaz.char new file mode 100644 index 0000000..bf3789b --- /dev/null +++ b/charsets/amiga_topaz.char @@ -0,0 +1,10 @@ +// Amiga "Topaz" workbench font +amiga_topaz.png +32, 6 + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ + + + + diff --git a/charsets/amiga_topaz.png b/charsets/amiga_topaz.png new file mode 100644 index 0000000..5ae94cd Binary files /dev/null and b/charsets/amiga_topaz.png differ diff --git a/charsets/apple2.char b/charsets/apple2.char new file mode 100644 index 0000000..afbe765 --- /dev/null +++ b/charsets/apple2.char @@ -0,0 +1,12 @@ +apple2.png +// Apple II +// from http://www.lazilong.com/apple_ii/a2font/readme.html +16, 8 + !"#$%^'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\]^_ +`abcdefghijklmno +pqrstuvwxyz{|}~ + + diff --git a/charsets/apple2.png b/charsets/apple2.png new file mode 100644 index 0000000..6694571 Binary files /dev/null and b/charsets/apple2.png differ diff --git a/charsets/atari.char b/charsets/atari.char new file mode 100644 index 0000000..9f2cee9 --- /dev/null +++ b/charsets/atari.char @@ -0,0 +1,11 @@ +// ATASCII (Atari ASCII) +atari.png +16, 8 + + + !"#$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\]^_ + abcdefghijklmno +pqrstuvwxyz | diff --git a/charsets/atari.png b/charsets/atari.png new file mode 100644 index 0000000..a32beca Binary files /dev/null and b/charsets/atari.png differ diff --git a/charsets/atari_st.char b/charsets/atari_st.char new file mode 100644 index 0000000..e3a34f6 --- /dev/null +++ b/charsets/atari_st.char @@ -0,0 +1,11 @@ +// Atari ST desktop font +atari_st.png +32, 8 + + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ + + + + diff --git a/charsets/atari_st.png b/charsets/atari_st.png new file mode 100644 index 0000000..09af60b Binary files /dev/null and b/charsets/atari_st.png differ diff --git a/charsets/bbc_master.char b/charsets/bbc_master.char new file mode 100644 index 0000000..e489753 --- /dev/null +++ b/charsets/bbc_master.char @@ -0,0 +1,18 @@ +// BBC Micro +bbc_master.png +16, 14 + !"#$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\]^_ +£abcdefghijklmno +pqrstuvwxyz{|}~ + + + + + + + + +//end diff --git a/charsets/bbc_master.png b/charsets/bbc_master.png new file mode 100644 index 0000000..bb7ad86 Binary files /dev/null and b/charsets/bbc_master.png differ diff --git a/charsets/c64_edscii.char b/charsets/c64_edscii.char new file mode 100644 index 0000000..4d97753 --- /dev/null +++ b/charsets/c64_edscii.char @@ -0,0 +1,16 @@ +// Commodore 64 (EDSCII version) +// first line: source image (base filename + .png assumed) +c64_edscii.png +// second line: map dimensions +16, 10 + !"#$%&'()*+,-./ +0123456789:;<=>? +@abcdefghijklmno +pqrstuvwxyz[ ] + ABCDEFGHIJKLMNO +PQRSTUVWXYZ + _ + + + \ +// end diff --git a/charsets/c64_edscii.png b/charsets/c64_edscii.png new file mode 100644 index 0000000..cd514e9 Binary files /dev/null and b/charsets/c64_edscii.png differ diff --git a/charsets/c64_petscii.char b/charsets/c64_petscii.char new file mode 100644 index 0000000..12e9b75 --- /dev/null +++ b/charsets/c64_petscii.char @@ -0,0 +1,16 @@ +// Commodore 64 (PETSCII editor version) +// first line: source image (base filename + .png assumed) +c64_petscii.png +// second line: map dimensions +16, 10 + ABCDEFGHIJKLMNO +PQRSTUVWXYZ[ ] +@!"#$%&'()*+,-./ +0123456789:;<=>? + + + + +abcdefghijklmnop +qrstuvwxyz +// end diff --git a/charsets/c64_petscii.png b/charsets/c64_petscii.png new file mode 100644 index 0000000..c711ddb Binary files /dev/null and b/charsets/c64_petscii.png differ diff --git a/charsets/c64_real_shifted.char b/charsets/c64_real_shifted.char new file mode 100644 index 0000000..edc9fdd --- /dev/null +++ b/charsets/c64_real_shifted.char @@ -0,0 +1,12 @@ +// Commodore 64 (real hardware, shifted set) +c64_real_shifted.png +16, 8 + !"#$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[ ] + \ + + + + diff --git a/charsets/c64_real_shifted.png b/charsets/c64_real_shifted.png new file mode 100644 index 0000000..c5e037c Binary files /dev/null and b/charsets/c64_real_shifted.png differ diff --git a/charsets/c64_real_unshifted.char b/charsets/c64_real_unshifted.char new file mode 100644 index 0000000..b68c972 --- /dev/null +++ b/charsets/c64_real_unshifted.char @@ -0,0 +1,12 @@ +// Commodore 64 (real hardware, unshifted set) +c64_real_unshifted.png +16, 8 + !"#$%&'()*+,-./ +0123456789:;<=>? +@abcdefghijklmno +pqrstuvwxyz[ ] + ABCDEFGHIJKLMNO +PQRSTUVWXYZ + + + diff --git a/charsets/c64_real_unshifted.png b/charsets/c64_real_unshifted.png new file mode 100644 index 0000000..4a33ad8 Binary files /dev/null and b/charsets/c64_real_unshifted.png differ diff --git a/charsets/commodore_pet.char b/charsets/commodore_pet.char new file mode 100644 index 0000000..7a107df --- /dev/null +++ b/charsets/commodore_pet.char @@ -0,0 +1,13 @@ +// Commodore PET +commodore_pet.png +16, 10 + ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\] +@!"#$%&'()*+,-./ +0123456789:;<=>? + \ + + + + abcdefghijklmno +pqrstuvwxyz diff --git a/charsets/commodore_pet.png b/charsets/commodore_pet.png new file mode 100644 index 0000000..3ab3d7b Binary files /dev/null and b/charsets/commodore_pet.png differ diff --git a/charsets/cpc.char b/charsets/cpc.char new file mode 100644 index 0000000..603ad75 --- /dev/null +++ b/charsets/cpc.char @@ -0,0 +1,17 @@ +// Amstrad CPC +cpc.png +16, 14 + !"#$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\] _ +`abcdefghijklmno +pqrstuvwxyz{|}~ + + +^` + + + + + diff --git a/charsets/cpc.png b/charsets/cpc.png new file mode 100644 index 0000000..fe0944c Binary files /dev/null and b/charsets/cpc.png differ diff --git a/charsets/dos.char b/charsets/dos.char new file mode 100644 index 0000000..aae5864 --- /dev/null +++ b/charsets/dos.char @@ -0,0 +1,11 @@ +// IBM PC code page 437 (aka "extended ASCII") +dos.png +32, 8 +   + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ +ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒ +áíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐ +└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ +αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ diff --git a/charsets/dos.png b/charsets/dos.png new file mode 100644 index 0000000..d0a0fb3 Binary files /dev/null and b/charsets/dos.png differ diff --git a/charsets/dos40.char b/charsets/dos40.char new file mode 100644 index 0000000..388f171 --- /dev/null +++ b/charsets/dos40.char @@ -0,0 +1,19 @@ +// IBM PC code page 437 (40-column version) +dos40.png +16, 16 +   + + !"#$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\]^_ +`abcdefghijklmno +pqrstuvwxyz{|}~ +ÇüéâäàåçêëèïîìÄÅ +ÉæÆôöòûùÿÖÜ¢£¥₧ƒ +áíóúñѪº¿⌐¬½¼¡«» +░▒▓│┤╡╢╖╕╣║╗╝╜╛┐ +└┴┬├─┼╞╟╚╔╩╦╠═╬╧ +╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ +αßΓπΣσµτΦΘΩδ∞φε∩ +≡±≥≤⌠⌡÷≈°∙·√ⁿ diff --git a/charsets/dos40.png b/charsets/dos40.png new file mode 100644 index 0000000..1cd528f Binary files /dev/null and b/charsets/dos40.png differ diff --git a/charsets/dos_basic.char b/charsets/dos_basic.char new file mode 100644 index 0000000..95fca5b --- /dev/null +++ b/charsets/dos_basic.char @@ -0,0 +1,6 @@ +// "Basic" (only keyboardable chars) ASCII +dos_basic.png +32, 3 + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ diff --git a/charsets/dos_basic.png b/charsets/dos_basic.png new file mode 100644 index 0000000..0c6d83c Binary files /dev/null and b/charsets/dos_basic.png differ diff --git a/charsets/intellivision.char b/charsets/intellivision.char new file mode 100644 index 0000000..b80a42e --- /dev/null +++ b/charsets/intellivision.char @@ -0,0 +1,27 @@ +// Mattel Intellivision (built-in) +intellivision.png +16, 14 + !"#$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\]^ +`abcdefghijklmno +pqrstuvwxyz{|}~ + + + + + + + + + + + + + + + + + + diff --git a/charsets/intellivision.png b/charsets/intellivision.png new file mode 100644 index 0000000..3c6bc57 Binary files /dev/null and b/charsets/intellivision.png differ diff --git a/charsets/jpetscii.char b/charsets/jpetscii.char new file mode 100644 index 0000000..e81ad4f --- /dev/null +++ b/charsets/jpetscii.char @@ -0,0 +1,20 @@ +// custom, PETSCII-derived set by JP LeBreton +jpetscii.png +16, 16 + ABCDEFGHIJKLMNO +PQRSTUVWXYZ[]{} +"abcdefghijklmno +pqrstuvwxyz +1234567890-=_+:; +!@#$%^&*(),.? + + + + + + + + + + `' +// end diff --git a/charsets/jpetscii.png b/charsets/jpetscii.png new file mode 100644 index 0000000..d3410c9 Binary files /dev/null and b/charsets/jpetscii.png differ diff --git a/charsets/msx.char b/charsets/msx.char new file mode 100644 index 0000000..8fb4bf6 --- /dev/null +++ b/charsets/msx.char @@ -0,0 +1,12 @@ +// MSX home computers +msx.png +32, 8 + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ +ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒ +áíóúñѪº¿⌐¬½¼¡«»ÃãĨĩÕõŨũIJij¾∽◇‰¶§ + + + +// end diff --git a/charsets/msx.png b/charsets/msx.png new file mode 100644 index 0000000..2c8a43d Binary files /dev/null and b/charsets/msx.png differ diff --git a/charsets/osamu-micro.char b/charsets/osamu-micro.char new file mode 100644 index 0000000..79e8f42 --- /dev/null +++ b/charsets/osamu-micro.char @@ -0,0 +1,4 @@ +// by @lunlumoart +osamu-micro.png +24, 7 + diff --git a/charsets/osamu-micro.png b/charsets/osamu-micro.png new file mode 100644 index 0000000..282c9de Binary files /dev/null and b/charsets/osamu-micro.png differ diff --git a/charsets/pacman.char b/charsets/pacman.char new file mode 100644 index 0000000..039e73b --- /dev/null +++ b/charsets/pacman.char @@ -0,0 +1,9 @@ +// Pac-Man ROM tiles +pacman.png +16, 6 + ABCDEFGHIJKLMNO +PQRSTUVWXYZ! +0123456789/-" + + + diff --git a/charsets/pacman.png b/charsets/pacman.png new file mode 100644 index 0000000..942609d Binary files /dev/null and b/charsets/pacman.png differ diff --git a/charsets/sharp.char b/charsets/sharp.char new file mode 100644 index 0000000..a2f3ef3 --- /dev/null +++ b/charsets/sharp.char @@ -0,0 +1,26 @@ +// Sharp MZ-700 aka "SharpSCII" +sharp.png +16, 22 + + + + + + + + !"#$%&'()<>[]/\ +0123456789:;*=+- +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ,.? + abcdefghijklmno +pqrstuvwxyz + + + + + + + + + + diff --git a/charsets/sharp.png b/charsets/sharp.png new file mode 100644 index 0000000..3157a80 Binary files /dev/null and b/charsets/sharp.png differ diff --git a/charsets/speccy.char b/charsets/speccy.char new file mode 100644 index 0000000..de9098c --- /dev/null +++ b/charsets/speccy.char @@ -0,0 +1,10 @@ +// ZX Spectrum +speccy.png +16,7 + !"#$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\]↑_ +£abcdefghijklmno +pqrstuvwxyz{|}~© + \ No newline at end of file diff --git a/charsets/speccy.png b/charsets/speccy.png new file mode 100644 index 0000000..e1ec5aa Binary files /dev/null and b/charsets/speccy.png differ diff --git a/charsets/teletext_uk.char b/charsets/teletext_uk.char new file mode 100644 index 0000000..f19de02 --- /dev/null +++ b/charsets/teletext_uk.char @@ -0,0 +1,13 @@ +// Teletext (Mullard SAA5050 character generator) +teletext_uk.png +16, 10 + !"£$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ½# +─abcdefghijklmno +pqrstuvwxyz¼ ÷ + + ▌ + ▐ + █ diff --git a/charsets/teletext_uk.png b/charsets/teletext_uk.png new file mode 100644 index 0000000..f36a05d Binary files /dev/null and b/charsets/teletext_uk.png differ diff --git a/charsets/ui.char b/charsets/ui.char new file mode 100644 index 0000000..f24d9df --- /dev/null +++ b/charsets/ui.char @@ -0,0 +1,9 @@ +// Playscii default UI font +ui.png +27, 6 + ABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyz + 0123456789!@#$%^&*() + `-=[]\;',./~_+{}|:"<>? + … + óćø diff --git a/charsets/ui.png b/charsets/ui.png new file mode 100644 index 0000000..c91ffea Binary files /dev/null and b/charsets/ui.png differ diff --git a/charsets/ultima4.char b/charsets/ultima4.char new file mode 100644 index 0000000..38c943e --- /dev/null +++ b/charsets/ultima4.char @@ -0,0 +1,20 @@ +// Ultima IV: Quest of the Avatar tileset +ultima4.png +16, 16 + + + + + + +ABCDEFGHIJKLMNOP +QRSTUVWXYZ + + + + + + + + +// end \ No newline at end of file diff --git a/charsets/ultima4.png b/charsets/ultima4.png new file mode 100644 index 0000000..eb20f56 Binary files /dev/null and b/charsets/ultima4.png differ diff --git a/code_of_conduct.txt b/code_of_conduct.txt new file mode 100644 index 0000000..3f67db3 --- /dev/null +++ b/code_of_conduct.txt @@ -0,0 +1,28 @@ +Contributor Code of Conduct + +Please note that this project is released with a Contributor Code of Conduct. By +participating in this project you agree to abide by its terms: + +As contributors and maintainers of this project, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating documentation, +submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free experience for +everyone, regardless of level of experience, gender, gender identity and expression, +sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. + +Examples of unacceptable behavior by participants include the use of sexual language or +imagery, derogatory comments or personal attacks, trolling, public or private harassment, +insults, or other unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, +commits, code, wiki edits, issues, and other contributions that are not aligned to this +Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed +from the project team. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by +opening an issue or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the Contributor Covenant +(http:contributor-covenant.org), version 1.0.0, available at +http://contributor-covenant.org/version/1/0/0/ diff --git a/collision.py b/collision.py new file mode 100644 index 0000000..70a42a8 --- /dev/null +++ b/collision.py @@ -0,0 +1,577 @@ +import math +from collections import namedtuple + +from renderable import TileRenderable +from renderable_line import CircleCollisionRenderable, BoxCollisionRenderable, TileBoxCollisionRenderable + +# collision shape types +CST_NONE = 0 +"Don't use a CollisionShape" +CST_CIRCLE = 1 +"Use a CircleCollisionShap" +CST_AABB = 2 +"Use an AABBCollisionShape" +CST_TILE = 3 +""" +Tile-based collision: generate multiple AABBCollisionShapes to approximate all +non-blank (character index 0) tiles of our GameObject's default Art's +"collision layer", whose string name is defined in GO.col_layer_name. +""" + +# collision types +CT_NONE = 0 +CT_PLAYER = 1 +CT_GENERIC_STATIC = 2 +CT_GENERIC_DYNAMIC = 3 + +# collision type groups, eg static and dynamic +CTG_STATIC = [CT_GENERIC_STATIC] +'"Collision type group", collections of CT_* values for more convenient checks.' +CTG_DYNAMIC = [CT_GENERIC_DYNAMIC, CT_PLAYER] +'"Collision type group", collections of CT_* values for more convenient checks.' + +__pdoc__ = {} +# named tuples for collision structs that don't merit a class +Contact = namedtuple('Contact', ['overlap', 'timestamp']) +__pdoc__['Contact'] = "Represents a contact between two objects." + +ShapeOverlap = namedtuple('ShapeOverlap', ['x', 'y', 'dist', 'area', 'other']) +__pdoc__['ShapeOverlap'] = "Represents a CollisionShape's overlap with another." + + +class CollisionShape: + """ + Abstract class for a shape that can overlap and collide with other shapes. + Shapes are part of a Collideable which in turn is part of a GameObject. + """ + def resolve_overlaps_with_shapes(self, shapes): + "Resolve this shape's overlap(s) with given list of shapes." + overlaps = [] + for other in shapes: + if other is self: + continue + overlap = self.get_overlap(other) + if overlap.dist < 0: + overlaps.append(overlap) + if len(overlaps) == 0: + return + # resolve collisions in order of largest -> smallest overlap + overlaps.sort(key=lambda item: item.area, reverse=True) + for i,old_overlap in enumerate(overlaps): + # resolve first overlap without recalculating + overlap = self.get_overlap(old_overlap.other) if i > 0 else overlaps[0] + self.resolve_overlap(overlap) + + def resolve_overlap(self, overlap): + "Resolve this shape's given overlap." + other = overlap.other + # tell objects they're overlapping, pass penetration vector + a_coll_b, a_started_b = self.go.overlapped(other.go, overlap) + b_coll_a, b_started_a = other.go.overlapped(self.go, overlap) + # if either object says it shouldn't collide with other, don't + if not a_coll_b or not b_coll_a: + return + # push shapes apart according to mass + total_mass = max(0, self.go.mass) + max(0, other.go.mass) + if self.go.is_dynamic(): + if not other.go.is_dynamic() or other.go.mass < 0: + a_push = overlap.dist + else: + a_push = (self.go.mass / total_mass) * overlap.dist + # move parent object, not shape + self.go.x += a_push * overlap.x + self.go.y += a_push * overlap.y + # update all shapes based on object's new position + self.go.collision.update_transform_from_object() + if other.go.is_dynamic(): + if not self.go.is_dynamic() or self.go.mass < 0: + b_push = overlap.dist + else: + b_push = (other.go.mass / total_mass) * overlap.dist + other.go.x -= b_push * overlap.x + other.go.y -= b_push * overlap.y + other.go.collision.update_transform_from_object() + # call objs' started_colliding once collisions have been resolved + world = self.go.world + if a_started_b: + world.try_object_method(self.go, self.go.started_colliding, [other.go]) + if b_started_a: + world.try_object_method(other.go, other.go.started_colliding, [self.go]) + + def get_overlapping_static_shapes(self): + "Return a list of static shapes that overlap with this shape." + overlapping_shapes = [] + shape_left, shape_top, shape_right, shape_bottom = self.get_box() + # add padding to overlapping tiles check + if False: + padding = 0.01 + shape_left -= padding + shape_top -= padding + shape_right += padding + shape_bottom += padding + for obj in self.go.world.objects.values(): + if obj is self.go or not obj.should_collide() or obj.is_dynamic(): + continue + # always check non-tile-based static shapes + if obj.collision_shape_type != CST_TILE: + overlapping_shapes += obj.collision.shapes + else: + # skip if even bounds don't overlap + obj_left, obj_top, obj_right, obj_bottom = obj.get_edges() + if not boxes_overlap(shape_left, shape_top, shape_right, shape_bottom, + obj_left, obj_top, obj_right, obj_bottom): + continue + overlapping_shapes += obj.collision.get_shapes_overlapping_box(shape_left, shape_top, shape_right, shape_bottom) + return overlapping_shapes + + +class CircleCollisionShape(CollisionShape): + "CollisionShape using a circle area." + def __init__(self, loc_x, loc_y, radius, game_object): + self.x, self.y = loc_x, loc_y + self.radius = radius + self.go = game_object + + def get_box(self): + "Return world coordinates of our bounds (left, top, right, bottom)" + return self.x - self.radius, self.y - self.radius, self.x + self.radius, self.y + self.radius + + def is_point_inside(self, x, y): + "Return True if given point is inside this shape." + return (self.x - x) ** 2 + (self.y - y) ** 2 <= self.radius ** 2 + + def overlaps_line(self, x1, y1, x2, y2): + "Return True if this circle overlaps given line segment." + return circle_overlaps_line(self.x, self.y, self.radius, x1, y1, x2, y2) + + def get_overlap(self, other): + "Return ShapeOverlap data for this shape's overlap with given other." + if type(other) is CircleCollisionShape: + px, py, pdist1, pdist2 = point_circle_penetration(self.x, self.y, + other.x, other.y, + self.radius + other.radius) + elif type(other) is AABBCollisionShape: + px, py, pdist1, pdist2 = circle_box_penetration(self.x, self.y, + other.x, other.y, + self.radius, other.halfwidth, + other.halfheight) + area = abs(pdist1 * pdist2) if pdist1 < 0 else 0 + return ShapeOverlap(x=px, y=py, dist=pdist1, area=area, other=other) + + +class AABBCollisionShape(CollisionShape): + "CollisionShape using an axis-aligned bounding box area." + def __init__(self, loc_x, loc_y, halfwidth, halfheight, game_object): + self.x, self.y = loc_x, loc_y + self.halfwidth, self.halfheight = halfwidth, halfheight + self.go = game_object + # for CST_TILE objects, lists of tile(s) we cover + self.tiles = [] + + def get_box(self): + return self.x - self.halfwidth, self.y - self.halfheight, self.x + self.halfwidth, self.y + self.halfheight + + def is_point_inside(self, x, y): + "Return True if given point is inside this shape." + return point_in_box(x, y, *self.get_box()) + + def overlaps_line(self, x1, y1, x2, y2): + "Return True if this box overlaps given line segment." + left, top, right, bottom = self.get_box() + return box_overlaps_line(left, top, right, bottom, x1, y1, x2, y2) + + def get_overlap(self, other): + "Return ShapeOverlap data for this shape's overlap with given other." + if type(other) is AABBCollisionShape: + px, py, pdist1, pdist2 = box_penetration(self.x, self.y, + other.x, other.y, + self.halfwidth, self.halfheight, + other.halfwidth, other.halfheight) + elif type(other) is CircleCollisionShape: + px, py, pdist1, pdist2 = circle_box_penetration(other.x, other.y, + self.x, self.y, + other.radius, self.halfwidth, + self.halfheight) + # reverse result if we're shape B + px, py = -px, -py + area = abs(pdist1 * pdist2) if pdist1 < 0 else 0 + return ShapeOverlap(x=px, y=py, dist=pdist1, area=area, other=other) + + +class Collideable: + "Collision component for GameObjects. Contains a list of shapes." + use_art_offset = False + "use game object's art_off_pct values" + def __init__(self, obj): + "Create new Collideable for given GameObject." + self.go = obj + self.cl = self.go.world.cl + self.renderables, self.shapes = [], [] + self.tile_shapes = {} + "Dict of shapes accessible by (x,y) tile coordinates" + self.contacts = {} + "Dict of contacts with other objects, by object name" + self.create_shapes() + + def create_shapes(self): + """ + Create collision shape(s) appropriate to our game object's + collision_shape_type value. + """ + self._clear_shapes() + if self.go.collision_shape_type == CST_NONE: + return + elif self.go.collision_shape_type == CST_CIRCLE: + self._create_circle() + elif self.go.collision_shape_type == CST_AABB: + self._create_box() + elif self.go.collision_shape_type == CST_TILE: + self.tile_shapes.clear() + self._create_merged_tile_boxes() + # update renderables once if static + if not self.go.is_dynamic(): + self.update_renderables() + + def _clear_shapes(self): + for r in self.renderables: + r.destroy() + self.renderables = [] + for shape in self.shapes: + self.cl._remove_shape(shape) + self.shapes = [] + "List of CollisionShapes" + + def _create_circle(self): + x = self.go.x + self.go.col_offset_x + y = self.go.y + self.go.col_offset_y + shape = self.cl._add_circle_shape(x, y, self.go.col_radius, self.go) + self.shapes = [shape] + self.renderables = [CircleCollisionRenderable(shape)] + + def _create_box(self): + x = self.go.x # + self.go.col_offset_x + y = self.go.y # + self.go.col_offset_y + shape = self.cl._add_box_shape(x, y, + self.go.col_width / 2, + self.go.col_height / 2, + self.go) + self.shapes = [shape] + self.renderables = [BoxCollisionRenderable(shape)] + + def _create_merged_tile_boxes(self): + "Create AABB shapes for a CST_TILE object" + # generate fewer, larger boxes! + frame = self.go.renderable.frame + if not self.go.col_layer_name in self.go.art.layer_names: + self.go.app.dev_log("%s: Couldn't find collision layer with name '%s'" % (self.go.name, self.go.col_layer_name)) + return + layer = self.go.art.layer_names.index(self.go.col_layer_name) + # tile is available if it's not empty and not already covered by a shape + def tile_available(tile_x, tile_y): + return self.go.art.get_char_index_at(frame, layer, tile_x, tile_y) != 0 and not (tile_x, tile_y) in self.tile_shapes + def tile_range_available(start_x, end_x, start_y, end_y): + for y in range(start_y, end_y + 1): + for x in range(start_x, end_x + 1): + if not tile_available(x, y): + return False + return True + for y in range(self.go.art.height): + for x in range(self.go.art.width): + if not tile_available(x, y): + continue + # determine how big we can make this box + # first fill left to right + end_x = x + while end_x < self.go.art.width - 1 and tile_available(end_x + 1, y): + end_x += 1 + # then fill top to bottom + end_y = y + while end_y < self.go.art.height - 1 and tile_range_available(x, end_x, y, end_y + 1): + end_y += 1 + # compute origin and halfsizes of box covering tile range + wx1, wy1 = self.go.get_tile_loc(x, y, tile_center=True) + wx2, wy2 = self.go.get_tile_loc(end_x, end_y, tile_center=True) + wx = (wx1 + wx2) / 2 + halfwidth = (end_x - x) * self.go.art.quad_width + halfwidth /= 2 + halfwidth += self.go.art.quad_width / 2 + wy = (wy1 + wy2) / 2 + halfheight = (end_y - y) * self.go.art.quad_height + halfheight /= 2 + halfheight += self.go.art.quad_height / 2 + shape = self.cl._add_box_shape(wx, wy, halfwidth, halfheight, + self.go) + # fill in cell(s) in our tile collision dict, + # write list of tiles shape covers to shape.tiles + for tile_y in range(y, end_y + 1): + for tile_x in range(x, end_x + 1): + self.tile_shapes[(tile_x, tile_y)] = shape + shape.tiles.append((tile_x, tile_y)) + r = TileBoxCollisionRenderable(shape) + # update renderable once to set location correctly + r.update() + self.shapes.append(shape) + self.renderables.append(r) + + def get_shape_overlapping_point(self, x, y): + "Return shape if it's overlapping given point, None if no overlap." + tile_x, tile_y = self.go.get_tile_at_point(x, y) + return self.tile_shapes.get((tile_x, tile_y), None) + + def get_shapes_overlapping_box(self, left, top, right, bottom): + "Return a list of our shapes that overlap given box." + shapes = [] + tiles = self.go.get_tiles_overlapping_box(left, top, right, bottom) + for (x, y) in tiles: + shape = self.tile_shapes.get((x, y), None) + if shape and not shape in shapes: + shapes.append(shape) + return shapes + + def update(self): + if self.go and self.go.is_dynamic(): + self.update_transform_from_object() + + def update_transform_from_object(self, obj=None): + "Snap our shapes to location of given object (if unspecified, our GO)." + obj = obj or self.go + # CST_TILE shouldn't run here, it's static-only + if obj.collision_shape_type == CST_TILE: + return + for shape in self.shapes: + shape.x = obj.x + obj.col_offset_x + shape.y = obj.y + obj.col_offset_y + + def set_shape_color(self, shape, new_color): + "Set the color of a given shape's debug LineRenderable." + try: + shape_index = self.shapes.index(shape) + except ValueError: + return + self.renderables[shape_index].color = new_color + self.renderables[shape_index].build_geo() + self.renderables[shape_index].rebind_buffers() + + def update_renderables(self): + for r in self.renderables: + r.update() + + def render(self): + for r in self.renderables: + r.render() + + def destroy(self): + for r in self.renderables: + r.destroy() + # remove our shapes from CollisionLord's shape list + for shape in self.shapes: + self.cl._remove_shape(shape) + + +class CollisionLord: + """ + Collision manager object, tracks Collideables, detects overlaps and + resolves collisions. + """ + iterations = 7 + """ + Number of times to resolve collisions per update. Lower at own risk; + multi-object collisions require multiple iterations to settle correctly. + """ + def __init__(self, world): + self.world = world + self.ticks = 0 + # list of objects processed for collision this frame + self.collisions_this_frame = [] + self.reset() + + def report(self): + print('%s: %s dynamic shapes, %s static shapes' % (self, + len(self.dynamic_shapes), + len(self.static_shapes))) + + def reset(self): + self.dynamic_shapes, self.static_shapes = [], [] + + def _add_circle_shape(self, x, y, radius, game_object): + shape = CircleCollisionShape(x, y, radius, game_object) + if game_object.is_dynamic(): + self.dynamic_shapes.append(shape) + else: + self.static_shapes.append(shape) + return shape + + def _add_box_shape(self, x, y, halfwidth, halfheight, game_object): + shape = AABBCollisionShape(x, y, halfwidth, halfheight, game_object) + if game_object.is_dynamic(): + self.dynamic_shapes.append(shape) + else: + self.static_shapes.append(shape) + return shape + + def _remove_shape(self, shape): + if shape in self.dynamic_shapes: + self.dynamic_shapes.remove(shape) + elif shape in self.static_shapes: + self.static_shapes.remove(shape) + + def update(self): + "Resolve overlaps between all relevant world objects." + for i in range(self.iterations): + # filter shape lists for anything out of room etc + valid_dynamic_shapes = [] + for shape in self.dynamic_shapes: + if shape.go.should_collide(): + valid_dynamic_shapes.append(shape) + for shape in valid_dynamic_shapes: + shape.resolve_overlaps_with_shapes(valid_dynamic_shapes) + for shape in valid_dynamic_shapes: + static_shapes = shape.get_overlapping_static_shapes() + shape.resolve_overlaps_with_shapes(static_shapes) + # check which objects stopped colliding + for obj in self.world.objects.values(): + obj.check_finished_contacts() + self.ticks += 1 + self.collisions_this_frame = [] + + +# collision handling + +def point_in_box(x, y, box_left, box_top, box_right, box_bottom): + "Return True if given point lies within box with given corners." + return box_left <= x <= box_right and box_bottom <= y <= box_top + +def boxes_overlap(left_a, top_a, right_a, bottom_a, + left_b, top_b, right_b, bottom_b): + "Return True if given boxes A and B overlap." + for (x, y) in ((left_a, top_a), (right_a, top_a), + (right_a, bottom_a), (left_a, bottom_a)): + if left_b <= x <= right_b and bottom_b <= y <= top_b: + return True + return False + +def lines_intersect(x1, y1, x2, y2, x3, y3, x4, y4): + "Return True if given lines intersect." + denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1) + numer = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3) + numer2 = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3) + if denom == 0: + if numer == 0 and numer2 == 0: + # coincident + return False + # parallel + return False + ua = numer / denom + ub = numer2 / denom + return ua >= 0 and ua <= 1 and ub >= 0 and ub <= 1 + +def line_point_closest_to_point(point_x, point_y, x1, y1, x2, y2): + "Return point on given line that's closest to given point." + wx, wy = point_x - x1, point_y - y1 + dir_x, dir_y = x2 - x1, y2 - y1 + proj = wx * dir_x + wy * dir_y + if proj <= 0: + # line point 1 is closest + return x1, y1 + vsq = dir_x ** 2 + dir_y ** 2 + if proj >= vsq: + # line point 2 is closest + return x2, y2 + else: + # closest point is between 1 and 2 + return x1 + (proj / vsq) * dir_x, y1 + (proj / vsq) * dir_y + +def circle_overlaps_line(circle_x, circle_y, radius, x1, y1, x2, y2): + "Return True if given circle overlaps given line." + # get closest point on line to circle center + closest_x, closest_y = line_point_closest_to_point(circle_x, circle_y, + x1, y1, x2, y2) + dist_x, dist_y = closest_x - circle_x, closest_y - circle_y + return dist_x ** 2 + dist_y ** 2 <= radius ** 2 + +def box_overlaps_line(left, top, right, bottom, x1, y1, x2, y2): + "Return True if given box overlaps given line." + # TODO: determine if this is less efficient than slab method below + if point_in_box(x1, y1, left, top, right, bottom) and \ + point_in_box(x2, y2, left, top, right, bottom): + return True + # check left/top/right/bottoms edges + return lines_intersect(left, top, left, bottom, x1, y1, x2, y2) or \ + lines_intersect(left, top, right, top, x1, y1, x2, y2) or \ + lines_intersect(right, top, right, bottom, x1, y1, x2, y2) or \ + lines_intersect(left, bottom, right, bottom, x1, y1, x2, y2) + +def box_overlaps_ray(left, top, right, bottom, x1, y1, x2, y2): + "Return True if given box overlaps given ray." + # TODO: determine if this can be adapted for line segments + # (just a matter of setting tmin/tmax properly?) + tmin, tmax = -math.inf, math.inf + dir_x, dir_y = x2 - x1, y2 - y1 + if abs(dir_x) > 0: + tx1 = (left - x1) / dir_x + tx2 = (right - x1) / dir_x + tmin = max(tmin, min(tx1, tx2)) + tmax = min(tmax, max(tx1, tx2)) + if abs(dir_y) > 0: + ty1 = (top - y1) / dir_y + ty2 = (bottom - y1) / dir_y + tmin = max(tmin, min(ty1, ty2)) + tmax = min(tmax, max(ty1, ty2)) + return tmax >= tmin + +def point_circle_penetration(point_x, point_y, circle_x, circle_y, radius): + "Return normalized penetration x, y, and distance for given circles." + dx, dy = circle_x - point_x, circle_y - point_y + pdist = math.sqrt(dx ** 2 + dy ** 2) + # point is center of circle, arbitrarily project out in +X + if pdist == 0: + return 1, 0, -radius, -radius + # TODO: calculate other axis of intersection for area? + return dx / pdist, dy / pdist, pdist - radius, pdist - radius + +def box_penetration(ax, ay, bx, by, ahw, ahh, bhw, bhh): + "Return penetration vector and magnitude for given boxes." + left_a, right_a = ax - ahw, ax + ahw + top_a, bottom_a = ay + ahh, ay - ahh + left_b, right_b = bx - bhw, bx + bhw + top_b, bottom_b = by + bhh, by - bhh + # A to left or right of B? + px = right_a - left_b if ax <= bx else right_b - left_a + # A above or below B? + py = top_b - bottom_a if ay >= by else top_a - bottom_b + dx, dy = bx - ax, by - ay + widths, heights = ahw + bhw, ahh + bhh + # return separating axis + penetration depth (+ other axis for area calc) + if widths + px - abs(dx) < heights + py - abs(dy): + if dx >= 0: + return 1, 0, -px, -py + elif dx < 0: + return -1, 0, -px, -py + else: + if dy >= 0: + return 0, 1, -py, -px + elif dy < 0: + return 0, -1, -py, -px + +def circle_box_penetration(circle_x, circle_y, box_x, box_y, circle_radius, + box_hw, box_hh): + "Return penetration vector and magnitude for given circle and box." + box_left, box_right = box_x - box_hw, box_x + box_hw + box_top, box_bottom = box_y + box_hh, box_y - box_hh + # if circle center inside box, use box-on-box penetration vector + distance + if point_in_box(circle_x, circle_y, box_left, box_top, box_right, box_bottom): + return box_penetration(circle_x, circle_y, box_x, box_y, + circle_radius, circle_radius, box_hw, box_hh) + # find point on AABB edges closest to center of circle + # clamp = min(highest, max(lowest, val)) + px = min(box_right, max(box_left, circle_x)) + py = min(box_top, max(box_bottom, circle_y)) + closest_x = circle_x - px + closest_y = circle_y - py + d = math.sqrt(closest_x ** 2 + closest_y ** 2) + pdist = circle_radius - d + if d == 0: + return + 1, 0, -pdist, -pdist + # TODO: calculate other axis of intersection for area? + return -closest_x / d, -closest_y / d, -pdist, -pdist diff --git a/cursor.py b/cursor.py new file mode 100644 index 0000000..660c41d --- /dev/null +++ b/cursor.py @@ -0,0 +1,376 @@ +import math, ctypes +import numpy as np +from OpenGL import GL + +import vector +from edit_command import EditCommand +from renderable_sprite import UISpriteRenderable + +""" +reference diagram: + + 0 0.2 0.8 1.0 + A--------B *--------* + | | | | +0.1 | D-----C *-----* | + | | | | + | | | | +0.2 F--E *--* + +etc +""" + +OUTSIDE_EDGE_SIZE = 0.2 +THICKNESS = 0.1 + +corner_verts = [ + 0, 0, # A/0 + OUTSIDE_EDGE_SIZE, 0, # B/1 + OUTSIDE_EDGE_SIZE, -THICKNESS, # C/2 + THICKNESS, -THICKNESS, # D/3 + THICKNESS, -OUTSIDE_EDGE_SIZE, # E/4 + 0, -OUTSIDE_EDGE_SIZE # F/5 +] + +# vert indices for the above +corner_elems = [ + 0, 1, 2, + 0, 2, 3, + 0, 3, 4, + 0, 5, 4 +] + +# X/Y flip transforms to make all 4 corners +# (top left, top right, bottom left, bottom right) +corner_transforms = [ + ( 1, 1), + (-1, 1), + ( 1, -1), + (-1, -1) +] + +# offsets to translate the 4 corners by +corner_offsets = [ + (0, 0), + (1, 0), + (0, -1), + (1, -1) +] + +BASE_COLOR = (0.8, 0.8, 0.8, 1) + +# why do we use the weird transforms and offsets? +# because a static vertex list wouldn't be able to adjust to different +# character set aspect ratios. + +class Cursor: + + vert_shader_source = 'cursor_v.glsl' + frag_shader_source = 'cursor_f.glsl' + alpha = 1 + icon_scale_factor = 4 + logg = False + + def __init__(self, app): + self.app = app + self.x, self.y, self.z = 0, 0, 0 + self.last_x, self.last_y = 0, 0 + self.scale_x, self.scale_y, self.scale_z = 1, 1, 1 + # list of EditCommandTiles for preview + self.preview_edits = [] + self.current_command = None + # offsets to render the 4 corners at + self.mouse_x, self.mouse_y = 0, 0 + self.moved = False + self.color = np.array(BASE_COLOR, dtype=np.float32) + # GL objects + if self.app.use_vao: + self.vao = GL.glGenVertexArrays(1) + GL.glBindVertexArray(self.vao) + self.vert_buffer, self.elem_buffer = GL.glGenBuffers(2) + self.vert_array = np.array(corner_verts, dtype=np.float32) + self.elem_array = np.array(corner_elems, dtype=np.uint32) + self.vert_count = int(len(self.elem_array)) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vert_buffer) + GL.glBufferData(GL.GL_ARRAY_BUFFER, self.vert_array.nbytes, + self.vert_array, GL.GL_STATIC_DRAW) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_buffer) + GL.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_array.nbytes, + self.elem_array, GL.GL_STATIC_DRAW) + # shader, attributes + self.shader = self.app.sl.new_shader(self.vert_shader_source, self.frag_shader_source) + # vert positions + self.pos_attrib = self.shader.get_attrib_location('vertPosition') + GL.glEnableVertexAttribArray(self.pos_attrib) + offset = ctypes.c_void_p(0) + GL.glVertexAttribPointer(self.pos_attrib, 2, + GL.GL_FLOAT, GL.GL_FALSE, 0, offset) + # uniforms + self.proj_matrix_uniform = self.shader.get_uniform_location('projection') + self.view_matrix_uniform = self.shader.get_uniform_location('view') + self.position_uniform = self.shader.get_uniform_location('objectPosition') + self.scale_uniform = self.shader.get_uniform_location('objectScale') + self.color_uniform = self.shader.get_uniform_location('baseColor') + self.quad_size_uniform = self.shader.get_uniform_location('quadSize') + self.xform_uniform = self.shader.get_uniform_location('vertTransform') + self.offset_uniform = self.shader.get_uniform_location('vertOffset') + self.alpha_uniform = self.shader.get_uniform_location('baseAlpha') + # finish + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0) + if self.app.use_vao: + GL.glBindVertexArray(0) + # init tool sprite, tool will provide texture when rendered + self.tool_sprite = UISpriteRenderable(self.app) + + def clamp_to_active_art(self): + self.x = max(0, min(self.x, self.app.ui.active_art.width - 1)) + self.y = min(0, max(self.y, -self.app.ui.active_art.height + 1)) + + def keyboard_move(self, delta_x, delta_y): + if not self.app.ui.active_art: + return + self.x += delta_x + self.y += delta_y + self.clamp_to_active_art() + self.moved = True + self.app.keyboard_editing = True + if self.logg: + self.app.log('Cursor: %s,%s,%s scale %.2f,%.2f' % (self.x, self.y, self.z, self.scale_x, self.scale_y)) + + def set_scale(self, new_scale): + self.scale_x = self.scale_y = new_scale + + def get_tile(self): + # adjust for brush size + size = self.app.ui.selected_tool.brush_size + if size: + size_offset = math.ceil(size / 2) - 1 + return int(self.x + size_offset), int(-self.y + size_offset) + else: + return int(self.x), int(-self.y) + + def center_in_art(self): + art = self.app.ui.active_art + if not art: + return + self.x = round(art.width / 2) * art.quad_width + self.y = round(-art.height / 2) * art.quad_height + self.moved = True + + # !!TODO!! finish this, work in progress + def get_tiles_under_drag(self): + """ + returns list of tuple coordinates of all tiles under cursor's current + position AND tiles it's moved over since last update + """ + + # TODO: get vector of last to current position, for each tile under + # current brush, do line trace along grid towards last point + + # TODO: this works in two out of four diagonals, + # swap current and last positions to determine delta? + + if self.last_x <= self.x: + x0, y0 = self.last_x, -self.last_y + x1, y1 = self.x, -self.y + else: + x0, y0 = self.x, -self.y + x1, y1 = self.last_x, -self.last_y + tiles = vector.get_tiles_along_line(x0, y0, x1, y1) + print('drag from %s,%s to %s,%s:' % (x0, y0, x1, y1)) + print(tiles) + return tiles + + def get_tiles_under_brush(self): + """ + returns list of tuple coordinates of all tiles under the cursor @ its + current brush size + """ + size = self.app.ui.selected_tool.brush_size + tiles = [] + x_start, y_start = int(self.x), int(-self.y) + for y in range(y_start, y_start + size): + for x in range(x_start, x_start + size): + tiles.append((x, y)) + return tiles + + def undo_preview_edits(self): + for edit in self.preview_edits: + edit.undo() + + def update_cursor_preview(self): + # rebuild list of cursor preview commands + if self.app.ui.selected_tool.show_preview: + self.preview_edits = self.app.ui.selected_tool.get_paint_commands() + for edit in self.preview_edits: + edit.apply() + else: + self.preview_edits = [] + + def start_paint(self): + if self.app.ui.console.visible or self.app.ui.popup in self.app.ui.hovered_elements: + return + if self.app.ui.selected_tool is self.app.ui.grab_tool: + self.app.ui.grab_tool.grab() + return + # start a new command group, commit and clear any preview edits + self.current_command = EditCommand(self.app.ui.active_art) + self.current_command.add_command_tiles(self.preview_edits) + self.preview_edits = [] + self.app.ui.active_art.set_unsaved_changes(True) + #print(self.app.ui.active_art.command_stack) + + def finish_paint(self): + "invoked by mouse button up and undo" + if self.app.ui.console.visible or self.app.ui.popup in self.app.ui.hovered_elements: + return + # push current command group onto undo stack + if not self.current_command: + return + self.current_command.finish_time = self.app.get_elapsed_time() + self.app.ui.active_art.command_stack.commit_commands([self.current_command]) + self.current_command = None + # tools like rotate produce a different change each time, so update again + if self.app.ui.selected_tool.update_preview_after_paint: + self.update_cursor_preview() + #print(self.app.ui.active_art.command_stack) + + def moved_this_frame(self): + return self.moved or \ + int(self.last_x) != int(self.x) or \ + int(self.last_y) != int(self.y) + + def reposition_from_mouse(self): + self.x, self.y, _ = vector.screen_to_world(self.app, + self.app.mouse_x, + self.app.mouse_y) + + def snap_to_tile(self): + w, h = self.app.ui.active_art.quad_width, self.app.ui.active_art.quad_height + char_aspect = w / h + # round result for oddly proportioned charsets + self.x = round(math.floor(self.x / w) * w) + self.y = round(math.ceil(self.y / h) * h * char_aspect) + + def pre_first_update(self): + # vector.screen_to_world result will be off because camera hasn't + # moved yet, recalc view matrix + self.app.camera.calc_view_matrix() + self.reposition_from_mouse() + self.snap_to_tile() + self.update_cursor_preview() + self.entered_new_tile() + + def update(self): + # save old positions before update + self.last_x, self.last_y = self.x, self.y + # pulse alpha and scale + self.alpha = 0.75 + (math.sin(self.app.get_elapsed_time() / 100) / 2) + #self.scale_x = 1.5 + (math.sin(self.get_elapsed_time() / 100) / 50 - 0.5) + mouse_moved = self.app.mouse_dx != 0 or self.app.mouse_dy != 0 + # update cursor from mouse if: mouse moved, camera moved w/o keyboard + if mouse_moved or (not self.app.keyboard_editing and self.app.camera.moved_this_frame): + # don't let mouse move cursor if text tool input is happening + if not self.app.ui.text_tool.input_active: + self.reposition_from_mouse() + # cursor always at depth of active layer + art = self.app.ui.active_art + self.z = art.layers_z[art.active_layer] if art else 0 + self.moved = True + if not self.moved and not self.app.ui.tool_settings_changed: + return + if not self.app.keyboard_editing and not self.app.ui.tool_settings_changed: + self.snap_to_tile() + # adjust for brush size + if self.app.ui.selected_tool.brush_size: + size = self.app.ui.selected_tool.brush_size + self.scale_x = self.scale_y = size + # don't reposition on resize if keyboard navigating + if mouse_moved: + size_offset = math.ceil(size / 2) - 1 + self.x -= size_offset + self.y += size_offset + else: + self.scale_x = self.scale_y = 1 + self.undo_preview_edits() + self.update_cursor_preview() + if self.moved_this_frame(): + self.entered_new_tile() + + def end_update(self): + "called at the end of App.update" + self.moved = False + + def entered_new_tile(self): + if self.current_command and self.app.ui.selected_tool.paint_while_dragging: + # add new tile(s) to current command group + self.current_command.add_command_tiles(self.preview_edits) + self.app.ui.active_art.set_unsaved_changes(True) + self.preview_edits = [] + + def render(self): + GL.glUseProgram(self.shader.program) + GL.glUniformMatrix4fv(self.proj_matrix_uniform, 1, GL.GL_FALSE, self.app.camera.projection_matrix) + GL.glUniformMatrix4fv(self.view_matrix_uniform, 1, GL.GL_FALSE, self.app.camera.view_matrix) + GL.glUniform3f(self.position_uniform, self.x, self.y, self.z) + GL.glUniform3f(self.scale_uniform, self.scale_x, self.scale_y, self.scale_z) + GL.glUniform4fv(self.color_uniform, 1, self.color) + GL.glUniform2f(self.quad_size_uniform, self.app.ui.active_art.quad_width, self.app.ui.active_art.quad_height) + GL.glUniform1f(self.alpha_uniform, self.alpha) + # VAO vs non-VAO paths + if self.app.use_vao: + GL.glBindVertexArray(self.vao) + else: + attrib = self.shader.get_attrib_location # for brevity + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vert_buffer) + GL.glVertexAttribPointer(attrib('vertPosition'), 2, GL.GL_FLOAT, GL.GL_FALSE, 0, + ctypes.c_void_p(0)) + GL.glEnableVertexAttribArray(attrib('vertPosition')) + # bind elem array instead of passing it to glDrawElements - latter + # sends pyopengl a new array, which is deprecated and breaks on Mac. + # thanks Erin Congden! + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_buffer) + GL.glEnable(GL.GL_BLEND) + GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA) + # draw 4 corners + for i in range(4): + tx,ty = corner_transforms[i][0], corner_transforms[i][1] + ox,oy = corner_offsets[i][0], corner_offsets[i][1] + GL.glUniform2f(self.xform_uniform, tx, ty) + GL.glUniform2f(self.offset_uniform, ox, oy) + GL.glDrawElements(GL.GL_TRIANGLES, self.vert_count, + GL.GL_UNSIGNED_INT, None) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0) + GL.glDisable(GL.GL_BLEND) + if self.app.use_vao: + GL.glBindVertexArray(0) + GL.glUseProgram(0) + # position and render tool icon + ui = self.app.ui + # special handling for quick grab + if self.app.right_mouse: + self.tool_sprite.texture = ui.grab_tool.get_icon_texture() + else: + self.tool_sprite.texture = ui.selected_tool.get_icon_texture() + # scale same regardless of screen resolution + aspect = self.app.window_height / self.app.window_width + scale_x = self.tool_sprite.texture.width / self.app.window_width + scale_x *= self.icon_scale_factor * self.app.ui.scale + self.tool_sprite.scale_x = scale_x + scale_y = self.tool_sprite.texture.height / self.app.window_height + scale_y *= self.icon_scale_factor * self.app.ui.scale + self.tool_sprite.scale_y = scale_y + # top left of icon at bottom right of cursor + size = ui.selected_tool.brush_size or 1 + x, y = self.x, self.y + x += size * ui.active_art.quad_width + # non-square charsets a bit tricky to properly account for + char_aspect = ui.active_art.quad_height / ui.active_art.quad_width + y -= (size / char_aspect) * ui.active_art.quad_height + y *= char_aspect + sx, sy = vector.world_to_screen_normalized(self.app, x, y, self.z) + # screen-space offset by icon's height + sy -= scale_y + self.tool_sprite.x, self.tool_sprite.y = sx, sy + self.tool_sprite.render() diff --git a/docs/bugs.txt b/docs/bugs.txt new file mode 100644 index 0000000..5695c7c --- /dev/null +++ b/docs/bugs.txt @@ -0,0 +1,17 @@ +bug list + +PNG export: layers that have too high a Z won't show up in export, special-case behavior for near/far Z in renderable export? + +rewrite Cursor.screen_to_world to produce same results as gluUnProject: +https://www.opengl.org/wiki/GluProject_and_gluUnProject_code +https://www.opengl.org/sdk/docs/man2/xhtml/gluUnProject.xml + +more on above: when camera tilt engaged, cursor is closest to accurate along middle of bottom edge - apply aspect correction to both axes? +multiplying y by aspect (w/h) causes more distortion, but recenters most accurate point at middle of screen instead + + +lower priority: + +problem discovered during 2015-01-04~06: +GLSL really can't handle int/uint attributes! charIndex looks fine in numpy int32 array data but comes into GLSL totally screwy. works fine when the array and attribute are floats instead. bug for PyOpenGL devs? +possible test program: two quads side by side, each doing some trivial shader that involves an arbitrary number, only difference being one is driven by an int attribute and the other by a float. diff --git a/docs/bugs/jesper_sarnesjo.txt b/docs/bugs/jesper_sarnesjo.txt new file mode 100644 index 0000000..2286be8 --- /dev/null +++ b/docs/bugs/jesper_sarnesjo.txt @@ -0,0 +1,50 @@ +~/src/_/playscii ♪ python3 playscii.py +Playscii v0.1.1 +OpenGL detected: 4.1 NVIDIA-10.0.43 310.41.05f01 +GLSL detected: 4.10 +Vertex Array Object support found. +creating new document art/new.psci +Traceback (most recent call last): + File "/usr/local/lib/python3.4/site-packages/OpenGL/latebind.py", line 41, in __call__ + return self._finalCall( *args, **named ) +TypeError: 'NoneType' object is not callable + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "playscii.py", line 531, in + app = Application(log_file, log_lines, file_to_load) + File "playscii.py", line 117, in __init__ + self.load_art(art_filename) + File "playscii.py", line 163, in load_art + art = self.new_art(filename) + File "playscii.py", line 139, in new_art + charset = self.load_charset(self.starting_charset) + File "playscii.py", line 190, in load_charset + new_charset = CharacterSet(self, charset_to_load, log) + File "/Users/jesper/src/_/playscii/charset.py", line 73, in __init__ + self.texture = Texture(img.tostring(), self.image_width, self.image_height) + File "/Users/jesper/src/_/playscii/texture.py", line 16, in __init__ + self.gltex = GL.glGenTextures(1) + File "/usr/local/lib/python3.4/site-packages/OpenGL/latebind.py", line 61, in __call__ + return self.wrapperFunction( self.baseFunction, *args, **named ) + File "/usr/local/lib/python3.4/site-packages/OpenGL/GL/exceptional.py", line 178, in glGenTextures + baseFunction( count, textures) + File "/usr/local/lib/python3.4/site-packages/OpenGL/latebind.py", line 45, in __call__ + return self._finalCall( *args, **named ) + File "/usr/local/lib/python3.4/site-packages/OpenGL/wrapper.py", line 664, in wrapperCall + raise err + File "/usr/local/lib/python3.4/site-packages/OpenGL/wrapper.py", line 657, in wrapperCall + result = wrappedOperation( *cArguments ) + File "/usr/local/lib/python3.4/site-packages/OpenGL/platform/baseplatform.py", line 402, in __call__ + return self( *args, **named ) + File "/usr/local/lib/python3.4/site-packages/OpenGL/error.py", line 232, in glCheckError + baseOperation = baseOperation, +OpenGL.error.GLError: GLError( + err = 1282, + description = b'invalid operation', + baseOperation = glGenTextures, + pyArgs = (1, c_uint(1)), + cArgs = (1, ), + cArguments = (1, ) +) diff --git a/docs/bugs/playscii_gl_errors.txt b/docs/bugs/playscii_gl_errors.txt new file mode 100644 index 0000000..e416cd7 --- /dev/null +++ b/docs/bugs/playscii_gl_errors.txt @@ -0,0 +1,61 @@ +winXP 32-bit virtualbox image, hardware acceleration enabled + + +OpenGL Warning: No pincher, please call crStateSetCurrentPointers() in your SPU +creating new document art/new.psci +Traceback (most recent call last): + File "playscii.py", line 491, in + app = Application(log_file, log_lines, file_to_load) + File "playscii.py", line 87, in __init__ + self.load_art(art_filename) + File "playscii.py", line 130, in load_art + art = self.new_art(filename) + File "playscii.py", line 106, in new_art + charset = self.load_charset(self.starting_charset) + File "playscii.py", line 159, in load_charset + new_charset = CharacterSet(self, charset_to_load, log) + File "c:\playscii\charset.py", line 73, in __init__ + self.texture = Texture(img.tostring(), self.image_width, self.image_height) + File "c:\playscii\texture.py", line 24, in __init__ + GL.glGenerateMipmap(GL.GL_TEXTURE_2D) + File "c:\python34\lib\site-packages\OpenGL\platform\baseplatform.py", line 407, in __call__ + self.__name__, self.__name__, +OpenGL.error.NullFunctionError: Attempt to call an undefined function glGenerateMipmap, check for bool(glGenerateMipmap) before calling + + +--- + +bind VAO before texture stuff: + +OpenGL Warning: No pincher, please call crStateSetCurrentPointers() in your SPU +Traceback (most recent call last): + File "c:\python34\lib\site-packages\OpenGL\latebind.py", line 41, in __call__ + return self._finalCall( *args, **named ) +TypeError: 'NoneType' object is not callable + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "playscii.py", line 491, in + app = Application(log_file, log_lines, file_to_load) + File "playscii.py", line 87, in __init__ + self.load_art(art_filename) + File "playscii.py", line 130, in load_art + art = self.new_art(filename) + File "playscii.py", line 106, in new_art + charset = self.load_charset(self.starting_charset) + File "playscii.py", line 159, in load_charset + new_charset = CharacterSet(self, charset_to_load, log) + File "c:\playscii\charset.py", line 73, in __init__ + self.texture = Texture(img.tostring(), self.image_width, self.image_height) + File "c:\playscii\texture.py", line 17, in __init__ + vao = GL.glGenVertexArrays(1) + File "c:\python34\lib\site-packages\OpenGL\latebind.py", line 45, in __call__ + return self._finalCall( *args, **named ) + File "c:\python34\lib\site-packages\OpenGL\wrapper.py", line 657, in wrapperCall + result = wrappedOperation( *cArguments ) + File "c:\python34\lib\site-packages\OpenGL\platform\baseplatform.py", line 407, in __call__ + self.__name__, self.__name__, +OpenGL.error.NullFunctionError: Attempt to call an undefined function glGenVertexArrays, check for bool(glGenVertexArrays) before calling + + diff --git a/docs/bugs/terryc.txt b/docs/bugs/terryc.txt new file mode 100644 index 0000000..fa1e051 --- /dev/null +++ b/docs/bugs/terryc.txt @@ -0,0 +1,37 @@ +Traceback (most recent call last): + File ".\OpenGL\latebind.py", line 41, in __call__ + return self._finalCall( *args, **named ) +TypeError: 'NoneType' object is not callable + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "playscii.py", line 489, in + File "playscii.py", line 85, in __init__ + File "playscii.py", line 128, in load_art + File "playscii.py", line 104, in new_art + File "playscii.py", line 157, in load_charset + File "c:\playscii\charset.py", line 73, in __init__ + File "c:\playscii\texture.py", line 16, in __init__ + File ".\OpenGL\latebind.py", line 61, in __call__ + return self.wrapperFunction( self.baseFunction, *args, **named ) + File ".\OpenGL\GL\exceptional.py", line 178, in glGenTextures + baseFunction( count, textures) + File ".\OpenGL\latebind.py", line 45, in __call__ + return self._finalCall( *args, **named ) + File ".\OpenGL\wrapper.py", line 664, in wrapperCall + raise err + File ".\OpenGL\wrapper.py", line 657, in wrapperCall + result = wrappedOperation( *cArguments ) + File ".\OpenGL\platform\baseplatform.py", line 402, in __call__ + return self( *args, **named ) + File ".\OpenGL\error.py", line 232, in glCheckError + baseOperation = baseOperation, +OpenGL.error.GLError: GLError( + err = 1282, + description = b'invalid operation', + baseOperation = glGenTextures, + pyArgs = (1, c_ulong(0)), + cArgs = (1, ), + cArguments = (1, ) +) \ No newline at end of file diff --git a/docs/bugs/v21.txt b/docs/bugs/v21.txt new file mode 100644 index 0000000..cbee653 --- /dev/null +++ b/docs/bugs/v21.txt @@ -0,0 +1,5 @@ +tried launching in Parallels (as I run a Mac). Didn't work! playscii.log reads: +Traceback (most recent call last): + File "playscii.py", line 12, in + File "c:\python34\lib\site-packages\zipextimporter.py", line 116, in load_module +zipimport.ZipImportError: can't find module sdl2 diff --git a/docs/bugs/zensaiyuki.txt b/docs/bugs/zensaiyuki.txt new file mode 100644 index 0000000..376344d --- /dev/null +++ b/docs/bugs/zensaiyuki.txt @@ -0,0 +1,51 @@ +Playscii v0.3.1 +OpenGL detected: 4.1 INTEL-10.2.46 +GLSL detected: 4.10 +Vertex Array Object support found. +creating new document art/new.psci +Traceback (most recent call last): + File "/usr/local/lib/python3.4/site-packages/OpenGL/latebind.py", line 41, in __call__ + return self._finalCall( *args, **named ) +TypeError: 'NoneType' object is not callable + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "playscii.py", line 664, in + app = Application(log_file, log_lines, file_to_load) + File "playscii.py", line 123, in __init__ + self.load_art(art_filename) + File "playscii.py", line 187, in load_art + art = self.new_art(filename) + File "playscii.py", line 163, in new_art + charset = self.load_charset(self.starting_charset) + File "playscii.py", line 223, in load_charset + new_charset = CharacterSet(self, charset_to_load, log) + File "/Users/bretonslivka/Downloads/JPLeBreton-playscii-337ccff3951d/charset.py", line 74, in __init__ + self.texture = Texture(img.tostring(), self.image_width, self.image_height) + File "/Users/bretonslivka/Downloads/JPLeBreton-playscii-337ccff3951d/texture.py", line 16, in __init__ + self.gltex = GL.glGenTextures(1) + File "/usr/local/lib/python3.4/site-packages/OpenGL/latebind.py", line 61, in __call__ + return self.wrapperFunction( self.baseFunction, *args, **named ) + File "/usr/local/lib/python3.4/site-packages/OpenGL/GL/exceptional.py", line 178, in glGenTextures + baseFunction( count, textures) + File "/usr/local/lib/python3.4/site-packages/OpenGL/latebind.py", line 45, in __call__ + return self._finalCall( *args, **named ) + File "/usr/local/lib/python3.4/site-packages/OpenGL/wrapper.py", line 664, in wrapperCall + raise err + File "/usr/local/lib/python3.4/site-packages/OpenGL/wrapper.py", line 657, in wrapperCall + result = wrappedOperation( *cArguments ) + File "/usr/local/lib/python3.4/site-packages/OpenGL/platform/baseplatform.py", line 402, in __call__ + return self( *args, **named ) + File "/usr/local/lib/python3.4/site-packages/OpenGL/error.py", line 232, in glCheckError + baseOperation = baseOperation, +OpenGL.error.GLError: GLError( + err = 1282, + description = b'invalid operation', + baseOperation = glGenTextures, + pyArgs = (1, c_uint(1)), + cArgs = (1, ), + cArguments = (1, ) +) +zenpsycho:JPLeBreton-playscii-337ccff3951d bretonslivka$ + diff --git a/docs/design/early_notes.txt b/docs/design/early_notes.txt new file mode 100644 index 0000000..29d466f --- /dev/null +++ b/docs/design/early_notes.txt @@ -0,0 +1,87 @@ + + +second design approach circa first week of january 2015 + +art stores no intermediate lists, just arrays of ints for char, fg & bg colors +shader does the rest! +compute char UV in the vert shader +get fg and bg colors from index by sampling from a 1D palette texture +pass in texture dimensions as uniforms (2 bits of data that don't change per object) +art's get and set methods compute index into array and return/set directly +no layer or frame objects! an Art keeps lists of em, and a few lists for data that used to live in each instance eg frame delay and layer Z. + + +--- + +design notes circa xmas 2014 + +art only changes when user edits +renderable updates from art when user edits or animation frame changes + +is a texture lookup for the palette (1D or otherwise) even necessary? table of colors in the renderable's color buffers might be sufficient + +is iterating through every tile in an art (layer) to update a renderable going to be bad for perf when lots of renderables are doing it every few frames? +PROBABLY, YES + +so: arts generate the openGL arrays (verts, elements, UVs, colors) and keep them around, update them piecemeal and only when edits are made; renderables grab these arrays from their art and resubmit the buffer data as needed + +--- + +ascii engine - playscii? +early notes circa september/october 2014 + +core principles: +- ASCII art with transparency and multiple layers (mainly for easier editing but also FX) +- animation support - multiple frames per file, # of layers constant across frames +- edit (art and animation) mode integrated with live game mode, press a key to start editing a game you're playing +-- NOT a full game creation tool, no in-app code editing or visual scripting - game behavior defined through python objects/compionents +- important stuff hot reloads, definitely: sprites, animations, shaders(?), possibly: character sets, palettes +- MDI: edit multiple files +X developed in tandem + ships with example games in different styles: a top-down vs side view, realtime vs turn-based +-- on hold: all work goes towards Secret Game Project + +--- + +- copy unity's rad ortho/persp camera mode switch a la https://twitter.com/pixelatedcrown/status/530857568240168960 +- characters can be >1 gridsquares big (but are always 1:1 aspect?) +- objects can consist of >1 gridsquares +- files can have multiple "pages", eg for animation +-- how to define frame timing? for an anim, each page stays up for a certain time +- edit mode vs play mode +-- or: edit mode (like a level editor) vs paint mode (like edscii) vs play mode +- MDI: multiple files can be open, switch between em +- file references update when you change the referenced file (edit a sprite, see changes immediately) +- "transparent" is a valid BG or FG color +- objects can reference files, their pages define animations +- objects specify whether they move on char grid or pixel grid +- layers can have z-depths set, only drawn in "play" mode +- levels: single page of a file, collision can be painted in a special layer +- edit mode concepts: file, page/frame, layer, tile, character, color +- animation playback in sub window? edit while watching anim, set pages that define anim and their timings +- play mode concepts: world (collection of levels?), level, layer, object, sprite, animation +- levels (screens) can scroll on char grid or pixel grid +- selection of different CRT emulation shaders + +test content: +- fireworks animation +- matrix screensaver-like noninteractive nonanimation +- endless ladder climbing remake +- real example game: "escape tunnel" + +work: +- UI mockups +- architecture, UI/concept classes +- what drives object behavior? +- how does edit mode work exactly? +-- pick and place objects from a library? +-- how to edit object properties? +-- how to specify connections between objects? + +references: +- Mark Wonnacott's kooltool: http://ragzouken.itch.io/kooltool +- libtcod / libdoryen: http://doryen.eptalys.net/libtcod + +edscii daily doodle ideas: +- big wizard +- toucan +- tunnels under earth diff --git a/docs/design/mock1.png b/docs/design/mock1.png new file mode 100644 index 0000000..bf80d9d Binary files /dev/null and b/docs/design/mock1.png differ diff --git a/docs/design/mock2.png b/docs/design/mock2.png new file mode 100644 index 0000000..c0c5ce9 Binary files /dev/null and b/docs/design/mock2.png differ diff --git a/docs/design/old/20150101.txt b/docs/design/old/20150101.txt new file mode 100644 index 0000000..ac0354b --- /dev/null +++ b/docs/design/old/20150101.txt @@ -0,0 +1,29 @@ + +first design approach notes, started 2014-12-31 abandoned 2015-01-03 + +geo + uvs + color data for all layers on a frame are precomputed for each frame. when renderables animate they just bind different arrays + +art.vert_array, art.elem_array: geo is same across all frames +ArtFrame.uv/fg/bg_array: uv/fg/bg color arrays for all layers + +Art.init(): initialize lists for 1 frame with 1 blank layer of specified size, update all tiles' char/fg/bg + +ArtFromDisk.init(): populate lists from saved data, update all tiles' char/fg/bg + +art.build_geo(): create vert and elem arrays for given size and update all tiles' char/colors - okay if it's slower because this only happens on init/resize + +ArtFrame.build_arrays(): creates uv/fgcolor/bgcolor arrays + +art.set_char_index/color_at(): only called by user or sim edits, update internal lists only, add each changed tile to "to update" lists: "characters to update", "fg/bg colors to update" + +art.update(): called from app.update(): process "to update" lists, calling art.update_char_array etc as needed (theoretrically this could be parallelized if lots of chars + colors are changing?) + +art.update_char_array: computes index into uv array for given tile, sets uvs + +art.update_color_array(fg=True): computers index into color array for given tile, sets color data + +art.do_test(): add layers and frames, set chars and colors manually + +renderable.update(): called from app.update(): has our art updated, or is it time to swap in a new animation frame? update buffers from art's arrays accordingly + +- investigate whether storing color (vec4) per vertex is better than color index (U of 1D color texture?) diff --git a/docs/design/old/art_class.txt b/docs/design/old/art_class.txt new file mode 100644 index 0000000..edfc70c --- /dev/null +++ b/docs/design/old/art_class.txt @@ -0,0 +1,62 @@ + +example: an art with 4 frames and 3 layers + +Art +|width, height, charset, palette: stuff that's written to / read from disk +|renderables: list of renderables using us +|vert_array, elem_array: geo array for all layers (changes on: resize, layer add/del) +|update lists: tiles of specific frame+layers whose array data we should update +|frames + |0 + |delay: time before display next frame + |uv_array, fg_color_array, bg_color array: arrays for all layers of this frame + | (changes on: tile edit, art resize, layer add/del) + |layers + |0 + |z: z depth for this layer + |chars, fg_colors, bg_colors: data (lists of rows) for this layer + |1 + |z + |chars, fg_colors, bg_colors + |2 + |z + |chars, fg_colors, bg_colors + |1 + |delay + |uv_array, fg_color_array, bg_color array + |layers + |0 + |z + |chars, fg_colors, bg_colors + |1 + |z + |chars, fg_colors, bg_colors + |2 + |z + |chars, fg_colors, bg_colors + |2 + |delay + |uv_array, fg_color_array, bg_color array + |layers + |0 + |z + |chars, fg_colors, bg_colors + |1 + |z + |chars, fg_colors, bg_colors + |2 + |z + |chars, fg_colors, bg_colors + |3 + |delay + |uv_array, fg_color_array, bg_color array + |layers + |0 + |z + |chars, fg_colors, bg_colors + |1 + |z + |chars, fg_colors, bg_colors + |2 + |z + |chars, fg_colors, bg_colors diff --git a/docs/design/psmock3_full.png b/docs/design/psmock3_full.png new file mode 100644 index 0000000..d40e359 Binary files /dev/null and b/docs/design/psmock3_full.png differ diff --git a/docs/design/psmock3_statusbar.png b/docs/design/psmock3_statusbar.png new file mode 100644 index 0000000..c71836e Binary files /dev/null and b/docs/design/psmock3_statusbar.png differ diff --git a/docs/docs_todo.txt b/docs/docs_todo.txt new file mode 100644 index 0000000..2357f7b --- /dev/null +++ b/docs/docs_todo.txt @@ -0,0 +1,11 @@ +documentation TODO + +auto-generated docs, add strings to code as needed + +readme in each example game dir explaining what it demonstrates + +GameWorld/GameObject/GameHUD/GameRoom full public API + +underlying Playscii classes, eg Art and Renderable + +license clarification: any art or games you /create/ with Playscii does not inherit this license, you're free to set terms on your own work diff --git a/docs/feedback.txt b/docs/feedback.txt new file mode 100644 index 0000000..0b34123 --- /dev/null +++ b/docs/feedback.txt @@ -0,0 +1,21 @@ +user feedback + +--- + +from @Flipyap 2015-01-24: + +The way EDSCII works makes it pretty hard to shade things the old-fashioned ASCII way, without the use of colors. + +I'd like to be able to bind characters to number keys for quick access to a palette of most frequently used characters/shapes. + +The second one is weirder, but it's based on the way an ASCII artist's brain operates. + +A pixel weight brush - draw random characters comprised of the same number of pixels (with a slider from fewest to most pixels). + +With maybe a lock button to make the brush use the same set of characters for consistency. + +Also, the current character palette makes it hard to distinguish connected shaped. It could use some spacing or a grid. + +It would also be nice if different tool groups used different cursors. I often couldn't tell if I was in paint or erase mode. + +--- diff --git a/docs/html/art_converters.jpg b/docs/html/art_converters.jpg new file mode 100644 index 0000000..ce6336f Binary files /dev/null and b/docs/html/art_converters.jpg differ diff --git a/docs/html/art_crt_off.png b/docs/html/art_crt_off.png new file mode 100644 index 0000000..57add5c Binary files /dev/null and b/docs/html/art_crt_off.png differ diff --git a/docs/html/art_crt_on.jpg b/docs/html/art_crt_on.jpg new file mode 100644 index 0000000..ec42225 Binary files /dev/null and b/docs/html/art_crt_on.jpg differ diff --git a/docs/html/art_layermenu.jpg b/docs/html/art_layermenu.jpg new file mode 100644 index 0000000..0c09d87 Binary files /dev/null and b/docs/html/art_layermenu.jpg differ diff --git a/docs/html/art_mask1.png b/docs/html/art_mask1.png new file mode 100644 index 0000000..79abdd6 Binary files /dev/null and b/docs/html/art_mask1.png differ diff --git a/docs/html/art_mask2.png b/docs/html/art_mask2.png new file mode 100644 index 0000000..5f26e9a Binary files /dev/null and b/docs/html/art_mask2.png differ diff --git a/docs/html/art_mask3.png b/docs/html/art_mask3.png new file mode 100644 index 0000000..ec5036b Binary files /dev/null and b/docs/html/art_mask3.png differ diff --git a/docs/html/art_mask4.png b/docs/html/art_mask4.png new file mode 100644 index 0000000..9ebeaaa Binary files /dev/null and b/docs/html/art_mask4.png differ diff --git a/docs/html/art_mask5.png b/docs/html/art_mask5.png new file mode 100644 index 0000000..ad79243 Binary files /dev/null and b/docs/html/art_mask5.png differ diff --git a/docs/html/art_menubar.jpg b/docs/html/art_menubar.jpg new file mode 100644 index 0000000..48e19cc Binary files /dev/null and b/docs/html/art_menubar.jpg differ diff --git a/docs/html/art_picker.jpg b/docs/html/art_picker.jpg new file mode 100644 index 0000000..8211fbf Binary files /dev/null and b/docs/html/art_picker.jpg differ diff --git a/docs/html/art_statusbar1.jpg b/docs/html/art_statusbar1.jpg new file mode 100644 index 0000000..476d93a Binary files /dev/null and b/docs/html/art_statusbar1.jpg differ diff --git a/docs/html/art_statusbar2.jpg b/docs/html/art_statusbar2.jpg new file mode 100644 index 0000000..2b802a6 Binary files /dev/null and b/docs/html/art_statusbar2.jpg differ diff --git a/docs/html/darkgrey.css b/docs/html/darkgrey.css new file mode 100755 index 0000000..c4d16f5 --- /dev/null +++ b/docs/html/darkgrey.css @@ -0,0 +1,130 @@ +body +{ + font-family: sans-serif; + color: #D8D8D8; + background-color: #505050; + margin: 0px; +} + +.main +{ + position: relative; + left: 10%; + width: 80%; +} + +.colorbar +{ + height: 32px; + background-repeat: repeat-x; + background-image: url('c64pal_strip_micro64b.png'); +} + +.titlebar +{ + background-color: #707070; + text-align: right; + padding: 20px 10% 20px 10%; +} + +.section +{ + padding: 0px 10% 0px 10%; + width: 80%; +} + +.pagetitle +{ + font-size: x-large; +} + +.pagetitle_left +{ + text-align: left; + font-size: x-large; +} + +.shadebar +{ + padding: 0px 10% 0px 10%; + height: 32px; + background-color: #404040; + text-align: left; + line-height: 32px; +} + +.centered +{ + text-align: center; +} + +.big +{ + font-size: x-large; + display: inline; +} + +.tiledesc +{ + text-align: right; +} + +.small +{ + font-size: medium; +} + +.block +{ + //text-indent: 50px; + padding: 0px 5% 0px 5%; +} + +tt +{ + font-size: 16px; + background-color: #484848; +} + +code +{ + border: 1px solid #aaa; + padding: 1px; + border-radius: 3px; + background-color: #484848; +} + +h1 +{ + font-size: large; + margin: 0px; +} + +a +{ + text-decoration: none; +} + +a:link +{ + color: #E8E8E8; + background-color: #686868; +} + +a:visited +{ + color: #D8D8D8; + background-color: #606060; +} + +a:hover +{ + color: #303030; + background-color: #FFFFFF; +} + +a:active +{ + color: #FFFFFF; + background-color: #000000; +} diff --git a/docs/html/exidy_sorcerer_converted.png b/docs/html/exidy_sorcerer_converted.png new file mode 100644 index 0000000..e7d4f30 Binary files /dev/null and b/docs/html/exidy_sorcerer_converted.png differ diff --git a/docs/html/exidy_sorcerer_orig.jpg b/docs/html/exidy_sorcerer_orig.jpg new file mode 100644 index 0000000..4bb0fd4 Binary files /dev/null and b/docs/html/exidy_sorcerer_orig.jpg differ diff --git a/docs/html/game_collision.jpg b/docs/html/game_collision.jpg new file mode 100644 index 0000000..c7bb5d8 Binary files /dev/null and b/docs/html/game_collision.jpg differ diff --git a/docs/html/game_cronotest.png b/docs/html/game_cronotest.png new file mode 100644 index 0000000..a84a489 Binary files /dev/null and b/docs/html/game_cronotest.png differ diff --git a/docs/html/game_flood.png b/docs/html/game_flood.png new file mode 100644 index 0000000..aa3de9a Binary files /dev/null and b/docs/html/game_flood.png differ diff --git a/docs/html/game_maze.png b/docs/html/game_maze.png new file mode 100644 index 0000000..3a4c857 Binary files /dev/null and b/docs/html/game_maze.png differ diff --git a/docs/html/game_menubar.jpg b/docs/html/game_menubar.jpg new file mode 100644 index 0000000..60aa0f5 Binary files /dev/null and b/docs/html/game_menubar.jpg differ diff --git a/docs/html/game_platso.png b/docs/html/game_platso.png new file mode 100644 index 0000000..4ad88fc Binary files /dev/null and b/docs/html/game_platso.png differ diff --git a/docs/html/game_propseditor.jpg b/docs/html/game_propseditor.jpg new file mode 100644 index 0000000..ee16dad Binary files /dev/null and b/docs/html/game_propseditor.jpg differ diff --git a/docs/html/game_shmup.png b/docs/html/game_shmup.png new file mode 100644 index 0000000..ef6cd73 Binary files /dev/null and b/docs/html/game_shmup.png differ diff --git a/docs/html/howto_art.html b/docs/html/howto_art.html new file mode 100644 index 0000000..dc4f609 --- /dev/null +++ b/docs/html/howto_art.html @@ -0,0 +1,477 @@ + + + + Playscii - Documentation (Art Mode) + + + + + +
+ Playscii logo +
+
+ +
+ +
+ +

+ Using Playscii's Art Mode, you can create art and animation. If you see "Art Mode" in the top right corner of the Playscii application window, you're in Art Mode. This page covers all the things you can do in this mode. +

+ +
+ +

Table of Contents

+ + + +
+ +

Painting Basics

+
+

+ A Playscii document is a grid of tiles called an Art. Each tile in an Art has a character, a foreground color, a background color, and a transform. Click and hold the primary mouse button, or Enter/Return, anywhere on a document to paint with the active character, color, and transform. +

+
+ +

Tile Character/Color/Transform

+
+

+ Character and foreground/background color are pretty self-explanatory. "Transform" refers to whether a character is flipped (horizontally or vertically, aka the X and Y axes) or rotated (90, 180, or 270 degrees). The current active character, colors, and transform are always shown on the status bar along the bottom edge of the screen. +

+
image of status bar
+

+ In this image, the 'A' character is selected, green is the foreground color, blue is the background color, and the transform is "normal", ie not flipped or rotated. +

+
+ +

Transparency

+
+

+ In addition to the regular colors, the foreground and/or background color for a tile can also be transparent. Anything transparent shows through to whatever (if anything) is behind it. In Playscii's user interface, this special color is visually represented with a red X. +

+
image of status bar
+

+ In this image, the '7' character is selected, green is the foreground color, the background is transparent, and the transform is "Flip X" ie flipped horizontally. +

+
+ +

the Picker

+
+

+ Press and hold space bar to bring up the "picker" that lets you quickly select characters, colors, and transforms. Here's a diagram showing all the features of the picker: +

+
image of picker with elements labeled by number
+
    +
  1. Character swatch - click a character here to set it as the active character for painting.
  2. +
  3. Color swatch - click the primary mouse button on a color here to set it as the active foreground color, secondary mouse click to set it as the active background color.
  4. +
  5. Transform selector - click one of the items here to set a different active transform (see transform section above).
  6. +
  7. Tool/picker tabs - click the left tab to bring up settings for each tool (see Tools and Affects Masks sections below), click the right tab to bring up the picker view.
  8. +
  9. Current character set - click this to bring up the character set selector.
  10. +
  11. Current palette - click this to bring up the palette selector.
  12. +
  13. Character swatch size - click the + and - buttons to change the character swatch's display size - bump it up if characters are too hard to see or click on your display.
  14. +
+

+ If it's more comfortable for you to tap space bar rather than hold it, you can change that behavior with "Picker toggle key: press/hold" in the Tool menu. +

+
+ +

Menu Bar

+
+

+ The menu bar along the top edge of the screen provides access to much of Playscii's functionality. Click a menu name to open it and select from the available commands. Many commands have an associated keyboard shortcut, displayed to the right of the menu entry. +

+
the Art Mode menu bar
+
+ +

Tools

+
+

+ You can pick the current tool from the Tool menu bar. The cursor will always show an icon indicating the currently selected tool. +

+
    +
  • Paint tool icon Paint - change the tiles within the cursor area to the current active character/colors/transform. +
  • Erase tool icon Erase - "erase" the tiles within the cursor area, removing characters and leaving only the current active background color. +
  • Rotate tool icon Rotate - rotate the tiles within the cursor area 90 degrees, relative to each character's current rotation. +
  • Grab tool icon Grab - set the character/color/transform of the tile beneath the cursor as the current active character/color/transform. Secondary mouse button does this no matter what tool you have selected, so that you can very quickly sample what you need and continue painting. +
  • Text tool icon Text - click anywhere in the document to start entering alphanumeric text at that location. Press Escape to stop entering text. +
  • Select tool icon Select - click and drag the mouse (or hold Enter/Return + arrow keys) to define a selected area. Other tool operations will be restricted to the selection area, and you can also cut/copy the selected area and paint it with the Paste tool (see below). Holding Shift while dragging a box adds to the current selection area, and holding Control while dragging a box subtracts it from the current selection area. Holding neither mod key replaces any previous selection. +
  • Paste tool icon Paste - paint with the last cut/copied tiles. +
+
+ +

Tool Settings

+
+

+ The Picker lets you change the settings for some tools: +

+
    +
  • Brush Size - increase or decrease the size of the square area a tool affects. Doesn't apply to the grab, text, select, and paste tools.
  • +
  • "Affects character / foreground color / background color / transform" masks - by default a tool will affect all of these things, but a tool's effect on each tile attribute can be disabled selectively. Hovering the cursor over a swatch will always preview the paint result, which might otherwise be a bit difficult to visualize. +

    +

    + + + + + + + + + + + + + + + + +
    affects: all affects: fg/bg color and xform, no char affects: bg color and xform, no char and fg color
    Affects: all
    Affects: colors and transform, but not character
    Affects: BG color and transform, but not character and FG color
    affects: bg color affects: char and bg color, no fg color and xform
    Affects: only background color
    Affects: character and BG color, but not FG color and transform
    +
    +

    +
  • +
+
+ +

Panning and Zooming

+
+

+ To zoom the view closer or further from the document you're editing, press Shift-X or Shift-Z respectively or scroll the mouse wheel up or down. +

+

+ Pressing = or - will snap-zoom the view closer or further in "pixel exact" increments, which gives a 1:1, 2:2, 4:4 etc correspondance between what you're seeing and the pixel size of your character set. This can be useful if you intend to export images where exact dimensions are important. +

+

+ To pan the view, use shift and the arrow keys or W/A/S/D (for up/left/down/right respectively), or click and drag the middle mouse button. +

+

+ Pressing Z will center the view on your art and snap the view to a 1:1 pixel exact zoom level. Pressing Z again without moving the view will return it to its previous location. This is good for stepping back for a quick look at the overall piece while you're working on details. +

+

+ You can also set the zoom level manually with "Set camera zoom..." in the View menu. +

+

+ You can also tilt the camera with "Camera tilt" in the View menu, but this isn't useful for much and is a bit broken at the moment. +

+
+ +

the Grid

+
+

+ By default Playscii displays a light grid over your art showing the boundaries of each tile, but you can turn this off with "Grid" in the View menu. +

+
+ +

CRT Filter

+
+

+ Playscii can display your work with a screen effect that emulates the look of old TVs or Monitors, ie cathode ray tubes. You can enable this with "CRT filter" in the View menu, or pressing Shift-R. If Playscii runs slowly on your computer, try disabling the CRT filter. +

+
+ + + + + + + + +
CRT filter on CRT filter off
CRT filter on
CRT filter off
+
+
+ +

Working with Documents

+
+

+ You can save the current document, create a new document, and open a previously saved document from the File menu. You can have multiple documents open at the same time and switch between them by pressing Control-Tab, while Shift-Control-Tab cycles backwards through open documents. +

+

+You can also see a list of all open documents at the bottom of the Art menu. +

+
+ +

Cropping and Resizing

+
+

+ You can crop a document by selecting an area with the Select tool and selecting "Crop to selection" from the Art menu. +

+

+ You can resize a document with "Resize" from the Art menu. This opens a dialog where you can enter the new desired size. If the desired size is smaller than the current size, you can specify a tile to be the new top left corner in the "Crop Start X/Y" fields. +

+
+ +

Flipping

+
+

+ You can flip an entire document, horizontally or vertically (called "Mirror" and "Flip" in some other art programs), with "Flip horizontally" and "Flip vertically" from the Art menu. The "Flip affects xforms" setting determines whether or not this operation also flips each individual tile by changing its transform. +

+
+ +

Layers

+
+

+ Playscii documents can have multiple layers, similar to Photoshop or GIMP. You can position these layers in 3D space for a parallax effect. +

+

+ In the Layer menu, you can create a new blank layer with "Add layer" or duplicate an existing one with "Duplicate this layer". The dialog will ask you to enter a name for the layer (purely for ease of identification) and a "Z-depth", ie how far from the default base depth, you want the layer to appear at. The following two Layer menu items let you change these two respective values. +

+

+ The "current active layer" is the one that your tools affect. You can cycle which layer is active with "Next layer" and "Previous layer", or with [ and ]. +

+

+ You can also select which layer is active in the layer list at the bottom of the Layer menu. The number of the current active layer is always shown in the status bar and corresponds to the order of this list. +

+
image of layer menu and status bar
+

+ When working on a particular layer, sometimes you want to see the other layers and sometimes you don't. "Inactive layers: Visible/Dim/Invisible" in the Layer menu cycles through three settings: all layers are 100% visible, non-active layers are dim but still partially visible, and non-active layers are completely hidden. +

+
+ +

Animation and Frames

+
+

+ Playscii documents can be animated, with multiple frames that each display for a "hold time" before advancing to the next. For documents with more than one frame, animation playback can be started and paused in Art Mode with "Start/Stop animation playback" in the Frame menu, or P. +

+

+ The "current active frame" is the one shown in the main editing view, that your tools affect. You can advance the currently active frame with "Next frame" and "Previous frame" in the Frame menu, or < and >. +

+

+ In the Frame menu, you can create a new blank frame with "Add frame" or duplicate an existing one with "Duplicate this frame". The dialog will ask you to enter a hold time for the new frame, and an index - the number the new frame should be inserted at in the 1-to-N sequence. You can change a frame's hold time and sequence index with the subsequent Frame menu items. You can also set all frame hold times to be the same with "Change all frames' hold times". +

+

+ Seeing the next and/or previous frames in the sequence, an "onion skin" view as it's called in traditional animation, can be a big help when animating. "Show onion skin frames", or O, toggles this off and on. In that same section of the Frame menu you can specify how many frames to show, as well as whether only previous frames, only next frames, or both are shown. +

+
+ +

Character Set Selector

+
+

+ By default Playscii lets you paint with the Commodore 64 PETSCII character set, but it supports many other sets out of the box, and you can define your own. The character set selector lets you pick from the the available sets. Clicking the "Set" button in this selector changes the current document's character set. This change doesn't affect the character index numbers of your actual document, so it's safe to experiment with different sets. +

+
+ +

Color Palette Selector

+
+

+ Similar to the character set selector, this selector lets you choose a different color palette from the default Commodore 64 palette. You can also define your own with nothing more than an image. +

+
+ +

Importing and Exporting

+
+

+ New with version 0.9.0, Playscii has an Import/Export plugin system you can use to get images in and out of Playscii from other formats. For example, you can export your art into a standard image format for easy sharing, export animations in GIF format, convert bitmap images into ASCII, and import art that was originally created in other ASCII formats or even text files. +

+
image of importer chooser
+

+ As it's a plugin system, you can also write your own converters. Playscii's built-in converters are stored in its formats/ subfolder, and you can place any you write in the formats/ subfolder of your Playscii documents folder. Weighing in at under 30 lines of code, the Plain Text Importer is a good example of how to get data from a very simple format into a Playscii art document. +

+
+ +

Image and Animation Export

+
+

+ Playscii documents use a custom file format with a .PSCI extension which saves things like tile and layer data, but you may want to export your art as a conventional bitmap image. You can export the current active frame of the current document to a PNG format image with "Export" in the File menu and then selecting "PNG image". You'll then see an options screen allowing you to set the pixel dimensions of the output, and whether or not it uses the CRT filter. +

+

+ You can also export animated documents in animated GIF format with "Animated GIF image" in the exporter chooser. GIF image animation uses the same "frame hold time" concept that Playscii uses, so the resulting GIF should look the same as it does in Playscii. +

+

+ If you're making a game in another engine and just using Playscii to paint sprites, you might want to do something like export a series of images for each layer in an Art, or each frame in an animation. The "PNG image set" exporter will take care of this for you. It provides the same options as the single image PNG exporter, plus the option to export frames and/or layers, and gives you a preview of what the exported filenames will look like. The Control-E shortcut for "run last exporter on current Art" can be especially useful here if you have multiple pieces of art open. +

+ +

Bitmap Image Conversion

+
+

+ Converting a Playscii document to a conventional bitmap image is very straightforward and preserves the image 100%, but doing the reverse is trickier and can have very aesthetically unique results. +

+
+ + + + + + + + +
sample bitmap image sample image, converted to PETSCII
Before
After
+
+

+ With the "Bitmap image" importer under "Import" in the File menu, you can select a bitmap image in JPEG or PNG format to convert into Playscii using the current document character set. An options screen then lets you specify whether to use the current document's palette, or generate a new one from the source image (as with Palette from File), as well as define the dimensions of the new art document. +

+

+ In brief, here's how the conversion process works: the source image is first resized to the current document size and its colors converted to the current palette. Each tile-sized block in the source image is then compared against all possible combinations of character and foreground/background color. When a best fit is found, that tile is painted at the source block's location and the next block is converted. This process is quite computationally intensive and may take a long time, even on fast computers. You can press Escape at any time to abort it. +

+

+ The document size and color palette at the time of conversion have a big impact on the look of the final result, so you may want to experiment with different settings. +

+
+ +

Custom Character Sets

+
+

+ Playscii includes several classic character sets from old computer systems, which you can preview and select in the Character Set Selector. You can also define custom character sets. +

+

+ Character set data for Playscii consists of two files, placed together in the charsets/ subfolder in your Playscii documents folder: an image file with the bitmap data of each character, and a text-based file with a .char extension: +

+
+

Character Set Source Image

+

+ This image should contain every character you want in the set, arranged in a uniform grid - variable-width fonts are not supported. The topmost, leftmost character should always be blank - Playscii always assumes this index zero is the blank character. +

+

+ Any pixel in the source image that is pure black (RGB 0, 0, 0) will be considered transparent, ie a tile's background color will show through to this. Any pixel that isn't this color will be taken as part of the character and "tinted" by the foregorund color, with pure white showing the tile pixels exactly as they appear in the source image. As of Playscii 0.8.2 tiles can contain multiple colors, and the Ultima IV tile set is provided as an example of this. +

+

+ Technically the source image can be in any format Playscii supports (PNG, GIF, JPEG, BMP) but PNG is preferred - using a lossy file format like JPEG will cause problems, because it produces unintended non-pure-black pixels. This can also result from using any form of smooth scaling in an image editing program - use "nearest neighbor" scaling in even multiples of the original pixel size if you don't want your characters to be distorted. +

+ +

Character Set Data File

+

+ You can create or edit this file in any text editor. It defines three things: the filename of the source image to use, the width and height in tiles of the source image, and the mapping of characters to blocks in the source image. In this file all lines that start with // (the double slash) are ignored so you can add comments as you like. +

+

+ The first line of this file names the image file with the bitmap character data - if it's left blank, Playscii will look for the same filename but with a .png extension. +

+

+ The second line of the file is the width and height of the character grid in the bitmap file, as integer numbers separated by a comma. Playscii needs this data to know how many pixels are in a tile for this character set. +

+

+ All subsequent lines are "mapping" data, a 1:1 correspondance between the characters on each line and the blocks in the bitmap. If a block doesn't have a representative character you can type on a keyboard, just leave it a blank space, but keep track of the number of blank spaces. You can even omit this data entirely, mostly it just means that the Text Tool won't know how to map the keys you press onto a character in your set. +

+
+ +

+ If you have issues getting a custom character set to work, the character sets already included with Playscii are a useful reference. You can find them in the charsets/ subfolder of the folder you're running Playscii from. Here's the ZX Spectrum character set data as an example: +

+
+ + + + + + + + + + +
ZX Spectrum character set + +// ignore this
+speccy.png
+16,4
+           " $:?
+()><=+-*/;,.0123
+456789ABCDEFGHIJ
+KLMNOPQRSTUVWXYZ
+// end +
+
speccy.png
speccy.char
+
+

+ Lastly, know that if you're working on character set data or images in an external program such as a text or image editor, Playscii (as of version 0.9.2) will automatically reload changes as you save them. +

+ +
+ +

Custom Color Palettes

+
+

+ Playscii includes several classic color palettes from old computers and game systems, which you can preview and select in the Palette Selector. You can also define custom color palettes in two different ways: +

+
    +
  • You can simply drop an image into the palettes/ subfolder of your Playscii documents folder. The image is scanned from top left to bottom right, and each unique color found is added to the palette. You can create color swatch images in traditional paint programs for this purpose quite easily. As of version 0.9.0, Playscii will automatically reload palette images as you change them in another program.
  • +
  • If you have an image with a larger number of unique colors, you can easily turn it into a custom palette with "Palette from image" in the Char/Color menu. After selecting a source image, the dialog lets you specify a name for the new palette file, and a target number of unique colors the source image will be reduced to.
  • +
+
+ +

Technical Note: Indices

+
+

+While this is more likely to be of use to Game Mode authors it bears mentioning here: a tile's character, foreground and background color, and transform are all stored internally as an index, ie a positive integer number. A tile's character index corresponds with its character's position in the Art's character set, a tile's color indices correspond with its fg/bg colors' positions in the Art's color palette, and a tile's transform index corresponds to the UV_* enum values defined in the Art module: UV_NORMAL, UV_ROTATE90, UV_FLIPX, and so on. +

+

+You can see these indices stored in the JSON of a .PSCI file, and if you're handy with Playscii's developer console you can get and set the currently selected values with ui.selected_char, ui.selected_fg_color, ui.selected_bg_color, and ui.selected_xform. +

+
+ +

Artscripts: Making Art from Code

+
+

+Playscii makes heavy use of Python's dynamic nature, so there are many ways besides the art tools described above to create art. You can peek and poke values at the current active art from the developer console, and you can also use something called Artscripts to run arbitrary Python code on a given Art, opening a broad toolbox of generative effects.

+

+

+In Art Mode, you can run an artscript on the current active art with "Run Artscript..." from the Art menu. You can quickly run that script subsequent times with Control-T. Artscripts are re-read on each run, so you can refine your code in a text editor and see the results in Playscii with a keystroke. +

+

+You can also run Artscripts from the dev console with the scr command, and you can set an art script to run every N seconds with the screv command. You can also run them from Game Mode code with an Art's run_script and run_script_every methods. +

+

+Artscripts are kept in the artscripts/ subfolder of your Playscii documents folder, and have an .arsc file extension. Every line in an art script must be valid Python code. Comment lines starting with # are fine. +

+

+An Artscript executes from within the Art's namespace, so referring to self from one refers to the Art itself. An iterator class called TileIter provides an easy way to iterate over all tiles in all frames and layers in an art, like so: +

+for frame, layer, x, y in TileIter(self):
+    self.set_char_index_at(frame, layer, x, y, random.randint(0, 64))
+
+The above code sets every tile in the art to a random (indices 0 through 64) character. +

+

+There are a few example Artscripts included in the Playscii application folder, most of which were written early in its development. conway.arsc runs a variant of Conway's Game of Life on each tile in the art, dissolve.arsc does an odd dissolve-like effect, and so on. +

+

+If you write an Artscript that's broadly useful and would be worth including with Playscii, please let us know! A pull request for the project's page would be easiest to integrate, but email works too. +

+
+ +

+ +<< back to main documentation page + +


+ + +
+ diff --git a/docs/html/howto_game.html b/docs/html/howto_game.html new file mode 100644 index 0000000..d369401 --- /dev/null +++ b/docs/html/howto_game.html @@ -0,0 +1,507 @@ + + + + Playscii - Documentation (Game Mode) + + + + + +
+ Playscii logo +
+
+ +
+ +
+ +

Introduction

+
+

+ While I've worked hard to make game creation in Playscii as easy and inviting as possible, it's still code-based, and much of this page will assume you know the basics of Python programming. Any kind of non-code-based game creation, such as visual programming, is a far-off someday thing. If you have ideas for how it could work, I'm interested in hearing them. +

+

+ That said, you can make cool things happen in Game Mode with small amounts of easy to understand code, and you can "live tune" many things without having to restart Playscii to see your changes. This page will explain how. +

+

+ There are some topics best covered in this format, but for other things Playscii's code itself is the best documentation. Playscii can auto-generate nicely formatted HTML documentation of its code you can view in any web browser, without an internet connection. All you have to do is select "Generate documentation" from the Help menu. It may take a moment, but within a few seconds a table of contents page should open in your web browser. (If you're running from source instead of one of the pre-compiled builds, make sure you have the pdoc Python module installed.) +

+

+ If you've already generated the docs, the following link should take you to there: +

Playscii Auto-Generated Documentation

+

+
+ +
+ +

Table of Contents

+ + + +
+ +

Entering Game Mode

+
+

+ By default Playscii launches into Art Mode. To switch between Art Mode and Game Mode, click the top right corner of the screen, or press G. +

+
+ +

Menu Bar

+
+

+ The menu bar along the top edge of the screen provides access to much of Playscii's functionality. Click a menu name to open it and select from the available commands. Many commands have an associated keyboard shortcut, displayed to the right of the menu entry. +

+
the Game Mode menu bar
+
+ +

Loading Games

+
+

+ Games in Playscii are folders that contain code and assets (art, sounds) in specific subfolders. Playscii includes some games in its application folder, but your operating system's Documents/Playscii/ folder has a games/ subfolder for you to put your own games in. +

+

+ You can launch a game in Playscii in one of three ways: +

    +
  • "Open game" from the Game menu will bring up a list of available games. Load one by clicking on it.
  • +
  • Launch Playscii from the command line with -game mygame after it, where mygame is the game (ie the folder) you want to launch.
  • +
  • Include a file called autoplay_this_game in the same folder as the Playscii executable, whose first line is the name of the game you want to load. This is a simple hack for distributing games to people who don't have Playscii - you can just zip up the folder and distribute that.
  • +
+

+
+ +

Creating a New Project / Folder Structure of a Game

+
+

+ You can start a new project with "New game" from the Game menu, and Playscii will create the appropriate folders for you: +

    +
  • art/ - PSCI art files used by your GameObjects go here.
  • +
  • charsets/ - If your game uses any custom character sets, put them here.
  • +
  • palettes/ - If your game uses any custom color palettes, put them here.
  • +
  • scripts/ - All Python scripts (.py extension) for your game go here. Playscii will create a generic "starter script" here, which may be helpful if you're new to writing Python scripts for game objects.
  • +
  • sounds/ - Sound effects and music for your game, in any format supported by SDL2_mixer, go here.
  • +
  • start.gs - This is the default game state save file that will be loaded when you open your game.
  • +
+

+

+ When you create a new project, Playscii automatically creates a generic "starter script" in the scripts/ folder, with a few things to help newcomers - if you already know what you're doing, you can delete or ignore it. This starter script defines two new "classes", or flavors, of game objects: a generic GameObject subclass and a subclass of Player, which is simply a GameObject that moves around when you press the arrow keys. Before getting too deeply into these, though, a higher level overview of how all the classes fit together is in order. +

+
+ +

Game World Overview

+
+

+ In Game Mode, Playscii delegates game functionality to something called a GameWorld: loading game states, content, and scripts; managing the spawning and lifetimes of GameObjects; running much of the input->update->render loop that makes the simulation go; and handling Edit UI tasks such as selecting and dragging objects. +

+

+ GameObjects are, in turn, most of what a GameWorld thinks about. A GameObject can represent the player, a non-player character, an entire screen of level geometry, a powerup, a trigger that does something when entered, an invisible marker where another object appears, and so on. +

+

+ GameWorlds can also organize their objects into GameRooms, so that only certain objects are visible and simulated at once, and can use a GameHUD to render UI-appropriate information above everything else. +

+

+ The GameWorld class also has some functions that are most appropriate to its scope, such as managing music playback, getting collections of objects by type, and global collision tests. Have a look at the GameWorld generated documentation for an idea of what it handles relative to the other moving parts. +

+
+ +

Game Object Overview

+
+

+The GameObject class defined in the built-in game_object.py module provides the base capabilities of all objects, and you can extend this functionality by creating variants of that base class in the scripts you place in the game's scripts/ subfolder. The game_util_objects.py module includes a few generic subclasses ready-made for things like the player, projectiles, NPCs, triggers, and spawners. +

+

+Every GameObject has two components that help it render (draw to the screen) and collide, respectively: a Renderable and a Collideable. Renderables in turn can draw data from one or more Arts, pieces of art you can create in Art Mode or generate on-the-fly with code. +

+

+GameObjects have many properties you can change, functions you can call and/or override, and concepts such as state and facing to let you define custom behaviors. Rather than try to detail all of them here, please have a look at the GameObject generated documentation and Game Object Utility Library generated documentation, as well as the code for the example games, for an idea of how these can be used. +

+
+ +

Game States

+
+

+Playscii can save the state of all objects in a GameWorld into a "save state file" not unlike a conventional savegame or save state in a game console emulator. The start.gs created with a new project defines the game's starting state, which you can modify how you like by adding and manipulating the objects therein. You can create additional save state files for testing purposes, or even to load in new segments of gameplay if there is no state carried over from previous segments. +

+

+Save a game's current state into a new state file with "Save new state..." from the State menu. "Save state" or Control-S saves over the last saved state - take care not to accidentally overwrite your start.gs with this - and "Load state" opens a list of save state files to choose from. F2 quickly reloads the last loaded state file, which is handy for rapid iteration. +

+

+Much as Art (.PSCI files) are just tiles, layers, and frames serialized into JSON, save state files are all the GameObjects and GameRooms serialized into JSON, so it's possible to view and even manually edit them, though there's no non-bug reason you'd need to do this. +

+

+ It's worth noting that all GameObjects with the should_save property set False do not get saved into state save files. This is appropriate for certain kinds of objects, such as projectiles or spawned enemies whose lifetimes are managed in some other way, and/or for whom saving and loading would introduce unwanted complexity into how they work. +

+
+ +

the Editor Interface

+
+

+In Game Mode, the boundary between editing a game and playing it is intentionally fairly thin. The editor interface lets you create, manage, and modify GameObjects, and when this interface is disabled you're left with just the game itself, ie what players experience. +

+

+You can hide this UI at any time with "Hide edit UI" in the Game menu or Shift-E. When distributing games, you can add the line Application.can_edit = False to playscii.cfg which will prevent players from using the interface, switching into Art Mode, or doing anything besides just what you as a the game's designer intend. +

+

+The most basic actions one can do in this edit UI are primary mouse button on an object to select it and drag to move it. Selected objects have a thin pulsing outline that shows their "bounds", ie the edges of their current Art. Similar to Art Mode's Select tool, you can select multiple objcets at once: Shift + primary mouse button adds an object to the current selection set, while Control + primary mouse button removes an object from the selection set. +

+

+You can also select from a list of all objects in the world with "Select objects" in the Object menu, or Control-L. The aforementioned modifier keys have the same effect here as when you click in the world. +

+

+Selected objects will drag-move together as expected. You can also delete all selected objects with "Delete selected objects" in the Object menu. +

+
+ + +

the Properties Editor

+
+

+The pane that appears on the right side of the screen when you have object(s) selected is the Properties Editor. It shows the properties on the selected object(s) that you're allowed to edit on a per-instance basis. Clicking on a property will bring up a window where you can enter its new value. If multiple selected objects have different values, this will be displayed in the property field instead of any single value. +

+
properties editor
+

+The properties you edit in this UI are the very same properties that are declared in the object's class definition. If you want to change a value for all instances of this class, edit the code; if you want to change the value for a single instance, use the Properties Editor. +

+

+Each class defines which of its properties can be edited, and which will be saved to state files. The serialized property is a list of string names of properties that will be saved and can be edited, while the editable property is a list of string names of properties that should be editable but not serialized - mainly useful for live tuning. +

+
+ +

Spawning New Object Instances

+
+

+You can create new instances of the classes you've defined in scripts with "Spawn object" in the Object menu, or Control-P. This will bring up a list of available classes. Click one to select it, and then click in the main view to spawn an object at that location. +

+

+ You can also create new objects from existing ones with "Duplicate selected objects" in the Object menu. +

+
+ +

Object State and Facing

+
+

+In almost any game that uses 2D artwork, different sprites and animations are used to represent an object's different states (standing, walking, jumping) and facings (left, front, back). GameObjects use a string variable called state and an integer called facing (with GOF_LEFT, GOF_RIGHT, GOF_FRONT, GOF_BACK as the possible values) for these. +

+

Object State

+

+GameObject.state can be any string, but the default state name is "stand". There is no setter method for state, you can just set it, get it, and compare it directly. +

+

+Any custom state names you define for a class need to be included in its valid_states list. The get_art_for_state get_art_for_state methods use this list to load and find state-appropriate art, respectively. When a GameObject's state_changes_art property is set True, its art_src value becomes a prefix for finding art filenames for the appropriate state, eg "player_stand", "monster_die" etc. When state_changes_art is False, the base art_src property is used and the object won't change its art unless you have custom code doing so. +

+

Object Facing

+

+Similar to the above, when an object's facing_changes_art property is True then get_art_for_state will try to return an art that is appropriate to both the object's current state and its art. The cronotest example game shows this in action: "crono_stand_front" is the art for the player standing (ie not moving) and facing to the front, while "crono_walk_right" is the art for the player walking to the right. +

+

+Unique left and right facings will be used if found, otherwise get_art_for_state will mirror the one it finds so you don't need to make extra art. In general, the system will fall back to whatever facing is available, so that if you're just roughing in an object quickly you can get away with just having a front or side-facing art and do the other assets later. +

+
+ +

World Properties and Globals

+
+

+GameWorld is a core Playscii class, and it is a singleton not a GameObject: it doesn't serialize itself, nor is it an appropriate place for game-specific logic. In addition to classes like Player and Projectile, the game_util_objects.py module has two special classes that enable you to manage the world's state as objects: WorldPropertiesObject and WorldGlobalsObject. +

+

+Every GameWorld has a WorldPropertiesObject, but it's given a few status flags that ensure you can't select it, delete it, or spawn a second instance. Its purpose is to mirror the properties of the world itself, and then propagate those back to the world when loading a state, so that you can edit the world's properties much as you would any other object, with "Edit world properties" in the World menu. Here you can change things like the gravity applied to physical objects, whether or not the camera auto-locks on to the player, and various debug settings. +

+

+Every GameWorld also has a WorldGlobalsObject, which is typically a custom class defined for each game, where you can put logic that manages global state. When a save state file loads, it's spawned immediately after any saved objects, so whatever it's looking for is guaranteed to be there. Other game objects can always refer to it via self.world.globals. +

+

+By default this object isn't serialized, to keep a clear separation between world data and world logic, but this isn't carved in stone. The first released Playscii game, Endless Ladder Climbing 2, makes fairly heavy use of a WorldGlobalsObject to manage world state. +

+

+As WorldGlobalsObject is bound to be a custom class, you can let the world know which class to use by entering the class name in WorldPropertiesObject.globals_object_class_name. +

+
+ +

Camera

+
+

+A game's camera is not represented by a GameObject, rather its few properties are manipulated via the WorldPropertiesObject (so its position at any given point is serialized in a save state file) or script code. +

+

+In addition to static positioning, a camera can have a "focus object" whose movement it tracks, set via Camera.focus_object. As a convenience, when GameWorld.player_camera_lock is True, the camera will try to stay locked on to the player. +

+

+As in Art Mode, you can manually set the camera's zoom level with "Set camera zoom" in the View menu, and you can set its position directly with the dev console. +

+

+It's sometimes useful to use a LocationMarker object to remember a camera position. "Move selected object(s) to camera" and "Move camera to selected object" in the View menu make it easier to do this: you can position the camera how you want it and then snap an object to it, and then later snap the camera to that object to restore the position. +

+

+Rooms can also set the camera position. This is explained in detail in the next section. +

+
+ + +

Rooms

+
+

+Sometimes your game will have multiple "screens" worth of content, like a large world to explore. It's usually easier, for both the designer and the computer, to not be thinking about every single object in such a world at all times. To this end, Playscii allows you to organize objects into Rooms, represented by the GameRoom class. +

+

+Rooms are strictly an opt-in concept: every object keeps track of which rooms it's in, and an object that is not in any rooms is considered to be everywhere. So by default the world updates and renders every object in it, and you don't need to think about rooms at all if you're not using them. Most of the example games don't use rooms at all, while the Maze game uses them extensively. If you've got Playscii open as you read these docs, opening the Maze game and poking at it might help you understand some of the functionality. +

+

+The game world has a notion of what the "current room" is, and by default it's None. Once you've created a room, with "Add room" in the Room menu, you can set it as current either with "Change current room" from the Room menu, or clicking on a room's name in the list at the bottom of that same menu - a checkmark will appear next to the current room. +

+

Managing Room Contents

+

+Once you have a room set as current, you can set which objects are in it with "Add selected objects to this room" and "Remove selected objects from this room". "Add/remove objects from this room" will bring up a list in the left pane, in which objects in the room are highlighted and clicking adds or removes them. On the code side, if you have a handle to the room itself you can do this with GameRoom.add_object_by_name (passing the object's string name), GameRoom.add_object (passing the object by reference), GameRoom.remove_object_by_name, and so on. +

+

+Again, objects that you know will always be on-screen - it's usually a safe bet that the player is, for example - can be kept outside of all rooms. +

+

+Objects that are not in the current room (and aren't "everywhere" as described above) are not rendered or updated (unless their GameObject.update_if_outside_room property is set True), so as you're organizing objects you'll see some of them blink out of sight. +

+

+If you get confused and what's where, you can toggle a global view of all objects in all rooms with "Show all rooms" in the Room menu. +

+

Room Camera Markers and Edge Warps

+

+Managing room transitions and camera changes as the player moves around are very common uses of rooms - again, the Maze game's explorable world does this a lot. If a room's camera_marker_name is set, the camera will warp there when the room is entered. You can easily set this with "Set this room's camera marker" in the Room menu. +

+

+Often you'll want to warp the player to a different room when they reach the "edge" of it. You need to provide two bits of information to the room to make this work: give it an object to define the "edges" of the room, with "Set this room's edge object" in the Room menu, and telling the world which room or point to warp to when the player reaches the north/south/east/west edges of those bounds, with "Set this room's edge warps". In the pane on the left, you'll notice you can select both room names and object names. If a room name is given for an edge warp, the player will warp to that room; if an object name is given, the player will warp to that object's location and change to that object's room. +

+

+Technically this "edge warp" functionality is doing something very similar to the WarpTrigger class, but its close integration with the room concept makes it somewhat easier. +

+

+A few more intricacies of Rooms are covered in the Maze game section below, so have a look if any of this isn't clear. +

+
+ +

HUD

+
+

+The GameHUD (HUD is short for Heads-Up Display) is a simple singleton member of GameWorld that draws in 2D screen space and manages its Renderables directly, useful for UI/HUD like purposes. The whole point of a GameHUD is that it has game-specific logic, so you'll want to create a subclass in your scripts and set your GameWorld.hud_class_name to its name via the WorldPropertiesObject, much as you set globals_object_class_name. +

+

+When you're setting Renderable sizes and locations in a GameHUD, remember that it uses OpenGL screen space coordinates, where (0,0) is the center of the screen and (1,1) is the top right corner. +

+
+ +

Debug Views

+
+

+Game Mode has a few visualization modes that are helpful for debugging in the View menu: +

    +
  • Show all object origins: show each object's "origin" or XYZ location using a familiar red/green/blue axis marker.
  • +
  • Show all object bounds: show each object's "bounds", ie the edges of their current Art.
  • +
  • Show all object collision: show each object's collision shapes - see the Collision section below.
  • +
+

+

+If you want to use debug lines for a more specific purpose, check out the renderable_line.DebugLineRenderable class - you can feed it a list of 3D coordinate tuples and it will draw those lines in the world. +

+
+ +

Collision Detection and Resolution

+
+

+Each GameObject has a Collideable component that allows it to participate in collisions with other objects. A Collideable in turn can have zero or more CollisionShapes, of which there are two types: Circle and Box (or "AABB" for Axis-Aligned Bounding Box, meaning an unrotated rectangle). Mostly commonly an object's Collideable will either have a single shape, as in the case of dynamic objects like the Player and Pickup classes, or multiple shapes arranged to approximate the shapes of tiles in an object's Art's "collision layer" - see more on this below. +

+
+ cronotest example game showing circle, box, and tile-based collision +

+ Cronotest example game showing circle, box, and tile-based collision. +

+
+

+These basic collision types are represented in the CST_* enumerated values in the collision module: CST_NONE, CST_CIRCLE, CST_AABB, and CST_TILE. Set a GameObject's collision_shape_type property to one of these to get each behavior. +

+

+CST_NONE means a Collideable will not bother generating any shapes and effectively do nothing, CST_CIRCLE and CST_AABB refer to the circle and box shapes described above, and CST_TILE refers to the generation of multiple box shapes alluded to above. An object's Circle collision size can be tuned with the col_radius property, and an object's AABB collision size can be tuned with the col_width and col_height properties. If you enable the collision debug view, you can see these changes reflected in real time. +

+

Tile-Based Collision

+

+CST_TILE collision leverages Playscii's tile-based nature by letting you define a layer in an object's Art to be its "collision layer" - a layer whose name is defined in the GameObject.col_layer_name property - so that you can easily author collision for complex environment objects. By default any layer in an Art named "collision" will be used for this purpose, and any non-blank (character index 0) tile on that layer will be treated as a solid block. In the image above, you can see the red shapes with the blue outlines that define the background object's collision layer. Static background objects are the most common use case for tile-based collision +

+

Static vs Dynamic Collision

+

+A GameObject's collision can be static or dynamic. If it's static, it can never move. Objects with CST_TILE collision are always static, as Playscii does not currently have a computationally efficient way to handle complex tile-based collisions for moving objects. The CT_* enum values defined in the collision module define arbitrary categories, and CTG_STATIC and CTG_DYNAMIC are lists of these values. You probably won't have to check or define these values much, just understand the static vs dynamic distinction and set it appropriately for each class. +

+

Tunneling

+

+Tunneling refers to bugs where moving objects can punch through other objects without the expected collision behavior. If you notice this happening for a given object class, you can set its fast_move_steps property to something greater than 0 to make its collision checks more granular - basically, each move is subdivided into fast_move_steps steps, the object stops moving if a collision is found, and the collision resolution phase that happens later will push the colliding object out of what it hit. This is enabled by default for the game_util_objects.Projectile class. Playscii's collision code is still maturing so if you see collision problems you can't easily fix, please file a bug. +

+
+ +

Sound and Music Playback

+
+

+Playscii's audio capabilities are not extensive but they should cover basic uses. Sound assets can be in any format supported by SDL2_mixer, and go in the sounds/ subfolder of your game folder. +

+

+GameObject.play_sound plays a sound by name, and names are mapped to asset filenames in an object's sound_filenames dictionary. Sounds can play N times or loop indefinitely, and you can stop them by name with stop_sound. You can also define looping sounds to play while an object is in a given state via looping_state_sounds +

+

+Music is controlled globally with GameWorld.play_music / stop_music. +

+
+ +

Handling Input

+
+

+ Playscii's InputLord class handles application input and takes care of basic things like player movement, but you may want to have objects (the player, most commonly) handle input directly. In these cases, set the class's handle_key_events and/or handle_mouse_events properties to True, and override GameObject's handle_key_down/handle_key_up and/or clicked/unclicked functions. InputLord passes in the key as a string and modifier key statues as booleans, so you don't need to worry about decoding from SDL2 keycodes or anything. Mouse events are passed in as button numbers and give the world coordinates of the click (X and Y axes). +

+
+ +

the Developer Console

+
+

+Playscii has a powerful developer console that can be opened by pressing ~ aka the tilde key, whose placement may vary on non-US layouts. If it's something unreasonable on your keyboard, you can rebind it to something better in your binds.cfg. +

+

+Type help at the dev console to see a list of available commands, with a brief summary of what each does. Some of these are more germane to Art Mode and/or redundant with functionality available from menus. Some commands require arguments after them; if so a usage hint will display if you type the command sans arguments. +

+

+ The dev console can also run arbitrary python expressions within the application's namespace! This is very powerful and potentially dangerous, so save your work before experimenting. The console's execution mechanism sets a few values so you can easily access them: +

    +
  • app - the application instance itself
  • +
  • ui - the application's top-level UI instance
  • +
  • camera - the current camera (Art Mode and Game Mode each have their own camera)
  • +
  • art - the current active Art in Art Mode
  • +
  • world - the GameWorld instance
  • +
  • player - the player instance in Game Mode
  • +
  • sel - the selected object in Game Mode, if only a single object is selected
  • +
  • hud - the GameWorld's GameHUD instance
  • +
+

+

+An example of how one might use this: select an object in Game Mode, open the console and type sel.art.set_tile_at(0, 0, 0, 0, 1 + 3, 4, 5). This will set the top left tile of the selected object's current Art to a specific character and color. That particular function is a bit wordy to call, but it demonstrates that you can call actual functions, use expressions, and set values directly from the console. The better you know Playscii's internals, the more powerful this tool can be for debugging and quick hacks. +

+
+ +

Crash/Error Handling

+
+

+As you're iterating on game code, it's possible your code will cause Playscii to crash. Since 0.8.1, where possible Playscii will try to catch this and print the Python exception information to the console instead of crashing. If you run into a situation where this reasonably should have happened but you got a crash instead, please file a bug. +

+
+ +

Workflow

+
+

+If you've been reading this document sequentially most of this will have been covered already, but I hope it's clear by now that Playscii's design places a high value on making it so you can "live edit" and see changes reflected immediately as much as possible, avoiding the productivity and morale drags of having to restart the application or game every time a small change is made. +

+

+A proficient Playscii workflow includes using state save files to rapidly reset after code changes, exposing important class tuning values for live property editing, and using the dev console when other UI doesn't easily expose things. Also worth mentioning is that any changes made to Arts that objects reference in Art Mode will be reflected instantly back in Game Mode, so you can iterate rapidly on art and animation assets. +

+

+I'm always looking to make this workflow better, so please send me any suggestions you have. +

+
+ +

Tour of Example Games

+
+

+Playscii includes some example games to demonstrate many of the features available in Game Mode, so here's a summary of the learning value of each. In addition the first released Playscii game, Endless Ladder Climbing 2, was created with an older version of Playscii but also does some reasonably ambitious things, so you can download that and examine the scripts/ folder in its game folder if you're eager to learn more. +

+ +

Cronotest

+
+
Cronotest game
+

+No real "game" to it, this was the first test space for Game Mode made in April-May of 2015, and shows off what was new at the time: bitmap image conversion from a certain beloved 1990s JRPG, a Player class that uses facing to drive front/side/back view stand and walk state animations, and basic examples of circle (player and the urn), box (the chest), and tile (room walls, bed, stair railing) collision types. +

+
+ +

Maze

+
+
Maze game
+

+This game was built to put the Rooms features through their paces. Its world consists of several large tile-based background objects, a few pickups, and some very basic NPCs spawned by ObjectSpawners - all collected into different rooms and connected by a combination of "edge warps" and conventional WarpTriggers. It was made with Playscii 0.7.1 in October 2015 and I made a video detailing its features. +

+
+ +

Flood

+
+
Flood game
+

+The goal of this game is to "flood" all the tiles with the same color, starting with the top left tile, before you run out of turns. Press number keys 1-5 to choose the next color to flood squares adjacent to the ones you've already flooded. +

+

+This game is a simple example of direct input handling - there's no actual Player object spawned, the Board class itself handles input. The Board also directly manipulates the tiles of its own, dynamically-generated Art - notice there are no pre-authored .PSCI files in the game's folder. Setting GameObject.generate_art to True tells the object not to worry about having an art_src set. +

+
+ +

Shmup

+
+
Shmup game
+

+A simple 2D shoot-em-up to show off Projectiles, ObjectSpawners, and a generated starfield. Note how the EnemySpawner class overrides get_spawn_class_name to produce a weighted random enemy population. Various objects use the lifespan property to auto-destroy themselves after a fixed time. The starfield uses Art.shift_all_frames(0, 1) to efficiently scroll downward - under the hood, this uses numpy's ndarray.roll to shift the data without rewriting every tile every update. +

+
+ +

Platso

+
+
Platso game
+

+A very basic single-screen platformer featuring a world with gravity and jumping, input handling to ensure each jump requires a keypress, and monsters with some basic behavior logic. Note PlatformMonster's use of set_timer_function to run its check_wall_hits method, a potentially expensive custom collision check, every 1/5 of a second instead of every frame. +

+

+Platformers live and die by their control feel and the solidity of their collision resolution and for this game those are definitely not where I'd like them to be, so if you have any suggestions on how to improve it, please let me know! +

+
+ +

+ +<< back to main documentation page + +


+ +
+ diff --git a/docs/html/howto_main.html b/docs/html/howto_main.html new file mode 100644 index 0000000..77c31aa --- /dev/null +++ b/docs/html/howto_main.html @@ -0,0 +1,197 @@ + + + + Playscii - Documentation (Main) + + + + + +
+ Playscii logo +
+
+ +
+ +
+ +

Documentation

+ +

+ Playscii (pronounced play-skee) is an art, animation, and game creation tool. +

+ +

+ See the Art Mode page for detailed info on how to create artwork and animations with Playscii. +

+ +

+ See the Game Mode page for detailed info on how to create games with Playscii. +

+ +

+ General README-type information on running and building Playscii follows. +

+ +
+ +

Table of Contents

+ + + +
+ +

System Requirements

+
+

+ Playscii should run in Windows Vista, 7, 8.1, and 10 (32-bit and 64-bit), macOS 10.12 Sierra or higher, and any reasonably modern desktop version of Linux. +

+

+ Hardware-wise you'll need a video card that's capable of OpenGL 2.1, with GLSL 1.30 support. If your computer was made after 2008 or so, you're probably fine. Playscii will detect your supported GLSL version on startup and quit with an error message if version 1.30 or higher is not found. +

+
+ +

Running

+
+

+If you're looking at Playscii in the itch.io app, simply click Install and then Launch! Note that if you're doing this in Linux, you're running from source and should follow the instructions for installing dependencies in the section below. +

+

+If you downloaded the ZIP file with "win32" in its name, you should have a Windows build you can run by double-clicking playscii.exe, without needing to install anything listed below. +

+

+ If you downloaded the DMG file, this is the Mac application bundle which can be installed in the standard manner, by opening the disk image file and then dragging Playscii.app into your Applications folder. You don't need to install anything else. +

+ Please note that as of at least macOS 10.13 "High Sierra" and later, you will have to bypass an OS-level security feature to run Playscii, as it is non-notarized software. I have no plans to offer notarized macOS builds. Once you've got Playscii.app in your Applications folder, run the following command from a Terminal:
+ xattr -dr com.apple.quarantine /Applications/Playscii.app
+ You should then be able to click the app to launch it as normal. +
+

+

+If you downloaded the ZIP file with "source" in its name or from the project's source code repository, you can run Playscii from its source code on any of the supported operating systems if you have Python and a few libraries installed. See the Running from Source and Building sections below. +

+
+ +

Configuration

+
+

+ Most users won't need to edit them, but just in case - Playscii places its configuration files in OS-appropriate folders: +

    +
  • + Windows 7-10: C:\Users\[your username]\AppData\Local\Playscii +
  • +
  • + Linux: ~/.config/Playscii +
  • +
  • + macOS: ~/Library/Application Support/Playscii +
  • +
+

+

+ Documents (your art, color palettes, etc) are stored in eg ~/Documents/Playscii in macOS and Linux, and the appropriate "My Documents" folder in Windows. +

+

+ You can override many program defaults in the file playscii.cfg. This file starts with a few possible "commented-out" overrides to get you started. You can enable one by deleting the # character at the start of the line. Every line in that file must be a valid Python expression, so edit carefully! +

+

+ Likewise you can change Playscii's keyboard command binds in the binds.cfg file. +

+
+ +

Running from Source

+
+

+ Running from source is only recommended if a binary build isn't available for your OS and/or you want to play with the latest still-in-development version. If you're doing so, you'll need some version of Python 3 - sorry, Python 2 is not supported - and the following libraries: +

+
    +
  • + PySDL2 +
  • +
  • + PyOpenGL +
  • +
  • + Numpy +
  • +
  • + Pillow or any compatible derivative of Python Image Library (PIL) +
  • +
  • + appdirs +
  • +
  • + pdoc - only needed if you want to generate documentation from Playscii's source itself. Mainly useful for game creation. +
  • +
+

+These libraries are all pretty easy to install using PIP, the package manager that comes with Python 3.4 and later. Find the pip executable and run it from the command line, like so: +

+pip install pysdl2 pyopengl numpy pillow appdirs pdoc +

+In Windows the pip executable is in the Scripts\ subfolder of your Python install folder, eg c:\Python34. On some Unix-like systems (Linux and macOS) the pip binary to run may be called pip3 to distinguish it from any Python 2 installations. On Unix-like systems you may also need to run pip as super user to let it install system libraries, eg by pre-pending sudo to the command above. +

+

+On most systems, SDL2_mixer - which Playscii's Game Mode uses for sound playback - is a separate library from SDL2 core, so you'll also need to install that, by providing SDL2_mixer.dll and all its dependency DLLs in Windows, or as a system library (eg from a package manager) on *NIX-based operating systems. +

+

+Once you have the dependencies installed, you can run Playscii from source like so: +

+

+python playscii.py [optional name of art file to open] +

+
+ +

Building

+
+

+ To produce Windows EXE builds, in addition to the above dependencies you'll also need PyInstaller. +

+

+ Simply run build_windows.bat and it will place a complete build in the dist\ subfolder. You may need to provide needed DLLs, such as SDL2.dll, SDL2_mixer.dll and its dependencies. +

+

+ The process for Mac Application bundles is quite similar: install PyInstaller, and run the build_mac.sh script. +

+

+ Michael Lazar has created a fork of Playscii on Github, with only a few very minor changes, that has been reported by some Mac users to work well on their newer systems. See these notes from that repository for specific commands to run to get the right build environment. I cannot offer support for builds made with this fork, however. +

+
+ +

Roadmap

+
+

+Many of Playscii's intended features have now been implemented, but you can see a list of planned features on the Playscii Trello. Please don't take anything there as a promise, though. If you'd find something on there especially valuable, feel free to vote or comment! +

+
+ +

+ +<< back to Playscii main page + +


+ +
+ diff --git a/docs/html/logo_bg_tile.png b/docs/html/logo_bg_tile.png new file mode 100644 index 0000000..e5d18bf Binary files /dev/null and b/docs/html/logo_bg_tile.png differ diff --git a/docs/html/pslogo_w_text2.png b/docs/html/pslogo_w_text2.png new file mode 100644 index 0000000..9d286dd Binary files /dev/null and b/docs/html/pslogo_w_text2.png differ diff --git a/docs/html/speccy.png b/docs/html/speccy.png new file mode 100644 index 0000000..8f8f63f Binary files /dev/null and b/docs/html/speccy.png differ diff --git a/docs/html/tool_erase.png b/docs/html/tool_erase.png new file mode 100644 index 0000000..b663a29 Binary files /dev/null and b/docs/html/tool_erase.png differ diff --git a/docs/html/tool_grab.png b/docs/html/tool_grab.png new file mode 100644 index 0000000..df86da8 Binary files /dev/null and b/docs/html/tool_grab.png differ diff --git a/docs/html/tool_paint.png b/docs/html/tool_paint.png new file mode 100644 index 0000000..3ef7d2e Binary files /dev/null and b/docs/html/tool_paint.png differ diff --git a/docs/html/tool_paste.png b/docs/html/tool_paste.png new file mode 100644 index 0000000..2d6076b Binary files /dev/null and b/docs/html/tool_paste.png differ diff --git a/docs/html/tool_rotate.png b/docs/html/tool_rotate.png new file mode 100644 index 0000000..72b1cbe Binary files /dev/null and b/docs/html/tool_rotate.png differ diff --git a/docs/html/tool_select.png b/docs/html/tool_select.png new file mode 100644 index 0000000..c4c22f0 Binary files /dev/null and b/docs/html/tool_select.png differ diff --git a/docs/html/tool_select_add.png b/docs/html/tool_select_add.png new file mode 100644 index 0000000..2993f34 Binary files /dev/null and b/docs/html/tool_select_add.png differ diff --git a/docs/html/tool_select_sub.png b/docs/html/tool_select_sub.png new file mode 100644 index 0000000..8798067 Binary files /dev/null and b/docs/html/tool_select_sub.png differ diff --git a/docs/html/tool_text.png b/docs/html/tool_text.png new file mode 100644 index 0000000..c0b78d0 Binary files /dev/null and b/docs/html/tool_text.png differ diff --git a/docs/links.txt b/docs/links.txt new file mode 100644 index 0000000..078c438 --- /dev/null +++ b/docs/links.txt @@ -0,0 +1,106 @@ +possibly-helpful links + + +collision: + +triplefox's response: +http://pastebin.com/By7QdCcu + +Metanet classics: +http://www.metanetsoftware.com/technique/tutorialA.html +http://www.metanetsoftware.com/technique/tutorialB.html + +Handmade Hero has a few sections on collision: https://www.youtube.com/watch?v=_g8DLrNyVsQ + +http://jonathanwhiting.com/tutorial/collision/ + +http://tim.hibal.org/blog/2d-character-movement/ + +https://github.com/pybox2d/pybox2d use Box2D just for collision? objects can be placed in "kinematic" mode and won't simulate, just collide + + + +parallelization: + +https://docs.python.org/3/library/multiprocessing.html + +https://timothyawiseman.wordpress.com/2012/12/21/a-really-simple-multiprocessing-python-example/ + + +image conversion: + +http://trixter.oldskool.org/2014/06/19/8088-domination-post-mortem-part-1/ + +http://sol.gfxile.net/textfx + +https://www.youtube.com/watch?v=L6CkYou6hYU + +https://www.youtube.com/watch?v=Iqxfdw-k1OU + +http://www.compuphase.com/cmetric.htm - "nonlinear RGB", faster (than Lab) color space conversion + +http://www.syntacticbayleaves.com/2008/12/03/determining-image-similarity/ + +http://www.guguncube.com/1656/python-image-similarity-comparison-using-several-techniques + +http://wiki.unity3d.com/index.php/Dithering_Shader + + + + +SDL/OpenGL resources: + +http://docs.gl + +https://open.gl/introduction + +https://www.opengl.org/wiki/Core_Language_%28GLSL%29 + +http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Table-of-Contents.html + +http://sdl.beuc.net/sdl.wiki/SDL_Average_FPS_Measurement + +http://www.arcsynthesis.org/gltut/Positioning/Tut05%20Optimization%20Base%20Vertex.html - specifically, use of glDrawElementsBaseVertex to draw a single layer from a renderable + +https://developer.apple.com/opengl/capabilities/index.html - GL feature/version support on OSX + + +Tool reference: + +http://ragzouken.itch.io/kooltool - 8) + +http://www.aseprite.org - sprite editor with non-OS native retro-feelin' UI + +http://www.warmplace.ru/soft/sunvox - unusual DAW + +https://bitbucket.org/runhello/geodesic/wiki/Home - Andi's Icosa + +https://github.com/andyherbert/ansiedit - cool web-based editor + +http://fontstruct.com/gallery - slick looking tile-based font builder + +https://github.com/abagames/mgl - kenta cho's framework + +https://pypi.python.org/pypi/Compositor/ - "Morphologically Optimal ASCII Art" + +http://www.kameli.net/marq/?page_id=2717 - PETSCII editor from ~2013 + +http://satellitesrecords.com/artists/c64.htm - C64 synthesizer created by Ryo Kawasaki + +http://rexpaint.blogspot.com/p/features.html - nice featureful ascii editor, Cogmind dev + + +World/screen projection: + +http://webglfactory.blogspot.com/2011/05/how-to-convert-world-to-screen.html + +http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/MousePicking + +http://www.gamedev.net/topic/508784-unproject--mouse-coordinates-sdl-using-opengl/ + +https://www.opengl.org/discussion_boards/showthread.php/165951-Glut-Mouse-Coordinates + +http://www.antongerdelan.net/opengl/raycasting.html + +https://gist.github.com/LordNed/6e7d0f5069112665b6364faa32692d25 + diff --git a/docs/thanks.txt b/docs/thanks.txt new file mode 100644 index 0000000..b9ba4c9 --- /dev/null +++ b/docs/thanks.txt @@ -0,0 +1,64 @@ + +Playscii was made with the support of many nice people: + + +Patrons: + +Andrew Anderson +Evan Armour +Jason Bakker +Aaron Brown +Ben Burbank +Josh Closs +Lachlan Cooper +Sam Crisp +Holger Dors +Matthew Duhamel +Jacques Frechet +Katelyn Gigante +Isaac Halvorson +Leon Hartwig +Aubrey Hesselgren +Nick Keirle +Jón Kristinsson +Jeremy Lonien +Rohit Nirmal +James Noble +David Pittman +Shannon Smith +Jack Turner +Chris Welch +Andrew Yoder + + +Programming Help: + +Shawn Walker +Sean Barrett +Mark Wonnacott +Ian MacLarty +Goldbuick +Tin Tvrtković +Sean Gubelman +Erin Congden +Rohit Nirmal + +Tool Design Inspiration: + +Anna Anthropy +Andi McClure +Bret Victor +Tim Sweeney (ZZT) +Craig Hickman (Kid Pix) +Bill Atkinson (HyperCard) + +Love, Encouragement, Moral Support: + +L Stiger +Gail, Gil, and Elise LeBreton +Brendan Sinclair +Liz Ryerson +Johnnemann Nordhagen +Aubrey Hesselgren +Zak McClendon +#tool-design diff --git a/docs/todo.txt b/docs/todo.txt new file mode 100644 index 0000000..9da5c67 --- /dev/null +++ b/docs/todo.txt @@ -0,0 +1,9 @@ +TODO + +this file is no longer in use. see the bug list for bugs: + +https://heptapod.host/jp-lebreton/playscii/issues + +and the trello for features / improvements: + +https://trello.com/b/BLQBXn5H/playscii diff --git a/docs/ui.txt b/docs/ui.txt new file mode 100644 index 0000000..96810eb --- /dev/null +++ b/docs/ui.txt @@ -0,0 +1,93 @@ +UI design notes + +menu bar: +- about/credits screen +- file: new, open, save, save as, close, export current frame to PNG, export animated GIF, quit +- edit: cut/copy/paste, select all/none/invert +- art: next/previous art, crop to selection, resize, [list of loaded art] +- frame: add to end/insert/duplicate/remove/change order/change delay +- layer: add/duplicate/remove/change current Z, same functionality as the pane described above +- tool: list of tools, active one is checked +- help: help screen, readme, website? + +layer/frame view: +- matrix w/ layers are rows, frames are columns, scrolls horizontally if lots of frames, vertically if lots of layers +- thumbnails of each frame across the top +- clicking frame or layer section of status bar expands/minimizes it +- exposes layer functionality: add/duplicate/remove layer, adjust layer Z +-- layer Z order /is/ the layer list ordering, no other index kinda number +- exposes frame functionality: add/duplicate/remove frame, change frame order, change frame delay +- playback controls: play/pause, next/previous frame, first/last frame +- onion skin settings: on/off, # of frames to show + +--- + +mark wonnacott likes EDSCII's spacebar-invoked charset/palette popup, and in kooltool it's effectively multi-tab also offering a tools pane... what if playscii's popup had tabs and that replaced a more conventional left-hand toolbar? + +how to show range of open documents? (save for later, when MDI is needed for game editing) + +--- + +possible features + +tools: +paint +erase +pick/grab +select +cut/copy/paste +shift contents of current layer +flip (top/bottom or left/right) or rotate (0/90/180/270) char +draw line +draw square +draw circle +fill +text + +tool settings: +paint: brush size, filter affect char/fg/bg +erase: filter affect char/fg/bg +pick: filter affect char/fg/bg +cut/copy/paste: affect all layers, filter affect char/fg/bg +draw line: line thickness +draw square: filled/hollow, square/nonsquare aspect +draw ellipse: filled/hollow, circle/ellipse aspect +fill: filter affect char/fg/bg + +navigation: +pan view +zoom view +shift active layer +shift active frame + +toggle grid +toggle onion skin +onion skin settings: # of previous frames, # of next frames, max/min opacity + +char/fg/bg settings: +swap selected fg/bg +previous/next char +previous/next fg color +previous/next bg color + +file/meta/misc: +undo/redo +load/open +save [with current name | with name Z] +new document [of size X by Y] [with name Z] +convert raster image (to current document size/charset/palette) +export current frame to PNG +export all frames to GIF +load charset +load palette +convert to charset (find matches from current to target charset, convert chars) +convert to palette (same as above but for colors) +crop document (to size X by Y) (to current selection) +add frame at index X +duplicate frame at index X +add layer with depth Z +duplicate layer X + +invoke command line +open help/about screen +execute python expression diff --git a/docs/uvs.txt b/docs/uvs.txt new file mode 100644 index 0000000..9417aa2 --- /dev/null +++ b/docs/uvs.txt @@ -0,0 +1,81 @@ + +uv transform worksheet + +a --------------- b +| | +| | +| | +| | +| | +| | +c --------------- d + +normal +0,0 ----------- 1,0 +| | +| | +| | +| | +| | +| | +0,1 ----------- 1,1 + +rotate 90 +0,1 ----------- 0,0 +| | +| | +| | +| | +| | +| | +1,1 ----------- 1,0 + +rotate 180 +1,1 ----------- 0,1 +| | +| | +| | +| | +| | +| | +1,0 ----------- 0,0 + +rotate 270 +1,0 ----------- 1,1 +| | +| | +| | +| | +| | +| | +0,0 ----------- 0,1 + +flip X +1,0 ----------- 0,0 +| | +| | +| | +| | +| | +| | +1,1 ----------- 0,1 + +flip Y +0,1 ----------- 1,1 +| | +| | +| | +| | +| | +| | +0,0 ----------- 1,0 + +flip X & Y +1,1 ----------- 0,1 +| | +| | +| | +| | +| | +| | +1,0 ----------- 0,0 diff --git a/edit_command.py b/edit_command.py new file mode 100644 index 0000000..91fb6ea --- /dev/null +++ b/edit_command.py @@ -0,0 +1,252 @@ +import time + +class EditCommand: + + "undo/redo-able representation of an art edit (eg paint, erase) operation" + + def __init__(self, art): + self.art = art + self.start_time = art.app.get_elapsed_time() + self.finish_time = None + # nested dictionary with frame(layer(column(row))) structure - + # this prevents multiple commands operating on the same tile + # from stomping each other + self.tile_commands = {} + + def get_number_of_commands(self): + commands = 0 + for frame in self.tile_commands.values(): + for layer in frame.values(): + for column in layer.values(): + for tile in column.values(): + commands += 1 + return commands + + def __str__(self): + # get unique-ish ID from memory address + addr = self.__repr__() + addr = addr[addr.find('0'):-1] + s = 'EditCommand_%s: %s tiles, time %s' % (addr, self.get_number_of_commands(), + self.finish_time) + return s + + def add_command_tiles(self, new_command_tiles): + for ct in new_command_tiles: + # create new tables for frames/layers/columns if not present + if not ct.frame in self.tile_commands: + self.tile_commands[ct.frame] = {} + if not ct.layer in self.tile_commands[ct.frame]: + self.tile_commands[ct.frame][ct.layer] = {} + if not ct.y in self.tile_commands[ct.frame][ct.layer]: + self.tile_commands[ct.frame][ct.layer][ct.y] = {} + # preserve "before" state of any command we overwrite + if ct.x in self.tile_commands[ct.frame][ct.layer][ct.y]: + old_ct = self.tile_commands[ct.frame][ct.layer][ct.y][ct.x] + ct.set_before(old_ct.b_char, old_ct.b_fg, old_ct.b_bg, + old_ct.b_xform) + self.tile_commands[ct.frame][ct.layer][ct.y][ct.x] = ct + + def undo_commands_for_tile(self, frame, layer, x, y): + # no commands at all yet, maybe + if len(self.tile_commands) == 0: + return + # tile might not have undo commands, eg text entry beyond start region + if not y in self.tile_commands[frame][layer] or \ + not x in self.tile_commands[frame][layer][y]: + return + self.tile_commands[frame][layer][y][x].undo() + + def undo(self): + for frame in self.tile_commands.values(): + for layer in frame.values(): + for column in layer.values(): + for tile_command in column.values(): + tile_command.undo() + + def apply(self): + for frame in self.tile_commands.values(): + for layer in frame.values(): + for column in layer.values(): + for tile_command in column.values(): + tile_command.apply() + + +class EntireArtCommand: + + """ + undo/redo-able representation of a whole-art operation, eg: + resize/crop, run art script, add/remove layer, etc + """ + + # art arrays to grab + array_types = ['chars', 'fg_colors', 'bg_colors', 'uv_mods'] + + def __init__(self, art, origin_x=0, origin_y=0): + self.art = art + # remember origin of resize command + self.origin_x, self.origin_y = origin_x, origin_y + self.before_frame = art.active_frame + self.before_layer = art.active_layer + self.start_time = self.finish_time = art.app.get_elapsed_time() + + def save_tiles(self, before=True): + # save copies of tile data lists + prefix = 'b' if before else 'a' + for atype in self.array_types: + # save list as eg "b_chars" for "character data before operation" + src_data = getattr(self.art, atype) + var_name = '%s_%s' % (prefix, atype) + # deep copy each frame's data, else before == after + new_data = [] + for frame in src_data: + new_data.append(frame.copy()) + setattr(self, var_name, new_data) + if before: + self.before_size = (self.art.width, self.art.height) + else: + self.after_size = (self.art.width, self.art.height) + + def undo(self): + # undo might remove frames/layers that were added + self.art.set_active_frame(self.before_frame) + self.art.set_active_layer(self.before_layer) + if self.before_size != self.after_size: + x, y = self.before_size + self.art.resize(x, y, self.origin_x, self.origin_y) + for atype in self.array_types: + new_data = getattr(self, 'b_' + atype) + setattr(self.art, atype, new_data[:]) + if self.before_size != self.after_size: + # Art.resize will set geo_changed and mark all frames changed + self.art.app.ui.adjust_for_art_resize(self.art) + self.art.mark_all_frames_changed() + + def apply(self): + if self.before_size != self.after_size: + x, y = self.after_size + self.art.resize(x, y, self.origin_x, self.origin_y) + for atype in self.array_types: + new_data = getattr(self, 'a_' + atype) + setattr(self.art, atype, new_data[:]) + if self.before_size != self.after_size: + self.art.app.ui.adjust_for_art_resize(self.art) + self.art.mark_all_frames_changed() + + +class EditCommandTile: + + def __init__(self, art): + self.art = art + self.creation_time = self.art.app.get_elapsed_time() + # initialize everything + # previously did 'string list of serialized items' + setattr + # which made prettier code but was slower + self.frame = self.layer = self.x = self.y = None + self.b_char = self.b_fg = self.b_bg = self.b_xform = None + self.a_char = self.a_fg = self.a_bg = self.a_xform = None + + def __str__(self): + s = 'F%s L%s %s,%s @ %.2f: ' % (self.frame, self.layer, str(self.x).rjust(2, '0'), str(self.y).rjust(2, '0'), self.creation_time) + s += 'c%s f%s b%s x%s -> ' % (self.b_char, self.b_fg, self.b_bg, self.b_xform) + s += 'c%s f%s b%s x%s' % (self.a_char, self.a_fg, self.a_bg, self.a_xform) + return s + + def __eq__(self, value): + return self.frame == value.frame and self.layer == value.layer and \ + self.x == value.x and self.y == value.y and \ + self.b_char == value.b_char and self.b_fg == value.b_fg and \ + self.b_bg == value.b_bg and self.b_xform == value.b_xform and \ + self.a_char == value.a_char and self.a_fg == value.a_fg and \ + self.a_bg == value.a_bg and self.a_xform == value.a_xform + + def copy(self): + "returns a deep copy of this tile command" + new_ect = EditCommandTile(self.art) + # TODO: old or new timestamp? does it matter? + #new_ect.creation_time = self.art.app.get_elapsed_time() + new_ect.creation_time = self.creation_time + # copy all properties + new_ect.frame, new_ect.layer = self.frame, self.layer + new_ect.x, new_ect.y = self.x, self.y + new_ect.b_char, new_ect.b_xform = self.b_char, self.b_xform + new_ect.b_fg, new_ect.b_bg = self.b_fg, self.b_bg + new_ect.a_char, new_ect.a_xform = self.a_char, self.a_xform + new_ect.a_fg, new_ect.a_bg = self.a_fg, self.a_bg + return new_ect + + def set_tile(self, frame, layer, x, y): + self.frame, self.layer = frame, layer + self.x, self.y = x, y + + def set_before(self, char, fg, bg, xform): + self.b_char, self.b_xform = char, xform + self.b_fg, self.b_bg = fg, bg + + def set_after(self, char, fg, bg, xform): + self.a_char, self.a_xform = char, xform + self.a_fg, self.a_bg = fg, bg + + def is_null(self): + return self.a_char == self.b_char and self.a_fg == self.b_fg and self.a_bg == self.b_bg and self.a_xform == self.b_xform + + def undo(self): + # tile's frame or layer may have been deleted + if self.layer > self.art.layers - 1 or self.frame > self.art.frames - 1: + return + if self.x >= self.art.width or self.y >= self.art.height: + return + tool = self.art.app.ui.selected_tool + set_all = tool.affects_char and tool.affects_fg_color and tool.affects_fg_color and tool.affects_xform + self.art.set_tile_at(self.frame, self.layer, self.x, self.y, + self.b_char, self.b_fg, self.b_bg, self.b_xform, set_all) + + def apply(self): + tool = self.art.app.ui.selected_tool + set_all = tool.affects_char and tool.affects_fg_color and tool.affects_fg_color and tool.affects_xform + self.art.set_tile_at(self.frame, self.layer, self.x, self.y, + self.a_char, self.a_fg, self.a_bg, self.a_xform, set_all) + + +class CommandStack: + + def __init__(self, art): + self.art = art + self.undo_commands, self.redo_commands = [], [] + + def __str__(self): + s = 'stack for %s:\n' % self.art.filename + s += '===\nundo:\n' + for cmd in self.undo_commands: + s += str(cmd) + '\n' + s += '\n===\nredo:\n' + for cmd in self.redo_commands: + s += str(cmd) + '\n' + return s + + def commit_commands(self, new_commands): + self.undo_commands += new_commands[:] + self.clear_redo() + + def undo(self): + if len(self.undo_commands) == 0: + return + command = self.undo_commands.pop() + self.art.app.cursor.undo_preview_edits() + command.undo() + self.redo_commands.append(command) + self.art.app.cursor.update_cursor_preview() + + def redo(self): + if len(self.redo_commands) == 0: + return + command = self.redo_commands.pop() + # un-apply cursor preview before applying redo, else preview edits + # edits will "stick" + self.art.app.cursor.undo_preview_edits() + command.apply() + # add to end of undo stack + self.undo_commands.append(command) + self.art.app.cursor.update_cursor_preview() + + def clear_redo(self): + self.redo_commands = [] diff --git a/formats/in_ans.py b/formats/in_ans.py new file mode 100644 index 0000000..3fb6f8c --- /dev/null +++ b/formats/in_ans.py @@ -0,0 +1,182 @@ + +from art_import import ArtImporter + +DEFAULT_FG, DEFAULT_BG = 7, 0 +WIDTH = 80 +MAX_LINES = 250 + +class ANSImporter(ArtImporter): + format_name = 'ANSI' + format_description = """ +Classic scene format using ANSI standard codes. +Assumes 80 columns, DOS character set and EGA palette. + """ + allowed_file_extensions = ['ans', 'txt'] + + def get_sequence(self, data): + "returns a list of ints from given data ending in a letter" + i = 0 + seq = [] + while not 64 <= data[i] <= 126: + seq.append(data[i]) + i += 1 + seq.append(data[i]) + return seq + + def get_commands_from_sequence(self, seq): + "returns command type & commands (separated by semicolon) from sequence" + cmds = [] + new_cmd = '' + for k in seq[:-1]: + if k != 59: + new_cmd += chr(k) + else: + cmds.append(new_cmd) + new_cmd = '' + # include last command + cmds.append(new_cmd) + return chr(seq[-1]), cmds + + def run_import(self, in_filename, options={}): + self.set_art_charset('dos') + self.set_art_palette('ansi') + # resize to arbitrary height, crop once we know final line count + self.resize(WIDTH, MAX_LINES) + self.art.clear_frame_layer(0, 0, DEFAULT_BG + 1) + data = open(in_filename, 'rb').read() + x, y = 0, 0 + # cursor save/restore codes position + saved_x, saved_y = 0, 0 + # final value of y might be lower than last line touched if + # cursor up/reset codes used; track highest value + max_y = 0 + fg, bg = DEFAULT_FG, DEFAULT_BG + i = 0 + fg_bright, bg_bright = False, False + while i < len(data): + if x >= WIDTH: + x = 0 + y += 1 + if y > max_y: max_y = y + # how much we will advance through bytes for next iteration + increment = 1 + # command sequence + if data[i] == 27 and data[i+1] == 91: + increment += 1 + # grab full length of sequence + seq = self.get_sequence(data[i+2:]) + # split sequence into individual commands + cmd_type, cmds = self.get_commands_from_sequence(seq) + # display control + if cmd_type == 'm': + # empty command = reset + if len(cmds) == 0: + fg, bg = DEFAULT_FG, DEFAULT_BG + fg_bright, bg_bright = False, False + else: + for cmd in cmds: + code = int(cmd) + # reset colors + if code == 0: + fg, bg = DEFAULT_FG, DEFAULT_BG + fg_bright, bg_bright = False, False + # "bright" colors + elif code == 1: + # bump fg color if isn't already bright + if not fg_bright: + fg += 8 + fg_bright = True + elif code == 5: + if not bg_bright: + bg += 8 + bg_bright = True + # swap fg/bg + elif code == 7: + fg, bg = bg, fg + # change fg color + elif 30 <= code <= 37: + fg = code - 30 + if fg_bright: fg += 8 + # change bg color + elif 40 <= code <= 47: + bg = code - 40 + if bg_bright: bg += 8 + #else: print('unhandled display code %s' % code) + # cursor up/down/forward/back + elif cmd_type == 'A': + y -= int(cmds[0]) if cmds[0] else 1 + elif cmd_type == 'B': + y += int(cmds[0]) if cmds[0] else 1 + if y > max_y: max_y = y + elif cmd_type == 'C': + x += int(cmds[0]) if cmds[0] else 1 + elif cmd_type == 'D': + x -= int(cmds[0]) if cmds[0] else 1 + # break + elif ord(cmd_type) == 26: + break + # set line wrap (ignore for now) + elif cmd_type == 'h': + pass + # move cursor to Y,X + elif cmd_type == 'H' or cmd_type == 'f': + if len(cmds) == 0 or len(cmds[0]) == 0: + new_y = 0 + else: + new_y = int(cmds[0]) - 1 + if len(cmds) < 2 or len(cmds[1]) == 0: + new_x = 0 + else: + new_x = int(cmds[1]) - 1 + x, y = new_x, new_y + if y > max_y: max_y = y + # clear line/screen + elif cmd_type == 'J': + cmd = int(cmds[0]) if cmds else 0 + # 0: clear from cursor to end of screen + if cmd == 0: + for xi in range(x, WIDTH): + self.art.set_char_index_at(0, 0, xi, y, 0) + # 1: clear from cursor to beginning of screen + elif cmd == 1: + for xi in range(x): + self.art.set_char_index_at(0, 0, xi, y, 0) + # 2: clear entire screen, move cursor to 0,0 + elif cmd == 2: + x, y = 0, 0 + self.art.clear_frame_layer(0, 0, DEFAULT_BG + 1) + # save cursor position + elif cmd_type == 's': + saved_x, saved_y = x, y + # restore cursor position + elif cmd_type == 'u': + x, y = saved_x, saved_y + #else: print('unhandled escape code %s' % cmd_type) + increment += len(seq) + # CR + LF + elif data[i] == 13 and data[i+1] == 10: + increment += 1 + x = 0 + y += 1 + if y > max_y: max_y = y + # LF + elif data[i] == 10: + x = 0 + y += 1 + if y > max_y: max_y = y + # indent + elif data[i] == 9: + x += 8 + # regular character + else: + char = data[i] + # account for color 0 (transparent) + self.art.set_tile_at(0, 0, x, y, char, fg + 1, bg + 1) + x += 1 + i += increment + # resize to last line touched + self.resize(WIDTH, max_y) + # rare cases where no lines covered + if self.art.height == 0: + return False + return True diff --git a/formats/in_ata.py b/formats/in_ata.py new file mode 100644 index 0000000..a889148 --- /dev/null +++ b/formats/in_ata.py @@ -0,0 +1,67 @@ + +from art_import import ArtImporter + +# import as white on black for ease of edit + export +DEFAULT_FG, DEFAULT_BG =113, 1 +# most ATAs are 40 columns, but some are a couple chars longer and a few are 80! +WIDTH, HEIGHT = 80, 40 + +class ATAImporter(ArtImporter): + format_name = 'ATASCII' + format_description = """ +ATARI 8-bit computer version of ASCII. +Imports with ATASCII character set and Atari palette. + """ + allowed_file_extensions = ['ata'] + + def run_import(self, in_filename, options={}): + self.set_art_charset('atari') + self.set_art_palette('atari') + self.resize(WIDTH, HEIGHT) + self.art.clear_frame_layer(0, 0, DEFAULT_BG) + # iterate over the bytes + data = open(in_filename, 'rb').read() + i = 0 + x, y = 0, 0 + while i < len(data): + fg, bg = DEFAULT_FG, DEFAULT_BG + if x >= WIDTH: + x = 0 + y += 1 + if y >= HEIGHT: + y = HEIGHT - 1 + char = data[i] + # handle control characters + # (most not supported!) + # https://en.wikipedia.org/wiki/ATASCII#Control_characters_2 + # tab + if char == 127: + x += 4 + i += 1 + continue + # backspace + elif char == 126: + x -= 1 + i += 1 + continue + # line break + elif char == 155: + x = 0 + y += 1 + i += 1 + continue + # over 127: inverted set + elif char > 127: + fg, bg = DEFAULT_BG, DEFAULT_FG + # being a little fancy here, redo if it backfires + char -= 128 + # handle mismatch between playscii's version of ATASCII (which + # prefers to have character index 0 empty) and the real ATASCII + if char == 0: + char = 32 + elif char == 32: + char = 0 + self.art.set_tile_at(0, 0, x, y, char, fg, bg) + x += 1 + i += 1 + return True diff --git a/formats/in_bitmap.py b/formats/in_bitmap.py new file mode 100644 index 0000000..0fe480d --- /dev/null +++ b/formats/in_bitmap.py @@ -0,0 +1,195 @@ + +# bitmap image conversion predates the import/export system so it's a bit weird. +# conversion happens over time, so it merely kicks off the process. + +import os +from PIL import Image + +from ui_file_chooser_dialog import ImageFileChooserDialog +from ui_dialog import UIDialog, Field +from ui_art_dialog import ImportOptionsDialog +from image_convert import ImageConverter +from art_import import ArtImporter +from palette import PaletteFromFile +from art import DEFAULT_CHARSET, DEFAULT_PALETTE, DEFAULT_WIDTH, DEFAULT_HEIGHT + +# custom chooser showing image previews, shares parent w/ "palette from image" + +class ConvertImageChooserDialog(ImageFileChooserDialog): + + title = 'Convert image' + confirm_caption = 'Choose' + + def confirm_pressed(self): + filename = self.field_texts[0] + if not os.path.exists(filename) or not os.path.isfile(filename): + return + self.ui.app.last_import_dir = self.current_dir + self.dismiss() + # get dialog box class and invoke it + dialog_class = self.ui.app.importer.options_dialog_class + # tell the dialog which image we chose, store its size + w, h = Image.open(filename).size + options = { + 'filename': filename, + 'image_width': w, + 'image_height': h + } + self.ui.open_dialog(dialog_class, options) + + +# custom dialog box providing convert options + +class ConvertImageOptionsDialog(ImportOptionsDialog): + + title = 'Convert bitmap image options' + field0_label = 'Color palette:' + field1_label = 'Current palette (%s)' + field2_label = 'From source image; # of colors:' + field3_label = ' ' + field5_label = 'Converted art size:' + field6_label = 'Best fit to current size (%s)' + field7_label = '%% of source image: (%s)' + field8_label = ' ' + field10_label = 'Smooth (bicubic) scale source image' + radio_groups = [(1, 2), (6, 7)] + field_width = UIDialog.default_short_field_width + # to get the layout we want, we must specify 0 padding lines and + # add some blank ones :/ + y_spacing = 0 + fields = [ + Field(label=field0_label, type=None, width=0, oneline=True), + Field(label=field1_label, type=bool, width=0, oneline=True), + Field(label=field2_label, type=bool, width=0, oneline=True), + Field(label=field3_label, type=int, width=field_width, oneline=True), + Field(label='', type=None, width=0, oneline=True), + Field(label=field5_label, type=None, width=0, oneline=True), + Field(label=field6_label, type=bool, width=0, oneline=True), + Field(label=field7_label, type=bool, width=0, oneline=True), + Field(label=field8_label, type=float, width=field_width, oneline=True), + Field(label='', type=None, width=0, oneline=True), + Field(label=field10_label, type=bool, width=0, oneline=True), + Field(label='', type=None, width=0, oneline=True) + ] + invalid_color_error = 'Palettes must be between 2 and 256 colors.' + invalid_scale_error = 'Scale must be greater than 0.0' + # redraw dynamic labels + always_redraw_labels = True + + def get_initial_field_text(self, field_number): + if field_number == 1: + return UIDialog.true_field_text + elif field_number == 3: + # # of colors from source image + return '64' + elif field_number == 6: + return UIDialog.true_field_text + elif field_number == 8: + # % of source image size + return '50.0' + elif field_number == 10: + return ' ' + return '' + + def get_field_label(self, field_index): + label = self.fields[field_index].label + # custom label replacements to show palette, possible convert sizes + if field_index == 1: + label %= self.ui.active_art.palette.name if self.ui.active_art else DEFAULT_PALETTE + elif field_index == 6: + # can't assume any art is open, use defaults if needed + w = self.ui.active_art.width if self.ui.active_art else DEFAULT_WIDTH + h = self.ui.active_art.height if self.ui.active_art else DEFAULT_HEIGHT + label %= '%s x %s' % (w, h) + elif field_index == 7: + # scale # might not be valid + valid,_ = self.is_input_valid() + if not valid: + return label % '???' + label %= '%s x %s' % self.get_tile_scale() + return label + + def get_tile_scale(self): + "returns scale in tiles of image dimensions" + # filename won't be set just after dialog is created + if not hasattr(self, 'filename'): + return 0, 0 + scale = float(self.field_texts[8]) / 100 + # can't assume any art is open, use defaults if needed + if self.ui.active_art: + cw = self.ui.active_art.charset.char_width + ch = self.ui.active_art.charset.char_height + else: + charset = self.ui.app.load_charset(DEFAULT_CHARSET) + cw, ch = charset.char_width, charset.char_height + width = self.image_width / cw + height = self.image_height / ch + width *= scale + height *= scale + return int(width), int(height) + + def is_input_valid(self): + # colors: int between 2 and 256 + try: int(self.field_texts[3]) + except: return False, self.invalid_color_error + colors = int(self.field_texts[3]) + if colors < 2 or colors > 256: + return False, self.invalid_color_error + # % scale: >0 float + try: float(self.field_texts[8]) + except: return False, self.invalid_scale_error + if float(self.field_texts[8]) <= 0: + return False, self.invalid_scale_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + self.dismiss() + # compile options for importer + options = {} + # create new palette from image? + if self.field_texts[1].strip(): + options['palette'] = self.ui.active_art.palette.name if self.ui.active_art else DEFAULT_PALETTE + else: + # create new palette + palette_filename = os.path.basename(self.filename) + colors = int(self.field_texts[3]) + new_pal = PaletteFromFile(self.ui.app, self.filename, + palette_filename, colors) + # palette now loaded and saved to disk + options['palette'] = new_pal.name + # rescale art? + if self.field_texts[6].strip(): + options['art_width'] = self.ui.active_art.width if self.ui.active_art else DEFAULT_WIDTH + options['art_height'] = self.ui.active_art.height if self.ui.active_art else DEFAULT_HEIGHT + else: + # art dimensions = scale% of image dimensions, in tiles + options['art_width'], options['art_height'] = self.get_tile_scale() + options['bicubic_scale'] = bool(self.field_texts[10].strip()) + ImportOptionsDialog.do_import(self.ui.app, self.filename, options) + + +class BitmapImageImporter(ArtImporter): + format_name = 'Bitmap image' + format_description = """ +Bitmap image in PNG, JPEG, or BMP format. + """ + file_chooser_dialog_class = ConvertImageChooserDialog + options_dialog_class = ConvertImageOptionsDialog + completes_instantly = False + + def run_import(self, in_filename, options={}): + # modify self.app.ui.active_art based on options + palette = self.app.load_palette(options['palette']) + self.art.set_palette(palette) + width, height = options['art_width'], options['art_height'] + self.art.resize(width, height) # Importer.init will adjust UI + bicubic_scale = options['bicubic_scale'] + # let ImageConverter do the actual heavy lifting + ic = ImageConverter(self.app, in_filename, self.art, bicubic_scale) + # early failures: file no longer exists, PIL fails to load and convert image + if not ic.init_success: + return False + self.app.update_window_title() + return True diff --git a/formats/in_bitmap_2color.py b/formats/in_bitmap_2color.py new file mode 100644 index 0000000..8e80a85 --- /dev/null +++ b/formats/in_bitmap_2color.py @@ -0,0 +1,86 @@ + +import numpy as np + +from image_convert import ImageConverter +from ui_dialog import UIDialog, Field, SkipFieldType +from formats.in_bitmap import BitmapImageImporter, ConvertImageChooserDialog, ConvertImageOptionsDialog + + +class TwoColorConvertImageOptionsDialog(ConvertImageOptionsDialog): + # simplified version of parent options dialog, reusing as much as possible + title = 'Convert 2-color bitmap image options' + field5_label = ConvertImageOptionsDialog.field5_label + field6_label = ConvertImageOptionsDialog.field6_label + field7_label = ConvertImageOptionsDialog.field7_label + field8_label = ConvertImageOptionsDialog.field8_label + field10_label = ConvertImageOptionsDialog.field10_label + field_width = ConvertImageOptionsDialog.field_width + fields = [ + Field(label='', type=SkipFieldType, width=0, oneline=True), + Field(label='', type=SkipFieldType, width=0, oneline=True), + Field(label='', type=SkipFieldType, width=0, oneline=True), + Field(label='', type=SkipFieldType, width=0, oneline=True), + Field(label='', type=SkipFieldType, width=0, oneline=True), + Field(label=field5_label, type=None, width=0, oneline=True), + Field(label=field6_label, type=bool, width=0, oneline=True), + Field(label=field7_label, type=bool, width=0, oneline=True), + Field(label=field8_label, type=float, width=field_width, oneline=True), + Field(label='', type=None, width=0, oneline=True), + Field(label=field10_label, type=bool, width=0, oneline=True), + Field(label='', type=None, width=0, oneline=True) + ] + + def __init__(self, ui, options): + ConvertImageOptionsDialog.__init__(self, ui, options) + self.active_field = 6 + + def get_initial_field_text(self, field_number): + # alternate defaults - use 1:1 scaling + if field_number == 6: + return ' ' + elif field_number == 7: + return UIDialog.true_field_text + elif field_number == 8: + # % of source image size - alternate default + return '100.0' + else: + return ConvertImageOptionsDialog.get_initial_field_text(self, field_number) + + +class TwoColorImageConverter(ImageConverter): + + def get_color_combos_for_block(self, src_block): + colors, counts = np.unique(src_block, False, False, return_counts=True) + if len(colors) > 0: + return (1, 2), [(2, 1)] + # handle blocks with 0 unique colors, ie clear tiles out of image bounds + # (just return white background) + else: + return [2], [] + + +class TwoColorBitmapImageImporter(BitmapImageImporter): + format_name = '2-color bitmap image' + format_description = """ +Variation on bitmap image conversion that forces +a black and white (1-bit) palette, and doesn't use +fg/bg color swaps. Suitable for plaintext export. + """ + file_chooser_dialog_class = ConvertImageChooserDialog + options_dialog_class = TwoColorConvertImageOptionsDialog + completes_instantly = False + + def run_import(self, in_filename, options={}): + # force palette to 1-bit black and white + palette = self.app.load_palette('bw') + self.art.set_palette(palette) + + width, height = options['art_width'], options['art_height'] + self.art.resize(width, height) # Importer.init will adjust UI + bicubic_scale = options['bicubic_scale'] + ic = TwoColorImageConverter(self.app, in_filename, self.art, bicubic_scale) + # early failures: file no longer exists, PIL fails to load and convert image + if not ic.init_success: + return False + self.app.update_window_title() + return True diff --git a/formats/in_bitmap_sequence.py b/formats/in_bitmap_sequence.py new file mode 100644 index 0000000..384cd35 --- /dev/null +++ b/formats/in_bitmap_sequence.py @@ -0,0 +1,116 @@ + +# "convert folder of images to animation" +# heavy lifting still done by ImageConverter, this mainly coordinates +# conversion of multiple frames + +import os, time + +import image_convert +import formats.in_bitmap as bm + +class ImageSequenceConverter: + + def __init__(self, app, image_filenames, art, bicubic_scale): + self.init_success = False + self.app = app + self.start_time = time.time() + self.image_filenames = image_filenames + # App.update_window_title uses image_filename for titlebar + self.image_filename = '' + # common name of sequence + self.image_name = os.path.splitext(self.image_filename)[0] + self.art = art + self.bicubic_scale = bicubic_scale + # queue up first frame + self.next_image(first=True) + self.init_success = True + + def next_image(self, first=False): + # pop last image off stack + if not first: + self.image_filenames.pop(0) + # done? + if len(self.image_filenames) == 0: + self.finish() + return + # next frame + self.art.set_active_frame(self.art.active_frame + 1) + try: + self.current_frame_converter = image_convert.ImageConverter(self.app, + self.image_filenames[0], + self.art, + self.bicubic_scale, self) + except: + self.fail() + return + if not self.current_frame_converter.init_success: + self.fail() + return + self.image_filename = self.image_filenames[0] + self.preview_sprite = self.current_frame_converter.preview_sprite + self.app.update_window_title() + + def fail(self): + self.app.log('Bad frame %s' % self.image_filenames[0], error=True) + self.finish(True) + + def update(self): + # create converter for new frame if current one is done, + # else update current one + if self.current_frame_converter.finished: + self.next_image() + else: + self.current_frame_converter.update() + + def finish(self, cancelled=False): + time_taken = time.time() - self.start_time + (verb, error) = ('cancelled', True) if cancelled else ('finished', False) + self.app.log('Conversion of image sequence %s %s after %.3f seconds' % (self.image_name, verb, time_taken), error) + self.app.converter = None + self.app.update_window_title() + + +class ConvertImageSequenceChooserDialog(bm.ConvertImageChooserDialog): + title = 'Convert folder' + confirm_caption = 'Choose First Image' + + +class BitmapImageSequenceImporter(bm.BitmapImageImporter): + format_name = 'Bitmap image folder' + format_description = """ +Converts a folder of Bitmap images (PNG, JPEG, or BMP) +into an animation. Dimensions will be based on first +image chosen. + """ + file_chooser_dialog_class = ConvertImageSequenceChooserDialog + #options_dialog_class = bm.ConvertImageOptionsDialog + + def run_import(self, in_filename, options={}): + palette = self.app.load_palette(options['palette']) + self.art.set_palette(palette) + width, height = options['art_width'], options['art_height'] + self.art.resize(width, height) # Importer.init will adjust UI + bicubic_scale = options['bicubic_scale'] + # get dir listing with full pathname + in_dir = os.path.dirname(in_filename) + in_files = ['%s/%s' % (in_dir, f) for f in os.listdir(in_dir)] + in_files.sort() + # assume numeric sequence starts from chosen file + in_files = in_files[in_files.index(in_filename):] + # remove files from end of list if they don't end in a number + while not os.path.splitext(in_files[-1])[0][-1].isdecimal() and \ + len(in_files) > 0: + in_files.pop() + # add frames to art as needed + while self.art.frames < len(in_files): + self.art.add_frame_to_end(log=False) + self.art.set_active_frame(0) + # create converter + isc = ImageSequenceConverter(self.app, in_files, self.art, + bicubic_scale) + # bail on early failure + if not isc.init_success: + return False + self.app.converter = isc + self.app.update_window_title() + return True diff --git a/formats/in_edscii.py b/formats/in_edscii.py new file mode 100644 index 0000000..a90e92e --- /dev/null +++ b/formats/in_edscii.py @@ -0,0 +1,92 @@ + +from art_import import ArtImporter +from ui_dialog import UIDialog, Field +from ui_art_dialog import ImportOptionsDialog + + +class EDSCIIImportOptionsDialog(ImportOptionsDialog): + title = 'Import EDSCII (legacy format) art' + field0_label = 'Width override (leave 0 to guess):' + field_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=int, width=field_width, oneline=False) + ] + invalid_width_error = 'Invalid width override.' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return '0' + return '' + + def is_input_valid(self): + # valid widths: any >=0 int + try: int(self.field_texts[0]) + except: return False, self.invalid_width_error + if int(self.field_texts[0]) < 0: + return False, self.invalid_width_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + width = int(self.field_texts[0]) + width = width if width > 0 else None + options = {'width_override':width} + self.dismiss() + # self.filename is set in our importer's file_chooser_dialog_class + ImportOptionsDialog.do_import(self.ui.app, self.filename, options) + + +class EDSCIIImporter(ArtImporter): + + format_name = 'EDSCII' + format_description = """ +Binary format for EDSCII, Playscii's predecessor. +Assumes single frame, single layer document. +Current character set and palette will be used. + """ + options_dialog_class = EDSCIIImportOptionsDialog + + def run_import(self, in_filename, options={}): + data = open(in_filename, 'rb').read() + # document width = find longest stretch before a \n + longest_line = 0 + for line in data.splitlines(): + if len(line) > longest_line: + longest_line = len(line) + # user can override assumed document width, needed for a few files + width = options.get('width_override', None) or int(longest_line / 3) + # derive height from width + # 2-byte line breaks might produce non-int result, cast erases this + height = int(len(data) / width / 3) + self.art.resize(width, height) + # populate char/color arrays by scanning width-long chunks of file + def chunks(l, n): + for i in range(0, len(l), n): + yield l[i:i+n] + # 3 bytes per tile, +1 for line ending + # BUT: files saved in windows may have 2 byte line breaks, try to detect + lb_length = 1 + lines = chunks(data, (width * 3) + lb_length) + for line in lines: + if line[-2] == ord('\r') and line[-1] == ord('\n'): + #self.app.log('EDSCIIImporter: windows-style line breaks detected') + lb_length = 2 + break + # recreate generator after first use + lines = chunks(data, (width * 3) + lb_length) + x, y = 0, 0 + for line in lines: + index = 0 + while index < len(line) - lb_length: + char = line[index] + # +1 to color indices; playscii color index 0 = transparent + fg = line[index+1] + 1 + bg = line[index+2] + 1 + self.art.set_tile_at(0, 0, x, y, char, fg, bg) + index += 3 + x += 1 + if x >= width: + x = 0 + y += 1 + return True diff --git a/formats/in_endoom.py b/formats/in_endoom.py new file mode 100644 index 0000000..10bda82 --- /dev/null +++ b/formats/in_endoom.py @@ -0,0 +1,42 @@ + +from art_import import ArtImporter + +class EndDoomImporter(ArtImporter): + format_name = 'ENDOOM' + format_description = """ +ENDOOM lump file format for Doom engine games. +80x25 DOS ASCII with EGA palette. +Background colors can only be EGA colors 0-8. + """ + + def run_import(self, in_filename, options={}): + """ + from http://doomwiki.org/wiki/ENDOOM: + 80x25 tiles, dos charset, ega palette + each tile is 2 bytes: + first byte = ASCII (code page 437) char index + second byte = color: + bits 0-3 = fg color, bits 4-6 = bg color, bit 7 = blink + """ + self.set_art_charset('dos') + self.set_art_palette('ega') + self.art.resize(80, 25) + data = open(in_filename, 'rb').read(4000) + x, y = 0, 0 + for i,byte in enumerate(data): + if i % 2 != 0: + continue + color_byte = data[i+1] + bits = bin(color_byte)[2:] + bits = bits.rjust(7, '0') + bg_bits = bits[:3] + fg_bits = bits[3:] + offset = 1 + fg = int(fg_bits, 2) + offset + bg = int(bg_bits, 2) + offset + self.art.set_tile_at(0, 0, x, y, byte, fg, bg) + x += 1 + if x >= self.art.width: + x = 0 + y += 1 + return True diff --git a/formats/in_txt.py b/formats/in_txt.py new file mode 100644 index 0000000..ac7259d --- /dev/null +++ b/formats/in_txt.py @@ -0,0 +1,32 @@ + +from art_import import ArtImporter + +class TextImporter(ArtImporter): + + format_name = 'Plain text' + format_description = """ +ASCII art in ordinary text format. +Assumes single frame, single layer document. +Current character set and palette will be used. + """ + + def run_import(self, in_filename, options={}): + lines = open(in_filename).readlines() + # determine length of longest line + longest = 0 + for line in lines: + if len(line) > longest: + longest = len(line) + if len(lines) == 0 or longest == 0: + return False + self.art.resize(longest, len(lines)) + x, y = 0, 0 + for line in lines: + for char in line: + char_index = self.art.charset.char_mapping.get(char, None) + if char_index: + self.art.set_char_index_at(0, 0, x, y, char_index) + x += 1 + x = 0 + y += 1 + return True diff --git a/formats/out_ans.py b/formats/out_ans.py new file mode 100644 index 0000000..0012505 --- /dev/null +++ b/formats/out_ans.py @@ -0,0 +1,62 @@ + +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 diff --git a/formats/out_ata.py b/formats/out_ata.py new file mode 100644 index 0000000..85f77fc --- /dev/null +++ b/formats/out_ata.py @@ -0,0 +1,35 @@ + +from art_export import ArtExporter +from art import TileIter + +class ANSExporter(ArtExporter): + format_name = 'ATASCII' + format_description = """ +ATARI 8-bit computer version of ASCII. +Assumes ATASCII character set and Atari palette. +Any tile with non-black background will be considered inverted. + """ + file_extension = 'ata' + + def run_export(self, out_filename, options): + # binary file; encoding into ANSI bytes happens just before write + self.outfile = open(out_filename, 'wb') + for frame, layer, x, y in TileIter(self.art): + # only read from layer 0 of frame 0 + if layer > 0 or frame > 0: + continue + ch, fg, bg, _ = self.art.get_tile_at(frame, layer, x, y) + # swap char indices 0 (heart) and 32 (blank space) + if ch == 0: + ch = 32 + elif ch == 32: + ch = 0 + # non-black (color 1) background = use inverted set + if bg > 1: + ch += 128 + self.outfile.write(bytes([ch])) + # line break + if x == self.art.width - 1: + self.outfile.write(bytes([155])) + self.outfile.close() + return True diff --git a/formats/out_endoom.py b/formats/out_endoom.py new file mode 100644 index 0000000..7f2c9b6 --- /dev/null +++ b/formats/out_endoom.py @@ -0,0 +1,38 @@ + +from art_export import ArtExporter + +WIDTH, HEIGHT = 80, 25 + +class EndDoomExporter(ArtExporter): + format_name = 'ENDOOM' + format_description = """ +ENDOOM lump file format for Doom engine games. +80x25 DOS ASCII with EGA palette. +Background colors can only be EGA colors 0-8. + """ + def run_export(self, out_filename, options): + if self.art.width < WIDTH or self.art.height < HEIGHT: + self.app.log("ENDOOM export: Art isn't big enough!") + return False + outfile = open(out_filename, 'wb') + for y in range(HEIGHT): + for x in range(WIDTH): + char, fg, bg, xform = self.art.get_tile_at(0, 0, x, y) + # decrement color for EGA, index 0 is transparent in playscii + fg -= 1 + bg -= 1 + # colors can't be negative + fg = max(0, fg) + bg = max(0, bg) + char_byte = bytes([char]) + outfile.write(char_byte) + fg_bits = bin(fg)[2:].rjust(4, '0') + # BG color can't be above 8 + bg %= 8 + bg_bits = bin(bg)[2:].rjust(3, '0') + color_bits = '0' + bg_bits + fg_bits + color_byte = int(color_bits, 2) + color_byte = bytes([color_byte]) + outfile.write(color_byte) + outfile.close() + return True diff --git a/formats/out_gif.py b/formats/out_gif.py new file mode 100644 index 0000000..0d53f35 --- /dev/null +++ b/formats/out_gif.py @@ -0,0 +1,15 @@ + +from art_export import ArtExporter +from image_export import export_animation + +class GIFExporter(ArtExporter): + format_name = 'Animated GIF image' + format_description = """ +Animated GIF of all frames in current document, with +transparency and proper frame timings. + """ + file_extension = 'gif' + def run_export(self, out_filename, options): + # heavy lifting done by image_export module + export_animation(self.app, self.app.ui.active_art, out_filename) + return True diff --git a/formats/out_png.py b/formats/out_png.py new file mode 100644 index 0000000..1dcf0a7 --- /dev/null +++ b/formats/out_png.py @@ -0,0 +1,81 @@ + +from art_export import ArtExporter +from image_export import export_still_image +from ui_dialog import UIDialog, Field +from ui_art_dialog import ExportOptionsDialog + +DEFAULT_SCALE = 4 +DEFAULT_CRT = True + +class PNGExportOptionsDialog(ExportOptionsDialog): + title = 'PNG image export options' + field0_label = 'Scale factor (%s pixels)' + field1_label = 'CRT filter' + fields = [ + Field(label=field0_label, type=int, width=6, oneline=False), + Field(label=field1_label, type=bool, width=0, oneline=True) + ] + # redraw dynamic labels + always_redraw_labels = True + invalid_scale_error = 'Scale must be greater than 0' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return str(DEFAULT_SCALE) + elif field_number == 1: + return [' ', UIDialog.true_field_text][DEFAULT_CRT] + + def get_field_label(self, field_index): + label = self.fields[field_index].label + if field_index == 0: + valid,_ = self.is_input_valid() + if not valid: + label %= '???' + else: + # calculate exported image size + art = self.ui.active_art + scale = int(self.field_texts[0]) + width = art.charset.char_width * art.width * scale + height = art.charset.char_height * art.height * scale + label %= '%s x %s' % (width, height) + return label + + def is_input_valid(self): + # scale factor: >0 int + try: int(self.field_texts[0]) + except: return False, self.invalid_scale_error + if int(self.field_texts[0]) <= 0: + return False, self.invalid_scale_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + self.dismiss() + # compile options for exporter + options = { + 'scale': int(self.field_texts[0]), + 'crt': bool(self.field_texts[1].strip()) + } + ExportOptionsDialog.do_export(self.ui.app, self.filename, options) + + +class PNGExporter(ArtExporter): + format_name = 'PNG image' + format_description = """ +PNG format (lossless compression) still image of current frame. +Can be exported with or without CRT filter effect. +If palette has only one transparent (alpha <1.0) color, +exported image will be 8-bit with same palette as this Art. +Otherwise it will be 32-bit with alpha transparency. +If CRT filter is enabled, image will always be 32-bit. + """ + file_extension = 'png' + options_dialog_class = PNGExportOptionsDialog + + def run_export(self, out_filename, options): + # heavy lifting done by image_export module + return export_still_image(self.app, self.app.ui.active_art, + out_filename, + crt=options.get('crt', DEFAULT_CRT), + scale=options.get('scale', DEFAULT_SCALE)) diff --git a/formats/out_png_set.py b/formats/out_png_set.py new file mode 100644 index 0000000..2ef426c --- /dev/null +++ b/formats/out_png_set.py @@ -0,0 +1,170 @@ + +import os + +from art_export import ArtExporter +from image_export import export_still_image +from ui_dialog import UIDialog, Field +from ui_art_dialog import ExportOptionsDialog +from renderable import LAYER_VIS_FULL, LAYER_VIS_NONE + +FILE_EXTENSION = 'png' + +DEFAULT_SCALE = 1 +DEFAULT_CRT = False + +def get_full_filename(in_filename, frame, layer_name, + use_frame, use_layer, + forbidden_chars): + "Returns properly mutated filename for given frame/layer data" + # strip out path and extension from filename as we mutate it + dirname = os.path.dirname(in_filename) + base_filename = os.path.basename(in_filename) + base_filename = os.path.splitext(base_filename)[0] + fn = base_filename + if use_frame: + fn += '_%s' % (str(frame).rjust(4, '0')) + if use_layer: + fn += '_%s' % layer_name + # strip unfriendly chars from output filename + for forbidden_char in ['\\', '/', '*', ':']: + fn = fn.replace(forbidden_char, '') + # add path and extension for final mutated filename + return '%s/%s.%s' % (dirname, fn, FILE_EXTENSION) + +class PNGSetExportOptionsDialog(ExportOptionsDialog): + title = 'PNG set export options' + tile_width = 60 # extra width for filename preview + field0_label = 'Scale factor (%s pixels)' + field1_label = 'CRT filter' + field2_label = 'Export frames' + field3_label = 'Export layers' + field4_label = 'First filename (in set of %s):' + field5_label = ' %s' + fields = [ + Field(label=field0_label, type=int, width=6, oneline=False), + Field(label=field1_label, type=bool, width=0, oneline=True), + Field(label=field2_label, type=bool, width=0, oneline=True), + Field(label=field3_label, type=bool, width=0, oneline=True), + Field(label=field4_label, type=None, width=0, oneline=True), + Field(label=field5_label, type=None, width=0, oneline=True) + ] + # redraw dynamic labels + always_redraw_labels = True + invalid_scale_error = 'Scale must be greater than 0' + + def get_initial_field_text(self, field_number): + art = self.ui.active_art + if field_number == 0: + return str(DEFAULT_SCALE) + elif field_number == 1: + return [' ', UIDialog.true_field_text][DEFAULT_CRT] + elif field_number == 2: + # default false if only one frame + return [' ', UIDialog.true_field_text][art.frames > 1] + elif field_number == 3: + # default false if only one layer + return [' ', UIDialog.true_field_text][art.layers > 1] + + def get_field_label(self, field_index): + label = self.fields[field_index].label + if field_index == 0: + valid,_ = self.is_input_valid() + if not valid: + label %= '???' + else: + # calculate exported image size + art = self.ui.active_art + scale = int(self.field_texts[0]) + width = art.charset.char_width * art.width * scale + height = art.charset.char_height * art.height * scale + label %= '%s x %s' % (width, height) + # show how many images exported set will be + elif field_index == 4: + export_frames = bool(self.field_texts[2].strip()) + export_layers = bool(self.field_texts[3].strip()) + art = self.ui.active_art + if export_frames and export_layers: + label %= str(art.frames * art.layers) + elif export_frames: + label %= str(art.frames) + elif export_layers: + label %= str(art.layers) + else: + label %= '1' + # preview frame + layer filename mutations based on current settings + elif field_index == 5: + export_frames = bool(self.field_texts[2].strip()) + export_layers = bool(self.field_texts[3].strip()) + art = self.ui.active_art + fn = get_full_filename(self.filename, 0, art.layer_names[0], + export_frames, export_layers, + self.ui.app.forbidden_filename_chars) + fn = os.path.basename(fn) + label %= fn + return label + + def is_input_valid(self): + # scale factor: >0 int + try: int(self.field_texts[0]) + except: return False, self.invalid_scale_error + if int(self.field_texts[0]) <= 0: + return False, self.invalid_scale_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + self.dismiss() + # compile options for importer + options = { + 'scale': int(self.field_texts[0]), + 'crt': bool(self.field_texts[1].strip()), + 'frames': bool(self.field_texts[2].strip()), + 'layers': bool(self.field_texts[3].strip()) + } + ExportOptionsDialog.do_export(self.ui.app, self.filename, options) + + +class PNGSetExporter(ArtExporter): + format_name = 'PNG image set' + format_description = """ +PNG image set for each frame and/or layer. + """ + file_extension = FILE_EXTENSION + options_dialog_class = PNGSetExportOptionsDialog + + def run_export(self, out_filename, options): + export_frames = options['frames'] + export_layers = options['layers'] + art = self.app.ui.active_art + # remember user's active frame/layer/viz settings so we + # can set em back when done + start_frame = art.active_frame + start_layer = art.active_layer + start_onion = self.app.onion_frames_visible + start_layer_viz = self.app.inactive_layer_visibility + self.app.onion_frames_visible = False + # if multi-player, only show active layer + self.app.inactive_layer_visibility = LAYER_VIS_NONE if export_layers else LAYER_VIS_FULL + success = True + for frame in range(art.frames): + # if exporting layers but not frames, only export active frame + if not export_frames and frame != art.active_frame: + continue + art.set_active_frame(frame) + for layer in range(art.layers): + art.set_active_layer(layer) + full_filename = get_full_filename(out_filename, frame, + art.layer_names[layer], + export_frames, export_layers, + self.app.forbidden_filename_chars) + if not export_still_image(self.app, art, full_filename, + crt=options.get('crt', DEFAULT_CRT), + scale=options.get('scale', DEFAULT_SCALE)): + success = False + # put everything back how user left it + art.set_active_frame(start_frame) + art.set_active_layer(start_layer) + self.app.onion_frames_visible = start_onion + self.app.inactive_layer_visibility = start_layer_viz + return success diff --git a/formats/out_txt.py b/formats/out_txt.py new file mode 100644 index 0000000..0954e5c --- /dev/null +++ b/formats/out_txt.py @@ -0,0 +1,29 @@ +from art_export import ArtExporter + +class TextExporter(ArtExporter): + format_name = 'Plain text' + format_description = """ +ASCII art in ordinary text format. +Assumes single frame, single layer document. +Current character set will be used; make sure it supports +any extended characters you want translated. + """ + file_extension = 'txt' + def run_export(self, out_filename, options): + # utf-8 is safest encoding to use here, but non-default on Windows + outfile = open(out_filename, 'w', encoding='utf-8') + for y in range(self.art.height): + for x in range(self.art.width): + char = self.art.get_char_index_at(0, 0, x, y) + found_char = False + for k,v in self.art.charset.char_mapping.items(): + if v == char: + found_char = True + outfile.write(k) + break + # if char not found, just write a blank space + if not found_char: + outfile.write(' ') + outfile.write('\n') + outfile.close() + return True diff --git a/framebuffer.py b/framebuffer.py new file mode 100644 index 0000000..08cb664 --- /dev/null +++ b/framebuffer.py @@ -0,0 +1,122 @@ +import numpy as np +from OpenGL import GL + + +class Framebuffer: + + start_crt_enabled = False + disable_crt = False + clear_color = (0, 0, 0, 1) + # declared as an option here in case people want to sub their own via CFG + crt_fragment_shader_filename = 'framebuffer_f_crt.glsl' + + def __init__(self, app, width=None, height=None): + self.app = app + self.width, self.height = width or self.app.window_width, height or self.app.window_height + # bind vao before compiling shaders + if self.app.use_vao: + self.vao = GL.glGenVertexArrays(1) + GL.glBindVertexArray(self.vao) + self.vbo = GL.glGenBuffers(1) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vbo) + fb_verts = np.array([-1, -1, 1, -1, -1, 1, 1, 1], dtype=np.float32) + GL.glBufferData(GL.GL_ARRAY_BUFFER, fb_verts.nbytes, fb_verts, + GL.GL_STATIC_DRAW) + # texture, depth buffer, framebuffer + self.texture = GL.glGenTextures(1) + self.depth_buffer = GL.glGenRenderbuffers(1) + self.framebuffer = GL.glGenFramebuffers(1) + self.setup_texture_and_buffers() + # shaders + self.plain_shader = self.app.sl.new_shader('framebuffer_v.glsl', 'framebuffer_f.glsl') + if not self.disable_crt: + self.crt_shader = self.app.sl.new_shader('framebuffer_v.glsl', self.crt_fragment_shader_filename) + self.crt = self.get_crt_enabled() + # shader uniforms and attributes + self.plain_tex_uniform = self.plain_shader.get_uniform_location('fbo_texture') + self.plain_attrib = self.plain_shader.get_attrib_location('v_coord') + GL.glEnableVertexAttribArray(self.plain_attrib) + GL.glVertexAttribPointer(self.plain_attrib, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None) + if not self.disable_crt: + self.crt_tex_uniform = self.crt_shader.get_uniform_location('fbo_texture') + self.crt_time_uniform = self.crt_shader.get_uniform_location('elapsed_time') + self.crt_res_uniform = self.crt_shader.get_uniform_location('resolution') + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) + if self.app.use_vao: + GL.glBindVertexArray(0) + + def get_crt_enabled(self): + return self.disable_crt or self.start_crt_enabled + + def setup_texture_and_buffers(self): + GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture) + GL.glTexParameterf(GL.GL_TEXTURE_2D, + GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR) + GL.glTexParameterf(GL.GL_TEXTURE_2D, + GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR) + GL.glTexParameterf(GL.GL_TEXTURE_2D, + GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE) + GL.glTexParameterf(GL.GL_TEXTURE_2D, + GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE) + GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, + self.width, self.height, 0, + GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None) + GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self.depth_buffer) + GL.glRenderbufferStorage(GL.GL_RENDERBUFFER, GL.GL_DEPTH_COMPONENT16, + self.width, self.height) + GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0) + GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.framebuffer) + GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, + GL.GL_TEXTURE_2D, self.texture, 0) + GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_ATTACHMENT, + GL.GL_RENDERBUFFER, self.depth_buffer) + GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0) + + def resize(self, new_width, new_height): + self.width, self.height = new_width, new_height + self.setup_texture_and_buffers() + + def toggle_crt(self): + self.crt = not self.crt + + def destroy(self): + if self.app.use_vao: + GL.glDeleteVertexArrays(1, [self.vao]) + GL.glDeleteBuffers(1, [self.vbo]) + GL.glDeleteRenderbuffers(1, [self.depth_buffer]) + GL.glDeleteTextures([self.texture]) + GL.glDeleteFramebuffers(1, [self.framebuffer]) + + def render(self): + if self.crt and not self.disable_crt: + GL.glUseProgram(self.crt_shader.program) + GL.glUniform1i(self.crt_tex_uniform, 0) + GL.glUniform2f(self.crt_res_uniform, self.width, self.height) + GL.glUniform1f(self.crt_time_uniform, self.app.get_elapsed_time()) + else: + GL.glUseProgram(self.plain_shader.program) + GL.glUniform1i(self.plain_tex_uniform, 0) + GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture) + GL.glClearColor(*self.clear_color) + GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) + # VAO vs non-VAO paths + if self.app.use_vao: + GL.glBindVertexArray(self.vao) + else: + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vbo) + GL.glVertexAttribPointer(self.plain_attrib, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None) + GL.glEnableVertexAttribArray(self.plain_attrib) + GL.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, 4) + if self.app.use_vao: + GL.glBindVertexArray(0) + GL.glUseProgram(0) + + +class ExportFramebuffer(Framebuffer): + clear_color = (0, 0, 0, 0) + def get_crt_enabled(self): return True + + +class ExportFramebufferNoCRT(Framebuffer): + clear_color = (0, 0, 0, 0) + def get_crt_enabled(self): return False diff --git a/game_hud.py b/game_hud.py new file mode 100644 index 0000000..c39f266 --- /dev/null +++ b/game_hud.py @@ -0,0 +1,45 @@ + +from art import Art +from renderable import TileRenderable + + +class GameHUDArt(Art): + #recalc_quad_height = False + log_creation = False + quad_width = 0.1 + + +class GameHUDRenderable(TileRenderable): + def get_projection_matrix(self): + # much like UIRenderable, use UI's matrices to render in screen space + return self.app.ui.view_matrix + def get_view_matrix(self): + return self.app.ui.view_matrix + + +class GameHUD: + + "stub HUD, subclass and put your own stuff here" + + def __init__(self, world): + self.world = world + self.arts, self.renderables = [], [] + + def update(self): + for art in self.arts: + art.update() + for r in self.renderables: + r.update() + + def should_render(self): + return True + + def render(self): + if not self.should_render(): + return + for r in self.renderables: + r.render() + + def destroy(self): + for r in self.renderables: + r.destroy() diff --git a/game_object.py b/game_object.py new file mode 100644 index 0000000..6e16ea1 --- /dev/null +++ b/game_object.py @@ -0,0 +1,1209 @@ +import os, math, random + +from collections import namedtuple + +import vector + +from art import Art, ArtInstance +from renderable import GameObjectRenderable +from renderable_line import OriginIndicatorRenderable, BoundsIndicatorRenderable + +from collision import Contact, Collideable, CST_NONE, CST_CIRCLE, CST_AABB, CST_TILE, CT_NONE, CTG_STATIC, CTG_DYNAMIC, point_in_box + +# facings +GOF_LEFT = 0 +"Object is facing left" +GOF_RIGHT = 1 +"Object is facing right" +GOF_FRONT = 2 +"Object is facing front" +GOF_BACK = 3 +"Object is facing back" + +FACINGS = { + GOF_LEFT: 'left', + GOF_RIGHT: 'right', + GOF_FRONT: 'front', + GOF_BACK: 'back' +} +"Dict mapping GOF_* facing enum values to strings" + +FACING_DIRS = { + GOF_LEFT: (-1, 0), + GOF_RIGHT: (1, 0), + GOF_FRONT: (0, -1), + GOF_BACK: (0, 1) +} +"Dict mapping GOF_* facing enum values to (x,y) orientations" + +DEFAULT_STATE = 'stand' + +# timer slots +TIMER_PRE_UPDATE = 0 +TIMER_UPDATE = 1 +TIMER_POST_UPDATE = 2 + +__pdoc__ = {} +__pdoc__['GameObject.x'] = "Object's location in 3D space." + + +class GameObject: + """ + Base class game object. GameObjects (GOs) are spawned into and managed by + a GameWorld. All GOs render and collide via a single Renderable and + Collideable, respectively. GOs can have states and facings. GOs are + serialized in game state save files. Much of Playscii game creation involves + creating flavors of GameObject. + See game_util_object module for some generic subclasses for things like + a player, spawners, triggers, attachments etc. + """ + art_src = 'game_object_default' + """ + If specified, this art file will be loaded from disk and used as object's + default appearance. If object has states/facings, this is the "base" + filename prefix, eg "hero" in "hero_stand_front.psci". + """ + state_changes_art = False + "If True, art will change with current state; depends on file naming." + stand_if_not_moving = False + "If True, object will go to stand state any time velocity is zero." + valid_states = [DEFAULT_STATE] + "List of valid states for this object, used to find anims" + facing_changes_art = False + "If True, art will change based on facing AND state" + generate_art = False + """ + If True, blank Art will be created with these dimensions, charset, + and palette + """ + use_art_instance = False + "If True, always use an ArtInstance of source Art" + animating = False + "If True, object's Art will animate on init/reset" + art_width, art_height = 8, 8 + art_charset, art_palette = None, None + y_sort = False + "If True, object will sort according to its Y position a la Zelda LttP" + lifespan = 0. + "If >0, object will self-destroy after this many seconds" + kill_distance_from_origin = 1000 + """ + If object gets further than this distance from origin, + (non-overridden) update will self-destroy + """ + spawner = None + "If another object spawned us, store reference to it here" + physics_move = True + "If False, don't do move physics updates for this object" + fast_move_steps = 0 + """ + If >0, subdivide high-velocity moves into fractions-of-this-object-sized + steps to avoid tunneling. turn this up if you notice an object tunneling. + # 1 = each step is object's full size + # 2 = each step is half object's size + # N = each step is 1/N object's size + """ + move_accel_x = move_accel_y = 200. + "Acceleration per update from player movement" + ground_friction = 10.0 + air_friction = 25.0 + mass = 1. + "Mass: negative number = infinitely dense" + bounciness = 0.25 + "Bounciness aka restitution, % of velocity reflected on bounce" + stop_velocity = 0.1 + "Near-zero point at which any velocity is set to zero" + log_move = False + log_load = False + log_spawn = False + visible = True + alpha = 1. + locked = False + "If True, location is protected from edit mode drags, can't click to select" + show_origin = False + show_bounds = False + show_collision = False + collision_shape_type = CST_NONE + "Collision shape: tile, circle, AABB - see the CST_* enum values" + collision_type = CT_NONE + "Type of collision (static, dynamic)" + col_layer_name = 'collision' + "Collision layer name for CST_TILE objects" + draw_col_layer = False + "If True, collision layer will draw normally" + col_offset_x, col_offset_y = 0., 0. + "Collision circle/box offset from origin" + col_radius = 1. + "Collision circle size, if CST_CIRCLE" + col_width, col_height = 1., 1. + "Collision AABB size, if CST_AABB" + art_off_pct_x, art_off_pct_y = 0.5, 0.5 + """ + Art offset from pivot: Renderable's origin_pct set to this if not None + 0,0 = top left; 1,1 = bottom right; 0.5,0.5 = center + """ + should_save = True + "If True, write this object to state save files" + serialized = ['name', 'x', 'y', 'z', 'art_src', 'visible', 'locked', 'y_sort', + 'art_off_pct_x', 'art_off_pct_y', 'alpha', 'state', 'facing', + 'animating', 'scale_x', 'scale_y'] + "List of members to serialize (no weak refs!)" + editable = ['show_collision', 'col_radius', 'col_width', 'col_height', + 'mass', 'bounciness', 'stop_velocity'] + """ + Members that don't need to be serialized, but should be exposed to + object edit UI + """ + set_methods = {'art_src': 'set_art_src', 'alpha': '_set_alpha', + 'scale_x': '_set_scale_x', 'scale_y': '_set_scale_y', + 'name': '_rename', 'col_radius': '_set_col_radius', + 'col_width': '_set_col_width', + 'col_height': '_set_col_height' + } + "If setting a given member should run some logic, specify the method here" + selectable = True + "If True, user can select this object in edit mode" + deleteable = True + "If True, user can delete this object in edit mode" + is_debug = False + "If True, object's visibility can be toggled with View menu option" + exclude_from_object_list = False + "If True, do not list object in edit mode UI - system use only!" + exclude_from_class_list = False + "If True, do not list class in edit mode UI - system use only!" + attachment_classes = {} + "Objects to spawn as attachments: key is member name, value is class" + noncolliding_classes = [] + "Blacklist of string names for classes to ignore collisions with" + sound_filenames = {} + 'Dict of sound filenames, keys are string "tags"' + looping_state_sounds = {} + "Dict of looping sounds that should play while in a given state" + update_if_outside_room = False + """ + If True, object's update function will run even if it's + outside the world's current room + """ + handle_key_events = False + "If True, handle key input events passed in from world / input handler" + handle_mouse_events = False + "If True, handle mouse click/wheel events passed in from world / input handler" + consume_mouse_events = False + "If True, prevent any other mouse click/wheel events from being processed" + def __init__(self, world, obj_data=None): + """ + Create new GameObject in world, from serialized data if provided. + """ + self.x, self.y, self.z = 0., 0., 0. + "Object's location in 3D space." + self.scale_x, self.scale_y, self.scale_z = 1., 1., 1. + "Object's scale in 3D space." + self.rooms = {} + "Dict of rooms we're in - if empty, object appears in all rooms" + self.state = DEFAULT_STATE + "String representing object state. Every object has one, even if it never changes." + self.facing = GOF_FRONT + "Every object gets a facing, even if it never changes" + self.name = self.get_unique_name() + # apply serialized data before most of init happens + # properties that need non-None defaults should be declared above + if obj_data: + for v in self.serialized: + if not v in obj_data: + if self.log_load: + self.app.dev_log("Serialized property '%s' not found for %s" % (v, self.name)) + continue + # if value is in data and serialized list but undeclared, do so + if not hasattr(self, v): + setattr(self, v, None) + # match type of variable as declared, eg loc might be written as + # an int in the JSON so preserve its floatness + if getattr(self, v) is not None: + src_type = type(getattr(self, v)) + setattr(self, v, src_type(obj_data[v])) + else: + setattr(self, v, obj_data[v]) + self.vel_x, self.vel_y, self.vel_z = 0, 0, 0 + "Object's velocity in units per second. Derived from acceleration." + self.move_x, self.move_y = 0, 0 + "User-intended acceleration" + self.last_x, self.last_y, self.last_z = self.x, self.y, self.z + self.last_update_end = 0 + self.flip_x = False + "Set by state, True if object's renderable should be flipped in X axis." + self.world = world + "GameWorld this object is managed by" + self.app = self.world.app + "For convenience, Application instance for this object's GameWorld" + self.destroy_time = 0 + "If >0, object will self-destroy at/after this time (in milliseconds)" + # lifespan property = easy auto-set for fixed lifetime objects + if self.lifespan > 0: + self.set_destroy_timer(self.lifespan) + self.timer_functions_pre_update = {} + "Dict of running GameObjectTimerFuctions that run during pre_update" + self.timer_functions_update = {} + "Dict of running GameObjectTimerFuctions that run during update" + self.timer_functions_post_update = {} + "Dict of running GameObjectTimerFuctions that run during post_update" + self.last_update_failed = False + "When True, object's last update threw an exception" + # load/create assets + self.arts = {} + "Dict of all Arts this object can reference, eg for states" + # if art_src not specified, create a new art according to dimensions + if self.generate_art: + self.art_src = '%s_art' % self.name + self.art = self.app.new_art(self.art_src, self.art_width, + self.art_height, self.art_charset, + self.art_palette) + # generated art will likely be only entry in this dict, + # but make sure it's there (eg generated art for Characters) + self.arts[self.art_src] = self.art + else: + self.load_arts() + if self.art is None or not self.art.valid: + # grab first available art + if len(self.arts) > 0: + for art in self.arts: + self.art = self.arts[art] + break + if not self.art: + self.app.log("Couldn't spawn GameObject with art %s" % self.art_src) + return + self.renderable = GameObjectRenderable(self.app, self.art, self) + self.renderable.alpha = self.alpha + self.origin_renderable = OriginIndicatorRenderable(self.app, self) + "Renderable for debug drawing of object origin." + self.bounds_renderable = BoundsIndicatorRenderable(self.app, self) + "1px LineRenderable showing object's bounding box" + for art in self.arts.values(): + if not art in self.world.art_loaded: + self.world.art_loaded.append(art) + self.orig_collision_type = self.collision_type + "Remember last collision type for enable/disable - don't set manually!" + self.collision = Collideable(self) + self.world.new_objects[self.name] = self + self.attachments = [] + if self.attachment_classes: + for atch_name,atch_class_name in self.attachment_classes.items(): + atch_class = self.world.classes[atch_class_name] + attachment = atch_class(self.world) + self.attachments.append(attachment) + attachment.attach_to(self) + setattr(self, atch_name, attachment) + self.should_destroy = False + "If True, object will be destroyed on next world update." + self.pre_first_update_run = False + "Flag that tells us we should run post_init next update." + self.last_state = None + self.last_warp_update = -1 + "Most recent warp world update, to prevent thrashing" + # set up art instance only after all art/renderable init complete + if self.use_art_instance: + self.set_art(ArtInstance(self.art)) + if self.animating and self.art.frames > 0: + self.start_animating() + if self.log_spawn: + self.app.log('Spawned %s with Art %s' % (self.name, os.path.basename(self.art.filename))) + + def get_unique_name(self): + "Generate and return a somewhat human-readable unique name for object" + name = str(self) + return '%s_%s' % (type(self).__name__, name[name.rfind('x')+1:-1]) + + def _rename(self, new_name): + # pass thru to world, this method exists for edit set method + self.world.rename_object(self, new_name) + + def pre_first_update(self): + """ + Run before first update; use this for any logic that depends on + init/creation being done ie all objects being present. + """ + pass + + def load_arts(self): + "Fill self.arts dict with Art references for eg states and facings." + self.art = self.app.load_art(self.art_src, False) + if self.art: + self.arts[self.art_src] = self.art + # if no states, use a single art always + if not self.state_changes_art: + self.arts[self.art_src] = self.art + return + for state in self.valid_states: + if self.facing_changes_art: + # load each facing for each state + for facing in FACINGS.values(): + art_name = '%s_%s_%s' % (self.art_src, state, facing) + art = self.app.load_art(art_name, False) + if art: + self.arts[art_name] = art + else: + # load each state + art_name = '%s_%s' % (self.art_src, state) + art = self.app.load_art(art_name, False) + if art: + self.arts[art_name] = art + # get reasonable default pose + self.art, self.flip_x = self.get_art_for_state() + + def is_point_inside(self, x, y): + "Return True if given point is inside our bounds" + left, top, right, bottom = self.get_edges() + return point_in_box(x, y, left, top, right, bottom) + + def get_edges(self): + "Return coords of our bounds (left, top, right, bottom)" + left = self.x - (self.renderable.width * self.art_off_pct_x) + right = self.x + (self.renderable.width * (1 - self.art_off_pct_x)) + top = self.y + (self.renderable.height * self.art_off_pct_y) + bottom = self.y - (self.renderable.height * (1 - self.art_off_pct_y)) + return left, top, right, bottom + + def distance_to_object(self, other): + "Return distance from center of this object to center of given object." + return self.distance_to_point(other.x, other.y) + + def distance_to_point(self, point_x, point_y): + "Return distance from center of this object to given point." + dx = self.x - point_x + dy = self.y - point_y + return math.sqrt(dx ** 2 + dy ** 2) + + def normal_to_object(self, other): + "Return tuple normal pointing in direction of given object." + return self.normal_to_point(other.x, other.y) + + def normal_to_point(self, point_x, point_y): + "Return tuple normal pointing in direction of given point." + dist = self.distance_to_point(point_x, point_y) + dx, dy = point_x - self.x, point_y - self.y + if dist == 0: + return 0, 0 + inv_dist = 1 / dist + return dx * inv_dist, dy * inv_dist + + def get_render_offset(self): + "Return a custom render offset. Override this in subclasses as needed." + return 0, 0, 0 + + def is_dynamic(self): + "Return True if object is dynamic." + return self.collision_type in CTG_DYNAMIC + + def is_entering_state(self, state): + "Return True if object is in given state this frame but not last frame." + return self.state == state and self.last_state != state + + def is_exiting_state(self, state): + "Return True if object is in given state last frame but not this frame." + return self.state != state and self.last_state == state + + def play_sound(self, sound_name, loops=0, allow_multiple=False): + "Start playing given sound." + # use sound_name as filename if it's not in our filenames dict + sound_filename = self.sound_filenames.get(sound_name, sound_name) + sound_filename = self.world.sounds_dir + sound_filename + self.world.app.al.object_play_sound(self, sound_filename, + loops, allow_multiple) + + def stop_sound(self, sound_name): + "Stop playing given sound." + sound_filename = self.sound_filenames.get(sound_name, sound_name) + sound_filename = self.world.sounds_dir + sound_filename + self.world.app.al.object_stop_sound(self, sound_filename) + + def stop_all_sounds(self): + "Stop all sounds playing on object." + self.world.app.al.object_stop_all_sounds(self) + + def enable_collision(self): + "Enable this object's collision." + self.collision_type = self.orig_collision_type + + def disable_collision(self): + "Disable this object's collision." + if self.collision_type == CT_NONE: + return + # remember prior collision type + self.orig_collision_type = self.collision_type + self.collision_type = CT_NONE + + def started_overlapping(self, other): + """ + Run when object begins overlapping with, but does not collide with, + another object. + """ + pass + + def started_colliding(self, other): + "Run when object begins colliding with another object." + self.resolve_collision_momentum(other) + + def stopped_colliding(self, other): + "Run when object stops colliding with another object." + if not other.name in self.collision.contacts: + # TODO: understand why this spams when player has a MazePickup + #self.world.app.log("%s stopped colliding with %s but wasn't in its contacts!" % (self.name, other.name)) + return + # called from check_finished_contacts + self.collision.contacts.pop(other.name) + + def resolve_collision_momentum(self, other): + "Resolve velocities between this object and given other object." + # don't resolve a pair twice + if self in self.world.cl.collisions_this_frame: + return + # determine new direction and velocity + total_vel = self.vel_x + self.vel_y + other.vel_x + other.vel_y + # negative mass = infinite + total_mass = max(0, self.mass) + max(0, other.mass) + if other.name not in self.collision.contacts or \ + self.name not in other.collision.contacts: + return + # redistribute velocity based on mass we're colliding with + if self.is_dynamic() and self.mass >= 0: + ax = self.collision.contacts[other.name].overlap.x + ay = self.collision.contacts[other.name].overlap.y + a_vel = total_vel * (self.mass / total_mass) + a_vel *= self.bounciness + self.vel_x, self.vel_y = -ax * a_vel, -ay * a_vel + if other.is_dynamic() and other.mass >= 0: + bx = other.collision.contacts[self.name].overlap.x + by = other.collision.contacts[self.name].overlap.y + b_vel = total_vel * (other.mass / total_mass) + b_vel *= other.bounciness + other.vel_x, other.vel_y = -bx * b_vel, -by * b_vel + # mark objects as resolved + self.world.cl.collisions_this_frame.append(self) + self.world.cl.collisions_this_frame.append(other) + + def check_finished_contacts(self): + """ + Updates our Collideable's contacts dict for contacts that were + happening last update but not this one, and call stopped_colliding. + """ + # put stopped-colliding objects in a list to process after checks + finished = [] + # keep separate list of names of objects no longer present + destroyed = [] + for obj_name,contact in self.collision.contacts.items(): + if contact.timestamp < self.world.cl.ticks: + # object might have been destroyed + obj = self.world.objects.get(obj_name, None) + if obj: + finished.append(obj) + else: + destroyed.append(obj_name) + for obj_name in destroyed: + self.collision.contacts.pop(obj_name) + for obj in finished: + self.stopped_colliding(obj) + obj.stopped_colliding(self) + + def get_contacting_objects(self): + "Return list of all objects we're currently contacting." + return [self.world.objects[obj] for obj in self.collision.contacts] + + def get_collisions(self): + "Return list of all overlapping shapes our shapes should collide with." + overlaps = [] + for shape in self.collision.shapes: + for other in self.world.cl.dynamic_shapes: + if other.go is self: + continue + if not other.go.should_collide(): + continue + if not self.can_collide_with(other.go): + continue + if not other.go.can_collide_with(self): + continue + overlaps.append(shape.get_overlap(other)) + for other in shape.get_overlapping_static_shapes(): + overlaps.append(other) + return overlaps + + def is_overlapping(self, other): + "Return True if we overlap with other object's collision" + return other.name in self.collision.contacts + + def are_bounds_overlapping(self, other): + "Return True if we overlap with other object's Art's bounds" + left, top, right, bottom = self.get_edges() + for x,y in [(left, top), (right, top), (right, bottom), (left, bottom)]: + if other.is_point_inside(x, y): + return True + return False + + def get_tile_at_point(self, point_x, point_y): + "Return x,y tile coord for given worldspace point" + left, top, right, bottom = self.get_edges() + x = (point_x - left) / self.art.quad_width + x = math.floor(x) + y = (point_y - top) / self.art.quad_height + y = math.ceil(-y) + return x, y + + def get_tiles_overlapping_box(self, box_left, box_top, box_right, box_bottom, log=False): + "Returns x,y coords for each tile overlapping given box" + if self.collision_shape_type != CST_TILE: + return [] + left, top = self.get_tile_at_point(box_left, box_top) + right, bottom = self.get_tile_at_point(box_right, box_bottom) + if bottom < top: + top, bottom = bottom, top + # stay in bounds + left = max(0, left) + right = min(right, self.art.width - 1) + top = max(1, top) + bottom = min(bottom, self.art.height) + tiles = [] + # account for range start being inclusive, end being exclusive + for x in range(left, right + 1): + for y in range(top - 1, bottom): + tiles.append((x, y)) + return tiles + + def overlapped(self, other, overlap): + """ + Called by CollisionLord when two objects overlap. + returns: bool "overlap allowed", bool "collision starting" + """ + started = other.name not in self.collision.contacts + # create or update contact info: (overlap, timestamp) + self.collision.contacts[other.name] = Contact(overlap, + self.world.cl.ticks) + can_collide = self.can_collide_with(other) + if not can_collide and started: + self.started_overlapping(other) + return can_collide, started + + def get_tile_loc(self, tile_x, tile_y, tile_center=True): + "Return top left / center of current Art's tile in world coordinates" + left, top, right, bottom = self.get_edges() + x = left + x += self.art.quad_width * tile_x + y = top + y -= self.art.quad_height * tile_y + if tile_center: + x += self.art.quad_width / 2 + y -= self.art.quad_height / 2 + return x, y + + def get_layer_z(self, layer_name): + "Return Z of layer with given name" + return self.z + self.art.layers_z[self.art.layer_names.index(layer_name)] + + def get_all_art(self): + "Return a list of all Art used by this object" + return list(self.arts.keys()) + + def start_animating(self): + "Start animation playback." + self.renderable.start_animating() + + def stop_animating(self): + "Pause animation playback on current frame." + self.renderable.stop_animating() + + def set_object_property(self, prop_name, new_value): + "Set property by given name to given value." + if not hasattr(self, prop_name): + return + if prop_name in self.set_methods: + method = getattr(self, self.set_methods[prop_name]) + method(new_value) + else: + setattr(self, prop_name, new_value) + + def get_art_for_state(self, state=None): + "Return Art (and 'flip X' bool) that best represents current state" + # use current state if none specified + state = self.state if state is None else state + art_state_name = '%s_%s' % (self.art_src, self.state) + # simple case: no facing, just state + if not self.facing_changes_art: + # return art for current state, use default if not available + if art_state_name in self.arts: + return self.arts[art_state_name], False + else: + default_name = '%s_%s' % (self.art_src, self.state or DEFAULT_STATE) + #assert(default_name in self.arts + # don't assert - if base+state name available, use that + if default_name in self.arts: + return self.arts[default_name], False + else: + #self.app.log('%s: Art with name %s not available, using %s' % (self.name, default_name, self.art_src)) + return self.arts[self.art_src], False + # more complex case: art determined by both state and facing + facing_suffix = FACINGS[self.facing] + # first see if anim exists for this exact state, skip subsequent logic + exact_name = '%s_%s' % (art_state_name, facing_suffix) + if exact_name in self.arts: + return self.arts[exact_name], False + # see what anims are available and try to choose best for facing + has_state = False + for anim in self.arts: + if anim.startswith(art_state_name): + has_state = True + break + # if NO anims for current state, fall back to default + if not has_state: + default_name = '%s_%s' % (self.art_src, DEFAULT_STATE) + art_state_name = default_name + front_name = '%s_%s' % (art_state_name, FACINGS[GOF_FRONT]) + left_name = '%s_%s' % (art_state_name, FACINGS[GOF_LEFT]) + right_name = '%s_%s' % (art_state_name, FACINGS[GOF_RIGHT]) + back_name = '%s_%s' % (art_state_name, FACINGS[GOF_BACK]) + has_front = front_name in self.arts + has_left = left_name in self.arts + has_right = right_name in self.arts + has_sides = has_left or has_right + # throw an error if nothing basic is available + #assert(has_front or has_sides) + if not has_front and not has_sides: + return self.arts[self.art_src], False + # if left/right opposite available, flip it + if self.facing == GOF_LEFT and has_right: + return self.arts[right_name], True + elif self.facing == GOF_RIGHT and has_left: + return self.arts[left_name], True + # if left or right but neither, use front + elif self.facing in [GOF_LEFT, GOF_RIGHT] and not has_sides: + return self.arts[front_name], False + # if no front but sides, use either + elif self.facing == GOF_FRONT and has_sides: + if has_right: + return self.arts[right_name], False + elif has_left: + return self.arts[left_name], False + # if no back, use sides or, as last resort, front + elif self.facing == GOF_BACK and has_sides: + if has_right: + return self.arts[right_name], False + elif has_left: + return self.arts[left_name], False + else: + return self.arts[front_name], False + # fall-through: keep using current art + return self.art, False + + def set_art(self, new_art, start_animating=True): + "Set object to use new given Art (passed by reference)." + if new_art is self.art: + return + self.art = new_art + self.renderable.set_art(self.art) + self.bounds_renderable.set_art(self.art) + if self.collision_shape_type == CST_TILE: + self.collision.create_shapes() + if (start_animating or self.animating) and new_art.frames > 1: + self.renderable.start_animating() + + def set_art_src(self, new_art_filename): + "Set object to use new given Art (passed by filename)" + if self.art_src == new_art_filename: + return + new_art = self.app.load_art(new_art_filename) + if not new_art: + return + self.art_src = new_art_filename + # reset arts dict + self.arts = {} + self.load_arts() + self.set_art(new_art) + + def set_loc(self, x, y, z=None): + "Set this object's location." + self.x, self.y = x, y + self.z = z or 0 + + def reset_last_loc(self): + 'Reset "last location" values used for updating state and fast_move' + self.last_x, self.last_y, self.last_z = self.x, self.y, self.z + + def set_scale(self, x, y, z): + "Set this object's scale." + self.scale_x, self.scale_y, self.scale_z = x, y, z + self.renderable.scale_x = self.scale_x + self.renderable.scale_y = self.scale_y + self.renderable.reset_size() + + def _set_scale_x(self, new_x): + self.set_scale(new_x, self.scale_y, self.scale_z) + + def _set_scale_y(self, new_y): + self.set_scale(self.scale_x, new_y, self.scale_z) + + def _set_col_radius(self, new_radius): + self.col_radius = new_radius + self.collision.shapes[0].radius = new_radius + + def _set_col_width(self, new_width): + self.col_width = new_width + self.collision.shapes[0].halfwidth = new_width / 2 + + def _set_col_height(self, new_height): + self.col_height = new_height + self.collision.shapes[0].halfheight = new_height / 2 + + def _set_alpha(self, new_alpha): + self.renderable.alpha = self.alpha = new_alpha + + def allow_move(self, dx, dy): + "Return True only if this object is allowed to move based on input." + return True + + def allow_move_x(self, dx): + "Return True if given movement in X axis is allowed." + return True + + def allow_move_y(self, dy): + "Return True if given movement in Y axis is allowed." + return True + + def move(self, dir_x, dir_y): + """ + Input player/sim-initiated velocity. Given value is multiplied by + acceleration in get_acceleration. + """ + # don't handle moves while game paused + # (add override flag if this becomes necessary) + if self.world.paused: + return + # check allow_move first + if not self.allow_move(dir_x, dir_y): + return + if self.allow_move_x(dir_x): + self.move_x += dir_x + if self.allow_move_y(dir_y): + self.move_y += dir_y + + def is_on_ground(self): + ''' + Return True if object is "on the ground". Subclasses define custom + logic here. + ''' + return True + + def get_friction(self): + "Return friction that should be applied for object's current context." + return self.ground_friction if self.is_on_ground() else self.air_friction + + def is_affected_by_gravity(self): + "Return True if object should be affected by gravity." + return False + + def get_gravity(self): + "Return x,y,z force of gravity for object's current context." + return self.world.gravity_x, self.world.gravity_y, self.world.gravity_z + + def get_acceleration(self, vel_x, vel_y, vel_z): + """ + Return x,y,z acceleration values for object's current context. + """ + force_x = self.move_x * self.move_accel_x + force_y = self.move_y * self.move_accel_y + force_z = 0 + if self.is_affected_by_gravity(): + grav_x, grav_y, grav_z = self.get_gravity() + force_x += grav_x * self.mass + force_y += grav_y * self.mass + force_z += grav_z * self.mass + # friction / drag + friction = self.get_friction() + speed = math.sqrt(vel_x ** 2 + vel_y ** 2 + vel_z ** 2) + force_x -= friction * self.mass * vel_x + force_y -= friction * self.mass * vel_y + force_z -= friction * self.mass * vel_z + # divide force by mass to get acceleration + accel_x = force_x / self.mass + accel_y = force_y / self.mass + accel_z = force_z / self.mass + # zero out acceleration beneath a threshold + # TODO: determine if this should be made tunable + return vector.cut_xyz(accel_x, accel_y, accel_z, 0.01) + + def apply_move(self): + """ + Apply current acceleration / velocity to position using Verlet + integration with half-step velocity estimation. + """ + accel_x, accel_y, accel_z = self.get_acceleration(self.vel_x, self.vel_y, self.vel_z) + timestep = self.world.app.timestep / 1000 + hsvel_x = self.vel_x + 0.5 * timestep * accel_x + hsvel_y = self.vel_y + 0.5 * timestep * accel_y + hsvel_z = self.vel_z + 0.5 * timestep * accel_z + self.x += hsvel_x * timestep + self.y += hsvel_y * timestep + self.z += hsvel_z * timestep + accel_x, accel_y, accel_z = self.get_acceleration(hsvel_x, hsvel_y, hsvel_z) + self.vel_x = hsvel_x + 0.5 * timestep * accel_x + self.vel_y = hsvel_y + 0.5 * timestep * accel_y + self.vel_z = hsvel_z + 0.5 * timestep * accel_z + self.vel_x, self.vel_y, self.vel_z = vector.cut_xyz(self.vel_x, self.vel_y, self.vel_z, self.stop_velocity) + + def moved_this_frame(self): + "Return True if object changed locations this frame." + delta = math.sqrt(abs(self.last_x - self.x) ** 2 + abs(self.last_y - self.y) ** 2 + abs(self.last_z - self.z) ** 2) + return delta > self.stop_velocity + + def warped_recently(self): + "Return True if object warped during last update." + return self.world.updates - self.last_warp_update <= 0 + + def handle_key_down(self, key, shift_pressed, alt_pressed, ctrl_pressed): + """ + Handle "key pressed" event, with keyboard mods passed in. + GO subclasses can do stuff here if their handle_key_events=True + """ + pass + + def handle_key_up(self, key, shift_pressed, alt_pressed, ctrl_pressed): + """ + Handle "key released" event, with keyboard mods passed in. + GO subclasses can do stuff here if their handle_key_events=True + """ + pass + + def clicked(self, button, mouse_x, mouse_y): + """ + Handle mouse button down event, with button # and + click location (in world coordinates) passed in. + GO subclasses can do stuff here if their handle_mouse_events=True + """ + pass + + def unclicked(self, button, mouse_x, mouse_y): + """ + Handle mouse button up event, with button # and + click location (in world coordinates) passed in. + GO subclasses can do stuff here if their handle_mouse_events=True + """ + pass + + def hovered(self, mouse_x, mouse_y): + """ + Handle mouse hover (fires when object -starts- being hovered). + GO subclasses can do stuff here if their handle_mouse_events=True + """ + pass + + def unhovered(self, mouse_x, mouse_y): + """ + Handle mouse unhover. + GO subclasses can do stuff here if their handle_mouse_events=True + """ + pass + + def mouse_wheeled(self, wheel_y): + """ + Handle mouse wheel movement. + GO subclasses can do stuff here if their handle_mouse_events=True + """ + pass + + def set_timer_function(self, timer_name, timer_function, delay_min, + delay_max=0, repeats=-1, slot=TIMER_PRE_UPDATE): + """ + Run given function in X seconds or every X seconds Y times. + If max is given, next execution will be between min and max time. + if repeat is -1, run indefinitely. + "Slot" determines whether function will run in pre_update, update, or + post_update. + """ + timer = GameObjectTimerFunction(self, timer_name, timer_function, + delay_min, delay_max, repeats, slot) + # add to slot-appropriate dict + d = [self.timer_functions_pre_update, self.timer_functions_update, + self.timer_functions_post_update][slot] + d[timer_name] = timer + + def stop_timer_function(self, timer_name): + "Stop currently running timer function with given name." + timer = self.timer_functions_pre_update.get(timer_name, None) or \ + self.timer_functions_update.get(timer_name, None) or \ + self.timer_functions_post_update.get(timer_name, None) + if not timer: + self.app.log('Timer named %s not found on object %s' % (timer_name, + self.name)) + d = [self.timer_functions_pre_update, self.timer_functions_update, + self.timer_functions_post_update][timer.slot] + d.pop(timer_name) + + def update_state(self): + "Update object state based on current context, eg movement." + if self.state_changes_art and self.stand_if_not_moving and \ + not self.moved_this_frame(): + self.state = DEFAULT_STATE + + def update_facing(self): + "Update object facing based on current context, eg movement." + dx, dy = self.x - self.last_x, self.y - self.last_y + if dx == 0 and dy == 0: + return + # TODO: flag for "side view only" objects + if abs(dy) > abs(dx): + self.facing = GOF_BACK if dy >= 0 else GOF_FRONT + else: + self.facing = GOF_RIGHT if dx >= 0 else GOF_LEFT + + def update_state_sounds(self): + "Stop and play looping sounds appropriate to current/recent states." + for state,sound in self.looping_state_sounds.items(): + if self.is_entering_state(state): + self.play_sound(sound, loops=-1) + elif self.is_exiting_state(state): + self.stop_sound(sound) + + def frame_begin(self): + "Run at start of game loop iteration, before input/update/render." + self.move_x, self.move_y = 0, 0 + self.last_x, self.last_y, self.last_z = self.x, self.y, self.z + # if we're just entering stand state, play any sound for it + if self.last_state is None: + self.update_state_sounds() + self.last_state = self.state + + def frame_update(self): + "Run once per frame, after input + simulation update and before render." + if not self.art.updated_this_tick: + self.art.update() + # update art based on state (and possibly facing too) + if self.state_changes_art: + new_art, flip_x = self.get_art_for_state() + self.set_art(new_art) + self.flip_x = flip_x + + def pre_update(self): + "Run before any objects have updated this simulation tick." + pass + + def post_update(self): + "Run after all objects have updated this simulation tick." + pass + + def fast_move(self): + """ + Subdivide object's move this frame into steps to avoid tunneling. + Only called for objects with fast_move_steps >0. + """ + final_x, final_y = self.x, self.y + dx, dy = self.x - self.last_x, self.y - self.last_y + total_move_dist = math.sqrt(dx ** 2 + dy ** 2) + if total_move_dist == 0: + return + # get movement normal + inv_dist = 1 / total_move_dist + dir_x, dir_y = dx * inv_dist, dy * inv_dist + if self.collision_shape_type == CST_CIRCLE: + step_dist = self.col_radius * 2 + elif self.collision_shape_type == CST_AABB: + # get size in axis object is moving in + step_x, step_y = self.col_width * dir_x, self.col_height * dir_y + step_dist = math.sqrt(step_x ** 2 + step_y ** 2) + step_dist /= self.fast_move_steps + # if object isn't moving fast enough, don't step + if total_move_dist <= step_dist: + return + steps = int(total_move_dist / step_dist) + # start stepping from beginning of this frame's move distance + self.x, self.y = self.last_x, self.last_y + for i in range(steps): + self.x += dir_x * step_dist + self.y += dir_y * step_dist + collisions = self.get_collisions() + # if overlapping just leave as-is, collision update will resolve + if len(collisions) > 0: + return + # ran through all steps without a hit, set back to final position + self.x, self.y = final_x, final_y + + def get_time_since_last_update(self): + "Return time (in milliseconds) since end of this object's last update." + return self.world.get_elapsed_time() - self.last_update_end + + def update(self): + """ + Apply movement/physics, update state and facing, keep our Collideable's + location locked to us. Self-destroy if a timer is up or we've fallen + out of the world. + """ + if 0 < self.destroy_time <= self.world.get_elapsed_time(): + self.destroy() + # don't apply physics to selected objects being dragged + if self.physics_move and not self.name in self.world.drag_objects: + self.apply_move() + if self.fast_move_steps > 0: + self.fast_move() + self.update_state() + self.update_state_sounds() + if self.facing_changes_art: + self.update_facing() + # update collision shape before CollisionLord resolves any collisions + self.collision.update() + if abs(self.x) > self.kill_distance_from_origin or \ + abs(self.y) > self.kill_distance_from_origin: + self.app.log('%s reached %s from origin, destroying.' % (self.name, self.kill_distance_from_origin)) + self.destroy() + + def update_renderables(self): + """ + Keep our Renderable's location locked to us, and update any debug + Renderables (collision, bounds etc) similarly. + """ + # even if debug viz are off, update once on init to set correct state + if self.show_origin or self in self.world.selected_objects: + self.origin_renderable.update() + if self.show_bounds or self in self.world.selected_objects or \ + (self is self.world.hovered_focus_object and self.selectable): + self.bounds_renderable.update() + if self.show_collision and self.is_dynamic(): + self.collision.update_renderables() + if self.visible: + self.renderable.update() + + def get_debug_text(self): + "Subclass logic can return a string to display in debug line." + return None + + def should_collide(self): + "Return True if this object should collide in current context." + return self.collision_type != CT_NONE and self.is_in_current_room() + + def can_collide_with(self, other): + "Return True if this object is allowed to collide with given object." + for ncc_name in self.noncolliding_classes: + if isinstance(other, self.world.classes[ncc_name]): + return False + return True + + def is_in_room(self, room): + "Return True if this object is in the given (by reference) Room." + return len(self.rooms) == 0 or room.name in self.rooms + + def is_in_current_room(self): + "Return True if this object is in the world's currently active Room." + return len(self.rooms) == 0 or (self.world.current_room and self.world.current_room.name in self.rooms) + + def room_entered(self, room, old_room): + "Run when a room we're in is entered." + pass + + def room_exited(self, room, new_room): + "Run when a room we're in is exited." + pass + + def render_debug(self): + "Render debug lines, eg origin/bounds/collision." + # only show debug stuff if in edit mode + if not self.world.app.ui.is_game_edit_ui_visible(): + return + if self.show_origin or self in self.world.selected_objects: + self.origin_renderable.render() + if self.show_bounds or self in self.world.selected_objects or \ + (self.selectable and self is self.world.hovered_focus_object): + self.bounds_renderable.render() + if self.show_collision and self.collision_type != CT_NONE: + self.collision.render() + + def render(self, layer, z_override=None): + #print('GameObject %s layer %s has Z %s' % (self.art.filename, layer, self.art.layers_z[layer])) + self.renderable.render(layer, z_override) + + def get_dict(self): + """ + Return a dict serializing this object's state that + GameWorld.save_to_file can dump to JSON. Only properties defined in + this object's "serialized" list are stored. Direct object references + are not safe to serialize, use only primitive types like strings. + """ + d = { 'class_name': type(self).__name__ } + # serialize whatever other vars are declared in self.serialized + for prop_name in self.serialized: + if hasattr(self, prop_name): + d[prop_name] = getattr(self, prop_name) + return d + + def reset_in_place(self): + "Run GameWorld.reset_object_in_place on this object." + self.world.reset_object_in_place(self) + + def set_destroy_timer(self, destroy_in_seconds): + "Set object to destroy itself given number of seconds from now." + self.destroy_time = self.world.get_elapsed_time() + destroy_in_seconds * 1000 + + def destroy(self): + self.stop_all_sounds() + # remove rooms' references to us + for room in self.rooms.values(): + if self.name in room.objects: + room.objects.pop(self.name) + self.rooms = {} + if self in self.world.selected_objects: + self.world.selected_objects.remove(self) + if self.spawner: + if hasattr(self.spawner, 'spawned_objects') and \ + self in self.spawner.spawned_objects: + self.spawner.spawned_objects.remove(self) + self.origin_renderable.destroy() + self.bounds_renderable.destroy() + self.collision.destroy() + for attachment in self.attachments: + attachment.destroy() + self.renderable.destroy() + self.should_destroy = True + + +class GameObjectTimerFunction: + """ + Object that manages a function's execution schedule for a GameObject. + Use GameObject.set_timer_function to create these. + """ + def __init__(self, go, name, function, delay_min, delay_max, repeats, slot): + self.go = go + "GameObject using this timer" + self.name = name + "This timer's name" + self.function = function + "GO function to run" + self.delay_min = delay_min + "Delay before next execution" + self.delay_max = delay_max + "If specified, next execution will be between min and max" + self.repeats = repeats + "# of times to repeat. -1 = infinite" + self.slot = slot + "Execute before, during, or after object's update" + self.next_update = self.go.world.get_elapsed_time() + self.runs = 0 + self._set_next_time() + + def _set_next_time(self): + "Compute and set this timer's next update time" + # if no max delay, just use min, else rand(min, max) + if not self.delay_max or self.delay_max == 0: + delay = self.delay_min + else: + delay = random.random() * (self.delay_max - self.delay_min) + delay += self.delay_min + self.next_update += int(delay * 1000) + + def update(self): + "Check timer, running function as needed" + if self.go.world.get_elapsed_time() < self.next_update: + return + # TODO: if function needs to run multiple times, do that and update appropriately + self._execute() + # remove timer if it's executed enough already + if self.repeats != -1 and self.runs > self.repeats: + self.go.stop_timer_function(self.name) + else: + self._set_next_time() + + def _execute(self): + # pass our object into our function + self.function() + self.runs += 1 diff --git a/game_room.py b/game_room.py new file mode 100644 index 0000000..488e7d7 --- /dev/null +++ b/game_room.py @@ -0,0 +1,195 @@ + +from game_object import GameObject + +class GameRoom: + """ + A collection of GameObjects within a GameWorld. Can be used to limit scope + of object updates, collisions, etc. + """ + camera_marker_name = '' + "If set, camera will move to marker with this name when room entered" + camera_follow_player = False + "If True, camera will follow player while in this room" + left_edge_warp_dest_name, right_edge_warp_dest_name = '', '' + "If set, warp to room OR marker with this name when edge crossed" + top_edge_warp_dest_name, bottom_edge_warp_dest_name = '', '' + warp_edge_bounds_obj_name = '' + "Object whose art's bounds should be used as our \"edges\" for above" + serialized = ['name', 'camera_marker_name', 'left_edge_warp_dest_name', + 'right_edge_warp_dest_name', 'top_edge_warp_dest_name', + 'bottom_edge_warp_dest_name', 'warp_edge_bounds_obj_name', + 'camera_follow_player'] + "List of string names of members to serialize for this Room class." + log_changes = False + "Log changes to and from this room" + def __init__(self, world, name, room_data=None): + self.world = world + self.name = name + self.pre_first_update_run = False + # dict of objects by name:object + self.objects = {} + if not room_data: + return + # restore serialized properties + # TODO: this is copy-pasted from GameObject, find a way to unify + # TODO: GameWorld.set_data_for that takes instance, serialized list, data dict + for v in self.serialized: + if not v in room_data: + self.world.app.dev_log("Serialized property '%s' not found for room %s" % (v, self.name)) + continue + if not hasattr(self, v): + setattr(self, v, None) + # match type of variable as declared, eg loc might be written as + # an int in the JSON so preserve its floatness + if getattr(self, v) is not None: + src_type = type(getattr(self, v)) + setattr(self, v, src_type(room_data[v])) + else: + setattr(self, v, room_data[v]) + # find objects by name and add them + for obj_name in room_data.get('objects', []): + self.add_object_by_name(obj_name) + + def pre_first_update(self): + self.reset_edge_warps() + + def reset_edge_warps(self): + self.edge_obj = self.world.objects.get(self.warp_edge_bounds_obj_name, None) + # no warping if we don't know our bounds + if not self.edge_obj: + return + edge_dest_name_suffix = '_name' + def set_edge_dest(dest_property): + # property name to destination name + dest_name = getattr(self, dest_property) + # get room OR object with name + dest_room = self.world.rooms.get(dest_name, None) + dest_obj = self.world.objects.get(dest_name, None) + # derive member name from serialized property name + member_name = dest_property.replace(edge_dest_name_suffix, '') + setattr(self, member_name, dest_room or dest_obj or None) + for pname in ['left_edge_warp_dest_name', 'right_edge_warp_dest_name', + 'top_edge_warp_dest_name', 'bottom_edge_warp_dest_name']: + set_edge_dest(pname) + + def set_camera_marker_name(self, marker_name): + if not marker_name in self.world.objects: + self.world.app.log("Couldn't find camera marker with name %s" % marker_name) + return + self.camera_marker_name = marker_name + if self is self.world.current_room: + self.use_camera_marker() + + def use_camera_marker(self): + if not self.camera_marker_name in self.world.objects: + return + cam_mark = self.world.objects[self.camera_marker_name] + self.world.camera.set_loc_from_obj(cam_mark) + + def entered(self, old_room): + "Run when the player enters this room." + if self.log_changes: + self.world.app.log('Room "%s" entered' % self.name) + # set camera if marker is set + if self.world.room_camera_changes_enabled: + self.use_camera_marker() + if self.camera_follow_player: + self.world.enable_player_camera_lock() + else: + self.world.disable_player_camera_lock() + # tell objects in this room player has entered so eg spawners can fire + for obj in self.objects.values(): + obj.room_entered(self, old_room) + + def exited(self, new_room): + "Run when the player exits this room." + if self.log_changes: + self.world.app.log('Room "%s" exited' % self.name) + # tell objects in this room player has exited + for obj in self.objects.values(): + obj.room_exited(self, new_room) + + def add_object_by_name(self, obj_name): + "Add object with given name to this room." + obj = self.world.objects.get(obj_name, None) + if not obj: + self.world.app.log("Couldn't find object named %s" % obj_name) + return + self.add_object(obj) + + def add_object(self, obj): + "Add object (by reference) to this room." + self.objects[obj.name] = obj + obj.rooms[self.name] = self + + def remove_object_by_name(self, obj_name): + "Remove object with given name from this room." + obj = self.world.objects.get(obj_name, None) + if not obj: + self.world.app.log("Couldn't find object named %s" % obj_name) + return + self.remove_object(obj) + + def remove_object(self, obj): + "Remove object (by reference) from this room." + if obj.name in self.objects: + self.objects.pop(obj.name) + else: + self.world.app.log("GameRoom %s doesn't contain GameObject %s" % (self.name, obj.name)) + if self.name in obj.rooms: + obj.rooms.pop(self.name) + else: + self.world.app.log("GameObject %s not found in GameRoom %s" % (obj.name, self.name)) + + def get_dict(self): + "Return a dict that GameWorld.save_to_file can dump to JSON" + object_names = list(self.objects.keys()) + d = {'class_name': type(self).__name__, 'objects': object_names} + # serialize whatever other vars are declared in self.serialized + for prop_name in self.serialized: + if hasattr(self, prop_name): + d[prop_name] = getattr(self, prop_name) + return d + + def _check_edge_warp(self, game_object): + # bail if no bounds or edge warp destinations set + if not self.edge_obj: + return + if not self.left_edge_warp_dest and not self.right_edge_warp_dest and not self.top_edge_warp_dest and not self.bottom_edge_warp_dest: + return + if game_object.warped_recently(): + return + px, py = game_object.x, game_object.y + if self.edge_obj.is_point_inside(px, py): + return + left, top, right, bottom = self.edge_obj.get_edges() + # which edge are we beyond? + warp_dest = None + if top > py > bottom and px < left: + warp_dest = self.left_edge_warp_dest + elif top > py > bottom and px > right: + warp_dest = self.right_edge_warp_dest + elif left < px < right and py > top: + warp_dest = self.top_edge_warp_dest + elif left < px < right and py < bottom: + warp_dest = self.bottom_edge_warp_dest + if not warp_dest: + return + if issubclass(type(warp_dest), GameRoom): + self.world.change_room(warp_dest.name) + elif issubclass(type(warp_dest), GameObject): + # TODO: change room or not? use_marker_room flag a la WarpTrigger? + game_object.set_loc(warp_dest.x, warp_dest.y) + game_object.last_warp_update = self.world.updates + + def update(self): + if self is self.world.current_room: + self._check_edge_warp(self.world.player) + + def destroy(self): + if self.name in self.world.rooms: + self.world.rooms.pop(self.name) + # remove references to us in each of our objects + for obj in self.objects.values(): + obj.rooms.pop(self.name) + self.objects = {} diff --git a/game_util_objects.py b/game_util_objects.py new file mode 100644 index 0000000..5c3d3fb --- /dev/null +++ b/game_util_objects.py @@ -0,0 +1,431 @@ + +import os.path, random + +from game_object import GameObject, FACING_DIRS +from collision import CST_NONE, CST_CIRCLE, CST_AABB, CST_TILE, CT_NONE, CT_GENERIC_STATIC, CT_GENERIC_DYNAMIC, CT_PLAYER, CTG_STATIC, CTG_DYNAMIC + +class GameObjectAttachment(GameObject): + "GameObject that doesn't think about anything, just renders" + collision_type = CT_NONE + should_save = False + selectable = False + exclude_from_class_list = True + physics_move = False + offset_x, offset_y, offset_z = 0., 0., 0. + "Offset from parent object's origin" + fixed_z = False + "If True, Z will not be locked to GO we're attached to" + editable = GameObject.editable + ['offset_x', 'offset_y', 'offset_z'] + + def attach_to(self, game_object): + "Attach this object to given object." + self.parent = game_object + + def update(self): + # very minimal update! + if not self.art.updated_this_tick: + self.art.update() + + def post_update(self): + # after parent has moved, snap to its location + self.x = self.parent.x + self.offset_x + self.y = self.parent.y + self.offset_y + if not self.fixed_z: + self.z = self.parent.z + self.offset_z + + +class BlobShadow(GameObjectAttachment): + "Generic blob shadow attachment class" + art_src = 'blob_shadow' + alpha = 0.5 + +class StaticTileBG(GameObject): + "Generic static world object with tile-based collision" + collision_shape_type = CST_TILE + collision_type = CT_GENERIC_STATIC + physics_move = False + +class StaticTileObject(GameObject): + collision_shape_type = CST_TILE + collision_type = CT_GENERIC_STATIC + physics_move = False + y_sort = True + +class StaticBoxObject(GameObject): + "Generic static world object with AABB-based (rectangle) collision" + collision_shape_type = CST_AABB + collision_type = CT_GENERIC_STATIC + physics_move = False + +class DynamicBoxObject(GameObject): + collision_shape_type = CST_AABB + collision_type = CT_GENERIC_DYNAMIC + y_sort = True + +class Pickup(GameObject): + collision_shape_type = CST_CIRCLE + collision_type = CT_GENERIC_DYNAMIC + y_sort = True + attachment_classes = { 'shadow': 'BlobShadow' } + +class Projectile(GameObject): + "Generic projectile class" + fast_move_steps = 1 + collision_type = CT_GENERIC_DYNAMIC + collision_shape_type = CST_CIRCLE + move_accel_x = move_accel_y = 400. + noncolliding_classes = ['Projectile'] + lifespan = 10. + "Projectiles should be transient, limited max life" + should_save = False + + def __init__(self, world, obj_data=None): + GameObject.__init__(self, world, obj_data) + self.fire_dir_x, self.fire_dir_y = 0, 0 + + def fire(self, firer, dir_x=0, dir_y=1): + self.set_loc(firer.x, firer.y, firer.z) + self.reset_last_loc() + self.fire_dir_x, self.fire_dir_y = dir_x, dir_y + + def update(self): + if (self.fire_dir_x, self.fire_dir_y) != (0, 0): + self.move(self.fire_dir_x, self.fire_dir_y) + GameObject.update(self) + +class Character(GameObject): + "Generic character class" + state_changes_art = True + stand_if_not_moving = True + move_state = 'walk' + "Move state name - added to valid_states in init so subclasses recognized" + collision_shape_type = CST_CIRCLE + collision_type = CT_GENERIC_DYNAMIC + + def __init__(self, world, obj_data=None): + if not self.move_state in self.valid_states: + self.valid_states.append(self.move_state) + GameObject.__init__(self, world, obj_data) + # assume that character should start idling, if its art animates + if self.art.frames > 0: + self.start_animating() + + def update_state(self): + GameObject.update_state(self) + if self.state_changes_art and abs(self.vel_x) > 0.1 or abs(self.vel_y) > 0.1: + self.state = self.move_state + +class Player(Character): + "Generic player class" + log_move = False + collision_type = CT_PLAYER + editable = Character.editable + ['move_accel_x', 'move_accel_y', + 'ground_friction', 'air_friction', + 'bounciness', 'stop_velocity'] + + def pre_first_update(self): + if self.world.player is None: + self.world.player = self + if self.world.player_camera_lock: + self.world.camera.focus_object = self + else: + self.world.camera.focus_object = None + + def button_pressed(self, button_index): + pass + + def button_unpressed(self, button_index): + pass + + +class TopDownPlayer(Player): + + y_sort = True + attachment_classes = { 'shadow': 'BlobShadow' } + facing_changes_art = True + + def get_facing_dir(self): + return FACING_DIRS[self.facing] + + +class WorldPropertiesObject(GameObject): + "Special magic singleton object that stores and sets GameWorld properties" + art_src = 'world_properties_object' + visible = deleteable = selectable = False + locked = True + physics_move = False + exclude_from_object_list = True + exclude_from_class_list = True + world_props = ['game_title', 'gravity_x', 'gravity_y', 'gravity_z', + 'hud_class_name', 'globals_object_class_name', + 'camera_x', 'camera_y', 'camera_z', + 'bg_color_r', 'bg_color_g', 'bg_color_b', 'bg_color_a', + 'player_camera_lock', 'object_grid_snap', 'draw_hud', + 'collision_enabled', 'show_collision_all', 'show_bounds_all', + 'show_origin_all', 'show_all_rooms', + 'room_camera_changes_enabled', 'draw_debug_objects' + ] + """ + Properties we serialize on behalf of GameWorld + TODO: figure out how to make these defaults sync with those in GW? + """ + serialized = world_props + editable = [] + "All visible properties are serialized, not editable" + def __init__(self, world, obj_data=None): + GameObject.__init__(self, world, obj_data) + world_class = type(world) + for v in self.serialized: + if obj_data and v in obj_data: + # if world instance has property from loaded data, use it + if hasattr(self.world, v): + setattr(self.world, v, obj_data[v]) + setattr(self, v, obj_data[v]) + # use world class (default) property if loaded data lacks it + elif hasattr(world_class, v): + setattr(self, v, getattr(world_class, v)) + else: + # set explicitly as float, for camera & bg color + setattr(self, v, 0.0) + # special handling of bg color (a list) + self.world.bg_color = [self.bg_color_r, self.bg_color_g, self.bg_color_b, self.bg_color_a] + self.world.camera.set_loc(self.camera_x, self.camera_y, self.camera_z) + # TODO: figure out why collision_enabled seems to default False! + + def set_object_property(self, prop_name, new_value): + setattr(self, prop_name, new_value) + # special handling for some values, eg bg color and camera + if prop_name.startswith('bg_color_'): + component = {'r': 0, 'g': 1, 'b': 2, 'a': 3}[prop_name[-1]] + self.world.bg_color[component] = float(new_value) + elif prop_name.startswith('camera_') and len(prop_name) == len('camera_x'): + setattr(self.world.camera, prop_name[-1], new_value) + # some properties have unique set methods in GW + elif prop_name == 'show_collision_all': + self.world.toggle_all_collision_viz() + elif prop_name == 'show_bounds_all': + self.world.toggle_all_bounds_viz() + elif prop_name == 'show_origin_all': + self.world.toggle_all_origin_viz() + elif prop_name == 'player_camera_lock': + self.world.toggle_player_camera_lock() + # normal properties you can just set: set em + elif hasattr(self.world, prop_name): + setattr(self.world, prop_name, new_value) + + def update_from_world(self): + self.camera_x = self.world.camera.x + self.camera_y = self.world.camera.y + self.camera_z = self.world.camera.z + + +class WorldGlobalsObject(GameObject): + """ + Invisible object holding global state, variables etc in GameWorld.globals. + Subclass can be specified in WorldPropertiesObject. + NOTE: this object is spawned from scratch every load, it's never serialized! + """ + should_save = False + visible = deleteable = selectable = False + locked = True + exclude_from_object_list = True + exclude_from_class_list = True + physics_move = False + serialized = [] + editable = [] + + +class LocationMarker(GameObject): + "Very simple GameObject that marks an XYZ location for eg camera points" + art_src = 'loc_marker' + serialized = ['name', 'x', 'y', 'z', 'visible', 'locked'] + editable = [] + alpha = 0.5 + physics_move = False + is_debug = True + + +class StaticTileTrigger(GameObject): + """ + Generic static trigger with tile-based collision. + Overlaps but doesn't collide. + """ + is_debug = True + collision_shape_type = CST_TILE + collision_type = CT_GENERIC_STATIC + noncolliding_classes = ['GameObject'] + physics_move = False + serialized = ['name', 'x', 'y', 'z', 'art_src', 'visible', 'locked'] + + def started_overlapping(self, other): + #self.app.log('Trigger overlapped with %s' % other.name) + pass + +class WarpTrigger(StaticTileTrigger): + "Trigger that warps object to a room/marker when they touch it." + is_debug = True + art_src = 'trigger_default' + alpha = 0.5 + destination_marker_name = None + "If set, warp to this location marker" + destination_room_name = None + "If set, make this room the world's current" + use_marker_room = True + "If True, change to destination marker's room" + warp_class_names = ['Player'] + "List of class names to warp on contact with us." + serialized = StaticTileTrigger.serialized + ['destination_room_name', + 'destination_marker_name', + 'use_marker_room'] + + def __init__(self, world, obj_data=None): + StaticTileTrigger.__init__(self, world, obj_data) + self.warp_classes = [self.world.get_class_by_name(class_name) for class_name in self.warp_class_names] + + def started_overlapping(self, other): + if other.warped_recently(): + return + # bail if object's class isn't allowed + valid_class = False + for c in self.warp_classes: + if isinstance(other, c): + valid_class = True + break + if not valid_class: + return + if self.destination_room_name: + if other is self.world.player: + # if overlapping object is player, change current room + # to destination room + self.world.change_room(self.destination_room_name) + else: + # if object is only in one room, move them to destination room + if len(other.rooms) == 1: + old_room = other.rooms.values()[0] + old_room.remove_object(other) + self.destination_room.add_object(other) + elif self.destination_marker_name: + marker = self.world.objects.get(self.destination_marker_name, None) + if not marker: + self.app.log('Warp destination object %s not found' % self.destination_marker_name) + return + other.set_loc(marker.x, marker.y, marker.z) + # warp to marker's room if specified, pick a random one if multiple + if self.use_marker_room and len(marker.rooms) == 1: + room = random.choice(list(marker.rooms.values())) + # warn if both room and marker are set but they conflict + if self.destination_room_name and \ + room.name != self.destination_room_name: + self.app.log("Marker %s's room differs from destination room %s" % (marker.name, self.destination_room_name)) + self.world.change_room(room.name) + other.last_warp_update = self.world.updates + + +class ObjectSpawner(LocationMarker): + "Simple object that spawns an object when triggered" + is_debug = True + spawn_class_name = None + spawn_obj_name = '' + spawn_random_in_bounds = False + "If True, spawn somewhere in this object's bounds, else spawn at location" + spawn_obj_data = {} + "Dict of properties to set on newly spawned object" + times_to_fire = -1 + "Number of times we can fire, -1 = infinite" + trigger_on_room_enter = True + "Set False for any subclass that triggers in some other way" + destroy_on_room_exit = True + "if True, spawned object will be destroyed when player leaves its room" + serialized = LocationMarker.serialized + ['spawn_class_name', 'spawn_obj_name', + 'times_to_fire', 'destroy_on_room_exit' + ] + + def __init__(self, world, obj_data=None): + LocationMarker.__init__(self, world, obj_data) + self.times_fired = 0 + # list of objects we've spawned + self.spawned_objects = [] + + def get_spawn_class_name(self): + "Return class name of object to spawn." + return self.spawn_class_name + + def get_spawn_location(self): + "Return x,y location we should spawn a new object at." + if not self.spawn_random_in_bounds: + return self.x, self.y + left, top, right, bottom = self.get_edges() + x = left + random.random() * (right - left) + y = top + random.random() * (bottom - top) + return x, y + + def can_spawn(self): + "Return True if spawner is allowed to spawn." + return True + + def do_spawn(self): + "Spawn and returns object." + class_name = self.get_spawn_class_name() + if not class_name: + return None + x, y = self.get_spawn_location() + new_obj = self.world.spawn_object_of_class(class_name, x, y) + if self.spawn_obj_name: + self.world.rename_object(new_obj, self.spawn_obj_name) + # new object should be in same rooms as us + new_obj.rooms.update(self.rooms) + self.spawned_objects.append(new_obj) + # save a reference to us, the spawner + new_obj.spawner = self + # TODO: put new object in our room(s), apply spawn_obj_data + return new_obj + + def trigger(self): + "Poke this spawner to do its thing, returns an object if spawned" + if self.times_to_fire != -1 and self.times_fired >= self.times_to_fire: + return None + if not self.can_spawn(): + return None + if self.times_fired != -1: + self.times_fired += 1 + return self.do_spawn() + + def room_entered(self, room, old_room): + if self.trigger_on_room_enter: + self.trigger() + + def room_exited(self, room, new_room): + if not self.destroy_on_room_exit: + return + for obj in self.spawned_objects: + obj.destroy() + + +class SoundBlaster(LocationMarker): + "Simple object that plays sound when triggered" + is_debug = True + sound_name = '' + "String name of sound to play, minus any extension" + can_play = True + "If False, won't play sound when triggered" + play_on_room_enter = True + loops = -1 + "Number of times to loop, if -1 loop indefinitely" + serialized = LocationMarker.serialized + ['sound_name', 'can_play', + 'play_on_room_enter'] + + def __init__(self, world, obj_data=None): + LocationMarker.__init__(self, world, obj_data) + # find file, try common extensions + for ext in ['', '.ogg', '.wav']: + filename = self.sound_name + ext + if self.world.sounds_dir and os.path.exists(self.world.sounds_dir + filename): + self.sound_filenames[self.sound_name] = filename + return + self.world.app.log("Couldn't find sound file %s for SoundBlaster %s" % (self.sound_name, self.name)) + + def room_entered(self, room, old_room): + self.play_sound(self.sound_name, self.loops) + + def room_exited(self, room, new_room): + self.stop_sound(self.sound_name) diff --git a/game_world.py b/game_world.py new file mode 100644 index 0000000..e8a8a7b --- /dev/null +++ b/game_world.py @@ -0,0 +1,1173 @@ + +import os, sys, math, time, importlib, json, traceback +from collections import namedtuple + +import sdl2 + +import game_object, game_util_objects, game_hud, game_room +import collision, vector +from camera import Camera +from grid import GameGrid +from art import ART_DIR +from charset import CHARSET_DIR +from palette import PALETTE_DIR + +TOP_GAME_DIR = 'games/' +DEFAULT_STATE_FILENAME = 'start' +STATE_FILE_EXTENSION = 'gs' +GAME_SCRIPTS_DIR = 'scripts/' +SOUNDS_DIR = 'sounds/' + +# generic starter script with a GO and Player subclass +STARTER_SCRIPT = """ +from game_object import GameObject +from game_util_objects import Player + + +class MyGamePlayer(Player): + "Generic starter player class for newly created games." + art_src = 'default_player' + # no "move" state art, so just use stand state for now + move_state = 'stand' + + +class MyGameObject(GameObject): + "Generic starter object class for newly created games." + def update(self): + # write "hello" in a color that shifts over time + color = self.art.palette.get_random_color_index() + self.art.write_string(0, 0, 3, 2, 'hello!', color) + # run parent class update + GameObject.update(self) +""" + + +# Quickie class to debug render order +RenderItem = namedtuple('RenderItem', ['obj', 'layer', 'sort_value']) + + +class GameCamera(Camera): + pan_friction = 0.2 + use_bounds = False + +class GameWorld: + """ + Holds global state for Game Mode. Spawns, manages, and renders GameObjects. + Properties serialized via WorldPropertiesObject. + Global state can be controlled via a WorldGlobalsObject. + """ + game_title = 'Untitled Game' + "Title for game, shown in window titlebar when not editing" + gravity_x, gravity_y, gravity_z = 0., 0., 0. + "Gravity applied to all objects who are affected by gravity." + bg_color = [0., 0., 0., 1.] + "OpenGL wiewport color to render behind everything else, ie the void." + hud_class_name = 'GameHUD' + "String name of HUD class to use" + properties_object_class_name = 'WorldPropertiesObject' + globals_object_class_name = 'WorldGlobalsObject' + "String name of WorldGlobalsObject class to use." + player_camera_lock = True + "If True, camera will be locked to player's location." + object_grid_snap = True + # editable properties + # TODO: + #update_when_unfocused = False + #"If True, game sim will update even when window doesn't have input focus" + draw_hud = True + allow_pause = True + "If False, user cannot pause game sim" + collision_enabled = True + "If False, CollisionLord won't bother thinking about collision at all." + # toggles for "show all" debug viz modes + show_collision_all = False + show_bounds_all = False + show_origin_all = False + show_all_rooms = False + "If True, show all rooms not just current one." + draw_debug_objects = True + "If False, objects with is_debug=True won't be drawn." + room_camera_changes_enabled = True + "If True, snap camera to new room's associated camera marker." + list_only_current_room_objects = False + "If True, list UI will only show objects in current room." + builtin_module_names = ['game_object', 'game_util_objects', 'game_hud', + 'game_room'] + builtin_base_classes = (game_object.GameObject, game_hud.GameHUD, + game_room.GameRoom) + + def __init__(self, app): + self.app = app + "Application that created this world." + self.game_dir = None + "Currently loaded game directory." + self.sounds_dir = None + self.game_name = None + "Game's internal name, based on its directory." + self.selected_objects = [] + self.hovered_objects = [] + self.hovered_focus_object = None + "Set by check_hovers(), to the object that will be selected if edit mode user clicks" + self.last_click_on_ui = False + self.last_mouse_click_x, self.last_mouse_click_y = 0, 0 + self.properties = None + "Our WorldPropertiesObject" + self.globals = None + "Our WorldGlobalsObject - not required" + self.camera = GameCamera(self.app) + self.grid = GameGrid(self.app) + self.grid.visible = False + self.player = None + self.paused = False + self._pause_time = 0 + self.updates = 0 + "Number of updates this we have performed." + self.modules = {'game_object': game_object, + 'game_util_objects': game_util_objects, + 'game_hud': game_hud, 'game_room': game_room} + self.classname_to_spawn = None + self.objects = {} + "Dict of objects by name:object" + self.new_objects = {} + "Dict of just-spawned objects, added to above on update() after spawn" + self.rooms = {} + "Dict of rooms by name:room" + self.current_room = None + self.cl = collision.CollisionLord(self) + self.hud = None + self.art_loaded = [] + self.drag_objects = {} + "Offsets for objects player is edit-dragging" + self.last_state_loaded = DEFAULT_STATE_FILENAME + + def play_music(self, music_filename, fade_in_time=0): + "Play given music file in any SDL2_mixer-supported format." + music_filename = self.game_dir + SOUNDS_DIR + music_filename + self.app.al.set_music(music_filename) + self.app.al.start_music(music_filename) + + def pause_music(self): + self.app.al.pause_music() + + def resume_music(self): + self.app.al.resume_music() + + def stop_music(self): + "Stop any currently playing music." + self.app.al.stop_all_music() + + def is_music_playing(self): + "Return True if there is music playing." + return self.app.al.is_music_playing() + + def pick_next_object_at(self, x, y): + "Return next unselected object at given point." + objects = self.get_objects_at(x, y) + # early out + if len(objects) == 0: + return None + # don't bother cycling if only one object found + if len(objects) == 1 and objects[0].selectable and \ + not objects[0] in self.selected_objects: + return objects[0] + # cycle through objects at point til an unselected one is found + for obj in objects: + if not obj.selectable: + continue + if obj in self.selected_objects: + continue + return obj + return None + + def get_objects_at(self, x, y, allow_locked=False): + "Return list of all objects whose bounds fall within given point." + objects = [] + for obj in self.objects.values(): + if obj.locked and not allow_locked: + continue + # only allow selecting of visible objects + # (can still be selected via list panel) + if obj.visible and obj.is_point_inside(x, y): + objects.append(obj) + # sort objects in Z, highest first + objects.sort(key=lambda obj: obj.z, reverse=True) + return objects + + def select_click(self): + x, y, z = vector.screen_to_world(self.app, self.app.mouse_x, + self.app.mouse_y) + # remember last place we clicked + self.last_mouse_click_x, self.last_mouse_click_y = x, y + if self.classname_to_spawn: + new_obj = self.spawn_object_of_class(self.classname_to_spawn, x, y) + if self.current_room: + self.current_room.add_object(new_obj) + self.app.ui.message_line.post_line('Spawned %s' % new_obj.name) + return + objects = self.get_objects_at(x, y) + next_obj = self.pick_next_object_at(x, y) + if len(objects) == 0: + self.deselect_all() + # ctrl: unselect first selected object found under mouse + elif self.app.il.ctrl_pressed: + for obj in self.selected_objects: + if obj in objects: + self.deselect_object(obj) + break + # shift: add to current selection + elif self.app.il.shift_pressed: + self.select_object(next_obj) + # no mod keys: select only object under cursor, deselect all if none + elif not next_obj and len(objects) == 0: + self.deselect_all() + # special case: must use shift-click for objects + # beneath (lower Z) topmost + elif next_obj is not objects[0]: + pass + else: + self.select_object(next_obj) + # remember object offsets from cursor for dragging + for obj in self.selected_objects: + self.drag_objects[obj.name] = (obj.x - x, obj.y - y, obj.z - z) + + def clicked(self, button): + # if edit UI is up, select stuff + if self.app.ui.is_game_edit_ui_visible(): + if button == sdl2.SDL_BUTTON_LEFT: + self.select_click() + # else pass clicks to any objects under mouse + else: + x, y, z = vector.screen_to_world(self.app, self.app.mouse_x, + self.app.mouse_y) + # 'locked" only relevant to edit mode, ignore it if in play mode + objects = self.get_objects_at(x, y, allow_locked=True) + for obj in objects: + if obj.handle_mouse_events and \ + (not obj.locked or not self.app.can_edit): + obj.clicked(button, x, y) + if obj.consume_mouse_events: + break + + def select_unclick(self): + # clicks on UI are consumed and flag world to not accept unclicks + # (keeps unclicks after dialog dismiss from deselecting objects) + if self.last_click_on_ui: + self.last_click_on_ui = False + # clear drag objects, since we're leaving valid drag context + # fixes unwanted drag after eg ESC exiting a menu + self.drag_objects.clear() + return + # if we're clicking to spawn something, don't drag/select + if self.classname_to_spawn: + return + x, y, z = vector.screen_to_world(self.app, self.app.mouse_x, + self.app.mouse_y) + # remember selected objects now, they might be deselected but still + # need to have their collision turned back on. + selected_objects = self.selected_objects[:] + if len(self.selected_objects) > 0 and not self.app.il.shift_pressed: + # if mouse has traveled much since click, deselect all objects + # except one mouse is over. + dx = self.last_mouse_click_x - x + dy = self.last_mouse_click_y - y + if math.sqrt(dx ** 2 + dy ** 2) < 1.5: + for obj in self.get_objects_at(x, y): + if obj in self.selected_objects: + self.deselect_all() + self.select_object(obj) + break + # end drag, forget drag object offsets + self.drag_objects.clear() + for obj in selected_objects: + obj.enable_collision() + if obj.collision_shape_type == collision.CST_TILE: + obj.collision.create_shapes() + obj.collision.update() + + def unclicked(self, button): + if self.app.ui.is_game_edit_ui_visible(): + if button == sdl2.SDL_BUTTON_LEFT: + self.select_unclick() + else: + x, y, z = vector.screen_to_world(self.app, self.app.mouse_x, + self.app.mouse_y) + objects = self.get_objects_at(x, y) + for obj in objects: + if obj.handle_mouse_events: + obj.unclicked(button, x, y) + + def check_hovers(self): + "Update objects on their mouse hover status" + x, y, z = vector.screen_to_world(self.app, self.app.mouse_x, + self.app.mouse_y) + new_hovers = self.get_objects_at(x, y) + # if this object will be selected on left click; draw bounds & label + if self.app.ui.is_game_edit_ui_visible(): + next_obj = self.pick_next_object_at(x, y) + self.hovered_focus_object = next_obj + # if in play mode, notify objects who have begun to be hovered + else: + for obj in new_hovers: + if obj.handle_mouse_events and not obj in self.hovered_objects: + obj.hovered(x, y) + # check for objects un-hovered by this move + for obj in self.hovered_objects: + if obj.handle_mouse_events and not obj in new_hovers: + obj.unhovered(x, y) + self.hovered_objects = new_hovers + + def mouse_wheeled(self, wheel_y): + x, y, z = vector.screen_to_world(self.app, self.app.mouse_x, + self.app.mouse_y) + objects = self.get_objects_at(x, y, allow_locked=True) + for obj in objects: + if obj.handle_mouse_events and \ + (not obj.locked or not self.app.can_edit): + obj.mouse_wheeled(wheel_y) + if obj.consume_mouse_events: + break + + def mouse_moved(self, dx, dy): + if self.app.ui.active_dialog: + return + # bail if mouse didn't move (in world space - include camera) last input + if self.app.mouse_dx == 0 and self.app.mouse_dy == 0 and \ + not self.camera.moved_this_frame: + return + # if last onclick was a UI element, don't drag + if self.last_click_on_ui: + return + self.check_hovers() + # not dragging anything? + if len(self.selected_objects) == 0: + return + # 0-length drags cause unwanted snapping + if dx == 0 and dy == 0: + return + # set dragged objects to mouse + offset from mouse when drag started + x, y, z = vector.screen_to_world(self.app, self.app.mouse_x, + self.app.mouse_y) + for obj_name,offset in self.drag_objects.items(): + obj = self.objects[obj_name] + if obj.locked: + continue + obj.disable_collision() + obj.x = x + offset[0] + obj.y = y + offset[1] + obj.z = z + offset[2] + if self.object_grid_snap: + obj.x = round(obj.x) + obj.y = round(obj.y) + # if odd width/height, origin will be between quads and + # edges will be off-grid; nudge so that edges are on-grid + if obj.art.width % 2 != 0: + obj.x += obj.art.quad_width / 2 + if obj.art.height % 2 != 0: + obj.y += obj.art.quad_height / 2 + + def select_object(self, obj, force=False): + "Add given object to our list of selected objects." + if not self.app.can_edit: + return + if obj and (obj.selectable or force) and not obj in self.selected_objects: + self.selected_objects.append(obj) + self.app.ui.object_selection_changed() + + def deselect_object(self, obj): + "Remove given object from our list of selected objects." + if obj in self.selected_objects: + self.selected_objects.remove(obj) + self.app.ui.object_selection_changed() + + def deselect_all(self): + "Deselect all objects." + self.selected_objects = [] + self.app.ui.object_selection_changed() + + def create_new_game(self, new_game_dir, new_game_title): + "Create appropriate dirs and files for a new game, return success." + self.unload_game() + new_dir = self.app.documents_dir + TOP_GAME_DIR + new_game_dir + '/' + if os.path.exists(new_dir): + self.app.log('Game dir %s already exists!' % new_game_dir) + return False + os.mkdir(new_dir) + os.mkdir(new_dir + ART_DIR) + os.mkdir(new_dir + GAME_SCRIPTS_DIR) + os.mkdir(new_dir + SOUNDS_DIR) + os.mkdir(new_dir + CHARSET_DIR) + os.mkdir(new_dir + PALETTE_DIR) + # create a generic starter script with a GO and Player subclass + f = open(new_dir + GAME_SCRIPTS_DIR + new_game_dir + '.py', 'w') + f.write(STARTER_SCRIPT) + f.close() + # load game + self.set_game_dir(new_game_dir) + self.properties = self.spawn_object_of_class('WorldPropertiesObject') + self.objects.update(self.new_objects) + self.new_objects = {} + # HACK: set some property defaults, no idea why they don't take :[ + self.collision_enabled = self.properties.collision_enabled = True + self.game_title = self.properties.game_title = new_game_title + self.save_to_file(DEFAULT_STATE_FILENAME) + return True + + def unload_game(self): + "Unload currently loaded game." + for obj in self.objects.values(): + obj.destroy() + self.cl.reset() + self.camera.reset() + self.player = None + self.globals = None + self.properties = None + if self.hud: + self.hud.destroy() + self.hud = None + self.objects, self.new_objects = {}, {} + self.rooms = {} + # art_loaded is cleared when game dir is set + self.selected_objects = [] + self.app.al.stop_all_music() + + def get_first_object_of_type(self, class_name, allow_subclasses=True): + "Return first object found with given class name." + c = self.get_class_by_name(class_name) + for obj in self.objects.values(): + # use isinstance so we catch subclasses + if c and allow_subclasses: + if isinstance(obj, c): + return obj + elif type(obj).__name__ == class_name: + return obj + + def get_all_objects_of_type(self, class_name, allow_subclasses=True): + "Return list of all objects found with given class name." + c = self.get_class_by_name(class_name) + objects = [] + for obj in self.objects.values(): + if c and allow_subclasses: + if isinstance(obj, c): + objects.append(obj) + elif type(obj).__name__ == class_name: + objects.append(obj) + return objects + + def set_for_all_objects(self, name, value): + "Set given variable name to given value for all objects." + for obj in self.objects.values(): + setattr(obj, name, value) + + def edit_art_for_selected(self): + if len(self.selected_objects) == 0: + return + self.app.exit_game_mode() + for obj in self.selected_objects: + for art_filename in obj.get_all_art(): + self.app.load_art_for_edit(art_filename) + + def move_selected(self, move_x, move_y, move_z): + "Shift position of selected objects by given x,y,z amount." + for obj in self.selected_objects: + obj.x += move_x + obj.y += move_y + obj.z += move_z + + def reset_game(self): + "Reset currently loaded game to last loaded state." + if self.game_dir: + self.load_game_state(self.last_state_loaded) + + def set_game_dir(self, dir_name, reset=False): + "Load game from given game directory." + if self.game_dir and dir_name == self.game_dir: + self.load_game_state(DEFAULT_STATE_FILENAME) + return + # loading a new game, wipe art list + self.art_loaded = [] + # check in user documents dir first + game_dir = TOP_GAME_DIR + dir_name + doc_game_dir = self.app.documents_dir + game_dir + for d in [doc_game_dir, game_dir]: + if not os.path.exists(d): + continue + self.game_dir = d + self.game_name = dir_name + if not d.endswith('/'): + self.game_dir += '/' + self.app.log('Game data folder is now %s' % self.game_dir) + # set sounds dir before loading state; some obj inits depend on it + self.sounds_dir = self.game_dir + SOUNDS_DIR + if reset: + # load in a default state, eg start.gs + self.load_game_state(DEFAULT_STATE_FILENAME) + else: + # if no reset load submodules into namespace from the get-go + self._import_all() + self.classes = self._get_all_loaded_classes() + break + if not self.game_dir: + self.app.log("Couldn't find game directory %s" % dir_name) + + def _remove_non_current_game_modules(self): + """ + Remove modules from previously-loaded games from both sys and + GameWorld's dicts. + """ + modules_to_remove = [] + games_dir_prefix = TOP_GAME_DIR.replace('/', '') + this_game_dir_prefix = '%s.%s' % (games_dir_prefix, self.game_name) + for module_name in sys.modules: + # remove any module that isn't for this game or part of its path + if module_name != games_dir_prefix and \ + module_name != this_game_dir_prefix and \ + module_name.startswith(games_dir_prefix) and \ + not module_name.startswith(this_game_dir_prefix + '.'): + modules_to_remove.append(module_name) + for module_name in modules_to_remove: + sys.modules.pop(module_name) + if module_name in self.modules: + self.modules.pop(module_name) + + def _get_game_modules_list(self): + "Return list of current game's modules from its scripts/ dir" + # build list of module files + modules_list = self.builtin_module_names[:] + # create appropriately-formatted python import path + module_path_prefix = '%s.%s.%s.' % (TOP_GAME_DIR.replace('/', ''), + self.game_name, + GAME_SCRIPTS_DIR.replace('/', '')) + for filename in os.listdir(self.game_dir + GAME_SCRIPTS_DIR): + # exclude emacs temp files and special world start script + if not filename.endswith('.py'): + continue + if filename.startswith('.#'): + continue + new_module_name = module_path_prefix + filename.replace('.py', '') + modules_list.append(new_module_name) + return modules_list + + def _import_all(self): + """ + Populate GameWorld.modules with the modules GW._get_all_loaded_classes + refers to when finding classes to spawn. + """ + # on first load, documents dir may not be in import path + if not self.app.documents_dir in sys.path: + sys.path += [self.app.documents_dir] + # clean modules dict before (re)loading anything + self._remove_non_current_game_modules() + # make copy of old modules table for import vs reload check + old_modules = self.modules.copy() + self.modules = {} + # load/reload new modules + for module_name in self._get_game_modules_list(): + try: + # always reload built in modules + if module_name in self.builtin_module_names or \ + module_name in old_modules: + m = importlib.reload(old_modules[module_name]) + else: + m = importlib.import_module(module_name) + self.modules[module_name] = m + except Exception as e: + self.app.log_import_exception(e, module_name) + + def toggle_pause(self): + "Toggles game pause state." + if not self.allow_pause: + return + self.paused = not self.paused + s = 'Game %spaused.' % ['un', ''][self.paused] + self.app.ui.message_line.post_line(s) + + def get_elapsed_time(self): + """ + Return total time world has been running (ie not paused) in + milliseconds. + """ + return self.app.get_elapsed_time() - self._pause_time + + def enable_player_camera_lock(self): + if self.player: + self.camera.focus_object = self.player + + def disable_player_camera_lock(self): + # change only if player has focus + if self.player and self.camera.focus_object is self.player: + self.camera.focus_object = None + + def toggle_player_camera_lock(self): + "Toggle whether camera is locked to player's location." + if self.player and self.camera.focus_object is self.player: + self.disable_player_camera_lock() + else: + self.enable_player_camera_lock() + + def toggle_grid_snap(self): + self.object_grid_snap = not self.object_grid_snap + + def handle_input(self, event, shift_pressed, alt_pressed, ctrl_pressed): + # pass event's key to any objects that want to handle it + if not event.type in [sdl2.SDL_KEYDOWN, sdl2.SDL_KEYUP]: + return + key = sdl2.SDL_GetKeyName(event.key.keysym.sym).decode() + key = key.lower() + args = (key, shift_pressed, alt_pressed, ctrl_pressed) + for obj in self.objects.values(): + if obj.handle_key_events: + if event.type == sdl2.SDL_KEYDOWN: + self.try_object_method(obj, obj.handle_key_down, args) + elif event.type == sdl2.SDL_KEYUP: + self.try_object_method(obj, obj.handle_key_up, args) + # TODO: handle_ functions for other types of input + + def get_colliders_at_point(self, point_x, point_y, + include_object_names=[], + include_class_names=[], + exclude_object_names=[], + exclude_class_names=[]): + """ + Return lists of colliding objects and shapes at given point that pass + given filters. + Includes are processed before excludes. + """ + whitelist_objects = len(include_object_names) > 0 + whitelist_classes = len(include_class_names) > 0 + blacklist_objects = len(exclude_object_names) > 0 + blacklist_classes = len(exclude_class_names) > 0 + # build list of objects to check + # always ignore non-colliders + colliders = [] + for obj in self.objects.values(): + if obj.should_collide(): + colliders.append(obj) + check_objects = [] + if whitelist_objects or whitelist_classes: + # list of class names -> list of classes + include_classes = [self.get_class_by_name(class_name) for class_name in include_class_names] + # only given objects of given classes + if whitelist_objects and whitelist_classes: + for obj_name in include_object_names: + obj = self.objects[obj_name] + for c in include_classes: + if isinstance(obj, c) and not obj in check_objects: + check_objects.append(obj) + # only given objects of any class + elif whitelist_objects and not whitelist_classes: + check_objects += [self.objects[obj_name] for obj_name in include_object_names] + # all colliders of given classes + elif whitelist_classes: + for obj in colliders: + for c in include_classes: + if isinstance(obj, c) and not obj in check_objects: + check_objects.append(obj) + else: + check_objects = colliders[:] + check_objects_unfiltered = check_objects[:] + if blacklist_objects or blacklist_classes: + exclude_classes = [self.get_class_by_name(class_name) for class_name in exclude_class_names] + for obj in check_objects_unfiltered: + if obj.name in exclude_object_names: + check_objects.remove(obj) + continue + for c in exclude_classes: + if isinstance(obj, c): + check_objects.remove(obj) + # check all objects that passed the filter(s) and build hit list + hit_objects = [] + hit_shapes = [] + for obj in check_objects: + # check bounds + if not obj.is_point_inside(point_x, point_y): + continue + # point overlaps with tile collision? + if obj.collision_shape_type == collision.CST_TILE: + tile_x, tile_y = obj.get_tile_at_point(point_x, point_y) + if (tile_x, tile_y) in obj.collision.tile_shapes: + hit_objects.append(obj) + hit_shapes.append(obj.collision.tile_shapes[(tile_x, tile_y)]) + else: + # point overlaps with primitive shape(s)? + for shape in obj.collision.shapes: + if shape.is_point_inside(point_y, point_y): + hit_objects.append(obj) + hit_shapes.append(shape) + return hit_objects, hit_shapes + + def frame_begin(self): + "Run at start of game loop iteration, before input/update/render." + for obj in self.objects.values(): + obj.art.updated_this_tick = False + obj.frame_begin() + + def frame_update(self): + for obj in self.objects.values(): + obj.frame_update() + + def try_object_method(self, obj, method, args=()): + "Try to run given object's given method, printing error if encountered." + #print('running %s.%s' % (obj.name, method.__name__)) + try: + method(*args) + if method.__name__ == 'update': + obj.last_update_failed = False + except Exception as e: + if method.__name__ == 'update' and obj.last_update_failed: + return + obj.last_update_failed = True + for line in traceback.format_exc().split('\n'): + if line and not 'try_object_method' in line and line.strip() != 'method()': + self.app.log(line.rstrip()) + s = 'Error in %s.%s! See console.' % (obj.name, method.__name__) + self.app.ui.message_line.post_line(s, 10, True) + + def pre_update(self): + "Run GO and Room pre_updates before GameWorld.update" + # add newly spawned objects to table + self.objects.update(self.new_objects) + self.new_objects = {} + # run pre_first_update / pre_update on all appropriate objects + for obj in self.objects.values(): + if not obj.pre_first_update_run: + self.try_object_method(obj, obj.pre_first_update) + obj.pre_first_update_run = True + # only run pre_update if not paused + elif not self.paused and (obj.is_in_current_room() or obj.update_if_outside_room): + # update timers + # (copy timers list in case a timer removes itself from object) + for timer in list(obj.timer_functions_pre_update.values())[:]: + timer.update() + obj.pre_update() + for room in self.rooms.values(): + if not room.pre_first_update_run: + room.pre_first_update() + room.pre_first_update_run = True + + def update(self): + self.mouse_moved(self.app.mouse_dx, self.app.mouse_dy) + if self.properties: + self.properties.update_from_world() + if not self.paused: + # update objects based on movement, then resolve collisions + for obj in self.objects.values(): + if obj.is_in_current_room() or obj.update_if_outside_room: + # update timers + for timer in list(obj.timer_functions_update.values())[:]: + timer.update() + self.try_object_method(obj, obj.update) + # subclass update may not call GameObject.update, + # set last update time here once we're sure it's done + obj.last_update_end = self.get_elapsed_time() + if self.collision_enabled: + self.cl.update() + for room in self.rooms.values(): + room.update() + # display debug text for selected object(s) + for obj in self.selected_objects: + s = obj.get_debug_text() + if s: + self.app.ui.debug_text.post_lines(s) + # remove objects marked for destruction + to_destroy = [] + for obj in self.objects.values(): + if obj.should_destroy: + to_destroy.append(obj.name) + for obj_name in to_destroy: + self.objects.pop(obj_name) + if len(to_destroy) > 0: + self.app.ui.edit_list_panel.items_changed() + if self.hud: + self.hud.update() + if self.paused: + self._pause_time += self.app.get_elapsed_time() - self.app.last_time + else: + self.updates += 1 + + def post_update(self): + "Run after GameWorld.update." + if self.paused: + return + for obj in self.objects.values(): + if obj.is_in_current_room() or obj.update_if_outside_room: + # update timers + for timer in list(obj.timer_functions_post_update.values())[:]: + timer.update() + obj.post_update() + + def render(self): + "Sort and draw all objects in Game Mode world." + visible_objects = [] + for obj in self.objects.values(): + if obj.should_destroy: + continue + obj.update_renderables() + # filter out objects outside current room here + # (if no current room or object is in no rooms, render it always) + in_room = self.current_room is None or obj.is_in_current_room() + hide_debug = obj.is_debug and not self.draw_debug_objects + # respect object's "should render at all" flag + if obj.visible and not hide_debug and \ + (self.show_all_rooms or in_room): + visible_objects.append(obj) + # + # process non "Y sort" objects first + # + draw_order = [] + collision_items = [] + y_objects = [] + for obj in visible_objects: + if obj.y_sort: + y_objects.append(obj) + continue + for i,z in enumerate(obj.art.layers_z): + # ignore invisible layers + if not obj.art.layers_visibility[i]: + continue + # only draw collision layer if show collision is set, OR if + # "draw collision layer" is set + if obj.collision_shape_type == collision.CST_TILE and \ + obj.col_layer_name == obj.art.layer_names[i] and \ + not obj.draw_col_layer: + if obj.show_collision: + item = RenderItem(obj, i, z + obj.z) + collision_items.append(item) + continue + item = RenderItem(obj, i, z + obj.z) + draw_order.append(item) + draw_order.sort(key=lambda item: item.sort_value, reverse=False) + # + # process "Y sort" objects + # + y_objects.sort(key=lambda obj: obj.y, reverse=True) + # draw layers of each Y-sorted object in Z order + for obj in y_objects: + items = [] + for i,z in enumerate(obj.art.layers_z): + if not obj.art.layers_visibility[i]: + continue + if obj.collision_shape_type == collision.CST_TILE and \ + obj.col_layer_name == obj.art.layer_names[i]: + if obj.show_collision: + item = RenderItem(obj, i, 0) + collision_items.append(item) + continue + item = RenderItem(obj, i, z) + items.append(item) + items.sort(key=lambda item: item.sort_value, reverse=False) + for item in items: + draw_order.append(item) + for item in draw_order: + item.obj.render(item.layer) + self.grid.render() + # + # draw debug stuff: collision tiles, origins/boxes, debug lines + # + for item in collision_items: + item.obj.render(item.layer) + for obj in self.objects.values(): + obj.render_debug() + if self.hud and self.draw_hud: + self.hud.render() + + def save_last_state(self): + "Save over last loaded state." + # strip down to base filename w/o extension :/ + last_state = self.last_state_loaded + last_state = os.path.basename(last_state) + last_state = os.path.splitext(last_state)[0] + self.save_to_file(last_state) + + def save_to_file(self, filename=None): + "Save current world state to a file." + objects = [] + for obj in self.objects.values(): + if obj.should_save: + objects.append(obj.get_dict()) + d = {'objects': objects} + # save rooms if any exist + if len(self.rooms) > 0: + rooms = [room.get_dict() for room in self.rooms.values()] + d['rooms'] = rooms + if self.current_room: + d['current_room'] = self.current_room.name + if filename and filename != '': + if not filename.endswith(STATE_FILE_EXTENSION): + filename += '.' + STATE_FILE_EXTENSION + filename = '%s%s' % (self.game_dir, filename) + else: + # state filename example: + # games/mytestgame2/1431116386.gs + timestamp = int(time.time()) + filename = '%s%s.%s' % (self.game_dir, timestamp, + STATE_FILE_EXTENSION) + json.dump(d, open(filename, 'w'), + sort_keys=True, indent=1) + self.app.log('Saved game state %s to disk.' % filename) + self.app.update_window_title() + + def _get_all_loaded_classes(self): + """ + Return classname,class dict of all GameObject classes in loaded modules. + """ + classes = {} + for module in self.modules.values(): + for k,v in module.__dict__.items(): + # skip anything that's not a game class + if not type(v) is type: + continue + base_classes = (game_object.GameObject, game_hud.GameHUD, game_room.GameRoom) + # TODO: find out why above works but below doesn't!! O___O + #base_classes = self.builtin_base_classes + if issubclass(v, base_classes): + classes[k] = v + return classes + + def get_class_by_name(self, class_name): + "Return Class object for given class name." + return self.classes.get(class_name, None) + + def reset_object_in_place(self, obj): + """ + "Reset" given object to its class defaults. + Actually destroys object in place and creates a new one. + """ + x, y = obj.x, obj.y + obj_class = obj.__class__.__name__ + spawned = self.spawn_object_of_class(obj_class, x, y) + if spawned: + self.app.log('%s reset to class defaults' % obj.name) + if obj is self.player: + self.player = spawned + obj.destroy() + + def duplicate_selected_objects(self): + "Duplicate all selected objects. Calls GW.duplicate_object" + new_objects = [] + for obj in self.selected_objects: + new_objects.append(self.duplicate_object(obj)) + # report on objects created + if len(new_objects) == 1: + self.app.log('%s created from %s' % (new_objects[0].name, obj.name)) + elif len(new_objects) > 1: + self.app.log('%s new objects created' % len(new_objects)) + + def duplicate_object(self, obj): + "Create a duplicate of given object." + d = obj.get_dict() + # offset new object's location + x, y = d['x'], d['y'] + x += obj.renderable.width + y -= obj.renderable.height + d['x'], d['y'] = x, y + # new object needs a unique name, use a temp one until object exists + # for real and we can give it a proper, more-likely-to-be-unique one + d['name'] = obj.name + ' TEMP COPY NAME' + new_obj = self.spawn_object_from_data(d) + # give object a non-duplicate name + self.rename_object(new_obj, new_obj.get_unique_name()) + # tell object's rooms about it + for room_name in new_obj.rooms: + self.world.rooms[room_name].add_object(new_obj) + # update list after changes have been applied to object + self.app.ui.edit_list_panel.items_changed() + return new_obj + + def rename_object(self, obj, new_name): + "Give specified object a new name. Doesn't accept already-in-use names." + self.objects.update(self.new_objects) + for other_obj in self.objects.values(): + if not other_obj is self and other_obj.name == new_name: + self.app.ui.message_line.post_line("Can't rename %s to %s, name already in use" % (obj.name, new_name)) + return + self.objects.pop(obj.name) + old_name = obj.name + obj.name = new_name + self.objects[obj.name] = obj + for room in self.rooms.values(): + if obj in room.objects.values(): + room.objects.pop(old_name) + room.objects[obj.name] = self + + def spawn_object_of_class(self, class_name, x=None, y=None): + "Spawn a new object of given class name at given location." + if not class_name in self.classes: + # no need for log here, import_all prints exception cause + #self.app.log("Couldn't find class %s" % class_name) + return + d = {'class_name': class_name} + if x is not None and y is not None: + d['x'], d['y'] = x, y + new_obj = self.spawn_object_from_data(d) + self.app.ui.edit_list_panel.items_changed() + return new_obj + + def spawn_object_from_data(self, object_data): + "Spawn a new object with properties populated from given data dict." + # load module and class + class_name = object_data.get('class_name', None) + if not class_name or not class_name in self.classes: + # no need for log here, import_all prints exception cause + #self.app.log("Couldn't parse class %s" % class_name) + return + obj_class = self.classes[class_name] + # pass in object data + new_object = obj_class(self, object_data) + return new_object + + def add_room(self, new_room_name, new_room_classname='GameRoom'): + "Add a new Room with given name of (optional) given class." + if new_room_name in self.rooms: + self.log('Room called %s already exists!' % new_room_name) + return + new_room_class = self.classes[new_room_classname] + new_room = new_room_class(self, new_room_name) + self.rooms[new_room.name] = new_room + + def remove_room(self, room_name): + "Delete Room with given name." + if not room_name in self.rooms: + return + room = self.rooms.pop(room_name) + if room is self.current_room: + self.current_room = None + room.destroy() + + def change_room(self, new_room_name): + "Set world's current active room to Room with given name." + if not new_room_name in self.rooms: + self.app.log("Couldn't change to missing room %s" % new_room_name) + return + old_room = self.current_room + self.current_room = self.rooms[new_room_name] + # tell old and new rooms they've been exited and entered, respectively + if old_room: + old_room.exited(self.current_room) + self.current_room.entered(old_room) + + def rename_room(self, room, new_room_name): + "Rename given Room to new given name." + old_name = room.name + room.name = new_room_name + self.rooms.pop(old_name) + self.rooms[new_room_name] = room + # update all objects in this room + for obj in self.objects.values(): + if old_name in obj.rooms: + obj.rooms.pop(old_name) + obj.rooms[new_room_name] = room + + def load_game_state(self, filename=DEFAULT_STATE_FILENAME): + "Load game state with given filename." + if not os.path.exists(filename): + filename = self.game_dir + filename + if not filename.endswith(STATE_FILE_EXTENSION): + filename += '.' + STATE_FILE_EXTENSION + self.app.enter_game_mode() + self.unload_game() + # tell list panel to reset, its contents might get jostled + self.app.ui.edit_list_panel.game_reset() + # import all submodules and catalog classes + self._import_all() + self.classes = self._get_all_loaded_classes() + try: + d = json.load(open(filename)) + #self.app.log('Loading game state %s...' % filename) + except: + self.app.log("Couldn't load game state from %s" % filename) + #self.app.log(sys.exc_info()) + return + errors = False + # spawn objects + for obj_data in d['objects']: + obj = self.spawn_object_from_data(obj_data) + if not obj: + errors = True + # spawn a WorldPropertiesObject if one doesn't exist + for obj in self.new_objects.values(): + if type(obj).__name__ == self.properties_object_class_name: + self.properties = obj + break + if not self.properties: + self.properties = self.spawn_object_of_class(self.properties_object_class_name, 0, 0) + # spawn a WorldGlobalStateObject + self.globals = self.spawn_object_of_class(self.globals_object_class_name, 0, 0) + # just for first update, merge new objects list into objects list + self.objects.update(self.new_objects) + # create rooms + for room_data in d.get('rooms', []): + # get room class + room_class_name = room_data.get('class_name', None) + room_class = self.classes.get(room_class_name, game_room.GameRoom) + room = room_class(self, room_data['name'], room_data) + self.rooms[room.name] = room + start_room = self.rooms.get(d.get('current_room', None), None) + if start_room: + self.change_room(start_room.name) + # spawn hud + hud_class = self.classes[d.get('hud_class', self.hud_class_name)] + self.hud = hud_class(self) + self.hud_class_name = hud_class.__name__ + if not errors and self.app.init_success: + self.app.log('Loaded game state from %s' % filename) + self.last_state_loaded = filename + self.set_for_all_objects('show_collision', self.show_collision_all) + self.set_for_all_objects('show_bounds', self.show_bounds_all) + self.set_for_all_objects('show_origin', self.show_origin_all) + self.app.update_window_title() + self.app.ui.edit_list_panel.items_changed() + #self.report() + + def report(self): + "Print (not log) information about current world state." + print('--------------\n%s report:' % self) + obj_arts, obj_rends, obj_dbg_rends, obj_cols, obj_col_rends = 0, 0, 0, 0, 0 + attachments = 0 + # create merged dict of existing and just-spawned objects + all_objects = self.objects.copy() + all_objects.update(self.new_objects) + print('%s objects:' % len(all_objects)) + for obj in all_objects.values(): + obj_arts += len(obj.arts) + if obj.renderable is not None: + obj_rends += 1 + if obj.origin_renderable is not None: + obj_dbg_rends += 1 + if obj.bounds_renderable is not None: + obj_dbg_rends += 1 + if obj.collision: + obj_cols += 1 + obj_col_rends += len(obj.collision.renderables) + attachments += len(obj.attachments) + print(""" + %s arts in objects, %s arts loaded, + %s HUD arts, %s HUD renderables, + %s renderables, %s debug renderables, + %s collideables, %s collideable viz renderables, + %s attachments""" % (obj_arts, len(self.art_loaded), len(self.hud.arts), + len(self.hud.renderables), + obj_rends, obj_dbg_rends, + obj_cols, obj_col_rends, attachments)) + self.cl.report() + print('%s charsets loaded, %s palettes' % (len(self.app.charsets), + len(self.app.palettes))) + print('%s arts loaded for edit' % len(self.app.art_loaded_for_edit)) + + def toggle_all_origin_viz(self): + "Toggle visibility of XYZ markers for all object origins." + self.show_origin_all = not self.show_origin_all + self.set_for_all_objects('show_origin', self.show_origin_all) + + def toggle_all_bounds_viz(self): + "Toggle visibility of boxes for all object bounds." + self.show_bounds_all = not self.show_bounds_all + self.set_for_all_objects('show_bounds', self.show_bounds_all) + + def toggle_all_collision_viz(self): + "Toggle visibility of debug lines for all object Collideables." + self.show_collision_all = not self.show_collision_all + self.set_for_all_objects('show_collision', self.show_collision_all) + + def destroy(self): + self.unload_game() + self.art_loaded = [] diff --git a/games/crawler/art/maze1.psci b/games/crawler/art/maze1.psci new file mode 100644 index 0000000..0ce8715 --- /dev/null +++ b/games/crawler/art/maze1.psci @@ -0,0 +1,2431 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 15.07056893846701, + -11.14376966393841, + 17.074097831634077 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 20, + "palette": "c64_pepto", + "selected_bg_color": 1, + "selected_char": 0, + "selected_fg_color": 0, + "selected_xform": 0, + "width": 20 +} \ No newline at end of file diff --git a/games/crawler/art/maze2.psci b/games/crawler/art/maze2.psci new file mode 100644 index 0000000..bc4fe15 --- /dev/null +++ b/games/crawler/art/maze2.psci @@ -0,0 +1,5431 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 17.807096370837836, + -14.04672870100407, + 17.5524355605633 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 30, + "palette": "c64_pepto", + "selected_bg_color": 1, + "selected_char": 255, + "selected_fg_color": 5, + "selected_xform": 0, + "width": 30 +} \ No newline at end of file diff --git a/games/crawler/charsets/jpetscii_crawler.char b/games/crawler/charsets/jpetscii_crawler.char new file mode 100644 index 0000000..222b2a6 --- /dev/null +++ b/games/crawler/charsets/jpetscii_crawler.char @@ -0,0 +1,24 @@ +// JPETSCII variant with added characters for the crawler game +jpetscii_crawler.png +16, 20 + ABCDEFGHIJKLMNO +PQRSTUVWXYZ[]{} +"abcdefghijklmno +pqrstuvwxyz +1234567890-=_+:; +!@#$%^&*(),.? + + + + + + + + + + `' + + + + +// end diff --git a/games/crawler/charsets/jpetscii_crawler.png b/games/crawler/charsets/jpetscii_crawler.png new file mode 100644 index 0000000..c6d2335 Binary files /dev/null and b/games/crawler/charsets/jpetscii_crawler.png differ diff --git a/games/crawler/scripts/crawler.py b/games/crawler/scripts/crawler.py new file mode 100644 index 0000000..e1109aa --- /dev/null +++ b/games/crawler/scripts/crawler.py @@ -0,0 +1,54 @@ + +from game_object import GameObject + +# initial work: 2019-02-17 and 18 +# FP view research: 2021-11-22 + +""" +wall art breakdown: +what are the maze tiles ahead of the viewer? +left / center / right, at different distances (1 tile away, 2 tiles away, etc) +the further away the tiles, the wider a swath of them we need to composite + +each "tile" -> a vertical slice for each grid square that shows either a wall or an empty space + +art.composite_to(src_frame, src_layer, src_x, src_y, width, height, + dest_art, dest_frame, dest_layer, dest_x, dest_y) +(art.composite_from) + +very useful: +https://weblogs.asp.net/bleroy/dungeon-master +"just draw the entire left/right perspective wall and clip out portions of it where there's a passage" method = good + +face-on wall tilers: "distance 0", "distance 1", etc + +naming: +"left 1 (1 tile immediately to our left) distance 3 (3 tiles away from POV)", "front distance 2 (2 tiles from POV)", etc + +""" + +DIR_NORTH = (0, -1) +DIR_SOUTH = (0, 1) +DIR_EAST = (1, 0) +DIR_WEST = (-1, 0) +LEFT_TURN_DIRS = { DIR_NORTH: DIR_WEST, DIR_WEST: DIR_SOUTH, + DIR_SOUTH: DIR_EAST, DIR_EAST: DIR_NORTH } +RIGHT_TURN_DIRS = { DIR_NORTH: DIR_EAST, DIR_EAST: DIR_SOUTH, + DIR_SOUTH: DIR_WEST, DIR_WEST: DIR_NORTH } +DIR_NAMES = { DIR_NORTH: 'north', DIR_SOUTH: 'south', + DIR_EAST: 'east', DIR_WEST: 'west' } +OPPOSITE_DIRS = { DIR_NORTH: DIR_SOUTH, DIR_SOUTH: DIR_NORTH, + DIR_EAST: DIR_WEST, DIR_WEST: DIR_EAST } + + +class CompositeTester(GameObject): + # slightly confusing terms here, our "source" will be loaded at runtime + art_src = 'comptest_dest' + use_art_instance = True + + def pre_first_update(self): + # load composite source art + comp_src_art = self.app.load_art('comptest_src', False) + self.art.composite_from(comp_src_art, 0, 0, 0, 0, + comp_src_art.width, comp_src_art.height, + 0, 0, 3, 2) diff --git a/games/crawler/scripts/line_tester.py b/games/crawler/scripts/line_tester.py new file mode 100644 index 0000000..ad71edc --- /dev/null +++ b/games/crawler/scripts/line_tester.py @@ -0,0 +1,57 @@ + +import vector + +from game_object import GameObject +from renderable_line import DebugLineRenderable + + +# stuff for troubleshooting "get tiles intersecting line" etc + + +class DebugMarker(GameObject): + art_width, art_height = 1, 1 + art_off_pct_x, art_off_pct_y = 0.0, 0.0 + generate_art = True + should_save = False + alpha = 0.5 + def pre_first_update(self): + # red X with yellow background + self.art.set_tile_at(0, 0, 0, 0, 24, 3, 8) + self.z = 0.1 + + +class LineTester(GameObject): + art_width, art_height = 40, 40 + art_off_pct_x, art_off_pct_y = 0.0, 0.0 + generate_art = True + + def pre_first_update(self): + self.mark_a = self.world.spawn_object_of_class('DebugMarker', -3, 33) + self.mark_b = self.world.spawn_object_of_class('DebugMarker', -10, 40) + self.z = -0.01 + self.world.grid.visible = True + self.line = DebugLineRenderable(self.app, self.art) + self.line.z = 0.0 + self.line.line_width = 3 + + def update(self): + GameObject.update(self) + # debug line + self.line.set_lines([(self.mark_a.x, self.mark_a.y, 0.0), + (self.mark_b.x, self.mark_b.y, 0.0)]) + # paint tiles under line + self.art.clear_frame_layer(0, 0, 7) + line_func = vector.get_tiles_along_line + line_func = vector.get_tiles_along_integer_line + tiles = line_func(self.mark_a.x, self.mark_a.y, + self.mark_b.x, self.mark_b.y) + for tile in tiles: + x, y = self.get_tile_at_point(tile[0], tile[1]) + char, fg = 1, 6 + self.art.set_tile_at(0, 0, x, y, char, fg) + + def render(self, layer, z_override=None): + GameObject.render(self, layer, z_override) + # TODO not sure why this is necessary, pre_first_update should run before first render(), right? blech + if hasattr(self, 'line') and self.line: + self.line.render() diff --git a/games/crawler/scripts/player.py b/games/crawler/scripts/player.py new file mode 100644 index 0000000..16f5caa --- /dev/null +++ b/games/crawler/scripts/player.py @@ -0,0 +1,58 @@ + +from game_object import GameObject +from game_util_objects import Player + +from games.crawler.scripts.crawler import DIR_NORTH, DIR_SOUTH, DIR_EAST, DIR_WEST, LEFT_TURN_DIRS, RIGHT_TURN_DIRS, DIR_NAMES, OPPOSITE_DIRS + + +class CrawlPlayer(Player): + should_save = False # we are spawned by maze + generate_art = True + art_width, art_height = 1, 1 + art_charset, art_palette = 'jpetscii', 'c64_pepto' + art_off_pct_x, art_off_pct_y = 0, 0 + # bespoke grid-based movement method + physics_move = False + handle_key_events = True + + view_range_tiles = 8 + fg_color = 8 # yellow + dir_chars = { DIR_NORTH: 147, + DIR_SOUTH: 163, + DIR_EAST: 181, + DIR_WEST: 180 + } + + def pre_first_update(self): + Player.pre_first_update(self) + # top-down facing + self.direction = DIR_NORTH + self.maze.update_tile_visibilities() + self.art.set_tile_at(0, 0, 0, 0, self.dir_chars[self.direction], self.fg_color) + + def handle_key_down(self, key, shift_pressed, alt_pressed, ctrl_pressed): + # turning? + if key == 'left': + self.direction = LEFT_TURN_DIRS[self.direction] + elif key == 'right': + self.direction = RIGHT_TURN_DIRS[self.direction] + # moving? + elif key == 'up' or key == 'down': + x, y = self.maze.get_tile_at_point(self.x, self.y) + if key == 'up': + new_x = x + self.direction[0] + new_y = y + self.direction[1] + else: + new_x = x - self.direction[0] + new_y = y - self.direction[1] + # is move valid? + if self.maze.is_tile_solid(new_x, new_y): + # TEMP negative feedback + dir_name = DIR_NAMES[self.direction] if key == 'up' else DIR_NAMES[OPPOSITE_DIRS[self.direction]] + self.app.log("can't go %s!" % dir_name) + else: + self.x, self.y = self.maze.x + new_x, self.maze.y - new_y + # update art to show facing + self.art.set_char_index_at(0, 0, 0, 0, self.dir_chars[self.direction]) + # update maze tiles + self.maze.update_tile_visibilities() diff --git a/games/crawler/scripts/topview.py b/games/crawler/scripts/topview.py new file mode 100644 index 0000000..45401c3 --- /dev/null +++ b/games/crawler/scripts/topview.py @@ -0,0 +1,123 @@ + +from game_object import GameObject +from vector import get_tiles_along_integer_line + +from art import TileIter + +from random import randint # DEBUG + +from games.crawler.scripts.crawler import DIR_NORTH, DIR_SOUTH, DIR_EAST, DIR_WEST, LEFT_TURN_DIRS, RIGHT_TURN_DIRS, DIR_NAMES, OPPOSITE_DIRS + + +class CrawlTopDownView(GameObject): + art_src = 'maze2' + art_off_pct_x, art_off_pct_y = 0, 0 + # we will be modifying this view at runtime so don't write on the source art + use_art_instance = True + # first character we find with this index will be where we spawn player + playerstart_char_index = 147 + # undiscovered = player has never seen this tile + undiscovered_color_index = 1 # black + # discovered = player has seen this tile but isn't currently looking at it + discovered_color_index = 12 # dark grey + + def pre_first_update(self): + # scan art for spot to spawn player + player_x, player_y = -1, -1 + for frame, layer, x, y in TileIter(self.art): + if self.art.get_char_index_at(frame, layer, x, y) == self.playerstart_char_index: + player_x, player_y = self.x + x, self.y - y + # clear the tile at this spot in our art + self.art.set_char_index_at(frame, layer, x, y, 0) + break + self.world.player = self.world.spawn_object_of_class('CrawlPlayer', player_x, player_y) + # give player a ref to us + self.world.player.maze = self + # make a copy of original layer to color for visibility, hide original + self.art.duplicate_layer(0) + self.art.layers_visibility[0] = False + for frame, layer, x, y in TileIter(self.art): + if layer == 0: + continue + # set all tiles undiscovered + self.art.set_color_at(0, layer, x, y, self.undiscovered_color_index) + self.art.mark_all_frames_changed() # DEBUG - this fixes the difference in result when use_art_instance=True! why? + # keep a list of tiles player can see + self.player_visible_tiles = [] + + def is_tile_solid(self, x, y): + return self.art.get_char_index_at(0, 0, x, y) != 0 + + # world to tile: self.get_tile_at_point(world_x, world_y) + # tile to world: self.get_tile_loc(tile_x, tile_y) + + def get_visible_tiles(self, x, y, dir_x, dir_y, tile_range, see_thru_walls=False): + "return tiles visible from given point facing given direction" + # NOTE: all the calculations here are done in this object's art's tile + # coordinates, not world space. so -Y is up/north, -X is left/west. + tiles = [] + # find back left corner of frustum and direction to scan along + if (dir_x, dir_y) == DIR_NORTH: + scan_start_x, scan_start_y = x - tile_range, y - tile_range + scan_dir_x, scan_dir_y = 1, 0 + elif (dir_x, dir_y) == DIR_SOUTH: + scan_start_x, scan_start_y = x + tile_range, y + tile_range + scan_dir_x, scan_dir_y = -1, 0 + elif (dir_x, dir_y) == DIR_EAST: + scan_start_x, scan_start_y = x + tile_range, y - tile_range + scan_dir_x, scan_dir_y = 0, 1 + elif (dir_x, dir_y) == DIR_WEST: + scan_start_x, scan_start_y = x - tile_range, y + tile_range + scan_dir_x, scan_dir_y = 0, -1 + # scan back of frustum tile by tile left to right, + # checking each tile hit + scan_distance = 0 + scan_length = tile_range * 2 + 1 # TODO make sure this is correct + while scan_distance < scan_length: + scan_x = scan_start_x + (scan_dir_x * scan_distance) + scan_y = scan_start_y + (scan_dir_y * scan_distance) + hit_tiles = get_tiles_along_integer_line(x, y, scan_x, scan_y) + for tile in hit_tiles: + tile_x, tile_y = tile[0], tile[1] + # skip out-of-bounds tiles + if 0 > tile_x or tile_x >= self.art.width or \ + 0 > tile_y or tile_y >= self.art.height: + continue + # whether this tile is solid or not, we have seen it + if not tile in tiles: + tiles.append((tile_x, tile_y)) + if not see_thru_walls and self.is_tile_solid(*tile): + break + scan_distance += 1 + return tiles + + def update_tile_visibilities(self): + """ + update our art's tile visuals based on what tiles can be, can't be, + or have been seen. + """ + previously_visible_tiles = self.player_visible_tiles[:] + p = self.world.player + px, py = self.get_tile_at_point(p.x, p.y) + self.player_visible_tiles = self.get_visible_tiles(px, py, + *p.direction, + p.view_range_tiles, + see_thru_walls=False) + #print(self.player_visible_tiles) + # color currently visible tiles + for tile in self.player_visible_tiles: + #print(tile) + if 0 > tile[0] or tile[0] >= self.art.width or \ + 0 > tile[1] or tile[1] >= self.art.height: + continue + if self.is_tile_solid(*tile): + orig_color = self.art.get_fg_color_index_at(0, 0, *tile) + self.art.set_color_at(0, 1, *tile, orig_color) + else: + #self.art.set_color_at(0, 1, *tile, randint(2, 14)) # DEBUG + pass + # color "previously seen" tiles + for tile in previously_visible_tiles: + if not tile in self.player_visible_tiles and \ + self.is_tile_solid(*tile): + self.art.set_color_at(0, 1, *tile, self.discovered_color_index) diff --git a/games/crawler/start.gs b/games/crawler/start.gs new file mode 100644 index 0000000..76fee0f --- /dev/null +++ b/games/crawler/start.gs @@ -0,0 +1,68 @@ +{ + "objects": [ + { + "bg_color_a": 0, + "bg_color_b": 0, + "bg_color_g": 0, + "bg_color_r": 0, + "camera_x": -2.6214004608647863, + "camera_y": 2.427993948091052, + "camera_z": 14.94938506263711, + "class_name": "WorldPropertiesObject", + "collision_enabled": true, + "draw_debug_objects": true, + "draw_hud": true, + "game_title": "Crawler", + "globals_object_class_name": "WorldGlobalsObject", + "gravity_x": 0.0, + "gravity_y": 0.0, + "gravity_z": 0.0, + "hud_class_name": "GameHUD", + "object_grid_snap": true, + "player_camera_lock": true, + "room_camera_changes_enabled": true, + "show_all_rooms": false, + "show_bounds_all": false, + "show_collision_all": false, + "show_origin_all": false + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "comptest_dest", + "class_name": "CompositeTester", + "facing": 2, + "locked": false, + "name": "CompositeTester_0922C170", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -28.0, + "y": -8.0, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0, + "art_off_pct_y": 0, + "art_src": "maze1", + "class_name": "CrawlTopDownView", + "facing": 2, + "locked": false, + "name": "CrawlTopDownView_7f8c74de6820", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -17.0, + "y": 12.0, + "y_sort": false, + "z": 0.0 + } + ] +} \ No newline at end of file diff --git a/games/cronotest/art/bed.psci b/games/cronotest/art/bed.psci new file mode 100644 index 0000000..f47a108 --- /dev/null +++ b/games/cronotest/art/bed.psci @@ -0,0 +1,1832 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 5, + -6.0, + 11.168324452166797 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 39, + "char": 108, + "fg": 44, + "xform": 0 + }, + { + "bg": 21, + "char": 100, + "fg": 0, + "xform": 0 + }, + { + "bg": 35, + "char": 105, + "fg": 40, + "xform": 0 + }, + { + "bg": 35, + "char": 68, + "fg": 39, + "xform": 0 + }, + { + "bg": 35, + "char": 106, + "fg": 40, + "xform": 0 + }, + { + "bg": 21, + "char": 78, + "fg": 40, + "xform": 0 + }, + { + "bg": 40, + "char": 99, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 92, + "fg": 40, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 39, + "char": 93, + "fg": 21, + "xform": 0 + }, + { + "bg": 40, + "char": 78, + "fg": 44, + "xform": 0 + }, + { + "bg": 39, + "char": 118, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 157, + "fg": 39, + "xform": 0 + }, + { + "bg": 39, + "char": 55, + "fg": 40, + "xform": 0 + }, + { + "bg": 40, + "char": 108, + "fg": 39, + "xform": 0 + }, + { + "bg": 39, + "char": 108, + "fg": 44, + "xform": 0 + }, + { + "bg": 40, + "char": 115, + "fg": 33, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 40, + "xform": 0 + }, + { + "bg": 14, + "char": 99, + "fg": 39, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 9, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 92, + "fg": 21, + "xform": 0 + }, + { + "bg": 2, + "char": 78, + "fg": 40, + "xform": 0 + }, + { + "bg": 39, + "char": 33, + "fg": 21, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 33, + "char": 101, + "fg": 37, + "xform": 0 + }, + { + "bg": 9, + "char": 79, + "fg": 44, + "xform": 0 + }, + { + "bg": 30, + "char": 115, + "fg": 29, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 30, + "xform": 0 + }, + { + "bg": 12, + "char": 102, + "fg": 17, + "xform": 0 + }, + { + "bg": 44, + "char": 113, + "fg": 17, + "xform": 0 + }, + { + "bg": 33, + "char": 134, + "fg": 18, + "xform": 0 + }, + { + "bg": 35, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 30, + "char": 109, + "fg": 21, + "xform": 0 + }, + { + "bg": 44, + "char": 109, + "fg": 30, + "xform": 0 + }, + { + "bg": 9, + "char": 110, + "fg": 17, + "xform": 0 + }, + { + "bg": 37, + "char": 106, + "fg": 17, + "xform": 0 + }, + { + "bg": 33, + "char": 106, + "fg": 17, + "xform": 0 + }, + { + "bg": 21, + "char": 110, + "fg": 17, + "xform": 0 + }, + { + "bg": 17, + "char": 109, + "fg": 33, + "xform": 0 + }, + { + "bg": 33, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 33, + "char": 102, + "fg": 21, + "xform": 0 + }, + { + "bg": 30, + "char": 97, + "fg": 17, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 30, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 46, + "fg": 12, + "xform": 0 + }, + { + "bg": 33, + "char": 102, + "fg": 30, + "xform": 0 + }, + { + "bg": 21, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 33, + "char": 95, + "fg": 12, + "xform": 0 + }, + { + "bg": 37, + "char": 39, + "fg": 17, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 101, + "fg": 37, + "xform": 0 + }, + { + "bg": 37, + "char": 107, + "fg": 33, + "xform": 0 + }, + { + "bg": 33, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 33, + "char": 102, + "fg": 21, + "xform": 0 + }, + { + "bg": 37, + "char": 31, + "fg": 17, + "xform": 0 + }, + { + "bg": 17, + "char": 145, + "fg": 37, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 146, + "fg": 37, + "xform": 0 + }, + { + "bg": 9, + "char": 102, + "fg": 17, + "xform": 0 + }, + { + "bg": 21, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 33, + "char": 93, + "fg": 21, + "xform": 0 + }, + { + "bg": 37, + "char": 67, + "fg": 17, + "xform": 0 + }, + { + "bg": 17, + "char": 46, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 30, + "xform": 0 + }, + { + "bg": 17, + "char": 101, + "fg": 37, + "xform": 0 + }, + { + "bg": 37, + "char": 67, + "fg": 30, + "xform": 0 + }, + { + "bg": 21, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 33, + "char": 91, + "fg": 37, + "xform": 0 + }, + { + "bg": 37, + "char": 98, + "fg": 17, + "xform": 0 + }, + { + "bg": 17, + "char": 121, + "fg": 43, + "xform": 0 + }, + { + "bg": 17, + "char": 121, + "fg": 25, + "xform": 0 + }, + { + "bg": 17, + "char": 121, + "fg": 43, + "xform": 0 + }, + { + "bg": 37, + "char": 13, + "fg": 17, + "xform": 0 + }, + { + "bg": 9, + "char": 66, + "fg": 30, + "xform": 0 + }, + { + "bg": 33, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 33, + "char": 86, + "fg": 39, + "xform": 0 + }, + { + "bg": 44, + "char": 120, + "fg": 12, + "xform": 0 + }, + { + "bg": 40, + "char": 69, + "fg": 21, + "xform": 0 + }, + { + "bg": 21, + "char": 86, + "fg": 39, + "xform": 0 + }, + { + "bg": 21, + "char": 86, + "fg": 39, + "xform": 0 + }, + { + "bg": 40, + "char": 5, + "fg": 21, + "xform": 0 + }, + { + "bg": 10, + "char": 87, + "fg": 9, + "xform": 0 + }, + { + "bg": 21, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 39, + "char": 100, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 120, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 98, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 72, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 72, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 39, + "char": 120, + "fg": 21, + "xform": 0 + }, + { + "bg": 42, + "char": 66, + "fg": 33, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 39, + "char": 118, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 121, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 121, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 121, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 121, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 121, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 118, + "fg": 14, + "xform": 0 + }, + { + "bg": 3, + "char": 33, + "fg": 21, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0.1 + } + ] + } + ], + "height": 15, + "palette": "chrono_bg", + "width": 10 +} \ No newline at end of file diff --git a/games/cronotest/art/chest.psci b/games/cronotest/art/chest.psci new file mode 100644 index 0000000..c3acfbe --- /dev/null +++ b/games/cronotest/art/chest.psci @@ -0,0 +1,320 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 7, + -3.380808832219176, + 8.418119671221483 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 144, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 144, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 164, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 164, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 165, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 222, + "fg": 19, + "xform": 0 + }, + { + "bg": 10, + "char": 254, + "fg": 19, + "xform": 0 + }, + { + "bg": 10, + "char": 253, + "fg": 19, + "xform": 0 + }, + { + "bg": 10, + "char": 165, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 101, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 117, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 131, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 132, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 132, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 133, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 165, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 7, + "palette": "chrono_bg", + "width": 7 +} \ No newline at end of file diff --git a/games/cronotest/art/chrono_bg.psci b/games/cronotest/art/chrono_bg.psci new file mode 100644 index 0000000..40755b9 --- /dev/null +++ b/games/cronotest/art/chrono_bg.psci @@ -0,0 +1,24224 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 21.068935656602946, + -22.00913696783814, + 16.839929741810913 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 4, + "char": 100, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 121, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 121, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 117, + "fg": 11, + "xform": 0 + }, + { + "bg": 6, + "char": 120, + "fg": 7, + "xform": 0 + }, + { + "bg": 9, + "char": 90, + "fg": 16, + "xform": 0 + }, + { + "bg": 12, + "char": 86, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 86, + "fg": 13, + "xform": 0 + }, + { + "bg": 9, + "char": 91, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 86, + "fg": 13, + "xform": 0 + }, + { + "bg": 9, + "char": 89, + "fg": 16, + "xform": 0 + }, + { + "bg": 6, + "char": 120, + "fg": 7, + "xform": 0 + }, + { + "bg": 5, + "char": 82, + "fg": 11, + "xform": 0 + }, + { + "bg": 5, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 108, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 86, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 72, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 121, + "fg": 3, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 121, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 91, + "fg": 40, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 16, + "xform": 0 + }, + { + "bg": 3, + "char": 108, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 108, + "fg": 2, + "xform": 0 + }, + { + "bg": 11, + "char": 95, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 95, + "fg": 9, + "xform": 0 + }, + { + "bg": 8, + "char": 137, + "fg": 15, + "xform": 0 + }, + { + "bg": 13, + "char": 93, + "fg": 15, + "xform": 0 + }, + { + "bg": 13, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 13, + "char": 102, + "fg": 7, + "xform": 0 + }, + { + "bg": 13, + "char": 95, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 39, + "fg": 9, + "xform": 0 + }, + { + "bg": 6, + "char": 20, + "fg": 5, + "xform": 0 + }, + { + "bg": 11, + "char": 102, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 101, + "fg": 5, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 86, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 86, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 87, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 100, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 117, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 120, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 123, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 86, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 17, + "char": 87, + "fg": 16, + "xform": 0 + }, + { + "bg": 3, + "char": 92, + "fg": 17, + "xform": 0 + }, + { + "bg": 4, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 16, + "char": 91, + "fg": 17, + "xform": 0 + }, + { + "bg": 17, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 16, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 108, + "fg": 5, + "xform": 0 + }, + { + "bg": 11, + "char": 95, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 101, + "fg": 7, + "xform": 0 + }, + { + "bg": 15, + "char": 3, + "fg": 8, + "xform": 0 + }, + { + "bg": 13, + "char": 67, + "fg": 8, + "xform": 0 + }, + { + "bg": 13, + "char": 67, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 102, + "fg": 11, + "xform": 0 + }, + { + "bg": 13, + "char": 67, + "fg": 8, + "xform": 0 + }, + { + "bg": 15, + "char": 67, + "fg": 8, + "xform": 0 + }, + { + "bg": 6, + "char": 102, + "fg": 7, + "xform": 0 + }, + { + "bg": 11, + "char": 113, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 44, + "fg": 7, + "xform": 0 + }, + { + "bg": 4, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 4, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 4, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 4, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 4, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 4, + "char": 53, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 120, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 86, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 121, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 123, + "fg": 2, + "xform": 0 + }, + { + "bg": 4, + "char": 123, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 123, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 72, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 72, + "fg": 3, + "xform": 0 + }, + { + "bg": 16, + "char": 117, + "fg": 2, + "xform": 0 + }, + { + "bg": 18, + "char": 108, + "fg": 17, + "xform": 0 + }, + { + "bg": 16, + "char": 123, + "fg": 18, + "xform": 0 + }, + { + "bg": 4, + "char": 72, + "fg": 3, + "xform": 0 + }, + { + "bg": 16, + "char": 107, + "fg": 17, + "xform": 0 + }, + { + "bg": 18, + "char": 121, + "fg": 40, + "xform": 0 + }, + { + "bg": 10, + "char": 105, + "fg": 5, + "xform": 0 + }, + { + "bg": 38, + "char": 95, + "fg": 7, + "xform": 0 + }, + { + "bg": 6, + "char": 117, + "fg": 11, + "xform": 0 + }, + { + "bg": 7, + "char": 123, + "fg": 6, + "xform": 0 + }, + { + "bg": 13, + "char": 113, + "fg": 8, + "xform": 0 + }, + { + "bg": 13, + "char": 120, + "fg": 15, + "xform": 0 + }, + { + "bg": 13, + "char": 67, + "fg": 15, + "xform": 0 + }, + { + "bg": 13, + "char": 102, + "fg": 7, + "xform": 0 + }, + { + "bg": 13, + "char": 121, + "fg": 15, + "xform": 0 + }, + { + "bg": 13, + "char": 118, + "fg": 8, + "xform": 0 + }, + { + "bg": 7, + "char": 101, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 115, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 138, + "fg": 7, + "xform": 0 + }, + { + "bg": 14, + "char": 120, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 120, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 120, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 120, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 120, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 120, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 120, + "fg": 5, + "xform": 0 + }, + { + "bg": 14, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 105, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 31, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 123, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 93, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 108, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 127, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 40, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 87, + "fg": 16, + "xform": 0 + }, + { + "bg": 40, + "char": 108, + "fg": 16, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 121, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 121, + "fg": 3, + "xform": 0 + }, + { + "bg": 11, + "char": 87, + "fg": 5, + "xform": 0 + }, + { + "bg": 11, + "char": 108, + "fg": 6, + "xform": 0 + }, + { + "bg": 11, + "char": 123, + "fg": 6, + "xform": 0 + }, + { + "bg": 11, + "char": 118, + "fg": 15, + "xform": 0 + }, + { + "bg": 12, + "char": 87, + "fg": 13, + "xform": 0 + }, + { + "bg": 8, + "char": 87, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 87, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 12, + "fg": 12, + "xform": 0 + }, + { + "bg": 8, + "char": 87, + "fg": 15, + "xform": 0 + }, + { + "bg": 12, + "char": 87, + "fg": 13, + "xform": 0 + }, + { + "bg": 26, + "char": 113, + "fg": 15, + "xform": 0 + }, + { + "bg": 6, + "char": 82, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 113, + "fg": 7, + "xform": 0 + }, + { + "bg": 14, + "char": 67, + "fg": 44, + "xform": 0 + }, + { + "bg": 14, + "char": 67, + "fg": 44, + "xform": 0 + }, + { + "bg": 14, + "char": 67, + "fg": 21, + "xform": 0 + }, + { + "bg": 14, + "char": 67, + "fg": 21, + "xform": 0 + }, + { + "bg": 14, + "char": 67, + "fg": 21, + "xform": 0 + }, + { + "bg": 14, + "char": 67, + "fg": 44, + "xform": 0 + }, + { + "bg": 14, + "char": 67, + "fg": 21, + "xform": 0 + }, + { + "bg": 14, + "char": 44, + "fg": 21, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 105, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 123, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 91, + "fg": 4, + "xform": 0 + }, + { + "bg": 3, + "char": 123, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 91, + "fg": 17, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 17, + "xform": 0 + }, + { + "bg": 5, + "char": 77, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 120, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 67, + "fg": 11, + "xform": 0 + }, + { + "bg": 38, + "char": 67, + "fg": 7, + "xform": 0 + }, + { + "bg": 6, + "char": 117, + "fg": 11, + "xform": 0 + }, + { + "bg": 8, + "char": 100, + "fg": 6, + "xform": 0 + }, + { + "bg": 15, + "char": 108, + "fg": 13, + "xform": 0 + }, + { + "bg": 15, + "char": 87, + "fg": 13, + "xform": 0 + }, + { + "bg": 13, + "char": 86, + "fg": 15, + "xform": 0 + }, + { + "bg": 13, + "char": 102, + "fg": 8, + "xform": 0 + }, + { + "bg": 15, + "char": 87, + "fg": 13, + "xform": 0 + }, + { + "bg": 15, + "char": 107, + "fg": 13, + "xform": 0 + }, + { + "bg": 8, + "char": 155, + "fg": 22, + "xform": 0 + }, + { + "bg": 6, + "char": 115, + "fg": 11, + "xform": 0 + }, + { + "bg": 6, + "char": 10, + "fg": 11, + "xform": 0 + }, + { + "bg": 24, + "char": 87, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 92, + "fg": 25, + "xform": 0 + }, + { + "bg": 2, + "char": 64, + "fg": 25, + "xform": 0 + }, + { + "bg": 2, + "char": 91, + "fg": 25, + "xform": 0 + }, + { + "bg": 2, + "char": 92, + "fg": 25, + "xform": 0 + }, + { + "bg": 14, + "char": 120, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 66, + "fg": 25, + "xform": 0 + }, + { + "bg": 14, + "char": 115, + "fg": 40, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 29, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 105, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 123, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 47, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 123, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 18, + "char": 123, + "fg": 3, + "xform": 0 + }, + { + "bg": 17, + "char": 92, + "fg": 37, + "xform": 0 + }, + { + "bg": 5, + "char": 77, + "fg": 42, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 120, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 67, + "fg": 7, + "xform": 0 + }, + { + "bg": 6, + "char": 111, + "fg": 7, + "xform": 0 + }, + { + "bg": 6, + "char": 117, + "fg": 11, + "xform": 0 + }, + { + "bg": 15, + "char": 123, + "fg": 6, + "xform": 0 + }, + { + "bg": 8, + "char": 86, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 67, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 44, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 102, + "fg": 12, + "xform": 0 + }, + { + "bg": 8, + "char": 67, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 86, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 101, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 115, + "fg": 11, + "xform": 0 + }, + { + "bg": 7, + "char": 101, + "fg": 6, + "xform": 0 + }, + { + "bg": 28, + "char": 113, + "fg": 31, + "xform": 0 + }, + { + "bg": 2, + "char": 102, + "fg": 25, + "xform": 0 + }, + { + "bg": 25, + "char": 21, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 101, + "fg": 29, + "xform": 0 + }, + { + "bg": 25, + "char": 101, + "fg": 31, + "xform": 0 + }, + { + "bg": 39, + "char": 6, + "fg": 14, + "xform": 0 + }, + { + "bg": 25, + "char": 101, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 105, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 69, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 123, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 41, + "fg": 4, + "xform": 0 + }, + { + "bg": 3, + "char": 123, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 117, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 67, + "fg": 31, + "xform": 0 + }, + { + "bg": 3, + "char": 120, + "fg": 18, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 67, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 91, + "fg": 18, + "xform": 0 + }, + { + "bg": 4, + "char": 72, + "fg": 18, + "xform": 0 + }, + { + "bg": 6, + "char": 67, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 95, + "fg": 7, + "xform": 0 + }, + { + "bg": 6, + "char": 117, + "fg": 5, + "xform": 0 + }, + { + "bg": 30, + "char": 93, + "fg": 6, + "xform": 0 + }, + { + "bg": 8, + "char": 102, + "fg": 15, + "xform": 0 + }, + { + "bg": 23, + "char": 66, + "fg": 32, + "xform": 0 + }, + { + "bg": 23, + "char": 86, + "fg": 9, + "xform": 0 + }, + { + "bg": 9, + "char": 99, + "fg": 23, + "xform": 0 + }, + { + "bg": 23, + "char": 86, + "fg": 9, + "xform": 0 + }, + { + "bg": 8, + "char": 101, + "fg": 15, + "xform": 0 + }, + { + "bg": 8, + "char": 101, + "fg": 7, + "xform": 0 + }, + { + "bg": 6, + "char": 115, + "fg": 5, + "xform": 0 + }, + { + "bg": 11, + "char": 113, + "fg": 7, + "xform": 0 + }, + { + "bg": 39, + "char": 87, + "fg": 33, + "xform": 0 + }, + { + "bg": 39, + "char": 72, + "fg": 33, + "xform": 0 + }, + { + "bg": 2, + "char": 87, + "fg": 21, + "xform": 0 + }, + { + "bg": 3, + "char": 72, + "fg": 33, + "xform": 0 + }, + { + "bg": 3, + "char": 72, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 72, + "fg": 33, + "xform": 0 + }, + { + "bg": 2, + "char": 72, + "fg": 33, + "xform": 0 + }, + { + "bg": 40, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 109, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 92, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 79, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 123, + "fg": 2, + "xform": 0 + }, + { + "bg": 6, + "char": 100, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 123, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 78, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 78, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 6, + "xform": 0 + }, + { + "bg": 18, + "char": 108, + "fg": 3, + "xform": 0 + }, + { + "bg": 18, + "char": 78, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 109, + "fg": 18, + "xform": 0 + }, + { + "bg": 11, + "char": 105, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 109, + "fg": 6, + "xform": 0 + }, + { + "bg": 30, + "char": 109, + "fg": 6, + "xform": 0 + }, + { + "bg": 8, + "char": 92, + "fg": 12, + "xform": 0 + }, + { + "bg": 32, + "char": 21, + "fg": 9, + "xform": 0 + }, + { + "bg": 32, + "char": 101, + "fg": 9, + "xform": 0 + }, + { + "bg": 9, + "char": 101, + "fg": 32, + "xform": 0 + }, + { + "bg": 32, + "char": 63, + "fg": 12, + "xform": 0 + }, + { + "bg": 8, + "char": 91, + "fg": 12, + "xform": 0 + }, + { + "bg": 30, + "char": 111, + "fg": 22, + "xform": 0 + }, + { + "bg": 6, + "char": 126, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 155, + "fg": 11, + "xform": 0 + }, + { + "bg": 28, + "char": 118, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 101, + "fg": 25, + "xform": 0 + }, + { + "bg": 2, + "char": 102, + "fg": 25, + "xform": 0 + }, + { + "bg": 24, + "char": 113, + "fg": 37, + "xform": 0 + }, + { + "bg": 24, + "char": 118, + "fg": 2, + "xform": 0 + }, + { + "bg": 24, + "char": 101, + "fg": 25, + "xform": 0 + }, + { + "bg": 24, + "char": 113, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 92, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 79, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 95, + "fg": 33, + "xform": 0 + }, + { + "bg": 21, + "char": 91, + "fg": 20, + "xform": 0 + }, + { + "bg": 20, + "char": 78, + "fg": 21, + "xform": 0 + }, + { + "bg": 21, + "char": 68, + "fg": 18, + "xform": 0 + }, + { + "bg": 21, + "char": 104, + "fg": 44, + "xform": 0 + }, + { + "bg": 21, + "char": 71, + "fg": 40, + "xform": 0 + }, + { + "bg": 21, + "char": 71, + "fg": 39, + "xform": 0 + }, + { + "bg": 21, + "char": 71, + "fg": 39, + "xform": 0 + }, + { + "bg": 21, + "char": 71, + "fg": 40, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 20, + "xform": 0 + }, + { + "bg": 20, + "char": 110, + "fg": 2, + "xform": 0 + }, + { + "bg": 21, + "char": 108, + "fg": 18, + "xform": 0 + }, + { + "bg": 38, + "char": 109, + "fg": 5, + "xform": 0 + }, + { + "bg": 7, + "char": 110, + "fg": 5, + "xform": 0 + }, + { + "bg": 7, + "char": 110, + "fg": 21, + "xform": 0 + }, + { + "bg": 30, + "char": 111, + "fg": 33, + "xform": 0 + }, + { + "bg": 22, + "char": 110, + "fg": 35, + "xform": 0 + }, + { + "bg": 22, + "char": 110, + "fg": 35, + "xform": 0 + }, + { + "bg": 22, + "char": 110, + "fg": 35, + "xform": 0 + }, + { + "bg": 22, + "char": 110, + "fg": 21, + "xform": 0 + }, + { + "bg": 30, + "char": 109, + "fg": 35, + "xform": 0 + }, + { + "bg": 7, + "char": 110, + "fg": 21, + "xform": 0 + }, + { + "bg": 7, + "char": 110, + "fg": 5, + "xform": 0 + }, + { + "bg": 11, + "char": 111, + "fg": 5, + "xform": 0 + }, + { + "bg": 31, + "char": 106, + "fg": 33, + "xform": 0 + }, + { + "bg": 4, + "char": 110, + "fg": 22, + "xform": 0 + }, + { + "bg": 25, + "char": 106, + "fg": 22, + "xform": 0 + }, + { + "bg": 28, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 28, + "char": 106, + "fg": 21, + "xform": 0 + }, + { + "bg": 18, + "char": 100, + "fg": 44, + "xform": 0 + }, + { + "bg": 37, + "char": 78, + "fg": 40, + "xform": 0 + }, + { + "bg": 44, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 39, + "fg": 5, + "xform": 0 + }, + { + "bg": 4, + "char": 79, + "fg": 3, + "xform": 0 + }, + { + "bg": 21, + "char": 123, + "fg": 2, + "xform": 0 + }, + { + "bg": 20, + "char": 106, + "fg": 16, + "xform": 0 + }, + { + "bg": 41, + "char": 68, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 85, + "fg": 31, + "xform": 0 + }, + { + "bg": 35, + "char": 123, + "fg": 16, + "xform": 0 + }, + { + "bg": 21, + "char": 93, + "fg": 39, + "xform": 0 + }, + { + "bg": 33, + "char": 77, + "fg": 21, + "xform": 0 + }, + { + "bg": 33, + "char": 79, + "fg": 44, + "xform": 0 + }, + { + "bg": 21, + "char": 68, + "fg": 10, + "xform": 0 + }, + { + "bg": 21, + "char": 107, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 44, + "char": 108, + "fg": 40, + "xform": 0 + }, + { + "bg": 3, + "char": 114, + "fg": 21, + "xform": 0 + }, + { + "bg": 3, + "char": 71, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 110, + "fg": 14, + "xform": 0 + }, + { + "bg": 10, + "char": 110, + "fg": 39, + "xform": 0 + }, + { + "bg": 10, + "char": 71, + "fg": 39, + "xform": 0 + }, + { + "bg": 39, + "char": 77, + "fg": 10, + "xform": 0 + }, + { + "bg": 39, + "char": 78, + "fg": 10, + "xform": 0 + }, + { + "bg": 10, + "char": 71, + "fg": 40, + "xform": 0 + }, + { + "bg": 10, + "char": 110, + "fg": 39, + "xform": 0 + }, + { + "bg": 3, + "char": 71, + "fg": 39, + "xform": 0 + }, + { + "bg": 3, + "char": 71, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 71, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 101, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 110, + "fg": 14, + "xform": 0 + }, + { + "bg": 22, + "char": 111, + "fg": 42, + "xform": 0 + }, + { + "bg": 2, + "char": 78, + "fg": 39, + "xform": 0 + }, + { + "bg": 18, + "char": 100, + "fg": 2, + "xform": 0 + }, + { + "bg": 18, + "char": 82, + "fg": 17, + "xform": 0 + }, + { + "bg": 18, + "char": 101, + "fg": 39, + "xform": 0 + }, + { + "bg": 39, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 93, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 107, + "fg": 3, + "xform": 0 + }, + { + "bg": 16, + "char": 123, + "fg": 40, + "xform": 0 + }, + { + "bg": 16, + "char": 110, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 35, + "char": 108, + "fg": 3, + "xform": 0 + }, + { + "bg": 18, + "char": 93, + "fg": 43, + "xform": 0 + }, + { + "bg": 31, + "char": 95, + "fg": 18, + "xform": 0 + }, + { + "bg": 18, + "char": 95, + "fg": 43, + "xform": 0 + }, + { + "bg": 44, + "char": 71, + "fg": 33, + "xform": 0 + }, + { + "bg": 21, + "char": 78, + "fg": 16, + "xform": 0 + }, + { + "bg": 44, + "char": 109, + "fg": 33, + "xform": 0 + }, + { + "bg": 21, + "char": 71, + "fg": 33, + "xform": 0 + }, + { + "bg": 4, + "char": 114, + "fg": 33, + "xform": 0 + }, + { + "bg": 2, + "char": 114, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 101, + "fg": 39, + "xform": 0 + }, + { + "bg": 39, + "char": 115, + "fg": 14, + "xform": 0 + }, + { + "bg": 39, + "char": 33, + "fg": 4, + "xform": 0 + }, + { + "bg": 39, + "char": 130, + "fg": 45, + "xform": 0 + }, + { + "bg": 39, + "char": 113, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 4, + "fg": 39, + "xform": 0 + }, + { + "bg": 39, + "char": 108, + "fg": 10, + "xform": 0 + }, + { + "bg": 39, + "char": 101, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 59, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 93, + "fg": 14, + "xform": 0 + }, + { + "bg": 40, + "char": 38, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 37, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 37, + "fg": 6, + "xform": 0 + }, + { + "bg": 2, + "char": 118, + "fg": 29, + "xform": 0 + }, + { + "bg": 40, + "char": 71, + "fg": 2, + "xform": 0 + }, + { + "bg": 20, + "char": 106, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 108, + "fg": 20, + "xform": 0 + }, + { + "bg": 39, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 109, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 60, + "fg": 4, + "xform": 0 + }, + { + "bg": 3, + "char": 60, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 95, + "fg": 9, + "xform": 0 + }, + { + "bg": 40, + "char": 68, + "fg": 9, + "xform": 0 + }, + { + "bg": 21, + "char": 110, + "fg": 39, + "xform": 0 + }, + { + "bg": 21, + "char": 110, + "fg": 39, + "xform": 0 + }, + { + "bg": 33, + "char": 110, + "fg": 40, + "xform": 0 + }, + { + "bg": 43, + "char": 106, + "fg": 35, + "xform": 0 + }, + { + "bg": 10, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 33, + "char": 71, + "fg": 43, + "xform": 0 + }, + { + "bg": 44, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 33, + "char": 71, + "fg": 44, + "xform": 0 + }, + { + "bg": 44, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 33, + "char": 68, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 114, + "fg": 33, + "xform": 0 + }, + { + "bg": 2, + "char": 110, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 110, + "fg": 42, + "xform": 0 + }, + { + "bg": 2, + "char": 79, + "fg": 39, + "xform": 0 + }, + { + "bg": 2, + "char": 78, + "fg": 39, + "xform": 0 + }, + { + "bg": 2, + "char": 78, + "fg": 39, + "xform": 0 + }, + { + "bg": 2, + "char": 55, + "fg": 39, + "xform": 0 + }, + { + "bg": 2, + "char": 68, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 78, + "fg": 45, + "xform": 0 + }, + { + "bg": 2, + "char": 77, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 95, + "fg": 4, + "xform": 0 + }, + { + "bg": 42, + "char": 109, + "fg": 33, + "xform": 0 + }, + { + "bg": 42, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 42, + "char": 110, + "fg": 21, + "xform": 0 + }, + { + "bg": 21, + "char": 108, + "fg": 47, + "xform": 0 + }, + { + "bg": 21, + "char": 68, + "fg": 42, + "xform": 0 + }, + { + "bg": 43, + "char": 110, + "fg": 21, + "xform": 0 + }, + { + "bg": 43, + "char": 110, + "fg": 21, + "xform": 0 + }, + { + "bg": 33, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 95, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 78, + "fg": 3, + "xform": 0 + }, + { + "bg": 14, + "char": 77, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 123, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 77, + "fg": 21, + "xform": 0 + }, + { + "bg": 14, + "char": 78, + "fg": 44, + "xform": 0 + }, + { + "bg": 14, + "char": 78, + "fg": 44, + "xform": 0 + }, + { + "bg": 39, + "char": 114, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 71, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 71, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 71, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 71, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 71, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 71, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 71, + "fg": 9, + "xform": 0 + }, + { + "bg": 3, + "char": 108, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 91, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 106, + "fg": 2, + "xform": 0 + }, + { + "bg": 39, + "char": 99, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 6, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 1, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 145, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 71, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 64, + "fg": 42, + "xform": 0 + }, + { + "bg": 14, + "char": 55, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 105, + "fg": 14, + "xform": 0 + }, + { + "bg": 39, + "char": 78, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 78, + "fg": 9, + "xform": 0 + }, + { + "bg": 40, + "char": 78, + "fg": 33, + "xform": 0 + }, + { + "bg": 39, + "char": 78, + "fg": 9, + "xform": 0 + }, + { + "bg": 39, + "char": 78, + "fg": 9, + "xform": 0 + }, + { + "bg": 40, + "char": 78, + "fg": 33, + "xform": 0 + }, + { + "bg": 39, + "char": 78, + "fg": 9, + "xform": 0 + }, + { + "bg": 14, + "char": 108, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 91, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 99, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 99, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 39, + "char": 109, + "fg": 21, + "xform": 0 + }, + { + "bg": 40, + "char": 108, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 106, + "fg": 40, + "xform": 0 + }, + { + "bg": 39, + "char": 114, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 117, + "fg": 2, + "xform": 0 + }, + { + "bg": 40, + "char": 91, + "fg": 14, + "xform": 0 + }, + { + "bg": 39, + "char": 126, + "fg": 44, + "xform": 0 + }, + { + "bg": 2, + "char": 114, + "fg": 47, + "xform": 0 + }, + { + "bg": 3, + "char": 71, + "fg": 44, + "xform": 0 + }, + { + "bg": 40, + "char": 92, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 93, + "fg": 21, + "xform": 0 + }, + { + "bg": 2, + "char": 92, + "fg": 10, + "xform": 0 + }, + { + "bg": 44, + "char": 99, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 40, + "char": 90, + "fg": 21, + "xform": 0 + }, + { + "bg": 42, + "char": 80, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 110, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 149, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 143, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 142, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 102, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 84, + "fg": 14, + "xform": 0 + }, + { + "bg": 39, + "char": 113, + "fg": 14, + "xform": 0 + }, + { + "bg": 39, + "char": 106, + "fg": 10, + "xform": 0 + }, + { + "bg": 39, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 39, + "char": 118, + "fg": 14, + "xform": 0 + }, + { + "bg": 39, + "char": 91, + "fg": 16, + "xform": 0 + }, + { + "bg": 39, + "char": 106, + "fg": 16, + "xform": 0 + }, + { + "bg": 39, + "char": 106, + "fg": 10, + "xform": 0 + }, + { + "bg": 39, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 100, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 92, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 83, + "fg": 42, + "xform": 0 + }, + { + "bg": 2, + "char": 93, + "fg": 21, + "xform": 0 + }, + { + "bg": 14, + "char": 91, + "fg": 39, + "xform": 0 + }, + { + "bg": 14, + "char": 62, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 114, + "fg": 44, + "xform": 0 + }, + { + "bg": 2, + "char": 93, + "fg": 21, + "xform": 0 + }, + { + "bg": 42, + "char": 41, + "fg": 14, + "xform": 0 + }, + { + "bg": 21, + "char": 78, + "fg": 42, + "xform": 0 + }, + { + "bg": 21, + "char": 78, + "fg": 42, + "xform": 0 + }, + { + "bg": 21, + "char": 78, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 41, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 117, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 93, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 79, + "fg": 40, + "xform": 0 + }, + { + "bg": 21, + "char": 101, + "fg": 40, + "xform": 0 + }, + { + "bg": 2, + "char": 101, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 82, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 74, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 6, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 118, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 135, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 42, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 84, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 16, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 16, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 16, + "char": 110, + "fg": 33, + "xform": 0 + }, + { + "bg": 21, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 105, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 117, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 103, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 114, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 108, + "fg": 40, + "xform": 0 + }, + { + "bg": 14, + "char": 71, + "fg": 39, + "xform": 0 + }, + { + "bg": 14, + "char": 71, + "fg": 39, + "xform": 0 + }, + { + "bg": 39, + "char": 111, + "fg": 42, + "xform": 0 + }, + { + "bg": 3, + "char": 107, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 95, + "fg": 40, + "xform": 0 + }, + { + "bg": 40, + "char": 93, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 110, + "fg": 2, + "xform": 0 + }, + { + "bg": 40, + "char": 111, + "fg": 39, + "xform": 0 + }, + { + "bg": 42, + "char": 92, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 103, + "fg": 47, + "xform": 0 + }, + { + "bg": 3, + "char": 117, + "fg": 42, + "xform": 0 + }, + { + "bg": 39, + "char": 105, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 108, + "fg": 44, + "xform": 0 + }, + { + "bg": 3, + "char": 108, + "fg": 2, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 102, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 115, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 15, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 102, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 14, + "fg": 42, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 14, + "char": 71, + "fg": 21, + "xform": 0 + }, + { + "bg": 14, + "char": 90, + "fg": 21, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 71, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 106, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 111, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 71, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 84, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 89, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 114, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 91, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 105, + "fg": 47, + "xform": 0 + }, + { + "bg": 39, + "char": 91, + "fg": 33, + "xform": 0 + }, + { + "bg": 14, + "char": 106, + "fg": 21, + "xform": 0 + }, + { + "bg": 2, + "char": 92, + "fg": 21, + "xform": 0 + }, + { + "bg": 42, + "char": 105, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 42, + "xform": 0 + }, + { + "bg": 3, + "char": 77, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 24, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 113, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 111, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 91, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 8, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 13, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 108, + "fg": 42, + "xform": 0 + }, + { + "bg": 41, + "char": 100, + "fg": 42, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 90, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 117, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 107, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 108, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 86, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 30, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 114, + "fg": 47, + "xform": 0 + }, + { + "bg": 3, + "char": 99, + "fg": 42, + "xform": 0 + }, + { + "bg": 3, + "char": 29, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 42, + "xform": 0 + }, + { + "bg": 40, + "char": 78, + "fg": 21, + "xform": 0 + }, + { + "bg": 39, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 108, + "fg": 44, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 86, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 105, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 49, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 33, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 23, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 8, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 33, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 25, + "fg": 5, + "xform": 0 + }, + { + "bg": 41, + "char": 90, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 35, + "char": 94, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 135, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 111, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 92, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 105, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 91, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 100, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 127, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 41, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 3, + "char": 27, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 78, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 40, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 44, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 79, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 102, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 89, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 82, + "fg": 47, + "xform": 0 + }, + { + "bg": 41, + "char": 8, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 102, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 30, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 113, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 35, + "char": 94, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 105, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 117, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 114, + "fg": 14, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 104, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 90, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 111, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 27, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 91, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 103, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 44, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 105, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 44, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 41, + "char": 114, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 99, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 98, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 113, + "fg": 6, + "xform": 0 + }, + { + "bg": 41, + "char": 113, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 64, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 101, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 35, + "char": 94, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 12, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 29, + "fg": 42, + "xform": 0 + }, + { + "bg": 14, + "char": 83, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 117, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 105, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 100, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 42, + "xform": 0 + }, + { + "bg": 6, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 10, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 41, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 10, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 72, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 123, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 34, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 102, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 34, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 101, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 115, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 102, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 101, + "fg": 6, + "xform": 0 + }, + { + "bg": 41, + "char": 96, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 35, + "char": 94, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 145, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 114, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 89, + "fg": 14, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 74, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 42, + "xform": 0 + }, + { + "bg": 3, + "char": 29, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 66, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 27, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 27, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 114, + "fg": 47, + "xform": 0 + }, + { + "bg": 41, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 41, + "char": 75, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 101, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 20, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 64, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 69, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 1, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 118, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 35, + "char": 94, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 96, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 44, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 90, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 114, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 13, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 29, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 39, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 29, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 114, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 44, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 113, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 101, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 8, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 64, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 101, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 131, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 35, + "char": 94, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 100, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 122, + "fg": 47, + "xform": 0 + }, + { + "bg": 41, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 10, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 100, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 91, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 37, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 86, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 91, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 86, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 6, + "xform": 0 + }, + { + "bg": 41, + "char": 114, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 138, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 102, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 82, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 35, + "char": 94, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 25, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 91, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 77, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 42, + "xform": 0 + }, + { + "bg": 6, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 5, + "xform": 0 + }, + { + "bg": 41, + "char": 114, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 27, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 39, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 39, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 93, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 91, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 102, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 76, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 21, + "char": 94, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 34, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 114, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 41, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 108, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 77, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 117, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 6, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 22, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 89, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 141, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 87, + "fg": 42, + "xform": 0 + }, + { + "bg": 41, + "char": 123, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 29, + "fg": 5, + "xform": 0 + }, + { + "bg": 41, + "char": 79, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 2, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 102, + "fg": 14, + "xform": 0 + }, + { + "bg": 42, + "char": 137, + "fg": 14, + "xform": 0 + }, + { + "bg": 47, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 101, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 99, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 100, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 10, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 2, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 42, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 93, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 87, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 114, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 5, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 29, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 14, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 41, + "char": 109, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 150, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 29, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 2, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 94, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 14, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 117, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 107, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 100, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 111, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 41, + "xform": 0 + }, + { + "bg": 5, + "char": 78, + "fg": 14, + "xform": 0 + }, + { + "bg": 47, + "char": 99, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 140, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 140, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 78, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 140, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 78, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 140, + "fg": 14, + "xform": 0 + }, + { + "bg": 2, + "char": 140, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 110, + "fg": 2, + "xform": 0 + }, + { + "bg": 14, + "char": 110, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 40, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 77, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 5, + "xform": 0 + }, + { + "bg": 41, + "char": 117, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 117, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 109, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 42, + "xform": 0 + }, + { + "bg": 3, + "char": 104, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 78, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 114, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 41, + "xform": 0 + }, + { + "bg": 6, + "char": 114, + "fg": 41, + "xform": 0 + }, + { + "bg": 14, + "char": 77, + "fg": 41, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 2, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 6, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 91, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 117, + "fg": 5, + "xform": 0 + }, + { + "bg": 41, + "char": 95, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 29, + "fg": 41, + "xform": 0 + }, + { + "bg": 14, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 107, + "fg": 47, + "xform": 0 + }, + { + "bg": 42, + "char": 92, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 123, + "fg": 42, + "xform": 0 + }, + { + "bg": 3, + "char": 27, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 107, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 92, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 114, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 44, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 123, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 3, + "char": 79, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 71, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 117, + "fg": 42, + "xform": 0 + }, + { + "bg": 14, + "char": 77, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 100, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 108, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 83, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 67, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 117, + "fg": 6, + "xform": 0 + }, + { + "bg": 47, + "char": 104, + "fg": 3, + "xform": 0 + }, + { + "bg": 41, + "char": 95, + "fg": 6, + "xform": 0 + }, + { + "bg": 14, + "char": 123, + "fg": 47, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 4, + "char": 77, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 78, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 6, + "xform": 0 + }, + { + "bg": 5, + "char": 78, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 87, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 78, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 79, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 78, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 95, + "fg": 42, + "xform": 0 + }, + { + "bg": 47, + "char": 157, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 10, + "fg": 47, + "xform": 0 + }, + { + "bg": 47, + "char": 79, + "fg": 41, + "xform": 0 + }, + { + "bg": 41, + "char": 111, + "fg": 47, + "xform": 0 + }, + { + "bg": 6, + "char": 109, + "fg": 5, + "xform": 0 + }, + { + "bg": 14, + "char": 123, + "fg": 5, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 114, + "fg": 4, + "xform": 0 + }, + { + "bg": 4, + "char": 78, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 110, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 108, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 111, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 114, + "fg": 3, + "xform": 0 + }, + { + "bg": 42, + "char": 117, + "fg": 14, + "xform": 0 + }, + { + "bg": 14, + "char": 108, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 30, + "fg": 14, + "xform": 0 + }, + { + "bg": 47, + "char": 108, + "fg": 42, + "xform": 0 + }, + { + "bg": 42, + "char": 93, + "fg": 3, + "xform": 0 + }, + { + "bg": 47, + "char": 78, + "fg": 41, + "xform": 0 + }, + { + "bg": 47, + "char": 104, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 123, + "fg": 4, + "xform": 0 + }, + { + "bg": 6, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 6, + "char": 78, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 77, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 79, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 106, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 94, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0.3 + } + ] + } + ], + "height": 48, + "palette": "chrono_bg", + "width": 42 +} \ No newline at end of file diff --git a/games/cronotest/art/crono_stand_back.psci b/games/cronotest/art/crono_stand_back.psci new file mode 100644 index 0000000..0fc69cb --- /dev/null +++ b/games/cronotest/art/crono_stand_back.psci @@ -0,0 +1,488 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 5.543197011980822, + -6.245611946839135, + 11.168324452166797 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 203, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 136, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 117, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 219, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 204, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 213, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 219, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 219, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 213, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 198, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 218, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 28, + "fg": 4, + "xform": 0 + }, + { + "bg": 11, + "char": 236, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 7, + "char": 212, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 153, + "fg": 10, + "xform": 0 + }, + { + "bg": 11, + "char": 218, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 204, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 28, + "fg": 11, + "xform": 0 + }, + { + "bg": 8, + "char": 213, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 236, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 192, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 236, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 203, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 210, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 132, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 132, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 132, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 192, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 11, + "palette": "crono_sprite", + "width": 7 +} \ No newline at end of file diff --git a/games/cronotest/art/crono_stand_front.psci b/games/cronotest/art/crono_stand_front.psci new file mode 100644 index 0000000..782388d --- /dev/null +++ b/games/cronotest/art/crono_stand_front.psci @@ -0,0 +1,488 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 5.543197011980822, + -6.245611946839135, + 11.168324452166797 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 125, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 27, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 210, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 220, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 219, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 133, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 101, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 192, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 200, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 211, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 28, + "fg": 7, + "xform": 0 + }, + { + "bg": 8, + "char": 125, + "fg": 12, + "xform": 0 + }, + { + "bg": 8, + "char": 165, + "fg": 11, + "xform": 0 + }, + { + "bg": 8, + "char": 27, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 214, + "fg": 9, + "xform": 0 + }, + { + "bg": 11, + "char": 28, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 101, + "fg": 11, + "xform": 0 + }, + { + "bg": 8, + "char": 214, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 209, + "fg": 8, + "xform": 0 + }, + { + "bg": 10, + "char": 149, + "fg": 6, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 210, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 133, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 131, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 11, + "palette": "crono_sprite", + "width": 7 +} \ No newline at end of file diff --git a/games/cronotest/art/crono_stand_right.psci b/games/cronotest/art/crono_stand_right.psci new file mode 100644 index 0000000..138cbc4 --- /dev/null +++ b/games/cronotest/art/crono_stand_right.psci @@ -0,0 +1,488 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 5.543197011980822, + -6.245611946839135, + 11.168324452166797 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 196, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 99, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 219, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 234, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 125, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 28, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 236, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 115, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 27, + "fg": 5, + "xform": 0 + }, + { + "bg": 7, + "char": 218, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 192, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 152, + "fg": 12, + "xform": 0 + }, + { + "bg": 10, + "char": 194, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 115, + "fg": 8, + "xform": 0 + }, + { + "bg": 10, + "char": 234, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 125, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 213, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 149, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 131, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 209, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 165, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 235, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 133, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 131, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 132, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 165, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 11, + "palette": "crono_sprite", + "width": 7 +} \ No newline at end of file diff --git a/games/cronotest/art/crono_walk_back.psci b/games/cronotest/art/crono_walk_back.psci new file mode 100644 index 0000000..b916b11 --- /dev/null +++ b/games/cronotest/art/crono_walk_back.psci @@ -0,0 +1,2853 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 5.543197011980822, + -6.245611946839135, + 11.168324452166797 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 193, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 204, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 203, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 125, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 199, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 168, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 27, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 212, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 212, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 5, + "char": 131, + "fg": 11, + "xform": 0 + }, + { + "bg": 3, + "char": 186, + "fg": 4, + "xform": 0 + }, + { + "bg": 8, + "char": 212, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 210, + "fg": 10, + "xform": 0 + }, + { + "bg": 11, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 219, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 202, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 132, + "fg": 12, + "xform": 0 + }, + { + "bg": 10, + "char": 218, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 210, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 115, + "fg": 0, + "xform": 0 + }, + { + "bg": 11, + "char": 148, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 102, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 242, + "fg": 2, + "xform": 0 + }, + { + "bg": 8, + "char": 115, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 235, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 194, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 211, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 192, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 200, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 115, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 210, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 28, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 99, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 192, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 184, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 153, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 133, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 10, + "char": 204, + "fg": 9, + "xform": 0 + }, + { + "bg": 11, + "char": 32, + "fg": 4, + "xform": 0 + }, + { + "bg": 11, + "char": 32, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 195, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 215, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 125, + "fg": 10, + "xform": 0 + }, + { + "bg": 11, + "char": 218, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 195, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 8, + "xform": 0 + }, + { + "bg": 10, + "char": 100, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 117, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 210, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 219, + "fg": 5, + "xform": 0 + }, + { + "bg": 8, + "char": 117, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 184, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 235, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 194, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 204, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 213, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 27, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 193, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 116, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 235, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 186, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 216, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 132, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 125, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 27, + "fg": 4, + "xform": 0 + }, + { + "bg": 11, + "char": 192, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 192, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 201, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 246, + "fg": 10, + "xform": 0 + }, + { + "bg": 8, + "char": 195, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 193, + "fg": 7, + "xform": 0 + }, + { + "bg": 8, + "char": 115, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 203, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 115, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 169, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 195, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 203, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 192, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 204, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 209, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 117, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 219, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 196, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 212, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 217, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 32, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 213, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 148, + "fg": 10, + "xform": 0 + }, + { + "bg": 11, + "char": 193, + "fg": 2, + "xform": 0 + }, + { + "bg": 11, + "char": 194, + "fg": 3, + "xform": 0 + }, + { + "bg": 10, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 131, + "fg": 10, + "xform": 0 + }, + { + "bg": 10, + "char": 236, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 136, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 236, + "fg": 9, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 10, + "xform": 0 + }, + { + "bg": 12, + "char": 23, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 100, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 131, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 164, + "fg": 8, + "xform": 0 + }, + { + "bg": 5, + "char": 100, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 100, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 215, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 204, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 118, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 218, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 63, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 212, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 234, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 32, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 148, + "fg": 10, + "xform": 0 + }, + { + "bg": 11, + "char": 100, + "fg": 2, + "xform": 0 + }, + { + "bg": 11, + "char": 115, + "fg": 4, + "xform": 0 + }, + { + "bg": 10, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 9, + "char": 116, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 125, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 133, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 210, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 133, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 125, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 125, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 165, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 214, + "fg": 6, + "xform": 0 + }, + { + "bg": 10, + "char": 218, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 214, + "fg": 2, + "xform": 0 + }, + { + "bg": 8, + "char": 235, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 192, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 186, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 149, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 184, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 246, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 200, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 201, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 151, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 234, + "fg": 2, + "xform": 0 + }, + { + "bg": 10, + "char": 209, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 165, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 164, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 99, + "fg": 4, + "xform": 0 + }, + { + "bg": 10, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 213, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 132, + "fg": 10, + "xform": 0 + }, + { + "bg": 9, + "char": 116, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 32, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 195, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 211, + "fg": 10, + "xform": 0 + }, + { + "bg": 8, + "char": 195, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 192, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 234, + "fg": 4, + "xform": 0 + }, + { + "bg": 3, + "char": 27, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 131, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 213, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 11, + "palette": "crono_sprite", + "width": 7 +} \ No newline at end of file diff --git a/games/cronotest/art/crono_walk_front.psci b/games/cronotest/art/crono_walk_front.psci new file mode 100644 index 0000000..8ec54ef --- /dev/null +++ b/games/cronotest/art/crono_walk_front.psci @@ -0,0 +1,2853 @@ +{ + "active_frame": 3, + "active_layer": 0, + "camera": [ + 5.543197011980822, + -6.245611946839135, + 11.168324452166797 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 149, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 93, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 219, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 154, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 192, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 151, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 150, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 194, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 180, + "fg": 7, + "xform": 0 + }, + { + "bg": 10, + "char": 199, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 101, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 219, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 133, + "fg": 3, + "xform": 0 + }, + { + "bg": 10, + "char": 194, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 213, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 184, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 204, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 234, + "fg": 12, + "xform": 0 + }, + { + "bg": 7, + "char": 192, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 210, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 215, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 202, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 213, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 220, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 210, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 236, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 125, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 193, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 117, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 192, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 203, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 202, + "fg": 10, + "xform": 0 + }, + { + "bg": 10, + "char": 122, + "fg": 7, + "xform": 0 + }, + { + "bg": 8, + "char": 194, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 209, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 152, + "fg": 12, + "xform": 0 + }, + { + "bg": 10, + "char": 125, + "fg": 3, + "xform": 0 + }, + { + "bg": 10, + "char": 236, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 210, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 195, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 192, + "fg": 3, + "xform": 0 + }, + { + "bg": 10, + "char": 218, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 62, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 27, + "fg": 10, + "xform": 0 + }, + { + "bg": 8, + "char": 210, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 118, + "fg": 1, + "xform": 0 + }, + { + "bg": 10, + "char": 203, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 131, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 132, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 236, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 99, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 164, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 141, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 193, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 219, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 27, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 154, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 236, + "fg": 5, + "xform": 0 + }, + { + "bg": 10, + "char": 185, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 11, + "char": 99, + "fg": 8, + "xform": 0 + }, + { + "bg": 10, + "char": 201, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 65, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 149, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 212, + "fg": 8, + "xform": 0 + }, + { + "bg": 10, + "char": 185, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 210, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 235, + "fg": 7, + "xform": 0 + }, + { + "bg": 11, + "char": 210, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 220, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 10, + "char": 204, + "fg": 6, + "xform": 0 + }, + { + "bg": 8, + "char": 185, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 133, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 32, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 217, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 100, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 89, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 202, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 115, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 170, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 131, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 115, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 204, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 200, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 10, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 10, + "char": 234, + "fg": 2, + "xform": 0 + }, + { + "bg": 8, + "char": 210, + "fg": 12, + "xform": 0 + }, + { + "bg": 3, + "char": 117, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 125, + "fg": 9, + "xform": 0 + }, + { + "bg": 10, + "char": 154, + "fg": 9, + "xform": 0 + }, + { + "bg": 8, + "char": 149, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 193, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 236, + "fg": 12, + "xform": 0 + }, + { + "bg": 8, + "char": 213, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 212, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 236, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 32, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 100, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 118, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 211, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 168, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 204, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 27, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 131, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 192, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 168, + "fg": 7, + "xform": 0 + }, + { + "bg": 3, + "char": 220, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 149, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 10, + "char": 186, + "fg": 12, + "xform": 0 + }, + { + "bg": 8, + "char": 165, + "fg": 11, + "xform": 0 + }, + { + "bg": 7, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 208, + "fg": 0, + "xform": 0 + }, + { + "bg": 11, + "char": 132, + "fg": 4, + "xform": 0 + }, + { + "bg": 11, + "char": 125, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 99, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 10, + "char": 236, + "fg": 4, + "xform": 0 + }, + { + "bg": 10, + "char": 125, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 236, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 198, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 152, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 109, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 235, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 136, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 133, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 192, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 204, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 122, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 101, + "fg": 4, + "xform": 0 + }, + { + "bg": 8, + "char": 117, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 165, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 154, + "fg": 12, + "xform": 0 + }, + { + "bg": 7, + "char": 117, + "fg": 10, + "xform": 0 + }, + { + "bg": 10, + "char": 210, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 234, + "fg": 7, + "xform": 0 + }, + { + "bg": 10, + "char": 61, + "fg": 11, + "xform": 0 + }, + { + "bg": 10, + "char": 125, + "fg": 12, + "xform": 0 + }, + { + "bg": 7, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 101, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 136, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 93, + "fg": 12, + "xform": 0 + }, + { + "bg": 7, + "char": 131, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 131, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 115, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 214, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 99, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 11, + "palette": "crono_sprite", + "width": 7 +} \ No newline at end of file diff --git a/games/cronotest/art/crono_walk_right.psci b/games/cronotest/art/crono_walk_right.psci new file mode 100644 index 0000000..581fce2 --- /dev/null +++ b/games/cronotest/art/crono_walk_right.psci @@ -0,0 +1,2853 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 5.543197011980822, + -6.245611946839135, + 11.168324452166797 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 203, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 154, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 100, + "fg": 4, + "xform": 0 + }, + { + "bg": 3, + "char": 27, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 210, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 183, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 99, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 117, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 133, + "fg": 1, + "xform": 0 + }, + { + "bg": 10, + "char": 62, + "fg": 7, + "xform": 0 + }, + { + "bg": 10, + "char": 28, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 212, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 165, + "fg": 3, + "xform": 0 + }, + { + "bg": 11, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 10, + "char": 213, + "fg": 12, + "xform": 0 + }, + { + "bg": 8, + "char": 214, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 204, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 10, + "char": 132, + "fg": 11, + "xform": 0 + }, + { + "bg": 10, + "char": 131, + "fg": 11, + "xform": 0 + }, + { + "bg": 3, + "char": 213, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 236, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 133, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 117, + "fg": 12, + "xform": 0 + }, + { + "bg": 11, + "char": 212, + "fg": 6, + "xform": 0 + }, + { + "bg": 10, + "char": 193, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 209, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 236, + "fg": 4, + "xform": 0 + }, + { + "bg": 8, + "char": 236, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 211, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 234, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 235, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 235, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 100, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 146, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 115, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 27, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 100, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 204, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 214, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 89, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 195, + "fg": 6, + "xform": 0 + }, + { + "bg": 2, + "char": 186, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 194, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 209, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 220, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 217, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 192, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 235, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 235, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 235, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 194, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 184, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 27, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 200, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 209, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 199, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 132, + "fg": 10, + "xform": 0 + }, + { + "bg": 2, + "char": 133, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 209, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 235, + "fg": 5, + "xform": 0 + }, + { + "bg": 7, + "char": 154, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 32, + "fg": 6, + "xform": 0 + }, + { + "bg": 10, + "char": 27, + "fg": 11, + "xform": 0 + }, + { + "bg": 3, + "char": 211, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 131, + "fg": 7, + "xform": 0 + }, + { + "bg": 11, + "char": 242, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 192, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 11, + "char": 115, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 85, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 234, + "fg": 6, + "xform": 0 + }, + { + "bg": 3, + "char": 117, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 8, + "char": 132, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 211, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 28, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 116, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 219, + "fg": 5, + "xform": 0 + }, + { + "bg": 5, + "char": 153, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 209, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 133, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 202, + "fg": 3, + "xform": 0 + }, + { + "bg": 7, + "char": 117, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 236, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 148, + "fg": 3, + "xform": 0 + }, + { + "bg": 10, + "char": 220, + "fg": 7, + "xform": 0 + }, + { + "bg": 10, + "char": 183, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 117, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 131, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 101, + "fg": 8, + "xform": 0 + }, + { + "bg": 12, + "char": 169, + "fg": 11, + "xform": 0 + }, + { + "bg": 10, + "char": 88, + "fg": 12, + "xform": 0 + }, + { + "bg": 3, + "char": 195, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 213, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 133, + "fg": 11, + "xform": 0 + }, + { + "bg": 11, + "char": 204, + "fg": 12, + "xform": 0 + }, + { + "bg": 8, + "char": 195, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 32, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 192, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 125, + "fg": 6, + "xform": 0 + }, + { + "bg": 10, + "char": 198, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 133, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 203, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 131, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 236, + "fg": 3, + "xform": 0 + }, + { + "bg": 8, + "char": 193, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 5, + "char": 209, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 203, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 219, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 193, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 125, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 204, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 215, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 131, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 153, + "fg": 7, + "xform": 0 + }, + { + "bg": 8, + "char": 202, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 4, + "xform": 0 + }, + { + "bg": 5, + "char": 100, + "fg": 4, + "xform": 0 + }, + { + "bg": 2, + "char": 198, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 213, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 198, + "fg": 7, + "xform": 0 + }, + { + "bg": 11, + "char": 134, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 220, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 10, + "char": 202, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 165, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 3, + "xform": 0 + }, + { + "bg": 6, + "char": 99, + "fg": 10, + "xform": 0 + }, + { + "bg": 0, + "char": 210, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 196, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 220, + "fg": 8, + "xform": 0 + }, + { + "bg": 3, + "char": 101, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 204, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 196, + "fg": 1, + "xform": 0 + }, + { + "bg": 5, + "char": 234, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 169, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 192, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 125, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 214, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 115, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 8, + "char": 192, + "fg": 0, + "xform": 0 + }, + { + "bg": 7, + "char": 27, + "fg": 5, + "xform": 0 + }, + { + "bg": 3, + "char": 209, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 11, + "char": 204, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 193, + "fg": 2, + "xform": 0 + }, + { + "bg": 8, + "char": 117, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 210, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 199, + "fg": 7, + "xform": 0 + }, + { + "bg": 8, + "char": 212, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 218, + "fg": 8, + "xform": 0 + }, + { + "bg": 11, + "char": 132, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 133, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 201, + "fg": 10, + "xform": 0 + }, + { + "bg": 8, + "char": 202, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 208, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 8, + "xform": 0 + }, + { + "bg": 8, + "char": 132, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 50, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 11, + "palette": "crono_sprite", + "width": 7 +} \ No newline at end of file diff --git a/games/cronotest/art/frontwall.psci b/games/cronotest/art/frontwall.psci new file mode 100644 index 0000000..d6ed383 --- /dev/null +++ b/games/cronotest/art/frontwall.psci @@ -0,0 +1,12122 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 24.97903469294033, + -30.930990834573723, + 15.313439144094088 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 123, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 123, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 123, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 14, + "char": 97, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 121, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 121, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 69, + "fg": 3, + "xform": 0 + }, + { + "bg": 2, + "char": 86, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 121, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 121, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 1, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 1, + "xform": 0 + }, + { + "bg": 2, + "char": 101, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + } + ] + } + ], + "height": 48, + "palette": "chrono_bg", + "width": 42 +} \ No newline at end of file diff --git a/games/cronotest/art/railing.psci b/games/cronotest/art/railing.psci new file mode 100644 index 0000000..c1cf584 --- /dev/null +++ b/games/cronotest/art/railing.psci @@ -0,0 +1,1124 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 8.838716783875718, + -4.093956077609326, + 11.734229051028327 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 5, + "char": 92, + "fg": 4, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 87, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 91, + "fg": 3, + "xform": 0 + }, + { + "bg": 5, + "char": 86, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 5, + "char": 87, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 107, + "fg": 6, + "xform": 0 + }, + { + "bg": 6, + "char": 86, + "fg": 4, + "xform": 0 + }, + { + "bg": 6, + "char": 86, + "fg": 4, + "xform": 0 + }, + { + "bg": 6, + "char": 86, + "fg": 4, + "xform": 0 + }, + { + "bg": 6, + "char": 86, + "fg": 4, + "xform": 0 + }, + { + "bg": 6, + "char": 86, + "fg": 4, + "xform": 0 + }, + { + "bg": 6, + "char": 86, + "fg": 4, + "xform": 0 + }, + { + "bg": 6, + "char": 86, + "fg": 4, + "xform": 0 + }, + { + "bg": 5, + "char": 87, + "fg": 3, + "xform": 0 + }, + { + "bg": 4, + "char": 120, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 72, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 95, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 72, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 29, + "fg": 7, + "xform": 0 + }, + { + "bg": 4, + "char": 123, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 118, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 67, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 121, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 121, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 0, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 4, + "char": 95, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 67, + "fg": 4, + "xform": 0 + }, + { + "bg": 3, + "char": 67, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 3, + "char": 86, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 89, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 99, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 89, + "fg": 4, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 105, + "fg": 4, + "xform": 0 + }, + { + "bg": 3, + "char": 114, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 108, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0.0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 1, + "char": 94, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 19, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 29, + "xform": 0 + } + ], + "z": 0.1 + } + ] + } + ], + "height": 7, + "palette": "chrono_bg", + "width": 13 +} \ No newline at end of file diff --git a/games/cronotest/art/urn.psci b/games/cronotest/art/urn.psci new file mode 100644 index 0000000..6b092d1 --- /dev/null +++ b/games/cronotest/art/urn.psci @@ -0,0 +1,392 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 2.389406694765217, + -3.852805199434878, + 4.537893891307499 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 105, + "fg": 18, + "xform": 0 + }, + { + "bg": 0, + "char": 106, + "fg": 18, + "xform": 0 + }, + { + "bg": 0, + "char": 107, + "fg": 18, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 46, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 121, + "fg": 18, + "xform": 0 + }, + { + "bg": 46, + "char": 122, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 123, + "fg": 18, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 46, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 46, + "char": 137, + "fg": 45, + "xform": 0 + }, + { + "bg": 46, + "char": 138, + "fg": 45, + "xform": 0 + }, + { + "bg": 46, + "char": 139, + "fg": 45, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 45, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 46, + "char": 176, + "fg": 45, + "xform": 0 + }, + { + "bg": 46, + "char": 177, + "fg": 45, + "xform": 0 + }, + { + "bg": 46, + "char": 178, + "fg": 45, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 45, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 134, + "fg": 45, + "xform": 0 + }, + { + "bg": 0, + "char": 135, + "fg": 45, + "xform": 0 + }, + { + "bg": 0, + "char": 136, + "fg": 45, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 103, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 104, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 118, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 122, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 134, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 135, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 136, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "z": 0.1 + } + ] + } + ], + "height": 6, + "palette": "chrono_bg", + "width": 5 +} \ No newline at end of file diff --git a/games/cronotest/palettes/chrono_bg.png b/games/cronotest/palettes/chrono_bg.png new file mode 100644 index 0000000..471f556 Binary files /dev/null and b/games/cronotest/palettes/chrono_bg.png differ diff --git a/games/cronotest/palettes/crono_sprite.png b/games/cronotest/palettes/crono_sprite.png new file mode 100644 index 0000000..e9ad536 Binary files /dev/null and b/games/cronotest/palettes/crono_sprite.png differ diff --git a/games/cronotest/scripts/cronotest_classes.py b/games/cronotest/scripts/cronotest_classes.py new file mode 100644 index 0000000..661c610 --- /dev/null +++ b/games/cronotest/scripts/cronotest_classes.py @@ -0,0 +1,31 @@ +import math + +from game_util_objects import TopDownPlayer, StaticTileBG, StaticTileObject, DynamicBoxObject, Pickup +from collision import CST_AABB + +class CronoPlayer(TopDownPlayer): + art_src = 'crono' + + col_radius = 1.5 + + # AABB testing + #collision_shape_type = CST_AABB + #col_offset_x, col_offset_y = 0, 1.25 + + col_width = 3 + col_height = 3 + art_off_pct_y = 0.9 + +class Chest(DynamicBoxObject): + art_src = 'chest' + col_width, col_height = 6, 4 + col_offset_y = -0.5 + +class Urn(Pickup): + art_src = 'urn' + col_radius = 2 + art_off_pct_y = 0.85 + +class Bed(StaticTileObject): + art_src = 'bed' + art_off_pct_x, art_off_pct_y = 0.5, 1 diff --git a/games/cronotest/start.gs b/games/cronotest/start.gs new file mode 100644 index 0000000..5fa562d --- /dev/null +++ b/games/cronotest/start.gs @@ -0,0 +1,163 @@ +{ + "objects": [ + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "games/cronotest/art/chest.psci", + "class_name": "Chest", + "facing": 2, + "locked": false, + "name": "Chest_7f74a2e68198", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -11.5, + "y": -0.5, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 1, + "art_src": "games/cronotest/art/bed.psci", + "class_name": "Bed", + "facing": 2, + "locked": false, + "name": "Bed_7f74a2e689e8", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 11.0, + "y": -8.95, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.9, + "art_src": "crono", + "class_name": "CronoPlayer", + "facing": 2, + "locked": false, + "name": "CronoPlayer_7f74a2e68630", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 0.29548660434491913, + "y": -1.8182171605321618, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 1.0, + "art_src": "games/cronotest/art/railing.psci", + "class_name": "StaticTileBG", + "facing": 2, + "locked": false, + "name": "StaticTileBG_7f74a2e23a58", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -4.4779006956760306, + "y": -13.021624732346341, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 1.0, + "art_src": "games/cronotest/art/frontwall.psci", + "class_name": "GameObject", + "facing": 2, + "locked": true, + "name": "GameObject_7f74a2e688d0", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 0.031815419357635655, + "y": -23.95867406907374, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.85, + "art_src": "urn", + "class_name": "Urn", + "facing": 2, + "locked": false, + "name": "Urn_7f74a2e68358", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -6.002785870079216, + "y": -6.6930952442337555, + "y_sort": true, + "z": 0.0 + }, + { + "bg_color_a": 0, + "bg_color_b": 0, + "bg_color_g": 0, + "bg_color_r": 0, + "camera_x": 0.2943722076058254, + "camera_y": -1.7974211407970777, + "camera_z": 20.0, + "class_name": "WorldPropertiesObject", + "collision_enabled": true, + "draw_debug_objects": true, + "draw_hud": true, + "game_title": "Cronotest art + collision example", + "globals_object_class_name": "WorldGlobalsObject", + "gravity_x": 0.0, + "gravity_y": 0.0, + "gravity_z": 0.0, + "hud_class_name": "GameHUD", + "object_grid_snap": true, + "player_camera_lock": true, + "room_camera_changes_enabled": true, + "show_all_rooms": false, + "show_bounds_all": false, + "show_collision_all": false, + "show_origin_all": false + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "games/cronotest/art/chrono_bg.psci", + "class_name": "StaticTileBG", + "facing": 2, + "locked": true, + "name": "StaticTileBG_7f74a2e77860", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 0.0, + "y": 0.0, + "y_sort": false, + "z": 0.0 + } + ] +} \ No newline at end of file diff --git a/games/cronotest/test1.gs b/games/cronotest/test1.gs new file mode 100644 index 0000000..e709fdb --- /dev/null +++ b/games/cronotest/test1.gs @@ -0,0 +1,116 @@ +{ + "camera_x": -11.700722110451439, + "camera_y": -6.822838461704266, + "camera_z": 24.918933315020546, + "gravity_x": 0, + "gravity_y": 0, + "gravity_z": 0, + "objects": [ + { + "alpha": 1.0, + "art_off_pct_x": 0.5, + "art_off_pct_y": 1, + "art_src": "games/cronotest/art/bed.psci", + "class_name": "Bed", + "facing": 2, + "locked": false, + "state": "stand", + "visible": true, + "x": 11.0, + "y": -8.95, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.85, + "art_src": "urn", + "class_name": "Urn", + "facing": 2, + "locked": false, + "state": "stand", + "visible": true, + "x": -16.001171252242354, + "y": -12.423482751095209, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "art_off_pct_x": 0.5, + "art_off_pct_y": 1.0, + "art_src": "games/cronotest/art/railing.psci", + "class_name": "StaticTileBG", + "facing": 2, + "locked": false, + "state": "stand", + "visible": true, + "x": -4.4779006956760306, + "y": -13.021624732346341, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.9, + "art_src": "crono", + "class_name": "CronoPlayer", + "facing": 1, + "is_player": true, + "locked": false, + "state": "stand", + "visible": true, + "x": -11.75855640123209, + "y": -6.835257383561769, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "games/cronotest/art/chrono_bg.psci", + "class_name": "StaticTileBG", + "facing": 2, + "locked": true, + "state": "stand", + "visible": true, + "x": 0.0, + "y": 0.0, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "art_off_pct_x": 0.5, + "art_off_pct_y": 1.0, + "art_src": "games/cronotest/art/frontwall.psci", + "class_name": "GameObject", + "facing": 2, + "locked": true, + "state": "stand", + "visible": true, + "x": 0.031815419357635655, + "y": -23.95867406907374, + "y_sort": true, + "z": 0.0 + }, + { + "alpha": 1.0, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "games/cronotest/art/chest.psci", + "class_name": "Chest", + "facing": 2, + "locked": false, + "state": "stand", + "visible": true, + "x": -12.0, + "y": 2.0, + "y_sort": true, + "z": 0.0 + } + ] +} \ No newline at end of file diff --git a/games/fireplace/art/credit.psci b/games/fireplace/art/credit.psci new file mode 100644 index 0000000..967b4e6 --- /dev/null +++ b/games/fireplace/art/credit.psci @@ -0,0 +1,871 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 17.5, + -2.0, + 16.875 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 140, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 148, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 136, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 58, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 34, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 135, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 128, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 142, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 140, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 142, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 148, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 34, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 129, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 142, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 135, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 128, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 141, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 131, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 142, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 136, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 131, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 46, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 142, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 140, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 4, + "palette": "c64_original", + "selected_bg_color": 0, + "selected_char": 1, + "selected_fg_color": 16, + "selected_xform": 0, + "width": 35 +} \ No newline at end of file diff --git a/games/fireplace/art/help.psci b/games/fireplace/art/help.psci new file mode 100644 index 0000000..a770a02 --- /dev/null +++ b/games/fireplace/art/help.psci @@ -0,0 +1,4231 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 17.5, + -10.0, + 16.875 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 16, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 5, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 20, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 19, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 3, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 9, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 9, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 133, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 136, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 143, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 139, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 16, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 135, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 135, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 142, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 150, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 135, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 136, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 131, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 135, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 136, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 16, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 140, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 143, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 140, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 136, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 16, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 130, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 142, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 134, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 134, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 139, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 3, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 18, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 20, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 133, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 133, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 16, + "char": 43, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 16, + "char": 45, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 136, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 131, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 146, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 140, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 129, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 145, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 142, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 16, + "char": 132, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 146, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 130, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 144, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 136, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 147, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 140, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 131, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 132, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 129, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 152, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 10, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 16, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 49, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 48, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 49, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 55, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 20, + "palette": "c64_original", + "selected_bg_color": 16, + "selected_char": 3, + "selected_fg_color": 1, + "selected_xform": 0, + "width": 35 +} \ No newline at end of file diff --git a/games/fireplace/palettes/fireplace.png b/games/fireplace/palettes/fireplace.png new file mode 100644 index 0000000..22a84e6 Binary files /dev/null and b/games/fireplace/palettes/fireplace.png differ diff --git a/games/fireplace/scripts/fireplace.py b/games/fireplace/scripts/fireplace.py new file mode 100644 index 0000000..5f1bfec --- /dev/null +++ b/games/fireplace/scripts/fireplace.py @@ -0,0 +1,265 @@ + +# PETSCII Fireplace for Playscii +# https://jp.itch.io/petscii-fireplace + +""" +High level approach here is to use a single GameObject that occupies the whole +screen, and draw to it using virtual (don't directly render) simulated particles. +This is more like a traditional 3D particle system, and fairly computationally +expensive compared to many old demoscene fire tricks. But it's easy to think about +and tune, which was the right call for a one-day exercise :] +""" + +import os, webbrowser +from random import random, randint, choice + +from game_object import GameObject +from art import TileIter + +# +# some tuning knobs +# + +# total # of particles to spawn and maintain; +# user can change this at runtime with +/- +TARGET_PARTICLES_DEFAULT = 100 +# don't fill entire bottom of screen with fire; let it drift up and out +SPAWN_MARGIN_X = 8 +# each particle's character "decays" towards 0 in random jumps +CHAR_DECAY_RATE_MAX = 16 +# music is just an OGG file, modders feel free to provide your own in sounds/ +MUSIC_FILENAME = 'music.ogg' +MUSIC_URL = 'http://brotherandroid.com' +# random ranges for time in seconds til next message pops up +MESSAGE_DELAY_MIN, MESSAGE_DELAY_MAX = 300, 600 +MESSAGES = [ + 'Happy Holidays', + 'Merry Christmas', + 'Happy New Year', + 'Happy Hanukkah', + 'Happy Kwanzaa', + 'Feliz Navidad', + 'Joyeux Noel' +] + + +class Fireplace(GameObject): + + "The main game object, manages particles, handles input, draws the fire." + + generate_art = True + art_charset = 'c64_petscii' + art_width, art_height = 54, 30 # approximately 16x9 aspect + art_palette = 'fireplace' + handle_key_events = True + + def pre_first_update(self): + self.art.add_layer(z=0.01) + self.target_particles = TARGET_PARTICLES_DEFAULT + # get list of character indices, sorted based on # of non-blank pixels. + # this correlates roughly with visual density, so each particle can + # appear to fizzle out over time. + chars = list(range(self.art.charset.last_index)) + weights = {} + for i in chars: + pixels = self.art.charset.get_solid_pixels_in_char(i) + weights[i] = pixels + self.weighted_chars = sorted(chars, key=weights.__getitem__) + # spawn initial particles + self.particles = [] + for i in range(self.target_particles): + p = FireParticle(self) + self.particles.append(p) + # help screen + self.help_screen = self.world.spawn_object_of_class("HelpScreen", 0, 0) + self.help_screen.z = 1 + self.help_screen.set_scale(0.75, 0.75, 1) + # start with help screen up, uncomment to hide on start + #self.help_screen.visible = False + # don't bother creating credit screen if no music present + self.credit_screen = None + self.music_exists = False + if os.path.exists(self.world.sounds_dir + MUSIC_FILENAME): + self.app.log('%s found in %s' % (MUSIC_FILENAME, self.world.sounds_dir)) + self.world.play_music(MUSIC_FILENAME) + self.music_paused = False + self.music_exists = True + # music credit screen, click for link to artist's website + self.credit_screen = self.world.spawn_object_of_class("CreditScreen", 0, -6) + self.credit_screen.z = 1.1 + self.credit_screen.set_scale(0.75, 0.75, 1) + else: + self.app.log('No %s found in %s' % (MUSIC_FILENAME, self.world.sounds_dir)) + self.set_new_message_time() + + def update(self): + # shift messages on layer 2 upward gradually + if self.app.frames % 10 == 0: + self.art.shift(0, 1, 0, -1) + # at random intervals, print a friendly message on screen + if self.world.get_elapsed_time() / 1000 > self.next_message_time: + self.post_new_message() + self.set_new_message_time() + # update all particles, then mark for deletion in a separate list. + # newbie tip: iterating through a list while removing items from it + # can lead to bad bugs! + for p in self.particles: + p.update() + to_destroy = [] + for p in self.particles: + # cull particles that go out off screen + if p.y < 0: + to_destroy.append(p) + if p.x < 0 or p.x > self.art.width - 1: + to_destroy.append(p) + # possible future optimization: {(x,y):[particles]} spatial dict? + # for now just iterate through every pair + for other in self.particles: + if p is other: + continue + if other in to_destroy: + continue + # merge colors & chars if we overlap another, then destroy it + if p.x == other.x and p.y == other.y: + p.merge(other) + to_destroy.append(other) + # cull particles that have "gone out" + if p.char <= 0: + to_destroy.append(p) + if p.fg <= 0 and p.bg <= 0: + to_destroy.append(p) + for p in to_destroy: + if p in self.particles: + # once removed from this list, particle will be garbage-collected + self.particles.remove(p) + # dim existing tiles + for frame, layer, x, y in TileIter(self.art): + # dim message layer at a lower rate + if layer == 1 and self.app.frames % 3 != 0: + continue + if randint(0, 4) == 1: + ch, fg, bg, _ = self.art.get_tile_at(frame, layer, x, y) + # don't decay char index for messages on layer 2 to keep it legible + if y != 0 and layer == 0: + ch = self.weighted_chars[ch - 1] + self.art.set_tile_at(frame, layer, x, y, ch, fg - 1, bg - 1) + # draw particles + # (looks nicer if we don't clear between frames, actually) + #self.art.clear_frame_layer(0, 0) + for p in self.particles: + self.art.set_tile_at(0, 0, p.x, p.y, self.weighted_chars[p.char], p.fg, p.bg) + # spawn new particles to maintain target count + while len(self.particles) < self.target_particles: + p = FireParticle(self) + self.particles.append(p) + GameObject.update(self) + + def set_new_message_time(self): + self.next_message_time = self.world.get_elapsed_time() / 1000 + randint(MESSAGE_DELAY_MIN, MESSAGE_DELAY_MAX) + + def post_new_message(self): + msg_text = choice(MESSAGES) + x = randint(0, self.art.width - len(msg_text)) + # spawn in lower half of screen + y = randint(int(self.art.height / 2), self.art.height) + # write to second layer + self.art.write_string(0, 1, x, y, msg_text, randint(12, 16)) + + def handle_key_down(self, key, shift_pressed, alt_pressed, ctrl_pressed): + # in many Playscii games all input goes through the Player object; + # here input is handled by this object. + if key == 'escape' and not self.world.app.can_edit: + self.world.app.should_quit = True + elif key == 'h': + self.help_screen.visible = not self.help_screen.visible + if self.credit_screen: + self.credit_screen.visible = not self.credit_screen.visible + elif key == 'm' and self.music_exists: + if self.music_paused: + self.world.resume_music() + self.music_paused = False + else: + self.world.pause_music() + self.music_paused = True + elif key == 'c': + if not self.app.fb.disable_crt: + self.app.fb.toggle_crt() + elif key == '=' or key == '+': + self.target_particles += 10 + self.art.write_string(0, 0, 0, 0, 'Embers: %s' % self.target_particles, 15, 1) + elif key == '-': + if self.target_particles <= 10: + return + self.target_particles -= 10 + self.art.write_string(0, 0, 0, 0, 'Embers: %s' % self.target_particles, 15, 1) + + +class FireParticle: + + "Simulated particle, spawned and ticked and rendered by a Fireplace object." + + def __init__(self, fp): + # pick char and color here; Fireplace should just run sim + self.y = fp.art.height + # spawn at random point along bottom edge, within margin + self.x = randint(SPAWN_MARGIN_X, fp.art.width - SPAWN_MARGIN_X) + # char here is not character index but density, which decays; + # fp.weighted_chars is used to look up actual index + self.char = randint(100, fp.art.charset.last_index - 1) + # spawn with random foreground + background colors + # idea: spawn with relatively high brightness, + # ie high density bright FG, low density bright BG? + # (update: this didn't end up being necessary, more noisy is good) + self.fg = randint(0, len(fp.art.palette.colors) - 1) + self.bg = randint(0, len(fp.art.palette.colors) - 1) + # hang on to fireplace + self.fp = fp + + def update(self): + # no need for out-of-range checks; fireplace will cull particles that + # reach the top of the screen + self.y -= randint(1, 2) + # randomly move up, up-left, or up-right + self.x += randint(-1, 1) + # reduce char index by randomized rate + self.char -= randint(1, CHAR_DECAY_RATE_MAX) + # dim fg/bg colors by randomized rate + self.fg -= randint(0, 1) + self.bg -= randint(0, 1) + # don't bother with range checks on colors; + # if random embers "flare up" that's cool + #self.fg = max(0, self.fg) + #self.bg = max(0, self.bg) + + def merge(self, other): + # merge (sum w/ other) colors & chars (ie when particles overlap) + self.char += other.char + self.fg += other.fg + self.bg += other.bg + + +class HelpScreen(GameObject): + art_src = 'help' + alpha = 0.7 + + +class CreditScreen(GameObject): + + "Separate object for the clickable area of the help screen." + + art_src = 'credit' + alpha = 0.7 + handle_mouse_events = True + + def clicked(self, button, mouse_x, mouse_y): + if self.visible: + webbrowser.open(MUSIC_URL) + + def hovered(self, mouse_x, mouse_y): + # hilight text on hover + for frame, layer, x, y in TileIter(self.art): + self.art.set_color_at(frame, layer, x, y, 2) + + def unhovered(self, mouse_x, mouse_y): + for frame, layer, x, y in TileIter(self.art): + self.art.set_color_at(frame, layer, x, y, 16) diff --git a/games/fireplace/sounds/music_howto.txt b/games/fireplace/sounds/music_howto.txt new file mode 100644 index 0000000..7b50845 --- /dev/null +++ b/games/fireplace/sounds/music_howto.txt @@ -0,0 +1 @@ +Place an OGG sound file called "music.ogg" in this folder to hear it while the fireplace is running. diff --git a/games/fireplace/start.gs b/games/fireplace/start.gs new file mode 100644 index 0000000..73a0723 --- /dev/null +++ b/games/fireplace/start.gs @@ -0,0 +1,49 @@ +{ + "objects": [ + { + "bg_color_a": 0, + "bg_color_b": 0, + "bg_color_g": 0, + "bg_color_r": 0, + "camera_x": 0, + "camera_y": 0, + "camera_z": 15, + "class_name": "WorldPropertiesObject", + "collision_enabled": true, + "draw_debug_objects": true, + "draw_hud": true, + "game_title": "PETSCII Fireplace", + "globals_object_class_name": "WorldGlobalsObject", + "gravity_x": 0.0, + "gravity_y": 0.0, + "gravity_z": 0.0, + "hud_class_name": "GameHUD", + "object_grid_snap": true, + "player_camera_lock": true, + "room_camera_changes_enabled": true, + "show_all_rooms": false, + "show_bounds_all": false, + "show_collision_all": true, + "show_origin_all": false + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "Fireplace_7f074ab37358_art", + "class_name": "Fireplace", + "facing": 2, + "locked": false, + "name": "Fireplace_7f074ab37358", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 0.0007062918608009561, + "y": -0.002189216100444674, + "y_sort": false, + "z": 0.0 + } + ] +} \ No newline at end of file diff --git a/games/flood/scripts/game.py b/games/flood/scripts/game.py new file mode 100644 index 0000000..6d221c3 --- /dev/null +++ b/games/flood/scripts/game.py @@ -0,0 +1,133 @@ + +from random import choice + +from art import TileIter +from game_object import GameObject + +# TODO: +# solver? https://stackoverflow.com/questions/1430962/how-to-optimally-solve-the-flood-fill-puzzle + + +TILE_COLORS = [3, 4, 5, 6, 7] +STARTING_TURNS = 15 +BOARD_WIDTH, BOARD_HEIGHT = 10, 10 + +# game states +GS_PLAYING = 0 +GS_WON = 1 +GS_LOST = 2 + + +class Board(GameObject): + generate_art = True + art_width, art_height = BOARD_WIDTH, BOARD_HEIGHT + art_charset = 'jpetscii' + art_palette = 'c64_original' + handle_key_events = True + + def __init__(self, world, obj_data): + GameObject.__init__(self, world, obj_data) + self.reset() + + def reset(self): + for frame, layer, x, y in TileIter(self.art): + color = choice(TILE_COLORS) + self.art.set_color_at(frame, layer, x, y, color, False) + self.captured_tiles = [(0, 0)] + # before play, flood with color of starting (top left) tile + start_color = self.art.get_bg_color_index_at(0, 0, 0, 0) + self.flood_with_color(start_color) + self.turns = STARTING_TURNS + self.game_state = GS_PLAYING + + def get_adjacent_tiles(self, x, y): + tiles = [] + if x > 0: + tiles.append((x-1, y)) + if x < BOARD_WIDTH - 1: + tiles.append((x+1, y)) + if y > 0: + tiles.append((x, y-1)) + if y < BOARD_HEIGHT - 1: + tiles.append((x, y+1)) + return tiles + + def flood_with_color(self, flood_color): + # set captured tiles to new color + for tile_x,tile_y in self.captured_tiles: + self.art.set_color_at(0, 0, tile_x, tile_y, flood_color, False) + # capture like-colored tiles adjacent to captured tiles + for frame, layer, x, y in TileIter(self.art): + if not (x, y) in self.captured_tiles: + continue + adjacents = self.get_adjacent_tiles(x, y) + for adj_x,adj_y in adjacents: + adj_color = self.art.get_bg_color_index_at(frame, layer, adj_x, adj_y) + if adj_color == flood_color: + self.captured_tiles.append((adj_x, adj_y)) + + def color_picked(self, color): + self.flood_with_color(TILE_COLORS[color]) + self.turns -= 1 + if len(self.captured_tiles) == BOARD_WIDTH * BOARD_HEIGHT: + self.game_state = GS_WON + elif self.turns == 0: + self.game_state = GS_LOST + # TODO: reset after delay / feedback? + + def handle_key_down(self, key, shift_pressed, alt_pressed, ctrl_pressed): + if self.game_state != GS_PLAYING: + self.reset() + return + # get list of valid keys from length of tile_colors + valid_keys = ['%s' % str(i + 1) for i in range(len(TILE_COLORS))] + if not key in valid_keys: + return + key = int(key) - 1 + self.color_picked(key) + + +class ColorBar(GameObject): + generate_art = True + art_width, art_height = len(TILE_COLORS), 1 + art_charset = 'jpetscii' + art_palette = 'c64_original' + + def __init__(self, world, obj_data): + GameObject.__init__(self, world, obj_data) + i = 0 + for frame, layer, x, y in TileIter(self.art): + self.art.set_color_at(frame, layer, x, y, TILE_COLORS[i], False) + self.art.write_string(frame, layer, x, y, str(i + 1), 1) + i += 1 + + +class TurnsBar(GameObject): + text = 'turns: %s' + generate_art = True + art_width, art_height = len(text) + 3, 1 + art_charset = 'jpetscii' + art_palette = 'c64_original' + + def __init__(self, world, obj_data): + GameObject.__init__(self, world, obj_data) + self.board = None + + def pre_first_update(self): + self.board = self.world.get_all_objects_of_type('Board')[0] + + def draw_text(self): + if not self.board: + return + self.art.clear_frame_layer(0, 0) + new_text = self.text % self.board.turns + if self.board.game_state == GS_WON: + new_text = 'won!!' + elif self.board.game_state == GS_LOST: + new_text = 'lost :(' + color = TILE_COLORS[self.board.turns % len(TILE_COLORS)] + self.art.write_string(0, 0, 0, 0, new_text, color, 0) + + def update(self): + GameObject.update(self) + self.draw_text() diff --git a/games/flood/start.gs b/games/flood/start.gs new file mode 100644 index 0000000..d4375c5 --- /dev/null +++ b/games/flood/start.gs @@ -0,0 +1,87 @@ +{ + "objects": [ + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "TurnsBar_7faf04947f60_art", + "class_name": "TurnsBar", + "facing": 2, + "locked": false, + "name": "TurnsBar_7faf04947f60", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 0.0, + "y": 11.5, + "y_sort": false, + "z": 0.0 + }, + { + "bg_color_a": 0, + "bg_color_b": 0, + "bg_color_g": 0, + "bg_color_r": 0, + "camera_x": 0, + "camera_y": 0, + "camera_z": 14.361272552123562, + "class_name": "WorldPropertiesObject", + "collision_enabled": true, + "draw_debug_objects": true, + "draw_hud": true, + "game_title": "Flood the Board", + "globals_object_class_name": "WorldGlobalsObject", + "gravity_x": 0.0, + "gravity_y": 0.0, + "gravity_z": 0.0, + "hud_class_name": "GameHUD", + "object_grid_snap": true, + "player_camera_lock": true, + "room_camera_changes_enabled": true, + "show_all_rooms": false, + "show_bounds_all": false, + "show_collision_all": false, + "show_origin_all": false + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "Board_7f4cb53af1d0_art", + "class_name": "Board", + "facing": 2, + "locked": false, + "name": "Board_7f4cb53af1d0", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -0.10763889209677793, + "y": 0.28819444444444453, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "ColorBar_7fa709339dd8_art", + "class_name": "ColorBar", + "facing": 2, + "locked": false, + "name": "ColorBar_7fa709339dd8", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -0.4188704619202457, + "y": -10.032944574608543, + "y_sort": false, + "z": 0.0 + } + ] +} \ No newline at end of file diff --git a/games/maze/art/artifact.psci b/games/maze/art/artifact.psci new file mode 100644 index 0000000..38c3a06 --- /dev/null +++ b/games/maze/art/artifact.psci @@ -0,0 +1,33 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1, + -1.0, + 9.164452067389453 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 61, + "fg": 15, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/maze/art/ax.psci b/games/maze/art/ax.psci new file mode 100644 index 0000000..d7ca5dd --- /dev/null +++ b/games/maze/art/ax.psci @@ -0,0 +1,33 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1, + -1.0, + 6.805135228775052 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 88, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/maze/art/bg1.psci b/games/maze/art/bg1.psci new file mode 100644 index 0000000..94d8bdb --- /dev/null +++ b/games/maze/art/bg1.psci @@ -0,0 +1,14434 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 18.896433007983518, + -17.115383932418407, + 17.25524389712486 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 75, + "fg": 9, + "xform": 1 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 60, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 30, + "palette": "c64_original", + "width": 40 +} \ No newline at end of file diff --git a/games/maze/art/bg2.psci b/games/maze/art/bg2.psci new file mode 100644 index 0000000..03c1b67 --- /dev/null +++ b/games/maze/art/bg2.psci @@ -0,0 +1,14434 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 17.54592793729281, + -16.436225220213267, + 7.893471049087522 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 55, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 35, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 45, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 45, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 41, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 96, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 98, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 20, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 15, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 23, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 14, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 38, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 51, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 109, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 96, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 97, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 97, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 97, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 98, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 109, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 129, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 129, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 129, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 34, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 96, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 98, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 96, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 98, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 43, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 127, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 57, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 111, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 45, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 41, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 46, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 96, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 141, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 98, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 126, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 126, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 126, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 124, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 126, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 124, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 124, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 128, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 109, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 109, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 130, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 126, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 109, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 109, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 45, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 57, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 51, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 41, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 53, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 51, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 53, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 41, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 46, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 51, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 14, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 30, + "palette": "c64_original", + "width": 40 +} \ No newline at end of file diff --git a/games/maze/art/bg3.psci b/games/maze/art/bg3.psci new file mode 100644 index 0000000..3698912 --- /dev/null +++ b/games/maze/art/bg3.psci @@ -0,0 +1,4114 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 10.0, + -8.5, + 10.339730073999807 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 57, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 43, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 159, + "fg": 5, + "xform": 1 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 46, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 56, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 15, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 17, + "palette": "c64_original", + "width": 20 +} \ No newline at end of file diff --git a/games/maze/art/debris.psci b/games/maze/art/debris.psci new file mode 100644 index 0000000..4b55f30 --- /dev/null +++ b/games/maze/art/debris.psci @@ -0,0 +1,33 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1, + -1.0, + 5.427468781813435 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 9, + "char": 233, + "fg": 10, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/maze/art/horiztrig_sm.psci b/games/maze/art/horiztrig_sm.psci new file mode 100644 index 0000000..df60fbd --- /dev/null +++ b/games/maze/art/horiztrig_sm.psci @@ -0,0 +1,70 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 0.5, + -1.0, + 13.120374326841103 + ], + "charset": "c64_petscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 69, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 69, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 69, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 94, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 94, + "fg": 8, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 3 +} \ No newline at end of file diff --git a/games/maze/art/key.psci b/games/maze/art/key.psci new file mode 100644 index 0000000..47605e7 --- /dev/null +++ b/games/maze/art/key.psci @@ -0,0 +1,33 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1, + -1.0, + 10.51465982453033 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 248, + "fg": 8, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/maze/art/lock.psci b/games/maze/art/lock.psci new file mode 100644 index 0000000..21824e9 --- /dev/null +++ b/games/maze/art/lock.psci @@ -0,0 +1,33 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1, + -1.0, + 4.854507800375921 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 8, + "char": 223, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/maze/art/npc.psci b/games/maze/art/npc.psci new file mode 100644 index 0000000..e000318 --- /dev/null +++ b/games/maze/art/npc.psci @@ -0,0 +1,33 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1, + -1.0, + 16 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 251, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/maze/art/outsideBG.psci b/games/maze/art/outsideBG.psci new file mode 100644 index 0000000..a7f50fb --- /dev/null +++ b/games/maze/art/outsideBG.psci @@ -0,0 +1,1474 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 7.5, + -4.0, + 18.020032620006088 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + }, + { + "name": "Layer 2", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 57, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 53, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 45, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 33, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 36, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 37, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 41, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 52, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 80, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 55, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 37, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 44, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 35, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 45, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 37, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 52, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 15, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 21, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 20, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 19, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 9, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 4, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 5, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 3.0 + } + ] + } + ], + "height": 8, + "palette": "c64_original", + "width": 15 +} \ No newline at end of file diff --git a/games/maze/art/player_stand.psci b/games/maze/art/player_stand.psci new file mode 100644 index 0000000..9f9e048 --- /dev/null +++ b/games/maze/art/player_stand.psci @@ -0,0 +1,33 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1, + -1.0, + 3.0367990740061646 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 252, + "fg": 13, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/maze/art/portal.psci b/games/maze/art/portal.psci new file mode 100644 index 0000000..644ae7e --- /dev/null +++ b/games/maze/art/portal.psci @@ -0,0 +1,123 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 2.0, + -2.0, + 4.611834012376883 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 149, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 149, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 149, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 164, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 164, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 165, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 165, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 164, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 165, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 3, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 4, + "palette": "c64_original", + "width": 4 +} \ No newline at end of file diff --git a/games/maze/art/portalBG.psci b/games/maze/art/portalBG.psci new file mode 100644 index 0000000..9ba3a08 --- /dev/null +++ b/games/maze/art/portalBG.psci @@ -0,0 +1,12034 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 19.16832888077641, + -9.12305638142787, + 14.398908824414697 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 55, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 41, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 51, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 13, + "char": 149, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 2, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 5, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 25, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 15, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 14, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 4, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 95, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 95, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 13, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 25, + "palette": "c64_original", + "width": 40 +} \ No newline at end of file diff --git a/games/maze/art/portalgate.psci b/games/maze/art/portalgate.psci new file mode 100644 index 0000000..8e8e12d --- /dev/null +++ b/games/maze/art/portalgate.psci @@ -0,0 +1,1006 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 5.261098742185768, + -4.57161302230278, + 7.023027440451251 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 9, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 9, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 9, + "xform": 0 + }, + { + "bg": 10, + "char": 149, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 149, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 149, + "fg": 1, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 10, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 8, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 11, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 4, + "xform": 0 + }, + { + "bg": 1, + "char": 149, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 149, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 149, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 149, + "fg": 9, + "xform": 0 + }, + { + "bg": 15, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 10, + "xform": 0 + }, + { + "bg": 15, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 13, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 4, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 14, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 3, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 4, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 148, + "fg": 2, + "xform": 0 + }, + { + "bg": 15, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 16, + "char": 148, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 9, + "palette": "c64_original", + "width": 9 +} \ No newline at end of file diff --git a/games/maze/art/ruinBG.psci b/games/maze/art/ruinBG.psci new file mode 100644 index 0000000..548f7c2 --- /dev/null +++ b/games/maze/art/ruinBG.psci @@ -0,0 +1,7234 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 16.840079319610158, + -7.136310069001161, + 12.423104157166355 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 39, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 44, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 64, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 153, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 35, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 12, + "xform": 0 + }, + { + "bg": 13, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 13, + "xform": 0 + }, + { + "bg": 13, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 13, + "char": 156, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 13, + "char": 36, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 53, + "fg": 13, + "xform": 0 + }, + { + "bg": 13, + "char": 46, + "fg": 1, + "xform": 0 + }, + { + "bg": 13, + "char": 42, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 47, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 46, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 189, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 122, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 193, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 13, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 153, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 245, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 233, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 13, + "char": 122, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 13, + "char": 146, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 217, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 153, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 95, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 13, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 13, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 13, + "char": 202, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 13, + "char": 173, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 13, + "char": 104, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 16, + "xform": 0 + }, + { + "bg": 13, + "char": 156, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 13, + "char": 173, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 13, + "char": 173, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 233, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 89, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 181, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 61, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 217, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 216, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 104, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 169, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 155, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 157, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 16, + "xform": 0 + }, + { + "bg": 1, + "char": 92, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 173, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 156, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 247, + "fg": 13, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 15, + "palette": "c64_original", + "width": 40 +} \ No newline at end of file diff --git a/games/maze/art/seaBG.psci b/games/maze/art/seaBG.psci new file mode 100644 index 0000000..7b8c533 --- /dev/null +++ b/games/maze/art/seaBG.psci @@ -0,0 +1,10834 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 19.605875185031014, + -12.91121652122058, + 15.095760175633085 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 7, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 187, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 30, + "palette": "c64_original", + "width": 30 +} \ No newline at end of file diff --git a/games/maze/art/southBG2.psci b/games/maze/art/southBG2.psci new file mode 100644 index 0000000..a255ef8 --- /dev/null +++ b/games/maze/art/southBG2.psci @@ -0,0 +1,6754 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 21.33364119572919, + -11.486257048083855, + 10.014015558529602 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 14, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 55, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 36, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 54, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 52, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 53, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 55, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 244, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 50, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 37, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 40, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 33, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 54, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 41, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 46, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 39, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 80, + "fg": 15, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + }, + { + "bg": 1, + "char": 254, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 20, + "palette": "c64_original", + "width": 28 +} \ No newline at end of file diff --git a/games/maze/art/vertrig.psci b/games/maze/art/vertrig.psci new file mode 100644 index 0000000..6457ee5 --- /dev/null +++ b/games/maze/art/vertrig.psci @@ -0,0 +1,214 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 0.5, + -7.5, + 13.120374326841103 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "collision", + "tiles": [ + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + }, + { + "bg": 2, + "char": 255, + "fg": 8, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "viz", + "tiles": [ + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 15, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/maze/scripts/hud.py b/games/maze/scripts/hud.py new file mode 100644 index 0000000..bebc160 --- /dev/null +++ b/games/maze/scripts/hud.py @@ -0,0 +1,27 @@ + +from game_hud import GameHUD, GameHUDRenderable + +class MazeHUD(GameHUD): + + message_color = 4 + + def __init__(self, world): + GameHUD.__init__(self, world) + self.msg_art = self.world.app.new_art('mazehud_msg', 42, 1, + 'jpetscii', 'c64_original') + self.msg = GameHUDRenderable(self.world.app, self.msg_art) + self.arts = [self.msg_art] + self.renderables = [self.msg] + self.msg.x = -0.9 + self.msg.y = 0.9 + aspect = self.world.app.window_height / self.world.app.window_width + self.msg.scale_x = 0.075 * aspect + self.msg.scale_y = 0.05 + self.current_msg = '' + self.msg_art.clear_frame_layer(0, 0, 0, self.message_color) + self.post_msg('Welcome to MAZE, the amazing example game!') + + def post_msg(self, msg_text): + self.current_msg = msg_text + self.msg_art.clear_frame_layer(0, 0, 0, self.message_color) + self.msg_art.write_string(0, 0, 0, 0, self.current_msg) diff --git a/games/maze/scripts/objects.py b/games/maze/scripts/objects.py new file mode 100644 index 0000000..4aa610b --- /dev/null +++ b/games/maze/scripts/objects.py @@ -0,0 +1,232 @@ + +import math, random + +from art import TileIter +from game_object import GameObject +from game_util_objects import Player, StaticTileBG +from collision import CST_NONE, CST_CIRCLE, CST_AABB, CST_TILE, CT_NONE, CT_GENERIC_STATIC, CT_GENERIC_DYNAMIC, CT_PLAYER, CTG_STATIC, CTG_DYNAMIC + +class MazeBG(StaticTileBG): + z = -0.1 + +class MazeNPC(GameObject): + art_src = 'npc' + use_art_instance = True + col_radius = 0.5 + collision_shape_type = CST_CIRCLE + collision_type = CT_GENERIC_STATIC + bark = 'Well hello there!' + + def started_colliding(self, other): + if not isinstance(other, Player): + return + self.world.hud.post_msg(self.bark) + + def pre_first_update(self): + self.z = 0.1 + # TODO: investigate why this random color set doesn't seem to work + random.seed(self.name) + random_color = random.randint(3, len(self.art.palette.colors)) + for art in self.arts.values(): + art.set_all_non_transparent_colors(random_color) + +class MazeBaker(MazeNPC): + bark = 'Sorry, all outta bread today!' + +class MazeCritter(MazeNPC): + + "dynamically-spawned NPC that wobbles around" + + collision_type = CT_GENERIC_DYNAMIC + should_save = False + move_rate = 0.25 + bark = 'wheee!' + + def update(self): + # skitter around randomly + x, y = (random.random() * 2) - 1, (random.random() * 2) - 1 + x *= self.move_rate + y *= self.move_rate + self.move(x, y) + GameObject.update(self) + + +class MazePickup(GameObject): + + collision_shape_type = CST_CIRCLE + collision_type = CT_GENERIC_DYNAMIC + col_radius = 0.5 + + hold_offset_y = 1.2 + consume_on_use = True + sound_filenames = {'pickup': 'pickup.ogg'} + + def __init__(self, world, obj_data=None): + GameObject.__init__(self, world, obj_data) + self.holder = None + + def started_colliding(self, other): + if not isinstance(other, Player): + return + if self is other.held_object: + return + other.pick_up(self) + + def stopped_colliding(self, other): + if not isinstance(other, Player): + return + if self is not other.held_object: + self.enable_collision() + + def picked_up(self, new_holder): + self.holder = new_holder + self.world.hud.post_msg('got %s!' % self.display_name) + self.disable_collision() + self.play_sound('pickup') + + def used(self, user): + if 'used' in self.sound_filenames: + self.play_sound('used') + if self.consume_on_use: + self.destroy() + + def destroy(self): + if self.holder: + self.holder.held_object = None + self.holder = None + GameObject.destroy(self) + + def update(self): + GameObject.update(self) + if not self.holder: + return + # if held, shadow holder + self.x = self.holder.x + # bob slightly above holder's head + bob_y = math.sin(self.world.get_elapsed_time() / 100) / 10 + self.y = self.holder.y + self.hold_offset_y + bob_y + self.z = self.holder.z + + +class MazeKey(MazePickup): + art_src = 'key' + display_name = 'a gold key' + used_message = 'unlocked!' + +class MazeAx(MazePickup): + art_src = 'ax' + display_name = 'an ax' + consume_on_use = False + used_message = 'chop!' + # TODO: see if there's a way to add to MazePickup's sound dict here :/ + sound_filenames = {'pickup': 'pickup.ogg', + 'used': 'break.ogg'} + +class MazePortalKey(MazePickup): + art_src = 'artifact' + display_name = 'the Artifact of Zendor' + used_message = '!!??!?!!?!?!?!!' + consume_on_use = False + sound_filenames = {'pickup': 'artifact.ogg', + 'used': 'portal.ogg'} + + def update(self): + MazePickup.update(self) + ch, fg, bg, xform = self.art.get_tile_at(0, 0, 0, 0) + # before artifact is held, fluctuate char + if not self.holder: + ch += 1 + ch %= self.art.charset.last_index + if ch == 0: + ch = 1 + # always fluctuate its color + fg += 1 + fg %= len(self.art.palette.colors) + self.art.set_tile_at(0, 0, 0, 0, ch, fg, bg, xform) + + +class MazeLock(StaticTileBG): + art_src = 'lock' + collision_shape_type = CST_CIRCLE + collision_type = CT_GENERIC_DYNAMIC + col_radius = 0.5 + mass = 0.0 + key_type = MazeKey + + def started_colliding(self, other): + if not isinstance(other, Player): + return + if other.held_object and type(other.held_object) is self.key_type: + self.unlocked(other) + else: + self.world.hud.post_msg('blocked - need %s!' % self.key_type.display_name) + + def unlocked(self, other): + self.disable_collision() + self.visible = False + other.use_item() + + +class MazeBlockage(MazeLock): + art_src = 'debris' + key_type = MazeAx + + +class MazePortalGate(MazeLock): + + art_src = 'portalgate' + key_type = MazePortalKey + collision_shape_type = CST_TILE + collision_type = CT_GENERIC_STATIC + + def update(self): + MazeLock.update(self) + if self.collision_type == CT_NONE: + if not self.art.is_script_running('evap'): + self.art.run_script_every('evap') + return + # cycle non-black colors + BLACK = 1 + LAST_COLOR = len(self.art.palette.colors) - 1 + for frame, layer, x, y in TileIter(self.art): + ch, fg, bg, xform = self.art.get_tile_at(frame, layer, x, y) + # alternate wedge characters + if ch == 148: + ch = 149 + elif ch == 149: + ch = 148 + if fg != BLACK and fg != 0: + fg += 1 + if fg > LAST_COLOR: + fg = 2 + if bg != BLACK and bg != 0: + bg += 1 + if bg > LAST_COLOR: + bg = 2 + self.art.set_tile_at(frame, layer, x, y, ch, fg, bg, xform) + + +class MazePortal(GameObject): + art_src = 'portal' + def update(self): + GameObject.update(self) + if self.app.updates % 2 != 0: + return + ramps = {11: 10, 10: 3, 3: 11} + for frame, layer, x, y in TileIter(self.art): + ch, fg, bg, xform = self.art.get_tile_at(frame, layer, x, y) + fg = ramps.get(fg, None) + self.art.set_tile_at(frame, layer, x, y, ch, fg, bg, xform) + + +class MazeStandingNPC(GameObject): + art_src = 'npc' + col_radius = 0.5 + collision_shape_type = CST_CIRCLE + collision_type = CT_GENERIC_DYNAMIC + bark = 'Well hello there!' + + def started_colliding(self, other): + if not isinstance(other, Player): + return + self.world.hud.post_msg(self.bark) diff --git a/games/maze/scripts/player.py b/games/maze/scripts/player.py new file mode 100644 index 0000000..3df525d --- /dev/null +++ b/games/maze/scripts/player.py @@ -0,0 +1,55 @@ + +import math + +from game_util_objects import Player, BlobShadow +from games.maze.scripts.rooms import OutsideRoom + +class PlayerBlobShadow(BlobShadow): + z = 0 + fixed_z = True + scale_x = scale_y = 0.5 + offset_y = -0.5 + def pre_first_update(self): + BlobShadow.pre_first_update(self) + # TODO: figure out why class default scale isn't taking? + self.set_scale(0.5, 0.5, 1) + + +class MazePlayer(Player): + art_src = 'player' + move_state = 'stand' + col_radius = 0.5 + # TODO: setting this to 2 fixes tunneling, but shouldn't slow down the player! + fast_move_steps = 2 + attachment_classes = { 'shadow': 'PlayerBlobShadow' } + + def __init__(self, world, obj_data=None): + Player.__init__(self, world, obj_data) + self.held_object = None + + def pick_up(self, pickup): + # drop any other held item first + if self.held_object: + self.drop(self.held_object, pickup) + self.held_object = pickup + pickup.picked_up(self) + + def drop(self, pickup, new_pickup=None): + # drop pickup in place of one we're swapping with, else drop at feet + if new_pickup: + pickup.x, pickup.y = new_pickup.x, new_pickup.y + else: + pickup.x, pickup.y = self.x, self.y + pickup.holder = None + + def use_item(self): + self.world.hud.post_msg(self.held_object.used_message) + self.held_object.used(self) + + def update(self): + Player.update(self) + if type(self.world.current_room) is OutsideRoom: + self.z = 5 + math.sin(self.world.get_elapsed_time() / 300) * 2 + else: + # slightly above blob shadow + self.z = 0.01 diff --git a/games/maze/scripts/rooms.py b/games/maze/scripts/rooms.py new file mode 100644 index 0000000..6c66fe0 --- /dev/null +++ b/games/maze/scripts/rooms.py @@ -0,0 +1,26 @@ + +from game_room import GameRoom + + +class MazeRoom(GameRoom): + + def exited(self, new_room): + GameRoom.exited(self, new_room) + # clear message line when exiting + if self.world.hud: + self.world.hud.post_msg('') + + +class OutsideRoom(MazeRoom): + + camera_follow_player = True + + def entered(self, old_room): + MazeRoom.entered(self, old_room) + self.world.collision_enabled = False + self.world.app.camera.y_tilt = 4 + + def exited(self, new_room): + MazeRoom.exited(self, new_room) + self.world.collision_enabled = True + self.world.app.camera.y_tilt = 0 diff --git a/games/maze/sounds/artifact.ogg b/games/maze/sounds/artifact.ogg new file mode 100644 index 0000000..696862f Binary files /dev/null and b/games/maze/sounds/artifact.ogg differ diff --git a/games/maze/sounds/break.ogg b/games/maze/sounds/break.ogg new file mode 100644 index 0000000..11e0a62 Binary files /dev/null and b/games/maze/sounds/break.ogg differ diff --git a/games/maze/sounds/caves.ogg b/games/maze/sounds/caves.ogg new file mode 100644 index 0000000..321973e Binary files /dev/null and b/games/maze/sounds/caves.ogg differ diff --git a/games/maze/sounds/credits.txt b/games/maze/sounds/credits.txt new file mode 100644 index 0000000..34ab213 --- /dev/null +++ b/games/maze/sounds/credits.txt @@ -0,0 +1,8 @@ + +cave ambient sound from freesound.org: +"cave drips" by user "everythingsounds" under CC-BY-3.0 license. +http://www.freesound.org/people/everythingsounds/sounds/199515/ +Modifications: sound shortened. + +CC-BY-3.0 license: +http://creativecommons.org/licenses/by/3.0/ diff --git a/games/maze/sounds/pickup.ogg b/games/maze/sounds/pickup.ogg new file mode 100644 index 0000000..6637179 Binary files /dev/null and b/games/maze/sounds/pickup.ogg differ diff --git a/games/maze/sounds/portal.ogg b/games/maze/sounds/portal.ogg new file mode 100644 index 0000000..145ab68 Binary files /dev/null and b/games/maze/sounds/portal.ogg differ diff --git a/games/maze/start.gs b/games/maze/start.gs new file mode 100644 index 0000000..82e4e01 --- /dev/null +++ b/games/maze/start.gs @@ -0,0 +1,767 @@ +{ + "current_room": "starting", + "objects": [ + { + "art_src": "trigger_default", + "class_name": "WarpTrigger", + "destination_marker_name": null, + "destination_room_name": "cave2", + "locked": false, + "name": "Tstart2cave2a", + "use_marker_room": true, + "visible": true, + "x": -1.0, + "y": -13.0, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "lock", + "class_name": "MazeLock", + "facing": 2, + "locked": false, + "name": "cavelock2", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 9.5, + "y": 15.5, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "npc", + "class_name": "MazeBaker", + "facing": 2, + "locked": false, + "name": "baker", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -52.559257663276675, + "y": 2.972578982963758, + "y_sort": false, + "z": 0.1 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "startcam", + "visible": true, + "x": -3.7439999999999998, + "y": 5.472000000000001, + "z": 16.009167380557365 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "debris", + "class_name": "MazeBlockage", + "facing": 2, + "locked": false, + "name": "MazeBlockage_7fa9d67fd828", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -5.5, + "y": 1.5, + "y_sort": false, + "z": 0.0 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "towncam", + "visible": true, + "x": -44.10279257082698, + "y": 4.0, + "z": 17.070995359986807 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "portalBG", + "class_name": "MazeBG", + "facing": 2, + "locked": false, + "name": "portalBG", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 36.0, + "y": 2.5, + "y_sort": false, + "z": -0.1 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "ruinscam", + "visible": true, + "x": -54.0788068588908, + "y": -25.46569798795009, + "z": 10.869957460577599 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "npc", + "class_name": "MazeNPC", + "facing": 2, + "locked": false, + "name": "hermit", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -58.170556930229274, + "y": 12.337916715178741, + "y_sort": false, + "z": 0.1 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "cave1cam", + "visible": true, + "x": -16.30483967372331, + "y": -18.07218161059315, + "z": 7.648539833909864 + }, + { + "art_src": "trigger_default", + "class_name": "WarpTrigger", + "destination_marker_name": null, + "destination_room_name": "cave1", + "locked": false, + "name": "Tstart2cave1", + "use_marker_room": true, + "visible": true, + "x": -16.0, + "y": -13.0, + "z": 0.0 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "portalcam", + "visible": true, + "x": 35.291462350930885, + "y": 3.106521280843485, + "z": 14.390099166413725 + }, + { + "art_src": "trigger_default", + "class_name": "WarpTrigger", + "destination_marker_name": null, + "destination_room_name": "cave2", + "locked": false, + "name": "Tstart2cave2b", + "use_marker_room": true, + "visible": true, + "x": 10.0, + "y": -13.0, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "bg2", + "class_name": "MazeBG", + "facing": 3, + "locked": false, + "name": "townBG", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -44.0, + "y": 4.0, + "y_sort": false, + "z": -0.1 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "seacam", + "visible": true, + "x": 14.373101157977933, + "y": 32.867089627789134, + "z": 16.0 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "cave2cam", + "visible": true, + "x": 4.804288025292883, + "y": -22.311180826149485, + "z": 11.429005565617334 + }, + { + "art_src": "trigger_default", + "class_name": "WarpTrigger", + "destination_marker_name": "outsidemark", + "destination_room_name": null, + "locked": false, + "name": "Tportal2outside", + "use_marker_room": true, + "visible": true, + "x": 48.59283481841614, + "y": 2.2222249748833316, + "z": 0.0 + }, + { + "class_name": "ObjectSpawner", + "destroy_on_room_exit": false, + "locked": false, + "name": "critterspawner2", + "spawn_class_name": "MazeCritter", + "spawn_obj_name": "critter2", + "times_to_fire": 1, + "visible": true, + "x": -41.5, + "y": 2.5, + "z": 0.0 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "ruinswarp", + "visible": true, + "x": -59.5, + "y": -26.5, + "z": 0.0 + }, + { + "class_name": "ObjectSpawner", + "destroy_on_room_exit": false, + "locked": false, + "name": "critterspawner3", + "spawn_class_name": "MazeCritter", + "spawn_obj_name": "critter3", + "times_to_fire": 1, + "visible": true, + "x": -37.5, + "y": 2.5, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "portal", + "class_name": "MazePortal", + "facing": 2, + "locked": false, + "name": "MazePortal_7fc29eeccc18", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -24.0, + "y": 34.0, + "y_sort": false, + "z": -0.1 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "player", + "class_name": "MazePlayer", + "facing": 0, + "locked": false, + "name": "MazePlayer_7f81aab05b00", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -9.855148054461994, + "y": 11.503396436924467, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "portal", + "class_name": "MazePortal", + "facing": 2, + "locked": false, + "name": "MazePortal_7fe84782d0b8", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 48.5, + "y": 2.5, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "ruinBG", + "class_name": "MazeBG", + "facing": 2, + "locked": false, + "name": "ruinsBG", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -46.0, + "y": -26.0, + "y_sort": false, + "z": -0.1 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "outsidemark", + "visible": true, + "x": -23.5, + "y": 33.5, + "z": 0.0 + }, + { + "bg_color_a": 0, + "bg_color_b": 0, + "bg_color_g": 0, + "bg_color_r": 0, + "camera_x": -3.7439999999999998, + "camera_y": 5.472000000000001, + "camera_z": 16.009167380557365, + "class_name": "WorldPropertiesObject", + "collision_enabled": true, + "draw_debug_objects": false, + "draw_hud": true, + "game_title": "Maze, the amazing example game!", + "globals_object_class_name": "WorldGlobalsObject", + "gravity_x": 0.0, + "gravity_y": 0.0, + "gravity_z": 0.0, + "hud_class_name": "MazeHUD", + "object_grid_snap": true, + "player_camera_lock": false, + "room_camera_changes_enabled": true, + "show_all_rooms": false, + "show_bounds_all": false, + "show_collision_all": false, + "show_origin_all": false + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "outsidecamstart", + "visible": true, + "x": -0.1545352492661648, + "y": 14.47792490660747, + "z": 27.301729651051534 + }, + { + "art_src": "trigger_default", + "class_name": "WarpTrigger", + "destination_marker_name": "ruinswarp", + "destination_room_name": null, + "locked": false, + "name": "Ttown2ruins", + "use_marker_room": true, + "visible": true, + "x": -59.0, + "y": -4.0, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "key", + "class_name": "MazeKey", + "facing": 2, + "locked": false, + "name": "MazeKey_7f0479f45a20", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 8.555555256207787, + "y": -1.3703703703703702, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "ax", + "class_name": "MazeAx", + "facing": 2, + "locked": false, + "name": "ax", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -16.5, + "y": -18.5, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "debris", + "class_name": "MazeBlockage", + "facing": 2, + "locked": false, + "name": "southblockage", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -16.5, + "y": -13.5, + "y_sort": false, + "z": 0.0 + }, + { + "can_play": true, + "class_name": "SoundBlaster", + "locked": false, + "name": "cavesound", + "play_on_room_enter": true, + "sound_name": "caves", + "visible": true, + "x": 9.185406956013711, + "y": -26.05735487265739, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "bg1", + "class_name": "MazeBG", + "facing": 2, + "locked": false, + "name": "startBG", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -4.0, + "y": 4.0, + "y_sort": false, + "z": -0.1 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "bg3", + "class_name": "MazeBG", + "facing": 2, + "locked": false, + "name": "cave1bg", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -16.0, + "y": -19.0, + "y_sort": false, + "z": -0.1 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "southBG2", + "class_name": "MazeBG", + "facing": 2, + "locked": false, + "name": "cave2bg", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 5.0, + "y": -20.5, + "y_sort": false, + "z": -0.1 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "portalgate", + "class_name": "MazePortalGate", + "facing": 2, + "locked": false, + "name": "MazePortalGate_7fe29bd58d30", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 48.5, + "y": 2.5, + "y_sort": false, + "z": 0.1 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "outsideBG", + "class_name": "MazeBG", + "facing": 2, + "locked": false, + "name": "outsideBG", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -24.268732973199565, + "y": 39.64642715552863, + "y_sort": false, + "z": -0.2 + }, + { + "class_name": "ObjectSpawner", + "destroy_on_room_exit": false, + "locked": false, + "name": "critterspawner1", + "spawn_class_name": "MazeCritter", + "spawn_obj_name": "critter1", + "times_to_fire": 1, + "visible": true, + "x": -44.97214883980052, + "y": 9.097588892218281, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "seaBG", + "class_name": "MazeBG", + "facing": 2, + "locked": false, + "name": "seaBG", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 15.0, + "y": 34.0, + "y_sort": false, + "z": -0.1 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "artifact", + "class_name": "MazePortalKey", + "facing": 2, + "locked": false, + "name": "MazePortalKey_7fe74c8c9048", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 13.5, + "y": 43.5, + "y_sort": false, + "z": 0.0 + } + ], + "rooms": [ + { + "bottom_edge_warp_dest_name": "", + "camera_follow_player": true, + "camera_marker_name": "outsidecamstart", + "class_name": "OutsideRoom", + "left_edge_warp_dest_name": "", + "name": "outside", + "objects": [ + "townBG", + "MazePortal_7fc29eeccc18", + "MazePortal_7fe84782d0b8", + "startBG", + "cave1bg", + "cave2bg", + "ruinsBG", + "outsidemark", + "outsideBG", + "portalBG", + "seaBG", + "outsidecamstart" + ], + "right_edge_warp_dest_name": "", + "top_edge_warp_dest_name": "", + "warp_edge_bounds_obj_name": "" + }, + { + "bottom_edge_warp_dest_name": "", + "camera_follow_player": false, + "camera_marker_name": "cave1cam", + "class_name": "MazeRoom", + "left_edge_warp_dest_name": "ruins", + "name": "cave1", + "objects": [ + "southblockage", + "cave1bg", + "cavesound", + "cave1cam" + ], + "right_edge_warp_dest_name": "", + "top_edge_warp_dest_name": "starting", + "warp_edge_bounds_obj_name": "cave1bg" + }, + { + "bottom_edge_warp_dest_name": "", + "camera_follow_player": false, + "camera_marker_name": "startcam", + "class_name": "MazeRoom", + "left_edge_warp_dest_name": "town", + "name": "starting", + "objects": [ + "Tstart2cave2a", + "startBG", + "Tstart2cave1", + "Tstart2cave2b", + "MazeBlockage_7fa9d67fd828", + "startcam", + "cavelock2" + ], + "right_edge_warp_dest_name": "portal", + "top_edge_warp_dest_name": "sea", + "warp_edge_bounds_obj_name": "startBG" + }, + { + "bottom_edge_warp_dest_name": "", + "camera_follow_player": true, + "camera_marker_name": "ruinscam", + "class_name": "MazeRoom", + "left_edge_warp_dest_name": "", + "name": "ruins", + "objects": [ + "ruinscam", + "cavesound", + "ruinswarp", + "ruinsBG" + ], + "right_edge_warp_dest_name": "cave1", + "top_edge_warp_dest_name": "", + "warp_edge_bounds_obj_name": "ruinsBG" + }, + { + "bottom_edge_warp_dest_name": "", + "camera_follow_player": false, + "camera_marker_name": "portalcam", + "class_name": "MazeRoom", + "left_edge_warp_dest_name": "starting", + "name": "portal", + "objects": [ + "MazePortal_7fe84782d0b8", + "Tportal2outside", + "MazePortalGate_7fe29bd58d30", + "portalBG", + "portalcam" + ], + "right_edge_warp_dest_name": "", + "top_edge_warp_dest_name": "", + "warp_edge_bounds_obj_name": "portalBG" + }, + { + "bottom_edge_warp_dest_name": "", + "camera_follow_player": false, + "camera_marker_name": "cave2cam", + "class_name": "MazeRoom", + "left_edge_warp_dest_name": "", + "name": "cave2", + "objects": [ + "cavesound", + "cave2bg", + "cave2cam" + ], + "right_edge_warp_dest_name": "", + "top_edge_warp_dest_name": "starting", + "warp_edge_bounds_obj_name": "cave2bg" + }, + { + "bottom_edge_warp_dest_name": "", + "camera_follow_player": false, + "camera_marker_name": "towncam", + "class_name": "MazeRoom", + "left_edge_warp_dest_name": "", + "name": "town", + "objects": [ + "townBG", + "critterspawner1", + "baker", + "critterspawner3", + "critterspawner2", + "Ttown2ruins", + "towncam" + ], + "right_edge_warp_dest_name": "starting", + "top_edge_warp_dest_name": "", + "warp_edge_bounds_obj_name": "townBG" + }, + { + "bottom_edge_warp_dest_name": "starting", + "camera_follow_player": false, + "camera_marker_name": "seacam", + "class_name": "MazeRoom", + "left_edge_warp_dest_name": "", + "name": "sea", + "objects": [ + "seaBG", + "seacam" + ], + "right_edge_warp_dest_name": "", + "top_edge_warp_dest_name": "", + "warp_edge_bounds_obj_name": "seaBG" + } + ] +} \ No newline at end of file diff --git a/games/platso/art/monster_stand.psci b/games/platso/art/monster_stand.psci new file mode 100644 index 0000000..4c56582 --- /dev/null +++ b/games/platso/art/monster_stand.psci @@ -0,0 +1,147 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1.5, + -1.5, + 3.0588513758923073 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 198, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 144, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 239, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 146, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 243, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 243, + "fg": 8, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 198, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 144, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 239, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 146, + "fg": 6, + "xform": 0 + }, + { + "bg": 0, + "char": 242, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 242, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 3, + "palette": "c64_original", + "width": 3 +} \ No newline at end of file diff --git a/games/platso/art/platworld.psci b/games/platso/art/platworld.psci new file mode 100644 index 0000000..bc04d67 --- /dev/null +++ b/games/platso/art/platworld.psci @@ -0,0 +1,24034 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 25.479192481920578, + -27.525740941237288, + 15.162619751731762 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "collision", + "tiles": [ + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 187, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "backdrop", + "tiles": [ + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 5, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 5, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 5, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 5, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 5, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 7, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 7, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 7, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 10, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 10, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 10, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 3, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 255, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 254, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 6, + "xform": 0 + }, + { + "bg": 12, + "char": 253, + "fg": 6, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 76, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 12, + "char": 187, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 12, + "xform": 0 + } + ], + "visible": 1, + "z": -0.1 + } + ] + } + ], + "height": 40, + "palette": "c64_original", + "width": 50 +} \ No newline at end of file diff --git a/games/platso/art/player_stand.psci b/games/platso/art/player_stand.psci new file mode 100644 index 0000000..6d037a9 --- /dev/null +++ b/games/platso/art/player_stand.psci @@ -0,0 +1,177 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 3.932563498956305, + -3.1765643047985757, + 6.540795313908221 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 251, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 168, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 255, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 169, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 202, + "fg": 16, + "xform": 0 + }, + { + "bg": 16, + "char": 127, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 204, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 16, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 5, + "palette": "c64_original", + "width": 5 +} \ No newline at end of file diff --git a/games/platso/art/player_walk.psci b/games/platso/art/player_walk.psci new file mode 100644 index 0000000..8b41897 --- /dev/null +++ b/games/platso/art/player_walk.psci @@ -0,0 +1,663 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 3.1541974518242744, + -2.3903888982749955, + 9.711611763557475 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.05, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 251, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 243, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 243, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 150, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 151, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 227, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.05, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 251, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 242, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 255, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 209, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 199, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 213, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.05, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 251, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 242, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 242, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 183, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.05, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 251, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 255, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 209, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 199, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 213, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 5, + "palette": "c64_original", + "width": 5 +} \ No newline at end of file diff --git a/games/platso/art/warptrigger.psci b/games/platso/art/warptrigger.psci new file mode 100644 index 0000000..e2e2d38 --- /dev/null +++ b/games/platso/art/warptrigger.psci @@ -0,0 +1,243 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 6.071495962526748, + -0.24702223108995436, + 10.311633934764973 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "collision", + "tiles": [ + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 5, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 4, + "palette": "c64_original", + "width": 9 +} \ No newline at end of file diff --git a/games/platso/scripts/platso.py b/games/platso/scripts/platso.py new file mode 100644 index 0000000..50a300e --- /dev/null +++ b/games/platso/scripts/platso.py @@ -0,0 +1,142 @@ + +import math, random + +from game_object import GameObject +from game_util_objects import StaticTileBG, Player, Character, WarpTrigger +from collision import CST_AABB + +class PlatformWorld(StaticTileBG): + draw_col_layer = True + +class PlatformPlayer(Player): + + # from http://www.piratehearts.com/blog/2010/08/30/40/: + # JumpSpeed = sqrt(2.0f * Gravity * JumpHeight); + + art_src = 'player' + #collision_shape_type = CST_AABB + col_width = 2 + col_height = 3 + handle_key_events = True + fast_move_steps = 1 + col_radius = 1.75 + move_accel_x = 400 + move_accel_y = 2500 + ground_friction = 20 + air_friction = 15 + max_jump_press_time = 0.15 + editable = Player.editable + ['max_jump_press_time'] + jump_key = 'x' + + def __init__(self, world, obj_data=None): + Player.__init__(self, world, obj_data) + self.jump_time = 0 + # don't jump again until jump is released and pressed again + self.jump_ready = True + self.started_jump = False + + def started_colliding(self, other): + Player.started_colliding(self, other) + if isinstance(other, PlatformMonster): + # landing atop monster? + dx, dy = other.x - self.x, other.y - self.y + if abs(dy) > abs(dx) and dy < -1: + other.destroy() + + def is_affected_by_gravity(self): + return True + + def handle_key_down(self, key, shift_pressed, alt_pressed, ctrl_pressed): + if key == self.jump_key and self.jump_ready: + self.jump() + self.jump_ready = False + self.started_jump = True + + def handle_key_up(self, key, shift_pressed, alt_pressed, ctrl_pressed): + if key == self.jump_key: + self.jump_ready = True + + def allow_move_y(self, dy): + # disable regular up/down movement, jump button sets move_y directly + return False + + def update_state(self): + self.state = 'stand' if self.is_on_ground() and (self.move_x, self.move_y) == (0, 0) else 'walk' + + def moved_this_frame(self): + delta = math.sqrt(abs(self.last_x - self.x) ** 2 + abs(self.last_y - self.y) ** 2 + abs(self.last_z - self.z) ** 2) + return delta > self.stop_velocity + + def is_on_ground(self): + # works for now: just check for -Y contact with first world object + ground = self.world.get_first_object_of_type('PlatformWorld') + contact = self.collision.contacts.get(ground.name, None) + if not contact: + return False + return contact.overlap.y < 0 + + def jump(self): + self.jump_time += self.get_time_since_last_update() / 1000 + if self.jump_time < self.max_jump_press_time: + self.move_y += 1 + + def update(self): + on_ground = self.is_on_ground() + if on_ground and self.jump_time > 0: + self.jump_time = 0 + # poll jump key for variable length jump + if self.world.app.il.is_key_pressed(self.jump_key) and \ + (self.started_jump or not on_ground): + self.jump() + self.started_jump = False + Player.update(self) + # wobble as we walk a la ELC2 + if self.state == 'walk' and on_ground: + self.y += math.sin(self.world.app.updates) / 5 + +class PlatformMonster(Character): + art_src = 'monster' + move_state = 'stand' + animating = True + fast_move_steps = 2 + move_accel_x = 100 + col_radius = 1 + + def pre_first_update(self): + # pick random starting direction + self.move_dir_x = random.choice([-1, 1]) + self.set_timer_function('hit_wall', self.check_wall_hits, 0.2) + + def is_affected_by_gravity(self): + return True + + def allow_move_y(self, dy): + return False + + def check_wall_hits(self): + "Turn around if a wall is immediately ahead of direction we're moving." + # check collision in direction we're moving + margin = 0.1 + if self.move_dir_x > 0: + x = self.x + self.col_radius + margin + else: + x = self.x - self.col_radius - margin + y = self.y + # DEBUG see trace destination + #lines = [(self.x, self.y, 0), (x, y, 0)] + #self.app.debug_line_renderable.set_lines(lines) + hits, shapes = self.world.get_colliders_at_point(x, y, + #include_object_names=[], + include_class_names=['PlatformWorld', + 'PlatformMonster'], + exclude_object_names=[self.name]) + if len(hits) > 0: + self.move_dir_x = -self.move_dir_x + + def update(self): + self.move(self.move_dir_x, 0) + Character.update(self) + + +class PlatformWarpTrigger(WarpTrigger): + warp_class_names = ['Player', 'PlatformMonster'] diff --git a/games/platso/start.gs b/games/platso/start.gs new file mode 100644 index 0000000..391119f --- /dev/null +++ b/games/platso/start.gs @@ -0,0 +1,156 @@ +{ + "objects": [ + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "platworld", + "class_name": "PlatformWorld", + "facing": 2, + "locked": true, + "name": "bg", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 0.0, + "y": 0.0, + "y_sort": false, + "z": -0.1 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "monster", + "class_name": "PlatformMonster", + "facing": 2, + "locked": false, + "name": "PlatformMonster_7fa6568bb1d0", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -6.059425457722554, + "y": 7.0, + "y_sort": false, + "z": 0.0 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "topwarpmark", + "visible": true, + "x": -5.630180148546872, + "y": 19.354543134005176, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "monster", + "class_name": "PlatformMonster", + "facing": 2, + "locked": false, + "name": "PlatformMonster_7fa656435320", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": -20.112994148537886, + "y": 3.0, + "y_sort": false, + "z": 0.0 + }, + { + "class_name": "LocationMarker", + "locked": false, + "name": "cameramark", + "visible": true, + "x": -0.9597252146192882, + "y": -1.107799301680745, + "z": 18.680436366706225 + }, + { + "art_src": "warptrigger", + "class_name": "PlatformWarpTrigger", + "destination_marker_name": "topwarpmark", + "destination_room_name": null, + "locked": false, + "name": "WarpTrigger_7f20b6c2bf98", + "use_marker_room": true, + "visible": true, + "x": -2.5, + "y": -22.0, + "z": 0.0 + }, + { + "bg_color_a": 0, + "bg_color_b": 0, + "bg_color_g": 0, + "bg_color_r": 0, + "camera_x": -0.9597252146192882, + "camera_y": -1.107799301680745, + "camera_z": 18.680436366706225, + "class_name": "WorldPropertiesObject", + "collision_enabled": true, + "draw_debug_objects": true, + "draw_hud": true, + "game_title": "PLATSO", + "globals_object_class_name": "WorldGlobalsObject", + "gravity_x": 0.0, + "gravity_y": -800.0, + "gravity_z": 0.0, + "hud_class_name": "GameHUD", + "object_grid_snap": true, + "player_camera_lock": false, + "room_camera_changes_enabled": true, + "show_all_rooms": false, + "show_bounds_all": false, + "show_collision_all": false, + "show_origin_all": false + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "monster", + "class_name": "PlatformMonster", + "facing": 2, + "locked": false, + "name": "PlatformMonster_7fa656435a20", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 14.300627894346023, + "y": 7.0, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "player", + "class_name": "PlatformPlayer", + "facing": 2, + "locked": false, + "name": "PlatformPlayer_7f0fe491c9e8", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 3.63842628232969, + "y": -16.25, + "y_sort": false, + "z": 0.0 + } + ] +} \ No newline at end of file diff --git a/games/shmup/art/asteroid.psci b/games/shmup/art/asteroid.psci new file mode 100644 index 0000000..2093ca1 --- /dev/null +++ b/games/shmup/art/asteroid.psci @@ -0,0 +1,81 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 3, + -3.0, + 10.339437341021961 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 149, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 149, + "fg": 9, + "xform": 0 + }, + { + "bg": 10, + "char": 149, + "fg": 9, + "xform": 0 + }, + { + "bg": 10, + "char": 149, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 149, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 10, + "char": 149, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 3, + "palette": "c64_original", + "width": 3 +} \ No newline at end of file diff --git a/games/shmup/art/bg_frame.psci b/games/shmup/art/bg_frame.psci new file mode 100644 index 0000000..807c81b --- /dev/null +++ b/games/shmup/art/bg_frame.psci @@ -0,0 +1,14794 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 17.75833754179403, + -30.617397029743437, + 17.619696383734336 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 108, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 19, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 8, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 13, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 21, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 16, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 80, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 110, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 56, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 52, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 38, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 41, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 50, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 37, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 1 + }, + { + "bg": 1, + "char": 140, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 74, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 142, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 41, + "palette": "c64_original", + "width": 30 +} \ No newline at end of file diff --git a/games/shmup/art/blockline_horiz.psci b/games/shmup/art/blockline_horiz.psci new file mode 100644 index 0000000..1422cb1 --- /dev/null +++ b/games/shmup/art/blockline_horiz.psci @@ -0,0 +1,394 @@ +{ + "active_frame": 0, + "active_layer": 1, + "camera": [ + 15.0, + -0.5, + 19.23057319529262 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 30 +} \ No newline at end of file diff --git a/games/shmup/art/boom.psci b/games/shmup/art/boom.psci new file mode 100644 index 0000000..5b83e5a --- /dev/null +++ b/games/shmup/art/boom.psci @@ -0,0 +1,1545 @@ +{ + "active_frame": 4, + "active_layer": 0, + "camera": [ + 4.961168420067169, + -3.2063775207684735, + 6.28984822227487 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 108, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 110, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 119, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 140, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 142, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 105, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 107, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 122, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 137, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 139, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 151, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 150, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 102, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 103, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 104, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 118, + "fg": 3, + "xform": 0 + }, + { + "bg": 3, + "char": 122, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 120, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 111, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 134, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 135, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 136, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 150, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 127, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 151, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 108, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 110, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 200, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 140, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 142, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 108, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 110, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 201, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 140, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 12, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 142, + "fg": 12, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 7, + "palette": "c64_original", + "width": 7 +} \ No newline at end of file diff --git a/games/shmup/art/enemy1.psci b/games/shmup/art/enemy1.psci new file mode 100644 index 0000000..17bf219 --- /dev/null +++ b/games/shmup/art/enemy1.psci @@ -0,0 +1,81 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 1.6467229806608072, + -1.271009990327077, + 4.685469196537706 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 172, + "fg": 7, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 173, + "fg": 7, + "xform": 3 + }, + { + "bg": 7, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 7, + "char": 172, + "fg": 8, + "xform": 1 + }, + { + "bg": 7, + "char": 47, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 214, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 3, + "palette": "c64_original", + "width": 3 +} \ No newline at end of file diff --git a/games/shmup/art/enemy2.psci b/games/shmup/art/enemy2.psci new file mode 100644 index 0000000..e003b8f --- /dev/null +++ b/games/shmup/art/enemy2.psci @@ -0,0 +1,147 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 2.6353900058944917, + -2.080875532273818, + 5.25886715549832 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.25, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 245, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 228, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 217, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 229, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.25, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 228, + "fg": 2, + "xform": 1 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 228, + "fg": 2, + "xform": 0 + }, + { + "bg": 2, + "char": 217, + "fg": 1, + "xform": 0 + }, + { + "bg": 1, + "char": 229, + "fg": 2, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 3, + "palette": "c64_original", + "width": 3 +} \ No newline at end of file diff --git a/games/shmup/art/enemy_proj.psci b/games/shmup/art/enemy_proj.psci new file mode 100644 index 0000000..fa49c84 --- /dev/null +++ b/games/shmup/art/enemy_proj.psci @@ -0,0 +1,87 @@ +{ + "active_frame": 2, + "active_layer": 0, + "camera": [ + 0.5, + -0.5, + 3.943004140277209 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 77, + "fg": 7, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 61, + "fg": 15, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 122, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 61, + "fg": 15, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/shmup/art/player.psci b/games/shmup/art/player.psci new file mode 100644 index 0000000..258cd3f --- /dev/null +++ b/games/shmup/art/player.psci @@ -0,0 +1,459 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 4.5, + -4.0, + 8.747186434947835 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 3, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 3, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 9, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 9, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 9, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 9, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 9, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 9, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 9, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 8, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 8, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 6, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 6, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 6, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 6, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 6, + "char": 251, + "fg": 1, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 7, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 7, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 1, + "char": 251, + "fg": 5, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + }, + { + "bg": 0, + "char": 0, + "fg": 0, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 8, + "palette": "c64_original", + "width": 9 +} \ No newline at end of file diff --git a/games/shmup/art/player_proj.psci b/games/shmup/art/player_proj.psci new file mode 100644 index 0000000..46112ea --- /dev/null +++ b/games/shmup/art/player_proj.psci @@ -0,0 +1,123 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 0.5, + -0.5, + 3.943004140277209 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 199, + "fg": 3, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 199, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 199, + "fg": 8, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 199, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 199, + "fg": 8, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + }, + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 0, + "char": 199, + "fg": 9, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 1 +} \ No newline at end of file diff --git a/games/shmup/art/spawn_area.psci b/games/shmup/art/spawn_area.psci new file mode 100644 index 0000000..429d16b --- /dev/null +++ b/games/shmup/art/spawn_area.psci @@ -0,0 +1,346 @@ +{ + "active_frame": 0, + "active_layer": 0, + "camera": [ + 15.999969418465653, + -1.0, + 19.23057319529262 + ], + "charset": "jpetscii", + "frames": [ + { + "delay": 0.1, + "layers": [ + { + "name": "Layer 1", + "tiles": [ + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + }, + { + "bg": 1, + "char": 1, + "fg": 2, + "xform": 0 + } + ], + "visible": 1, + "z": 0 + }, + { + "name": "collision", + "tiles": [ + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + }, + { + "bg": 1, + "char": 255, + "fg": 11, + "xform": 0 + } + ], + "visible": 1, + "z": 0.1 + } + ] + } + ], + "height": 1, + "palette": "c64_original", + "width": 26 +} \ No newline at end of file diff --git a/games/shmup/scripts/shmup.py b/games/shmup/scripts/shmup.py new file mode 100644 index 0000000..e04bab0 --- /dev/null +++ b/games/shmup/scripts/shmup.py @@ -0,0 +1,240 @@ + +import math, random + +from game_object import GameObject +from game_util_objects import Player, Character, Projectile, StaticTileBG, ObjectSpawner + +class ShmupPlayer(Player): + state_changes_art = False + move_state = 'stand' + art_src = 'player' + handle_key_events = True + invincible = False # DEBUG + serialized = Player.serialized + ['invincible'] + respawn_delay = 3 + # refire delay, else holding X chokes game + fire_delay = 0.15 + + def __init__(self, world, obj_data=None): + Player.__init__(self, world, obj_data) + # track last death and last fire time for respawn and refire delays + self.last_death_time = 0 + self.last_fire_time = 0 + # save our start position + self.start_x, self.start_y = self.x, self.y + + def handle_key_down(self, key, shift_pressed, alt_pressed, ctrl_pressed): + if key == 'x' and self.state == 'dead': + # respawn after short delay + time = self.world.get_elapsed_time() / 1000 + if time >= self.last_death_time + self.respawn_delay: + self.state = 'stand' + self.set_loc(self.start_x, self.start_y) + self.visible = True + + def update_state(self): + # only two states, ignore stuff parent class does for this + pass + + def die(self, killer): + if self.invincible or self.state == 'dead': + return + boom = Boom(self.world) + boom.set_loc(self.x, self.y) + self.state = 'dead' + self.last_death_time = self.world.get_elapsed_time() / 1000 + self.visible = False + + def update(self): + Player.update(self) + # poll fire key directly for continuous fire (with refire delay) + if self.state != 'dead' and self.world.app.il.is_key_pressed('x'): + time = self.world.get_elapsed_time() / 1000 + if time >= self.last_fire_time + self.fire_delay: + proj = ShmupPlayerProjectile(self.world) + proj.fire(self, 0, 1) + self.last_fire_time = self.world.get_elapsed_time() / 1000 + + +class PlayerBlocker(StaticTileBG): + "keeps player from advancing too far upfield" + art_src = 'blockline_horiz' + noncolliding_classes = ['Projectile', 'ShmupEnemy'] + +class EnemySpawner(ObjectSpawner): + "sits at top of screen and spawns enemies" + art_src = 'spawn_area' + spawn_random_in_bounds = True + trigger_on_room_enter = False + + def __init__(self, world, obj_data=None): + ObjectSpawner.__init__(self, world, obj_data) + self.next_spawn_time = 0 + self.target_enemy_count = 1 + + def can_spawn(self): + player = self.world.get_first_object_of_type('ShmupPlayer') + # only spawn if player has fired, there's room, and it's time + return player and player.state != 'dead' and \ + player.last_fire_time > 0 and \ + len(self.spawned_objects) < self.target_enemy_count and \ + self.world.get_elapsed_time() >= self.next_spawn_time + + def get_spawn_class_name(self): + roll = random.random() + # pick random enemy type to spawn + if roll > 0.8: + return 'Enemy1' + elif roll > 0.6: + return 'Enemy2' + else: + return 'Asteroid' + + def update(self): + StaticTileBG.update(self) + # bump up enemy counts as time goes on + time = self.world.get_elapsed_time() / 1000 + if time > 60: + self.target_enemy_count = 4 + elif time > 30: + self.target_enemy_count = 3 + elif time > 10: + self.target_enemy_count = 2 + enemy = self.trigger() + # if we spawned, pick next spawn time within random range + if enemy: + next_delay = random.random() * 3 + self.next_spawn_time = self.world.get_elapsed_time() + next_delay * 1000 + +class EnemyDeleter(StaticTileBG): + "deletes enemies once they hit a certain point on screen" + art_src = 'blockline_horiz' + def started_colliding(self, other): + if isinstance(other, ShmupEnemy): + other.destroy() + +class ShmupEnemy(Character): + state_changes_art = False + move_state = 'stand' + should_save = False + invincible = False # DEBUG + serialized = Character.serialized + ['invincible'] + + def started_colliding(self, other): + if isinstance(other, ShmupPlayer): + other.die(self) + + def fire_proj(self): + proj = ShmupEnemyProjectile(self.world) + # fire downward + proj.fire(self, 0, -1) + + def update(self): + self.move(0, -1) + Character.update(self) + +class Enemy1(ShmupEnemy): + art_src = 'enemy1' + move_accel_y = 100 + + def update(self): + # sine wave motion in X + time = self.world.get_elapsed_time() + self.x = math.sin(time / 200) * 6 + # fire very occasionally + if random.random() < 0.05: + self.fire_proj() + ShmupEnemy.update(self) + +class Enemy2(ShmupEnemy): + art_src = 'enemy2' + animating = True + move_accel_y = 50 + + def pre_first_update(self): + ShmupEnemy.pre_first_update(self) + # pick random lateral movement goal + self.goal_x, y = self.spawner.get_spawn_location() + + def update(self): + # move to random goal X + dx = self.goal_x - self.x + if 0 < abs(dx) < 0.5: + self.x = self.goal_x + elif dx > 0: + self.move(1, 0) + elif dx < 0: + self.move(-1, 0) + else: + # fire salvo + if random.random() < 0.1: + self.fire_proj() + ShmupEnemy.update(self) + +class Asteroid(ShmupEnemy): + "totally inert, just moves slowly down the screen" + art_src = 'asteroid' + move_accel_y = 200 + +class ShmupPlayerProjectile(Projectile): + animating = True + art_src = 'player_proj' + use_art_instance = True + noncolliding_classes = Projectile.noncolliding_classes + ['Boom', 'Player'] + def started_colliding(self, other): + if isinstance(other, ShmupEnemy) and not other.invincible: + boom = Boom(self.world) + boom.set_loc(self.x, self.y) + # spawn burst, destroy enemy + other.destroy() + self.destroy() + +class ShmupEnemyProjectile(Projectile): + animating = True + art_src = 'enemy_proj' + use_art_instance = True + noncolliding_classes = Projectile.noncolliding_classes + ['Boom', 'ShmupEnemy'] + def started_colliding(self, other): + if isinstance(other, ShmupPlayer) and other.state != 'dead': + other.die(self) + self.destroy() + +class Boom(GameObject): + art_src = 'boom' + animating = True + use_art_instance = True + should_save = False + z = 0.5 + scale_x, scale_y = 3, 3 + lifespan = 0.5 + def get_acceleration(self, vel_x, vel_y, vel_z): + return 0, 0, -100 + +class Starfield(GameObject): + + "scrolling background with stars generated on-the-fly - no PSCI file!" + + generate_art = True + art_width, art_height = 30, 41 + art_charset = 'jpetscii' + alpha = 0.25 # NOTE: this will be overriden by saved instance because it's in the list of serialized properties + # indices of star characters + star_chars = [201] + + def pre_first_update(self): + self.art.clear_frame_layer(0, 0) + + def create_star(self): + "create a star at a random point along the top edge" + x = int(random.random() * self.art_width) + char = random.choice(self.star_chars) + color = self.art.palette.get_random_color_index() + self.art.set_tile_at(0, 0, x, 0, char, color) + + def update(self): + # maybe create a star at the top, clear bottom line, then shift-wrap + if random.random() < 0.25: + self.create_star() + self.art.clear_line(0, 0, self.art_height - 1) + self.art.shift_all_frames(0, 1) + GameObject.update(self) diff --git a/games/shmup/start.gs b/games/shmup/start.gs new file mode 100644 index 0000000..82f247b --- /dev/null +++ b/games/shmup/start.gs @@ -0,0 +1,139 @@ +{ + "objects": [ + { + "bg_color_a": 0, + "bg_color_b": 0, + "bg_color_g": 0, + "bg_color_r": 0, + "camera_x": 0, + "camera_y": 0.5976516786404464, + "camera_z": 21.114262986283173, + "class_name": "WorldPropertiesObject", + "collision_enabled": true, + "draw_debug_objects": true, + "draw_hud": true, + "game_title": "SHMUP!", + "globals_object_class_name": "WorldGlobalsObject", + "gravity_x": 0.0, + "gravity_y": 0.0, + "gravity_z": 0.0, + "hud_class_name": "GameHUD", + "object_grid_snap": false, + "player_camera_lock": false, + "room_camera_changes_enabled": true, + "show_all_rooms": false, + "show_bounds_all": false, + "show_collision_all": false, + "show_origin_all": false + }, + { + "class_name": "EnemySpawner", + "destroy_on_room_exit": true, + "locked": false, + "name": "EnemySpawner_7efd6601d3c8", + "spawn_class_name": null, + "spawn_obj_name": "", + "times_to_fire": -1, + "visible": false, + "x": 0.14662682279777428, + "y": 18.974880574109132, + "z": 0.0 + }, + { + "alpha": 0.6, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "Starfield_7f5392c94f28_art", + "class_name": "Starfield", + "facing": 2, + "locked": true, + "name": "Starfield_7f5392c94f28", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 0.0, + "y": 0.0, + "y_sort": false, + "z": -0.5 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "blockline_horiz", + "class_name": "PlayerBlocker", + "facing": 2, + "locked": false, + "name": "PlayerBlocker_7fdf8004d5c0", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": false, + "x": 0.09775121519851826, + "y": -4.729789676694888, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "bg_frame", + "class_name": "StaticTileBG", + "facing": 2, + "locked": true, + "name": "bg_frame", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": true, + "x": 0.0, + "y": 0.0, + "y_sort": false, + "z": 0.1 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "blockline_horiz", + "class_name": "EnemyDeleter", + "facing": 2, + "locked": false, + "name": "EnemyDeleter_7f5364165da0", + "scale_x": 1.0, + "scale_y": 1.0, + "state": "stand", + "visible": false, + "x": -0.09775121519851382, + "y": -19.68572595864547, + "y_sort": false, + "z": 0.0 + }, + { + "alpha": 1.0, + "animating": false, + "art_off_pct_x": 0.5, + "art_off_pct_y": 0.5, + "art_src": "player", + "class_name": "ShmupPlayer", + "facing": 2, + "invincible": false, + "locked": false, + "name": "ShmupPlayer_7faab653d4a8", + "scale_x": 0.5, + "scale_y": 0.5, + "state": "stand", + "visible": true, + "x": 0.28300364472611744, + "y": -12.941906968542662, + "y_sort": false, + "z": 0.0 + } + ] +} \ No newline at end of file diff --git a/games/wildflowers/scripts/flower.py b/games/wildflowers/scripts/flower.py new file mode 100644 index 0000000..a7af5a0 --- /dev/null +++ b/games/wildflowers/scripts/flower.py @@ -0,0 +1,169 @@ + +import time, random + +from game_object import GameObject +from art import UV_FLIPX, UV_FLIPY, UV_ROTATE180, ART_DIR +from renderable import TileRenderable + +from games.wildflowers.scripts.ramps import PALETTE_RAMPS +from games.wildflowers.scripts.petal import Petal +from games.wildflowers.scripts.frond import Frond + + +# TODO: random size range? +# (should also change camera zoom, probably frond/petal counts) +FLOWER_WIDTH, FLOWER_HEIGHT = 16, 16 + + +class FlowerObject(GameObject): + + generate_art = True + should_save = False + physics_move = False + art_width, art_height = FLOWER_WIDTH, FLOWER_HEIGHT + + min_petals, max_petals = 0, 4 + min_fronds, max_fronds = 0, 8 + # every flower must have at least this many petals + fronds + minimum_complexity = 4 + # app updates per grow update; 1 = grow every frame + ticks_per_grow = 4 + + # DEBUG: if True, add current time to date seed as a decimal, + # to test with highly specific values + # (note: this turns the seed from an int into a float) + seed_includes_time = False + # DEBUG: if nonzero, use this seed for testing + debug_seed = 0 + debug_log = False + + def __init__(self, world, obj_data=None): + GameObject.__init__(self, world, obj_data) + # set random seed based on date, a different flower each day + t = time.localtime() + year, month, day = t.tm_year, t.tm_mon, t.tm_mday + weekday = t.tm_wday # 0 = monday + date = year * 10000 + month * 100 + day + if self.seed_includes_time: + date += t.tm_hour * 0.01 + t.tm_min * 0.0001 + t.tm_sec * 0.000001 + if self.debug_seed != 0: + self.seed = self.debug_seed + else: + self.seed = date + random.seed(self.seed) + # pick a random dark BG color (will be quantized to palette) + r, g, b = random.random() / 10, random.random() / 10, random.random() / 10 + # set up art with character set, size, and a random (supported) palette + self.art.set_charset_by_name('jpetscii') + palette = random.choice(list(PALETTE_RAMPS.keys())) + self.art.set_palette_by_name(palette) + # quantize bg color and set it for art and world + self.bg_index = self.art.palette.get_closest_color_index(int(r * 255), int(g * 255), int(b * 255)) + bg_color = self.art.palette.colors[self.bg_index] + self.world.bg_color[0] = bg_color[0] / 255.0 + self.world.bg_color[1] = bg_color[1] / 255.0 + self.world.bg_color[2] = bg_color[2] / 255.0 + self.world.bg_color[3] = 1.0 # set here or alpha is zero? + self.art.resize(self.art_width, self.art_height) + self.app.ui.adjust_for_art_resize(self) # grid etc + self.art.clear_frame_layer(0, 0, bg_color=self.bg_index) + # petals on a layer underneath fronds? + #self.art.add_layer(z=-0.001, name='petals') + self.finished_growing = False + # some flowers can be more petal-centric or frond-centric, + # but keep a certain minimum complexity + petal_count = random.randint(self.min_petals, self.max_petals) + frond_count = random.randint(self.min_fronds, self.max_fronds) + while petal_count + frond_count < self.minimum_complexity: + petal_count = random.randint(self.min_petals, self.max_petals) + frond_count = random.randint(self.min_fronds, self.max_fronds) + self.petals = [] + #petal_count = 5 # DEBUG + for i in range(petal_count): + self.petals.append(Petal(self, i)) + # sort petals by radius largest to smallest, + # so big ones don't totally stomp smaller ones + self.petals.sort(key=lambda item: item.goal_radius, reverse=True) + self.fronds = [] + #frond_count = 0 # DEBUG + for i in range(frond_count): + self.fronds.append(Frond(self, i)) + # track # of growth updates we've had + self.grows = 0 + # create an art document we can add frames to and later export + self.export_filename = '%s%swildflower_%s' % (self.app.documents_dir, ART_DIR, self.seed) + self.exportable_art = self.app.new_art(self.export_filename, + self.art_width, self.art_height, + self.art.charset.name, + self.art.palette.name) + # re-set art's filename to be in documents dir rather than game dir :/ + self.exportable_art.set_filename(self.export_filename) + # image export process needs a renderable + r = TileRenderable(self.app, self.exportable_art) + + def update(self): + GameObject.update(self) + # grow only every few ticks, so you can watch the design grow + if self.app.updates % self.ticks_per_grow != 0: + return + if not self.finished_growing: + self.update_growth() + + def update_growth(self): + if self.debug_log: + print('update growth:') + grew = False + for p in self.petals: + if not p.finished_growing: + grew = True + p.grow() + # break so that each petal grows one at a time + break + for f in self.fronds: + # break if still growing petals + if grew: + break + if not f.finished_growing: + grew = True + painted = f.grow() + while not painted and not f.finished_growing: + painted = f.grow() + # break so that each frond grows one at a time + break + self.copy_new_frame() + self.grows += 1 + if not grew: + self.finished_growing = True + self.exportable_art.set_active_frame(self.exportable_art.frames - 1) + if self.debug_log: + print('flower finished') + + def paint_mirrored(self, layer, x, y, char, fg, bg=None): + # only paint if in top left quadrant + if x > (self.art_width / 2) - 1 or y > (self.art_height / 2) - 1: + return + # draw in top left + self.art.set_tile_at(0, layer, x, y, char, fg, bg) + # mirror in other three quadrants + top_right = (self.art_width - 1 - x, y) + bottom_left = (x, self.art_height - 1 - y) + bottom_right = (self.art_width - 1 - x, self.art_height - 1 - y) + self.art.set_tile_at(0, layer, *top_right, + char, fg, bg, transform=UV_FLIPX) + self.art.set_tile_at(0, layer, *bottom_left, + char, fg, bg, transform=UV_FLIPY) + self.art.set_tile_at(0, layer, *bottom_right, + char, fg, bg, transform=UV_ROTATE180) + + def copy_new_frame(self): + # add new frame to art for export + # (art starts with 1 frame, only do this after first frame written) + # base exported frame delay on what you see in live app + delay = (1 / self.app.update_rate) * self.ticks_per_grow + if self.grows > 0: + self.exportable_art.add_frame_to_end(delay, log=False) + self.exportable_art.chars[-1] = self.art.chars[0].copy() + self.exportable_art.fg_colors[-1] = self.art.fg_colors[0].copy() + self.exportable_art.bg_colors[-1] = self.art.bg_colors[0].copy() + self.exportable_art.uv_mods[-1] = self.art.uv_mods[0].copy() + self.exportable_art.uv_maps[-1] = self.art.uv_maps[0].copy() diff --git a/games/wildflowers/scripts/frond.py b/games/wildflowers/scripts/frond.py new file mode 100644 index 0000000..29b2c1e --- /dev/null +++ b/games/wildflowers/scripts/frond.py @@ -0,0 +1,136 @@ + +import random + +from games.wildflowers.scripts.ramps import RampIterator + + +# growth direction consts +NONE = (0, 0) +LEFT = (-1, 0) +LEFT_UP = (-1, -1) +UP = (0, -1) +RIGHT_UP = (1, -1) +RIGHT = (1, 0) +RIGHT_DOWN = (1, 1) +DOWN = (0, 1) +LEFT_DOWN = (-1, 1) +DIRS = [LEFT, LEFT_UP, UP, RIGHT_UP, RIGHT, RIGHT_DOWN, DOWN, LEFT_DOWN] + +FROND_CHARS = [ + # thick and skinny \ + 151, 166, + # thick and skinny / + 150, 167, + # thick and skinny X + 183, 182, + # solid inward wedges, NW NE SE SW + 148, 149, 164, 165 +] + + +class Frond: + + min_life, max_life = 3, 16 + random_char_chance = 0.5 + mutate_char_chance = 0.2 + # layer all fronds should paint on + layer = 0 + debug = False + + def __init__(self, flower, index): + self.flower = flower + self.index = index + self.finished_growing = False + # choose growth function + self.growth_functions = [self.grow_straight_line, self.grow_curl, + self.grow_wander_outward] + self.get_grow_dir = random.choice(self.growth_functions) + #self.get_grow_dir = self.grow_curl # DEBUG + # for straight line growers, set a consistent direction + if self.get_grow_dir == self.grow_straight_line: + self.grow_line = random.choice(DIRS) + self.growth_history = [] + self.chaos = random.random() + self.life = random.randint(self.min_life, self.max_life) + # pick a starting point near center + w, h = self.flower.art_width, self.flower.art_height + self.x = random.randint(int(w / 4), int(w / 2) - 1) + self.y = random.randint(int(h / 4), int(h / 2) - 1) + # get a random color ramp from flower's palette + self.ramp = RampIterator(self.flower) + self.color = self.ramp.color + # chance to use a fully random (non-blank) character + if random.random() < self.chaos * self.random_char_chance: + self.char = random.choice(FROND_CHARS) + else: + self.char = random.randint(1, 255) + # first grow() will paint first character + + def grow(self): + """ + grows this frond by another tile + return True if we painted, so flower can skip frame wait + """ + painted = False + if self.life <= 0 or self.color == self.ramp.end: + self.finished_growing = True + if self.debug: + print(' frond %i finished.' % self.index) + return painted + if self.debug: + print(' frond %i at (%i, %i) using %s' % (self.index, self.x, self.y, self.get_grow_dir.__name__)) + # if we're out of bounds, simply don't paint; + # we might go back in bounds next grow + if 0 <= self.x < self.flower.art_width - 1 and \ + 0 <= self.y < self.flower.art_height - 1: + self.flower.paint_mirrored(self.layer, self.x, self.y, + self.char, self.color) + painted = True + self.growth_history.append((self.x, self.y)) + self.life -= 1 + self.color = self.ramp.go_to_next_color() + # roll against chaos to mutate character + if random.random() < self.chaos * self.mutate_char_chance: + self.char = random.choice(FROND_CHARS) + # TODO: roll against chaos to change grow function? + # determine last grow direction and base next grow on it + last_growth = self.growth_history[-1] + if len(self.growth_history) > 1: + penultimate_growth = self.growth_history[-2] + last_x = last_growth[0] - penultimate_growth[0] + last_y = last_growth[1] - penultimate_growth[1] + else: + last_x, last_y = 0, 0 + grow_x, grow_y = self.get_grow_dir((last_x, last_y)) + self.x, self.y = self.x + grow_x, self.y + grow_y + return painted + + # paint and growth functions work in top left quadrant, then mirrored + + def grow_straight_line(self, last_dir): + return self.grow_line + + def grow_wander_outward(self, last_dir): + # (original prototype growth algo) + return random.choice([LEFT_UP, LEFT, UP]) + + def grow_curl(self, last_dir): + if last_dir == NONE: + return random.choice([LEFT, LEFT_UP, UP]) + # 2:1 weighting for current dir + elif last_dir == LEFT: + return random.choice([LEFT, LEFT, LEFT_UP]) + elif last_dir == LEFT_UP: + return random.choice([LEFT_UP, LEFT_UP, UP]) + elif last_dir == UP: + return random.choice([UP, UP, RIGHT_UP]) + elif last_dir == RIGHT_UP: + return random.choice([RIGHT_UP, RIGHT_UP, RIGHT]) + elif last_dir == RIGHT: + return random.choice([RIGHT, RIGHT, RIGHT_DOWN]) + elif last_dir == RIGHT_DOWN: + return random.choice([RIGHT_DOWN, RIGHT_DOWN, DOWN]) + elif last_dir == DOWN: + return random.choice([DOWN, DOWN, LEFT_DOWN]) + elif last_dir == LEFT_DOWN: + return random.choice([LEFT_DOWN, LEFT_DOWN, LEFT]) diff --git a/games/wildflowers/scripts/petal.py b/games/wildflowers/scripts/petal.py new file mode 100644 index 0000000..7a86b9d --- /dev/null +++ b/games/wildflowers/scripts/petal.py @@ -0,0 +1,125 @@ + +import random, math + +from games.wildflowers.scripts.ramps import RampIterator + + +PETAL_CHARS = [ + # solid block + 255, + # shaded boxes + 254, 253, + # solid circle + 122, + # curved corner lines, NW NE SE SW + 105, 107, 139, 137, + # mostly-solid curved corners, NW NE SE SW + 144, 146, 178, 176, + # solid inward wedges, NW NE SE SW + 148, 149, 164, 165 +] + + +class Petal: + + min_radius = 3 + mutate_char_chance = 0.2 + # layer all petals should paint on + layer = 0 + debug = False + + def __init__(self, flower, index): + self.flower = flower + self.index = index + self.finished_growing = False + self.chaos = random.random() + max_radius = int(self.flower.art_width / 2) + self.goal_radius = random.randint(self.min_radius, max_radius) + self.radius = 0 + ring_styles = [self.get_ring_tiles_box, self.get_ring_tiles_wings, + self.get_ring_tiles_diamond, self.get_ring_tiles_circle] + self.get_ring_tiles = random.choice(ring_styles) + # pick a starting point near center + w, h = self.flower.art_width, self.flower.art_height + self.x = random.randint(int(w / 4), int(w / 2) - 1) + self.y = random.randint(int(h / 4), int(h / 2) - 1) + # get a random color ramp from flower's palette + self.ramp = RampIterator(self.flower) + self.color = self.ramp.color + # random char from predefined list + self.char = random.choice(PETAL_CHARS) + + def grow(self): + # grow outward (up and left) from center in "rings" + if self.radius >= self.goal_radius: + self.finished_growing = True + return + if self.debug: + print(' petal %i at (%i, %i) at radius %i using %s' % (self.index, self.x, self.y, self.radius, self.get_ring_tiles.__name__)) + self.paint_ring() + # grow and change + self.radius += 1 + self.color = self.ramp.go_to_next_color() + # roll against chaos to mutate character + if random.random() < self.chaos * self.mutate_char_chance: + self.char = random.choice(PETAL_CHARS) + + def paint_ring(self): + tiles = self.get_ring_tiles() + for t in tiles: + x = self.x - t[0] + y = self.y - t[1] + # don't paint out of bounds + if 0 <= x < self.flower.art_width - 1 and \ + 0 <= y < self.flower.art_height - 1: + self.flower.paint_mirrored(self.layer, x, y, + self.char, self.color) + #print('%s, %s' % (x, y)) + + def get_ring_tiles_box(self): + tiles = [] + for x in range(self.radius + 1): + tiles.append((x, self.radius)) + for y in range(self.radius + 1): + tiles.append((self.radius, y)) + return tiles + + def get_ring_tiles_dealieX(self): + # not sure what to call this but it's a nice shape + tiles = [] + for y in range(self.radius): + for x in range(self.radius): + tiles.append((x - self.radius, y - self.radius)) + return tiles + + def get_ring_tiles_wings(self): + # not sure what to call this but it's a nice shape + tiles = [] + cut_size = int(self.chaos * 4) + for y in range(self.radius - cut_size): + for x in range(self.radius - cut_size): + x = x - self.radius + y = y - self.radius + tiles.append((x, y)) + return tiles + + + def get_ring_tiles_diamond(self): + tiles = [] + for y in range(self.radius, -1, -1): + for x in range(0, self.radius + 1): + if x + y == self.radius: + tiles.append((x, y)) + return tiles + + def get_ring_tiles_circle(self): + tiles = [] + angle = 0 + resolution = 30 + for i in range(resolution): + angle += math.radians(90.0 / resolution) + x = round(math.cos(angle) * self.radius) + y = round(math.sin(angle) * self.radius) + if not (x, y) in tiles: + tiles.append((x, y)) + return tiles diff --git a/games/wildflowers/scripts/ramps.py b/games/wildflowers/scripts/ramps.py new file mode 100644 index 0000000..d225cc6 --- /dev/null +++ b/games/wildflowers/scripts/ramps.py @@ -0,0 +1,112 @@ + +import random + +# wildflowers palette ramp definitions + +PALETTE_RAMPS = { + # palette name : list of its ramps + 'dpaint': [ + # ramp tuple: (start index, length, stride) + # generally, lighter / more vivid to darker + (17, 16, 1), # white to black + (33, 16, 1), # red to black + (49, 8, 1), # white to red + (57, 8, 1), # light orange to dark orange + (65, 16, 1), # light yellow to ~black + (81, 8, 1), # light green to green + (89, 24, 1), # white to green to ~black + (113, 16, 1), # light cyan to ~black + (129, 8, 1), # light blue to blue + (137, 24, 1), # white to blue to ~black + (161, 16, 1), # light purple to ~black + (177, 16, 1), # light magenta to ~black + (193, 24, 1), # pale flesh to ~black + (225, 22, 1) # ROYGBV rainbow + ], + 'doom': [ + (17, 27, 1), # very light pink to dark red + (44, 20, 1), # pale flesh to brown + (69, 26, 1), # white to very dark grey + (95, 14, 1), # bright green to ~black + (109, 12, 1), # light tan to dark tan + (126, 4, 1), # olive drab + (130, 7, 1), # light gold to gold brown + (137, 18, 1), # white to dark red + (155, 14, 1), # white to dark blue + (169, 11, 1), # white to orange + (180, 7, 1), # white to yellow + (187, 4, 1), # orange to burnt orange + (193, 7, 1), # dark blue to black + (201, 5, 1) # light magenta to dark purple + ], + 'quake': [ + (16, 15, -1), # white to black + (32, 16, -1), # mustard to black + (48, 16, -1), # lavender to black + (63, 15, -1), # olive to black + (79, 16, -1), # red to black + (92, 13, -1), # orange to ~black + (108, 16, -1), # yellow to orange to ~black + (124, 16, -1), # pale flesh to ~black + (125, 16, 1), # light purple to ~black + (141, 13, 1), # purpleish pink to ~black + (154, 15, 1), # light tan to ~black + (169, 16, 1), # light olive to ~black + (185, 14, 1), # yellow to ~black + (199, 31, 1), # blue to black to light orange + (233, 4, -1), # yellow to brown + (236, 3, -1), # light blue to blue + (240, 4, -1), # red to dark red + (243, 3, -1) # white to yellow + ], + 'heretic': [ + (35, 35, -1), # white to black + (51, 16, -1), # light grey to dark grey + (65, 14, -1), # white to dark violent-grey + (94, 29, -1), # white to dark brown + (110, 16, -1), # light tan to brown + (136, 26, -1), # light yellow to dark golden brown + (144, 8, -1), # yellow to orange + (160, 16, -1), # red to dark red + (168, 8, -1), # white to pink + (176, 8, -1), # light magenta to dark magenta + (184, 8, -1), # white to purple + (208, 24, -1), # white to cyan to dark blue + (224, 16, -1), # light green to dark green + (240, 16, -1), # olive to dark olive + (247, 7, -1) # red to yellow + ], + 'atari': [ + (113, 8, -16), # white to black + (114, 8, -16), # yellow to muddy brown + (115, 8, -16), # dull gold to brown + (116, 8, -16), # peach to burnt orange + (117, 8, -16), # pink to red + (118, 8, -16), # magenta to dark magenta + (119, 8, -16), # purple to dark purple + (120, 8, -16), # violet to dark violet + (121, 8, -16), # light blue to dark blue + (122, 8, -16), # light cobalt to dark cobalt + (123, 8, -16), # light teal to dark teal + (124, 8, -16), # light sea green to dark sea green + (125, 8, -16), # light green to dark green + (126, 8, -16), # yellow green to dark yellow green + (127, 8, -16), # pale yellow to dark olive + (128, 8, -16) # gold to golden brown + ] +} + + +class RampIterator: + + def __init__(self, flower): + ramp_def = random.choice(PALETTE_RAMPS[flower.art.palette.name]) + self.start, self.length, self.stride = ramp_def + self.end = self.start + (self.length * self.stride) + # determine starting color, somewhere along ramp + self.start_step = random.randint(0, self.length - 1) + self.color = self.start + (self.start_step * self.stride) + + def go_to_next_color(self): + self.color += self.stride + return self.color diff --git a/games/wildflowers/scripts/wildflowers.py b/games/wildflowers/scripts/wildflowers.py new file mode 100644 index 0000000..5a302aa --- /dev/null +++ b/games/wildflowers/scripts/wildflowers.py @@ -0,0 +1,88 @@ + +from game_util_objects import WorldGlobalsObject, GameObject +from image_export import export_animation, export_still_image + +from games.wildflowers.scripts.flower import FlowerObject + +""" +overall approach: +grow multiple "petals" (shapes) and "fronds" (lines) from ~center of top left +quadrant, mirror these in the other three quadrants. + +last commit of first gen approach (before rewrite & petals): commit a476248 + +frond style ideas: +- frond draws each growth dir from a deck, reshuffling when empty to avoid repetition? +- frond weights growth dirs differently depending on its remaining life? + +maybe weight frond start locations in a radius, ie likely to start from center, but rarely can start further and further away. + +character ramps based on direction changes, visual density, something else? +""" + + +class FlowerGlobals(WorldGlobalsObject): + + # if True, generate a 4x4 grid instead of just one + test_gen = False + handle_key_events = True + + def __init__(self, world, obj_data=None): + WorldGlobalsObject.__init__(self, world, obj_data) + + def pre_first_update(self): + #self.app.can_edit = False + self.app.ui.set_game_edit_ui_visibility(False) + self.app.ui.message_line.post_line('') + if self.test_gen: + for x in range(4): + for y in range(4): + flower = self.world.spawn_object_of_class('FlowerObject') + flower.set_loc(x * flower.art.width, y * flower.art.height) + self.world.camera.set_loc(25, 25, 35) + else: + flower = self.world.spawn_object_of_class('FlowerObject') + self.world.camera.set_loc(0, 0, 10) + self.flower = flower + self.world.spawn_object_of_class('SeedDisplay') + + def handle_key_down(self, key, shift_pressed, alt_pressed, ctrl_pressed): + if key != 'e': + return + if not self.flower: + return + + # save to .psci + # hold on last frame + self.flower.exportable_art.frame_delays[-1] = 6.0 + self.flower.exportable_art.save_to_file() + # TODO: investigate why opening for edit puts art mode in a bad state + #self.app.load_art_for_edit(self.flower.exportable_art.filename) + + # save to .gif - TODO investigate problem with frame deltas not clearing + #export_animation(self.app, self.flower.exportable_art, + # self.flower.export_filename + '.gif', + # bg_color=self.world.bg_color, loop=False) + + # export to .png - works + export_still_image(self.app, self.flower.exportable_art, + self.flower.export_filename + '.png', + crt=self.app.fb.crt, scale=4, + bg_color=self.world.bg_color) + self.app.log('Exported %s.png' % self.flower.export_filename) + + +class SeedDisplay(GameObject): + + generate_art = True + art_width, art_height = 30, 1 + art_charset = 'ui' + art_palette = 'c64_original' + + def __init__(self, world, obj_data=None): + GameObject.__init__(self, world, obj_data) + self.art.clear_frame_layer(0, 0) + f = world.globals.flower + self.art.write_string(0, 0, 0, 0, str(f.seed), 12, 0) + self.set_scale(0.275, 0.275, 1) + self.set_loc(f.art_width, f.art_height / -2) diff --git a/games/wildflowers/start.gs b/games/wildflowers/start.gs new file mode 100644 index 0000000..e185d62 --- /dev/null +++ b/games/wildflowers/start.gs @@ -0,0 +1,30 @@ +{ + "objects": [ + { + "bg_color_a": 0.0, + "bg_color_b": 0.0, + "bg_color_g": 0.0, + "bg_color_r": 0.0, + "camera_x": 30, + "camera_y": 20, + "camera_z": 35, + "class_name": "WorldPropertiesObject", + "collision_enabled": true, + "draw_debug_objects": true, + "draw_hud": true, + "game_title": "wildflowers", + "globals_object_class_name": "FlowerGlobals", + "gravity_x": 0.0, + "gravity_y": 0.0, + "gravity_z": 0.0, + "hud_class_name": "GameHUD", + "object_grid_snap": true, + "player_camera_lock": true, + "room_camera_changes_enabled": true, + "show_all_rooms": false, + "show_bounds_all": false, + "show_collision_all": false, + "show_origin_all": false + } + ] +} diff --git a/grid.py b/grid.py new file mode 100644 index 0000000..0a0ea2e --- /dev/null +++ b/grid.py @@ -0,0 +1,108 @@ +import numpy as np + +from renderable_line import LineRenderable + +# grid that displays as guide for Cursor + +AXIS_COLOR = (0.8, 0.8, 0.8, 0.5) +BASE_COLOR = (0.5, 0.5, 0.5, 0.25) +EXTENTS_COLOR = (0, 0, 0, 1) + +class Grid(LineRenderable): + + visible = True + draw_axes = False + + def get_tile_size(self): + "Returns (width, height) grid size in tiles." + return 1, 1 + + def build_geo(self): + "build vert, element, and color arrays" + w, h = self.get_tile_size() + # frame + v = [(0, 0), (w, 0), (0, -h), (w, -h)] + e = [0, 1, 1, 3, 3, 2, 2, 0] + color = EXTENTS_COLOR + c = color * 4 + index = 4 + # axes - Y and X + if self.draw_axes: + v += [(w/2, -h), (w/2, 0), (0, -h/2), (w, -h/2)] + e += [4, 5, 6, 7] + color = AXIS_COLOR + c += color * 4 + index = 8 + # vertical lines + color = BASE_COLOR + for x in range(1, w): + # skip middle line + if not self.draw_axes or x != w/2: + v += [(x, -h), (x, 0)] + e += [index, index+1] + c += color * 2 + index += 2 + for y in range(1, h): + if not self.draw_axes or y != h/2: + v += [(0, -y), (w, -y)] + e += [index, index+1] + c += color * 2 + index += 2 + self.vert_array = np.array(v, dtype=np.float32) + self.elem_array = np.array(e, dtype=np.uint32) + self.color_array = np.array(c, dtype=np.float32) + + def reset_loc(self): + self.x = 0 + self.y = 0 + self.z = 0 + + def reset(self): + "macro for convenience - rescale, reposition, update renderable" + self.build_geo() + self.reset_loc() + self.rebind_buffers() + + def update(self): + pass + + def get_projection_matrix(self): + return self.app.camera.projection_matrix + + def get_view_matrix(self): + return self.app.camera.view_matrix + + +class ArtGrid(Grid): + + def reset_loc(self): + self.x, self.y = 0, 0 + self.z = self.app.ui.active_art.layers_z[self.app.ui.active_art.active_layer] + + def reset(self): + self.quad_size_ref = self.app.ui.active_art + Grid.reset(self) + + def get_tile_size(self): + return self.app.ui.active_art.width, self.app.ui.active_art.height + + +class GameGrid(Grid): + + draw_axes = True + base_size = 800 + + def get_tile_size(self): + # TODO: dynamically adjust bounds based on furthest away objects? + return self.base_size, self.base_size + + def set_base_size(self, new_size): + self.base_size = new_size + self.reset() + + def reset_loc(self): + # center of grid at world zero + qw, qh = self.get_quad_size() + self.x = qw * -(self.base_size / 2) + self.y = qh * (self.base_size / 2) + self.z = 0 diff --git a/image_convert.py b/image_convert.py new file mode 100644 index 0000000..1154bde --- /dev/null +++ b/image_convert.py @@ -0,0 +1,252 @@ + +import math, os.path, time +import numpy as np + +from PIL import Image, ImageChops, ImageStat + +from renderable_sprite import SpriteRenderable +from lab_color import rgb_to_lab, lab_color_diff + +""" +notes / future research + +- generate a table of image sum vectors for every char/fg/bg combination in the charset + palette +- find the closest vector from this table for each source block +-- if it's a table, how to index? + +- build dict of char index frequency, run each new source block comparison in order from most to least used (so far) characters. +-- takes same amount of time to try all characters, only helps if diffs use a "good-enough" threshold +-- threshold guesses: 0 = perfect, 600 = reasonable, 1000 = poor, 1500 crummy + +"8088 corruption explained" talk: +https://www.youtube.com/watch?v=L6CkYou6hYU +- downsample each block bilinearly, divide each into 4x4 cells, then compare them with similarly bilinearly-downsampled char blocks +""" + +class ImageConverter: + + tiles_per_tick = 1 + lab_color_comparison = True + # delay in seconds before beginning to convert tiles. + # lets eg UI catch up to BitmapImageImporter changes to Art. + start_delay = 1.0 + + def __init__(self, app, image_filename, art, bicubic_scale=False, sequence_converter=None): + self.init_success = False + image_filename = app.find_filename_path(image_filename) + if not image_filename or not os.path.exists(image_filename): + app.log("ImageConverter: Couldn't find image %s" % image_filename) + app.converter = None + return + self.app = app + self.start_time = time.time() + self.image_filename = image_filename + self.art = art + self.finished = False + # if an ImageSequenceConverter created us, keep a handle to it + self.sequence_converter = sequence_converter + try: + self.src_img = Image.open(self.image_filename).convert('RGB') + except: + return + # if we're part of a sequence, app doesn't need handle directly to us + if not self.sequence_converter: + self.app.converter = self + # preserve aspect + self.char_w, self.char_h = art.charset.char_width, art.charset.char_height + art_pixel_w, art_pixel_h = self.char_w * art.width, self.char_h * art.height + w, h = self.src_img.size + ratio = min(art_pixel_h / h, art_pixel_w / w) + w = math.floor((w * ratio) / self.char_w) * self.char_w + h = math.floor((h * ratio) / self.char_h) * self.char_h + scale_method = Image.BICUBIC if bicubic_scale else Image.NEAREST + self.src_img = self.src_img.resize((w, h), resample=scale_method) + # convert source image to art's palette + self.src_img = self.art.palette.get_palettized_image(self.src_img) + self.color_diffs = self.get_generated_color_diffs(self.art.palette.colors) + # convert palettized source image to an array for fast comparisons + self.src_array = np.fromstring(self.src_img.tobytes(), dtype=np.uint8) + src_w, src_h = self.src_img.size + self.src_array = np.reshape(self.src_array, (src_h, src_w)) + # convert charmap to 1-bit color for fast value swaps during + # block comparison + self.char_img = self.art.charset.image_data.copy().convert('RGB') + bw_pal_img = Image.new('P', (1, 1)) + bw_pal = [0, 0, 0, 255, 255, 255] + while len(bw_pal) < 256 * 3: + bw_pal.append(0) + bw_pal_img.putpalette(tuple(bw_pal)) + self.char_img = self.char_img.quantize(palette=bw_pal_img) + self.char_array = np.fromstring(self.char_img.tobytes(), dtype=np.uint8) + self.char_array = np.reshape(self.char_array, (self.art.charset.image_height, self.art.charset.image_width)) + # create, size and position image preview + preview_img = self.src_img.copy() + # remove transparency if source image is a GIF to avoid a PIL crash :[ + # TODO: https://github.com/python-pillow/Pillow/issues/1377 + if 'transparency' in preview_img.info: + preview_img.info.pop('transparency') + self.preview_sprite = SpriteRenderable(self.app, None, preview_img) + # preview image scale takes into account character aspect + self.preview_sprite.scale_x = w / (self.char_w / self.art.quad_width) + self.preview_sprite.scale_y = h / (self.char_h / self.art.quad_height) + # position in top left corner + self.preview_sprite.y = -self.preview_sprite.scale_y + self.preview_sprite.z = self.art.layers_z[self.art.active_layer] - 0.01 + # clear active layer so we can see preview + self.art.clear_frame_layer(self.art.active_frame, self.art.active_layer, 0) + # block indices + self.x, self.y = 0, 0 + # precompute block indices - lets us do a bit less + and * + self.char_blocks = [] + for char_y in range(self.art.charset.map_height): + for char_x in range(self.art.charset.map_width): + x0, y0 = char_x * self.char_w, char_y * self.char_h + x1, y1 = x0 + self.char_w, y0 + self.char_h + self.char_blocks.append((x0, y0, x1, y1)) + # characters might end mid-row, bail if so + if len(self.char_blocks) > self.art.charset.last_index: + break + self.init_success = True + + def get_generated_color_diffs(self, colors): + # build table of color diffs + unique_colors = len(colors) + color_diffs = np.zeros((unique_colors, unique_colors), dtype=np.float32) + # option: L*a*b color space conversion for greater accuracy + get_color_diff = self.get_lab_color_diff if self.lab_color_comparison else self.get_rgb_color_diff + #get_color_diff = self.get_nonlinear_rgb_color_diff + for i,color in enumerate(colors): + for j,other_color in enumerate(colors): + color_diffs[i][j] = get_color_diff(color, other_color) + return color_diffs + + def get_rgb_color_diff(self, color1, color2): + r = abs(color1[0] - color2[0]) + g = abs(color1[1] - color2[1]) + b = abs(color1[2] - color2[2]) + a = abs(color1[3] - color2[3]) + return abs(r + g + b + a) + + def get_lab_color_diff(self, color1, color2): + l1, a1, b1 = rgb_to_lab(*color1[:3]) + l2, a2, b2 = rgb_to_lab(*color2[:3]) + return lab_color_diff(l1, a1, b1, l2, a2, b2) + + def get_nonlinear_rgb_color_diff(self, color1, color2): + # from http://www.compuphase.com/cmetric.htm + rmean = int((color1[0] + color2[0]) / 2) + r = color1[0] - color2[0] + g = color1[1] - color2[1] + b = color1[2] - color2[2] + return math.sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8)) + + def update(self): + if time.time() < self.start_time + self.start_delay: + return + for i in range(self.tiles_per_tick): + x_start, y_start = self.x * self.char_w, self.y * self.char_h + x_end, y_end = x_start + self.char_w, y_start + self.char_h + block = self.src_array[y_start:y_end, x_start:x_end] + char, fg, bg = self.get_best_tile_for_block(block) + # get_best_etc sometimes returns 0 for darkest blocks, + # but transparency isn't properly supported yet + fg = self.art.palette.darkest_index if fg == 0 else fg + bg = self.art.palette.darkest_index if bg == 0 else bg + self.art.set_tile_at(self.art.active_frame, self.art.active_layer, + self.x, self.y, char, fg, bg) + #print('set block %s,%s to ch %s fg %s bg %s' % (self.x, self.y, char, fg, bg)) + self.x += 1 + if self.x >= self.art.width: + self.x = 0 + self.y += 1 + if self.y >= self.art.height: + self.finish() + break + + def get_color_combos_for_block(self, src_block): + """ + returns # of unique colors, AND + list of unique (fg, bg) color index tuples for given block + """ + # get unique colors in source block + colors, counts = np.unique(src_block, False, False, return_counts=True) + # early out for single-color blocks + if len(colors) == 1: + return colors, [] + # sort by most to least used colors + color_counts = [] + for i,color in enumerate(colors): + color_counts += [(color, counts[i])] + color_counts.sort(key=lambda item: item[1], reverse=True) + combos = [] + for color1,count1 in color_counts: + for color2,count2 in color_counts: + if color1 == color2: + continue + # fg/bg color swap SHOULD be allowed + if (color1, color2) in combos: + continue + combos.append((color1, color2)) + return colors, combos + + def get_best_tile_for_block(self, src_block): + "returns a (char, fg, bg) tuple for the best match of given block" + colors, combos = self.get_color_combos_for_block(src_block) + # single color block? + if len(combos) == 0: + # if a block is all transparent pixels or outside image bounds, + # no unique colors will be found + bg = 0 if len(colors) == 0 else colors[0] + return (0, 0, bg) + # compare all combos + chars w/ source block + best_char = 0 + best_diff = 9999999999999 + best_fg, best_bg = 0, 0 + for bg,fg in combos: + # reset char index before each run through charset + char_index = 0 + char_array = self.char_array.copy() + # replace 1-bit color of char image with fg and bg colors + char_array[char_array == 0] = bg + char_array[char_array == 1] = fg + for (x0, y0, x1, y1) in self.char_blocks: + char_block = char_array[y0:y1, x0:x1] + # using array of difference values w/ fancy numpy indexing, + # sum() it + # (used to be get_block_diff(block1, block2)) + diff = self.color_diffs[src_block, char_block].sum() + # no difference = return immediately + if diff == 0: + return (char_index, fg, bg) + if diff < best_diff: + best_diff = diff + best_char = char_index + best_fg, best_bg = fg, bg + #print('%s is new best char index, diff %s:' % (char_index, diff)) + char_index += 1 + # return best (least different to source block) char/fg/bg found + #print('%s is best char index, diff %s:' % (best_char, best_diff)) + return (best_char, best_fg, best_bg) + + def print_block(self, block, fg, bg): + "prints ASCII representation of a block with . and # as white and black" + w, h = block.shape + s = '' + for y in range(h): + for x in range(w): + if block[y][x] == fg: + s += '#' + else: + s += '.' + s += '\n' + print(s) + + def finish(self, cancelled=False): + self.finished = True + if not self.sequence_converter: + time_taken = time.time() - self.start_time + verb = 'cancelled' if cancelled else 'finished' + self.app.log('Conversion of image %s %s after %.3f seconds' % (self.image_filename, verb, time_taken)) + self.app.converter = None + self.preview_sprite = None + self.app.update_window_title() diff --git a/image_export.py b/image_export.py new file mode 100644 index 0000000..64d2d70 --- /dev/null +++ b/image_export.py @@ -0,0 +1,158 @@ +import os +from OpenGL import GL +from PIL import Image, ImageChops, GifImagePlugin + +from framebuffer import ExportFramebuffer, ExportFramebufferNoCRT + +def get_frame_image(app, art, frame, allow_crt=True, scale=1, bg_color=(0, 0, 0, 0)): + "returns a PIL image of given frame of given art, None on failure" + post_fb_class = ExportFramebuffer if allow_crt else ExportFramebufferNoCRT + # determine art's native size in pixels + w = art.charset.char_width * art.width + h = art.charset.char_height * art.height + w, h = int(w * scale), int(h * scale) + # error out if over max texture size + if w > app.max_texture_size or h > app.max_texture_size: + app.log("ERROR: Image output size (%s x %s) exceeds your hardware's max supported texture size (%s x %s)!" % (w, h, app.max_texture_size, app.max_texture_size), error=True) + app.log(' Please export at a smaller scale or chop up your artwork :[', error=True) + return None + # create CRT framebuffer + post_fb = post_fb_class(app, w, h) + # create render target and target framebuffer that will become image + export_fb = GL.glGenFramebuffers(1) + render_buffer = GL.glGenRenderbuffers(1) + GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, render_buffer) + GL.glRenderbufferStorage(GL.GL_RENDERBUFFER, GL.GL_RGBA8, w, h) + GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, export_fb) + GL.glFramebufferRenderbuffer(GL.GL_DRAW_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, + GL.GL_RENDERBUFFER, render_buffer) + GL.glViewport(0, 0, w, h) + # do render + GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, post_fb.framebuffer) + # bg_color might be None + GL.glClearColor(*bg_color or (0, 0, 0, 0)) + GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) + # render to it + art.renderables[0].render_frame_for_export(frame) + GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, export_fb) + post_fb.render() + GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0) + # read pixels from it + pixels = GL.glReadPixels(0, 0, w, h, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, + outputType=None) + # cleanup / deinit of GL stuff + GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0) + GL.glViewport(0, 0, app.window_width, app.window_height) + GL.glDeleteFramebuffers(1, [export_fb]) + GL.glDeleteRenderbuffers(1, [render_buffer]) + post_fb.destroy() + # GL pixel data as numpy array -> bytes for PIL image export + pixel_bytes = pixels.flatten().tobytes() + src_img = Image.frombytes(mode='RGBA', size=(w, h), data=pixel_bytes) + src_img = src_img.transpose(Image.FLIP_TOP_BOTTOM) + return src_img + +def export_animation(app, art, out_filename, bg_color=None, loop=True): + # get list of rendered frame images + frames = [] + # use arbitrary color for transparency + i_transp = art.palette.get_random_non_palette_color() + # if bg color is specified, this isn't art mode; play along + if bg_color is not None: + f_transp = bg_color + art.palette.colors[0] = (round(bg_color[0] * 255), + round(bg_color[1] * 255), + round(bg_color[2] * 255), + 255) + else: + # GL wants floats + f_transp = (i_transp[0]/255, i_transp[1]/255, i_transp[2]/255, 1.) + for frame in range(art.frames): + frame_img = get_frame_image(app, art, frame, allow_crt=False, + scale=1, bg_color=f_transp) + if bg_color is not None: + # if bg color is specified, assume no transparency + frame_img = art.palette.get_palettized_image(frame_img, force_no_transparency=True) + else: + frame_img = art.palette.get_palettized_image(frame_img, i_transp[:3]) + frames.append(frame_img) + # compile frames into animated GIF with proper frame delays + # technique thanks to: + # https://github.com/python-pillow/Pillow/blob/master/Scripts/gifmaker.py + output_img = open(out_filename, 'wb') + for i,img in enumerate(frames): + delay = art.frame_delays[i] * 1000 + if i == 0: + data = GifImagePlugin.getheader(img)[0] + # PIL only wants to write GIF87a for some reason... + # welcome to 1989 B] + data[0] = data[0].replace(b'7', b'9') + # TODO: loop doesn't work? + if bg_color is not None: + # if bg color is specified, assume no transparency + if loop: + data += GifImagePlugin.getdata(img, duration=delay, loop=0) + else: + data += GifImagePlugin.getdata(img, duration=delay) + else: + data += GifImagePlugin.getdata(img, duration=delay, + transparency=0, loop=0) + for b in data: + output_img.write(b) + continue + delta = ImageChops.subtract_modulo(img, frames[i-1]) + # Image.getbbox() rather unhelpfully returns None if no delta + dw, dh = delta.size + bbox = delta.getbbox() or (0, 0, dw, dh) + for b in GifImagePlugin.getdata(img.crop(bbox), offset=bbox[:2], + duration=delay, transparency=0, + loop=0): + output_img.write(b) + output_img.write(b';') + output_img.close() + output_format = 'Animated GIF' + #app.log('%s exported (%s)' % (out_filename, output_format)) + + +def export_still_image(app, art, out_filename, crt=True, scale=1, bg_color=None): + # respect "disable CRT entirely" setting for slow GPUs + crt = False if app.fb.disable_crt else crt + # just write RGBA if palette has more than one color with <1 alpha + # TODO: add PNG/PNGset export option for palettized; + # for now always export 32bit + if crt or not art.palette.all_colors_opaque() or bg_color or True: + src_img = get_frame_image(app, art, art.active_frame, crt, scale, bg_color) + if not src_img: + return False + src_img.save(out_filename, 'PNG') + output_format = '32-bit w/ alpha' + else: + # else convert to current palette. + # as with aniGIF export, use arbitrary color for transparency + i_transp = art.palette.get_random_non_palette_color() + f_transp = (i_transp[0]/255, i_transp[1]/255, i_transp[2]/255, 1.) + src_img = get_frame_image(app, art, art.active_frame, False, scale, f_transp) + if not src_img: + return False + output_img = art.palette.get_palettized_image(src_img, i_transp[:3]) + output_img.save(out_filename, 'PNG', transparency=0) + output_format = '8-bit palettized w/ transparency' + #app.log('%s exported (%s)' % (out_filename, output_format)) + return True + + +def write_thumbnail(app, art_filename, thumb_filename): + "write thumbnail. assume art is not loaded, tear down everything when done." + art = app.load_art(art_filename, False) + # don't bother if art is None, must be created at runtime eg via Game Mode + if not art: + return + renderable = None + if len(art.renderables) == 0: + renderable = app.thumbnail_renderable_class(app, art) + art.renderables.append(renderable) + img = get_frame_image(app, art, 0, allow_crt=False) + if img: + img.save(thumb_filename, 'PNG') + if renderable: + renderable.destroy() diff --git a/input_handler.py b/input_handler.py new file mode 100644 index 0000000..479935e --- /dev/null +++ b/input_handler.py @@ -0,0 +1,1212 @@ +import ctypes, os, platform +import sdl2 + +from sys import exit + +from ui import SCALE_INCREMENT, OIS_WIDTH, OIS_HEIGHT, OIS_FILL +from renderable import LAYER_VIS_FULL, LAYER_VIS_DIM, LAYER_VIS_NONE +from ui_art_dialog import NewArtDialog, SaveAsDialog, QuitUnsavedChangesDialog, CloseUnsavedChangesDialog, RevertChangesDialog, ResizeArtDialog, AddFrameDialog, DuplicateFrameDialog, FrameDelayDialog, FrameDelayAllDialog, FrameIndexDialog, AddLayerDialog, DuplicateLayerDialog, SetLayerNameDialog, SetLayerZDialog, PaletteFromFileDialog, ImportFileDialog, ExportFileDialog, SetCameraZoomDialog, ExportOptionsDialog, OverlayImageOpacityDialog +from ui_game_dialog import NewGameDirDialog, LoadGameStateDialog, SaveGameStateDialog, AddRoomDialog, SetRoomCamDialog, SetRoomEdgeWarpsDialog, SetRoomBoundsObjDialog, RenameRoomDialog +from ui_info_dialog import PagedInfoDialog +from ui_file_chooser_dialog import ArtChooserDialog, CharSetChooserDialog, PaletteChooserDialog, PaletteFromImageChooserDialog, RunArtScriptDialog, OverlayImageFileChooserDialog +from ui_list_operations import LO_NONE, LO_SELECT_OBJECTS, LO_SET_SPAWN_CLASS, LO_LOAD_STATE, LO_SET_ROOM, LO_SET_ROOM_OBJECTS, LO_SET_OBJECT_ROOMS, LO_OPEN_GAME_DIR, LO_SET_ROOM_EDGE_WARP, LO_SET_ROOM_EDGE_WARP, LO_SET_ROOM_EDGE_OBJ, LO_SET_ROOM_CAMERA +from collision import CT_NONE +from art import ART_DIR, ART_FILE_EXTENSION +from key_shifts import NUMLOCK_ON_MAP, NUMLOCK_OFF_MAP + +BINDS_FILENAME = 'binds.cfg' +BINDS_TEMPLATE_FILENAME = 'binds.cfg.default' + + +class InputLord: + + "sets up key binds and handles input" + wheel_zoom_amount = 3.0 + keyboard_zoom_amount = 1.0 + + def __init__(self, app): + self.app = app + self.ui = self.app.ui + # read from binds.cfg file or create it from template + # exec results in edit_binds, a dict whose keys are keys+mods + # and whose values are bound functions + self.edit_bind_src = None + # bad probs if a command isn't in binds.cfg, so just blow it away + # if the template is newer than it + # TODO: better solution is find any binds in template but not binds.cfg + # and add em + binds_filename = self.app.config_dir + BINDS_FILENAME + binds_outdated = not os.path.exists(binds_filename) or os.path.getmtime(binds_filename) < os.path.getmtime(BINDS_TEMPLATE_FILENAME) + if not binds_outdated and os.path.exists(binds_filename): + exec(open(binds_filename).read()) + self.app.log('Loaded key binds from %s' % binds_filename) + else: + default_data = open(BINDS_TEMPLATE_FILENAME).readlines()[1:] + new_binds = open(binds_filename, 'w') + new_binds.writelines(default_data) + new_binds.close() + self.app.log('Created new key binds file %s' % binds_filename) + exec(''.join(default_data)) + if not self.edit_bind_src: + self.app.log('No bind data found, Is binds.cfg.default present?') + exit() + # associate key + mod combos with methods + self.edit_binds = {} + for bind_string in self.edit_bind_src: + bind = self.parse_key_bind(bind_string) + if not bind: + continue + # bind data could be a single item (string) or a list/tuple + bind_data = self.edit_bind_src[bind_string] + if type(bind_data) is str: + bind_fnames = ['BIND_%s' % bind_data] + else: + bind_fnames = ['BIND_%s' % s for s in bind_data] + bind_functions = [] + for bind_fname in bind_fnames: + if not hasattr(self, bind_fname): + continue + bind_functions.append(getattr(self, bind_fname)) + self.edit_binds[bind] = bind_functions + # get controller(s) + # TODO: use kewl SDL2 gamepad system + js_init = sdl2.SDL_InitSubSystem(sdl2.SDL_INIT_JOYSTICK) + if js_init != 0: + self.app.log("SDL2: Couldn't initialize joystick subsystem, code %s" % js_init) + return + sticks = sdl2.SDL_NumJoysticks() + #self.app.log('%s gamepads found' % sticks) + self.gamepad = None + self.gamepad_left_x, self.gamepad_left_y = 0, 0 + # for now, just grab first pad + if sticks > 0: + pad = sdl2.SDL_JoystickOpen(0) + pad_name = sdl2.SDL_JoystickName(pad).decode('utf-8') + pad_axes = sdl2.SDL_JoystickNumAxes(pad) + pad_buttons = sdl2.SDL_JoystickNumButtons(pad) + self.app.log('Gamepad found: %s with %s axes, %s buttons' % (pad_name, pad_axes, pad_buttons)) + self.gamepad = pad + # before main loop begins, set initial mouse position - + # SDL_GetMouseState returns 0,0 if the mouse hasn't yet moved + # in the new window! + wx, wy = ctypes.c_int(0), ctypes.c_int(0) + sdl2.SDL_GetWindowPosition(self.app.window, wx, wy) + wx, wy = int(wx.value), int(wy.value) + mx, my = ctypes.c_int(0), ctypes.c_int(0) + sdl2.mouse.SDL_GetGlobalMouseState(mx, my) + mx, my = int(mx.value), int(my.value) + self.app.mouse_x, self.app.mouse_y = mx - wx, my - wy + # set flag so we know whether handle_input's SDL_GetMouseState result + # is accurate :/ + self.mouse_has_moved = False + + def parse_key_bind(self, in_string): + "returns a tuple of (key, mod1, mod2) key bind data from given string" + shift = False + alt = False + ctrl = False + key = None + for i in in_string.split(): + if i.lower() == 'shift': + shift = True + elif i.lower() == 'alt': + alt = True + elif i.lower() == 'ctrl': + ctrl = True + else: + key = i + return (key, shift, alt, ctrl) + + def get_bind_functions(self, keysym, shift, alt, ctrl): + "returns a list of methods for the given key + mods if one exists" + keystr = sdl2.SDL_GetKeyName(keysym).decode().lower() + key_data = (keystr, shift, alt, ctrl) + return self.edit_binds.get(key_data, []) + + def get_keysym(self, event): + "get SDL2 keysym from event; right now only used to check numlock variants" + numlock_on = bool(event.key.keysym.mod & sdl2.KMOD_NUM) + keysym = event.key.keysym.sym + # if numlock is on, treat numpad keys like numbers + if numlock_on and keysym in NUMLOCK_ON_MAP: + return NUMLOCK_ON_MAP[keysym] + elif not numlock_on and keysym in NUMLOCK_OFF_MAP: + return NUMLOCK_OFF_MAP[keysym] + return keysym + + def get_command_shortcut(self, command_function): + for bind in self.edit_bind_src: + if command_function == self.edit_bind_src[bind]: + return bind + return '' + + def get_menu_items_for_command_function(self, function): + # search both menus for items; command checks + buttons = self.ui.art_menu_bar.menu_buttons + self.ui.game_menu_bar.menu_buttons + items = [] + for button in buttons: + # skip eg playscii button + if not hasattr(button, 'menu_data'): + continue + for item in button.menu_data.items: + if function.__name__ == 'BIND_%s' % item.command: + items.append(item) + return items + + def is_command_function_allowed(self, function): + "returns True if given function's menu bar item is available" + items = self.get_menu_items_for_command_function(function) + if not items: + return True + # return True if ANY items are active + for item in items: + if not item.always_active and item.should_dim(self.app): + continue + if item.art_mode_allowed and not self.app.game_mode: + return True + if item.game_mode_allowed and self.app.game_mode: + return True + return False + + def handle_input(self): + app = self.app + # get and store mouse state + # (store everything in parent app object so stuff can access it easily) + mx, my = ctypes.c_int(0), ctypes.c_int(0) + mouse = sdl2.mouse.SDL_GetMouseState(mx, my) + app.left_mouse = bool(mouse & sdl2.SDL_BUTTON(sdl2.SDL_BUTTON_LEFT)) + app.middle_mouse = bool(mouse & sdl2.SDL_BUTTON(sdl2.SDL_BUTTON_MIDDLE)) + app.right_mouse = bool(mouse & sdl2.SDL_BUTTON(sdl2.SDL_BUTTON_RIGHT)) + mx, my = int(mx.value), int(my.value) + # if mouse hasn't moved since init, disregard SDL_GetMouseState + if self.mouse_has_moved: + app.mouse_x, app.mouse_y = mx, my + elif mx != 0 or my != 0: + self.mouse_has_moved = True + # relative mouse move state + mdx, mdy = ctypes.c_int(0), ctypes.c_int(0) + sdl2.mouse.SDL_GetRelativeMouseState(mdx, mdy) + if self.mouse_has_moved: + app.mouse_dx, app.mouse_dy = int(mdx.value), int(mdy.value) + if app.mouse_dx != 0 or app.mouse_dy != 0: + app.keyboard_editing = False + # dragging a dialog? + if app.left_mouse and self.ui.active_dialog in self.ui.hovered_elements: + self.ui.active_dialog.update_drag(app.mouse_dx, app.mouse_dy) + # get keyboard state so later we can directly query keys + ks = sdl2.SDL_GetKeyboardState(None) + # get modifier states + self.shift_pressed, self.alt_pressed, self.ctrl_pressed = False, False, False + if ks[sdl2.SDL_SCANCODE_LSHIFT] or ks[sdl2.SDL_SCANCODE_RSHIFT]: + self.shift_pressed = True + if ks[sdl2.SDL_SCANCODE_LALT] or ks[sdl2.SDL_SCANCODE_RALT]: + self.alt_pressed = True + if ks[sdl2.SDL_SCANCODE_LCTRL] or ks[sdl2.SDL_SCANCODE_RCTRL]: + self.ctrl_pressed = True + # check and remember capslock as a special mod state + # (currently only used for text tool entry) + ms = sdl2.SDL_GetModState() + self.capslock_on = bool(ms & sdl2.KMOD_CAPS) + # macOS: treat command as interchangeable with control, is this kosher? + if platform.system() == 'Darwin' and (ks[sdl2.SDL_SCANCODE_LGUI] or ks[sdl2.SDL_SCANCODE_RGUI]): + self.ctrl_pressed = True + if app.capslock_is_ctrl and ks[sdl2.SDL_SCANCODE_CAPSLOCK]: + self.ctrl_pressed = True + # pack mods into a tuple to save listing em all out repeatedly + mods = self.shift_pressed, self.alt_pressed, self.ctrl_pressed + # get controller state + if self.gamepad: + self.gamepad_left_x = sdl2.SDL_JoystickGetAxis(self.gamepad, sdl2.SDL_CONTROLLER_AXIS_LEFTX) / 32768 + self.gamepad_left_y = sdl2.SDL_JoystickGetAxis(self.gamepad, sdl2.SDL_CONTROLLER_AXIS_LEFTY) / -32768 + for event in sdl2.ext.get_events(): + if event.type == sdl2.SDL_QUIT: + app.should_quit = True + elif event.type == sdl2.SDL_WINDOWEVENT: + if event.window.event == sdl2.SDL_WINDOWEVENT_RESIZED: + # test window we create on init to detect resolution makes + # SDL think we've resized main app window on first tick! + if app.updates > 0: + app.resize_window(event.window.data1, event.window.data2) + elif event.type == sdl2.SDL_JOYBUTTONDOWN: + if not app.gw.paused and app.gw.player: + app.gw.player.button_pressed(event.jbutton.button) + elif event.type == sdl2.SDL_JOYBUTTONUP: + if not app.gw.paused and app.gw.player: + self.app.gw.player.button_unpressed(event.jbutton.button) + elif event.type == sdl2.SDL_KEYDOWN: + keysym = self.get_keysym(event) + # if console is up, pass input to it + if self.ui.console.visible: + self.ui.console.handle_input(keysym, *mods) + # same with dialog box + elif self.ui.active_dialog and self.ui.active_dialog is self.ui.keyboard_focus_element: + self.ui.active_dialog.handle_input(keysym, *mods) + # bail, process no further input + #sdl2.SDL_PumpEvents() + #return + # handle text input if text tool is active + elif self.ui.selected_tool is self.ui.text_tool and self.ui.text_tool.input_active: + self.ui.text_tool.handle_keyboard_input(keysym, *mods) + # see if there's a function for this bind and run it + else: + flist = self.get_bind_functions(keysym, *mods) + for f in flist: + # don't run any command whose menu bar item's dimmed / not allowed (ie wrong mode) + if self.is_command_function_allowed(f): + f() + # if game mode active, pass to world as well as any binds + if self.app.game_mode: + self.app.gw.handle_input(event, *mods) + # for key up events, use the same binds but handle them special case + # TODO: once there are enough key up events, figure out a more + # elegant way than this + elif event.type == sdl2.SDL_KEYUP: + keysym = self.get_keysym(event) + if self.app.game_mode: + self.app.gw.handle_input(event, *mods) + # dismiss selector popup + flist = self.get_bind_functions(keysym, *mods) + if not flist: + pass + elif self.ui.active_dialog: + # keyup shouldn't have any special meaning in a dialog + pass + elif self.BIND_game_grab in flist: + if self.app.game_mode and not self.ui.active_dialog and self.app.gw.player: + self.app.gw.player.button_unpressed(0) + return + elif self.BIND_toggle_picker in flist: + # ..but only for default hold-to-show setting + if self.ui.popup_hold_to_show: + self.ui.popup.hide() + elif self.BIND_select_or_paint in flist: + app.keyboard_editing = True + if not self.ui.selected_tool is self.ui.text_tool and not self.ui.text_tool.input_active: + self.app.cursor.finish_paint() + # + # mouse events aren't handled by bind table for now + # + elif event.type == sdl2.SDL_MOUSEWHEEL: + ui_wheeled = self.ui.wheel_moved(event.wheel.y) + if not ui_wheeled: + if self.app.can_edit: + if event.wheel.y > 0: + # only zoom in should track towards cursor + app.camera.zoom(-self.wheel_zoom_amount, + towards_cursor=True) + elif event.wheel.y < 0: + app.camera.zoom(self.wheel_zoom_amount) + else: + self.app.gw.mouse_wheeled(event.wheel.y) + elif event.type == sdl2.SDL_MOUSEBUTTONUP: + # "consume" input if UI handled it + ui_unclicked = self.ui.unclicked(event.button.button) + if ui_unclicked: + sdl2.SDL_PumpEvents() + return + if self.app.game_mode: + self.app.gw.unclicked(event.button.button) + # LMB up: finish paint for most tools, end select drag + if event.button.button == sdl2.SDL_BUTTON_LEFT: + if self.ui.selected_tool is self.ui.select_tool and self.ui.select_tool.selection_in_progress: + self.ui.select_tool.finish_select(self.shift_pressed, self.ctrl_pressed) + elif not self.ui.selected_tool is self.ui.text_tool and not self.ui.text_tool.input_active: + app.cursor.finish_paint() + elif event.type == sdl2.SDL_MOUSEBUTTONDOWN: + ui_clicked = self.ui.clicked(event.button.button) + # don't register edit commands if a menu is up + if ui_clicked or self.ui.menu_bar.active_menu_name or self.ui.active_dialog: + sdl2.SDL_PumpEvents() + if self.app.game_mode: + self.app.gw.last_click_on_ui = True + return + # pass clicks through to game world + if self.app.game_mode: + if not ui_clicked: + self.app.gw.clicked(event.button.button) + # LMB down: start text entry, start select drag, or paint + elif event.button.button == sdl2.SDL_BUTTON_LEFT: + if not self.ui.active_art: + return + elif self.ui.selected_tool is self.ui.text_tool: + # text tool: only start entry if click is outside popup + if not self.ui.text_tool.input_active and \ + not self.ui.popup in self.ui.hovered_elements: + self.ui.text_tool.start_entry() + elif self.ui.selected_tool is self.ui.select_tool: + # select tool: accept clicks if they're outside the popup + if not self.ui.select_tool.selection_in_progress and \ + (not self.ui.keyboard_focus_element or \ + (self.ui.keyboard_focus_element is self.ui.popup and \ + not self.ui.popup in self.ui.hovered_elements)): + self.ui.select_tool.start_select() + else: + app.cursor.start_paint() + elif event.button.button == sdl2.SDL_BUTTON_RIGHT: + if self.app.ui.active_art: + self.ui.quick_grab() + # none of the below applies to cases where a dialog is up + if self.ui.active_dialog: + sdl2.SDL_PumpEvents() + return + # directly query keys we don't want affected by OS key repeat delay + # TODO: these are hard-coded for the moment, think of a good way + # to expose this functionality to the key bind system + def pressing_up(ks): + return ks[sdl2.SDL_SCANCODE_W] or ks[sdl2.SDL_SCANCODE_UP] or ks[sdl2.SDL_SCANCODE_KP_8] + def pressing_down(ks): + return ks[sdl2.SDL_SCANCODE_S] or ks[sdl2.SDL_SCANCODE_DOWN] or ks[sdl2.SDL_SCANCODE_KP_2] + def pressing_left(ks): + return ks[sdl2.SDL_SCANCODE_A] or ks[sdl2.SDL_SCANCODE_LEFT] or ks[sdl2.SDL_SCANCODE_KP_4] + def pressing_right(ks): + return ks[sdl2.SDL_SCANCODE_D] or ks[sdl2.SDL_SCANCODE_RIGHT] or ks[sdl2.SDL_SCANCODE_KP_6] + # prevent camera move if: console is up, text input is active, editing + # is not allowed + if self.shift_pressed and not self.alt_pressed and not self.ctrl_pressed and not self.ui.console.visible and not self.ui.text_tool.input_active and self.app.can_edit and self.ui.keyboard_focus_element is None: + if pressing_up(ks): + app.camera.pan(0, 1, True) + if pressing_down(ks): + app.camera.pan(0, -1, True) + if pressing_left(ks): + app.camera.pan(-1, 0, True) + if pressing_right(ks): + app.camera.pan(1, 0, True) + if ks[sdl2.SDL_SCANCODE_X]: + app.camera.zoom(-self.keyboard_zoom_amount, keyboard=True, + towards_cursor=True) + if ks[sdl2.SDL_SCANCODE_Z]: + app.camera.zoom(self.keyboard_zoom_amount, keyboard=True) + if self.app.can_edit and app.middle_mouse and (app.mouse_dx != 0 or app.mouse_dy != 0): + app.camera.mouse_pan(app.mouse_dx, app.mouse_dy) + # game mode: arrow keys and left gamepad stick move player + if self.app.game_mode and not self.ui.console.visible and not self.ui.active_dialog and self.ui.keyboard_focus_element is None: + if pressing_up(ks): + # shift = move selected + if self.shift_pressed and self.app.can_edit: + app.gw.move_selected(0, 1, 0) + elif not self.ctrl_pressed and app.gw.player: + app.gw.player.move(0, 1) + if pressing_down(ks): + if self.shift_pressed and self.app.can_edit: + app.gw.move_selected(0, -1, 0) + elif not self.ctrl_pressed and app.gw.player: + app.gw.player.move(0, -1) + if pressing_left(ks): + if self.shift_pressed and self.app.can_edit: + app.gw.move_selected(-1, 0, 0) + elif not self.ctrl_pressed and app.gw.player: + app.gw.player.move(-1, 0) + if pressing_right(ks): + if self.shift_pressed and self.app.can_edit: + app.gw.move_selected(1, 0, 0) + elif not self.ctrl_pressed and app.gw.player: + app.gw.player.move(1, 0) + if abs(self.gamepad_left_x) > 0.15 and app.gw.player: + app.gw.player.move(self.gamepad_left_x, 0) + if abs(self.gamepad_left_y) > 0.15 and app.gw.player: + app.gw.player.move(0, self.gamepad_left_y) + sdl2.SDL_PumpEvents() + + def is_key_pressed(self, key): + "returns True if given key is pressed" + key = bytes(key, encoding='utf-8') + scancode = sdl2.keyboard.SDL_GetScancodeFromName(key) + return sdl2.SDL_GetKeyboardState(None)[scancode] + + # + # bind functions + # + # function names correspond with key values in binds.cfg + def BIND_quit(self): + for art in self.app.art_loaded_for_edit: + if art.unsaved_changes and self.app.can_edit: + if self.app.game_mode: + self.app.exit_game_mode() + self.ui.set_active_art(art) + self.ui.open_dialog(QuitUnsavedChangesDialog) + return + self.app.should_quit = True + + def BIND_toggle_console(self): + self.ui.console.toggle() + + def BIND_import_file(self): + self.ui.open_dialog(ImportFileDialog) + + def BIND_export_file(self): + self.ui.open_dialog(ExportFileDialog) + + def BIND_export_file_last(self): + # if user hasn't exported this session, pick an exporter + if self.ui.app.exporter: + # redo export with appropriate filename & last options if they have + out_filename = self.ui.active_art.filename + out_filename = os.path.basename(out_filename) + out_filename = os.path.splitext(out_filename)[0] + ExportOptionsDialog.do_export(self.ui.app, out_filename, + self.ui.app.last_export_options) + else: + self.ui.open_dialog(ExportFileDialog) + + def BIND_decrease_ui_scale(self): + if self.ui.scale > SCALE_INCREMENT * 2: + self.ui.set_scale(self.ui.scale - SCALE_INCREMENT) + + def BIND_increase_ui_scale(self): + # cap UI scale at 2 + if self.ui.scale + SCALE_INCREMENT < 2.0: + self.ui.set_scale(self.ui.scale + SCALE_INCREMENT) + + def BIND_toggle_fullscreen(self): + self.app.toggle_fullscreen() + + def BIND_decrease_brush_size(self): + self.ui.selected_tool.decrease_brush_size() + self.ui.menu_bar.refresh_active_menu() + + def BIND_increase_brush_size(self): + self.ui.selected_tool.increase_brush_size() + self.ui.menu_bar.refresh_active_menu() + + def BIND_cycle_char_forward(self): + self.ui.select_char(self.ui.selected_char+1) + + def BIND_cycle_char_backward(self): + self.ui.select_char(self.ui.selected_char-1) + + def BIND_cycle_fg_forward(self): + self.ui.select_fg(self.ui.selected_fg_color+1) + + def BIND_cycle_fg_backward(self): + self.ui.select_fg(self.ui.selected_fg_color-1) + + def BIND_cycle_bg_forward(self): + self.ui.select_bg(self.ui.selected_bg_color+1) + + def BIND_cycle_bg_backward(self): + self.ui.select_bg(self.ui.selected_bg_color-1) + + def BIND_cycle_xform_forward(self): + self.ui.cycle_selected_xform() + + def BIND_cycle_xform_backward(self): + self.ui.cycle_selected_xform(True) + + def BIND_toggle_affects_char(self): + self.ui.selected_tool.toggle_affects_char() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_affects_fg(self): + self.ui.selected_tool.toggle_affects_fg() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_affects_bg(self): + self.ui.selected_tool.toggle_affects_bg() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_affects_xform(self): + self.ui.selected_tool.toggle_affects_xform() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_crt(self): + self.app.fb.toggle_crt() + self.ui.menu_bar.refresh_active_menu() + + def BIND_select_pencil_tool(self): + self.ui.set_selected_tool(self.ui.pencil_tool) + + def BIND_select_erase_tool(self): + self.ui.set_selected_tool(self.ui.erase_tool) + + def BIND_select_rotate_tool(self): + self.ui.set_selected_tool(self.ui.rotate_tool) + + def BIND_select_grab_tool(self): + self.ui.set_selected_tool(self.ui.grab_tool) + + def BIND_select_text_tool(self): + self.ui.set_selected_tool(self.ui.text_tool) + + def BIND_select_select_tool(self): + self.ui.set_selected_tool(self.ui.select_tool) + + def BIND_select_fill_tool(self): + self.ui.set_selected_tool(self.ui.fill_tool) + + def BIND_cycle_fill_boundary_mode(self): + self.ui.cycle_fill_tool_mode() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_art_toolbar(self): + self.ui.art_toolbar.visible = not self.ui.art_toolbar.visible + self.ui.menu_bar.refresh_active_menu() + + def BIND_cut_selection(self): + self.ui.cut_selection() + # switch to PasteTool + self.ui.set_selected_tool(self.ui.paste_tool) + # clear selection + self.ui.select_none() + self.ui.tool_settings_changed = True + + def BIND_copy_selection(self): + self.ui.copy_selection() + # switch to PasteTool + self.ui.set_selected_tool(self.ui.paste_tool) + # clear selection + self.ui.select_none() + self.ui.tool_settings_changed = True + + def BIND_select_paste_tool(self): + self.ui.set_selected_tool(self.ui.paste_tool) + + def BIND_select_none(self): + if self.app.game_mode: + self.app.gw.deselect_all() + else: + self.ui.select_none() + + def BIND_cancel(self): + # context-dependent: + # game mode: deselect + # normal painting mode: cancel current selection + # menu bar active: bail out of current menu + # either way: bail on image conversion if it's happening + if self.app.converter: + self.app.converter.finish(True) + if self.ui.menu_bar.active_menu_name: + self.ui.menu_bar.close_active_menu() + elif self.app.game_mode: + # bail out of list if it's active + if self.ui.keyboard_focus_element is self.ui.edit_list_panel: + self.ui.edit_list_panel.cancel() + else: + self.app.gw.deselect_all() + else: + self.ui.select_none() + + def BIND_select_all(self): + self.ui.select_all() + + def BIND_select_invert(self): + self.ui.invert_selection() + + def BIND_edit_cfg(self): + self.ui.menu_bar.close_active_menu() + self.app.edit_cfg() + + def BIND_erase_selection_or_art(self): + # if in game mode, delete selected objects + if self.app.game_mode: + # operate on a copy of selected objects list, + # as obj.destroy() removes itself from original + for obj in self.app.gw.selected_objects[:]: + # some objects can't be deleted + if obj.deleteable: + obj.destroy() + else: + self.ui.erase_selection_or_art() + + def BIND_toggle_game_mode(self): + if not self.app.can_edit: + return + if not self.app.game_mode: + self.app.enter_game_mode() + else: + self.app.exit_game_mode() + self.app.update_window_title() + + def BIND_new_game_dir(self): + self.ui.open_dialog(NewGameDirDialog) + + def BIND_set_game_dir(self): + if self.app.can_edit: + # show available games in list panel + self.ui.edit_list_panel.set_list_operation(LO_OPEN_GAME_DIR) + + def BIND_load_game_state(self): + self.ui.edit_list_panel.set_list_operation(LO_LOAD_STATE) + + def BIND_save_game_state(self): + self.ui.open_dialog(SaveGameStateDialog) + + def BIND_reset_game(self): + if self.app.game_mode and self.app.gw.game_dir: + self.app.gw.reset_game() + + def BIND_toggle_picker(self): + if not self.ui.active_art: + return + if self.ui.popup_hold_to_show: + self.ui.popup.show() + else: + self.ui.popup.toggle() + + def BIND_toggle_picker_hold(self): + self.ui.popup_hold_to_show = not self.ui.popup_hold_to_show + self.ui.menu_bar.refresh_active_menu() + + def BIND_swap_fg_bg_colors(self): + if self.ui.active_art: + self.ui.swap_fg_bg_colors() + + def BIND_save_current(self): + # save current game state in game mode, else save current art + if self.app.game_mode and self.app.gw.game_dir: + # as with reset, save over last loaded state + self.app.gw.save_last_state() + elif self.ui.active_art: + # if new document, ask for a name + default_name = ART_DIR + 'new.' + ART_FILE_EXTENSION + if self.ui.active_art.filename == default_name: + self.ui.open_dialog(SaveAsDialog) + else: + self.ui.active_art.save_to_file() + + def BIND_toggle_ui_visibility(self): + self.ui.visible = not self.ui.visible + + def BIND_toggle_grid_visibility(self): + self.app.grid.visible = not self.app.grid.visible + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_bg_texture(self): + self.app.show_bg_texture = not self.app.show_bg_texture + self.ui.menu_bar.refresh_active_menu() + + def BIND_previous_frame(self): + self.ui.set_active_frame(self.ui.active_art.active_frame - 1) + + def BIND_next_frame(self): + self.ui.set_active_frame(self.ui.active_art.active_frame + 1) + + def BIND_toggle_anim_playback(self): + # if game mode, pause/unpause + if self.app.game_mode: + self.toggle_pause() + return + for r in self.ui.active_art.renderables: + if r.animating: + r.stop_animating() + else: + r.start_animating() + self.ui.menu_bar.refresh_active_menu() + + def toggle_pause(self): + self.app.gw.toggle_pause() + self.ui.menu_bar.refresh_active_menu() + + def BIND_previous_layer(self): + self.ui.set_active_layer(self.ui.active_art.active_layer - 1) + self.ui.menu_bar.refresh_active_menu() + + def BIND_next_layer(self): + self.ui.set_active_layer(self.ui.active_art.active_layer + 1) + self.ui.menu_bar.refresh_active_menu() + + def BIND_previous_art(self): + self.ui.previous_active_art() + self.ui.menu_bar.refresh_active_menu() + + def BIND_next_art(self): + if len(self.app.art_loaded_for_edit) == 0: + return + self.ui.next_active_art() + self.ui.menu_bar.refresh_active_menu() + + def BIND_undo(self): + self.ui.undo() + + def BIND_redo(self): + self.ui.redo() + + def BIND_quick_grab(self): + if not self.ui.active_art: + return + self.app.keyboard_editing = True + self.ui.quick_grab() + + def BIND_set_camera_zoom(self): + self.ui.open_dialog(SetCameraZoomDialog) + + def BIND_camera_zoom_in_proportional(self): + self.app.camera.zoom_proportional(1) + + def BIND_camera_zoom_out_proportional(self): + self.app.camera.zoom_proportional(-1) + + def BIND_toggle_zoom_extents(self): + self.app.camera.toggle_zoom_extents() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_camera_tilt(self): + if self.app.camera.y_tilt == 2: + self.app.camera.y_tilt = 0 + self.ui.message_line.post_line('Camera tilt disengaged.') + else: + self.app.camera.y_tilt = 2 + self.ui.message_line.post_line('Camera tilt engaged.') + self.ui.menu_bar.refresh_active_menu() + + def BIND_select_overlay_image(self): + self.ui.open_dialog(OverlayImageFileChooserDialog) + + def BIND_toggle_overlay_image(self): + self.app.draw_overlay = not self.app.draw_overlay + self.ui.menu_bar.refresh_active_menu() + + def BIND_set_overlay_image_opacity(self): + self.ui.open_dialog(OverlayImageOpacityDialog) + + def BIND_set_overlay_image_scaling(self): + if self.app.overlay_scale_type == OIS_WIDTH: + self.app.overlay_scale_type = OIS_HEIGHT + elif self.app.overlay_scale_type == OIS_HEIGHT: + self.app.overlay_scale_type = OIS_FILL + elif self.app.overlay_scale_type == OIS_FILL: + self.app.overlay_scale_type = OIS_WIDTH + self.ui.size_and_position_overlay_image() + self.ui.menu_bar.refresh_active_menu() + + def BIND_add_to_list_selection(self): + if not self.ui.edit_list_panel.is_visible(): + return + self.ui.edit_list_panel.keyboard_select_item() + + def BIND_remove_from_list_selection(self): + if not self.ui.edit_list_panel.is_visible(): + return + self.ui.edit_list_panel.keyboard_select_item() + + def BIND_select_or_paint(self): + if self.ui.keyboard_focus_element: + # save current focus element because kb_select_item might change it! + selected_element = self.ui.keyboard_focus_element + # get button pressed in case we need its item + button = self.ui.keyboard_focus_element.keyboard_select_item() + if selected_element is self.ui.pulldown: + # mirror behavior from MenuItemButton.click: close on select if needed + if button and button.item.close_on_select: + self.ui.menu_bar.close_active_menu() + return + if not self.ui.active_art: + return + elif self.ui.selected_tool is self.ui.text_tool and not self.ui.text_tool.input_active: + self.ui.text_tool.start_entry() + elif self.ui.selected_tool is self.ui.select_tool: + if self.ui.select_tool.selection_in_progress: + # pass in shift/alt for add/subtract + self.ui.select_tool.finish_select(self.shift_pressed, self.ctrl_pressed) + else: + self.ui.select_tool.start_select() + else: + self.app.cursor.start_paint() + + def BIND_screenshot(self): + self.app.screenshot() + + def BIND_run_test_mutate(self): + if self.ui.active_art.is_script_running('conway'): + self.ui.active_art.stop_script('conway') + else: + self.ui.active_art.run_script_every('conway', 0.05) + + def BIND_arrow_up(self): + if self.ui.keyboard_focus_element: + self.ui.keyboard_navigate(0, -1) + else: + self.app.cursor.keyboard_move(0, 1) + + def BIND_arrow_down(self): + if self.ui.keyboard_focus_element: + self.ui.keyboard_navigate(0, 1) + else: + self.app.cursor.keyboard_move(0, -1) + + def BIND_arrow_left(self): + # navigate popup, menu bar etc + if self.ui.keyboard_focus_element: + self.ui.keyboard_navigate(-1, 0) + else: + self.app.cursor.keyboard_move(-1, 0) + + def BIND_arrow_right(self): + if self.ui.keyboard_focus_element: + self.ui.keyboard_navigate(1, 0) + else: + self.app.cursor.keyboard_move(1, 0) + + def BIND_cycle_inactive_layer_visibility(self): + if not self.ui.active_art: + return + if self.ui.active_art.layers == 1: + return + message_text = 'Non-active layers: ' + if self.app.inactive_layer_visibility == LAYER_VIS_FULL: + self.app.inactive_layer_visibility = LAYER_VIS_DIM + message_text += 'dim' + elif self.app.inactive_layer_visibility == LAYER_VIS_DIM: + self.app.inactive_layer_visibility = LAYER_VIS_NONE + message_text += 'invisible' + else: + self.app.inactive_layer_visibility = LAYER_VIS_FULL + message_text += 'visible' + self.ui.message_line.post_line(message_text) + self.ui.menu_bar.refresh_active_menu() + + def BIND_open_file_menu(self): + self.ui.menu_bar.open_menu_by_name('file') + + def BIND_open_edit_menu(self): + self.ui.menu_bar.open_menu_by_name('edit') + + def BIND_open_tool_menu(self): + self.ui.menu_bar.open_menu_by_name('tool') + + def BIND_open_view_menu(self): + self.ui.menu_bar.open_menu_by_name('view') + + def BIND_open_art_menu(self): + self.ui.menu_bar.open_menu_by_name('art') + + def BIND_open_frame_menu(self): + if self.app.game_mode: + self.ui.menu_bar.open_menu_by_name('room') + else: + self.ui.menu_bar.open_menu_by_name('frame') + + def BIND_open_layer_menu(self): + self.ui.menu_bar.open_menu_by_name('layer') + + def BIND_open_char_color_menu(self): + self.ui.menu_bar.open_menu_by_name('char_color') + + def BIND_open_help_menu(self): + self.ui.menu_bar.open_menu_by_name('help') + + def BIND_open_game_menu(self): + self.ui.menu_bar.open_menu_by_name('game') + + def BIND_open_state_menu(self): + self.ui.menu_bar.open_menu_by_name('state') + + def BIND_open_world_menu(self): + self.ui.menu_bar.open_menu_by_name('world') + + def BIND_open_object_menu(self): + self.ui.menu_bar.open_menu_by_name('object') + + def BIND_new_art(self): + self.ui.open_dialog(NewArtDialog) + + def BIND_open_art(self): + self.ui.open_dialog(ArtChooserDialog) + + def BIND_save_art_as(self): + if self.app.game_mode: + self.ui.open_dialog(SaveGameStateDialog) + elif not self.ui.active_art: + return + else: + self.ui.open_dialog(SaveAsDialog) + + def BIND_revert_art(self): + if not self.ui.active_art: + return + if self.ui.active_art.unsaved_changes: + self.ui.open_dialog(RevertChangesDialog) + + def BIND_close_art(self): + if not self.ui.active_art: + return + if self.ui.active_art.unsaved_changes: + self.ui.open_dialog(CloseUnsavedChangesDialog) + return + self.app.close_art(self.ui.active_art) + # dismiss popup if no more arts are open + if self.ui.popup.visible and len(self.app.art_loaded_for_edit) == 0: + self.ui.popup.hide() + + def BIND_open_help_docs(self): + self.app.open_help_docs() + + def BIND_generate_docs(self): + self.app.generate_docs() + + def BIND_open_website(self): + self.app.open_website() + + def BIND_crop_to_selection(self): + self.ui.crop_to_selection(self.ui.active_art) + + def BIND_resize_art(self): + self.ui.open_dialog(ResizeArtDialog) + + def BIND_art_flip_horizontal(self): + self.ui.active_art.flip_horizontal(self.ui.active_art.active_frame, + self.ui.active_art.active_layer) + + def BIND_art_flip_vertical(self): + self.ui.active_art.flip_vertical(self.ui.active_art.active_frame, + self.ui.active_art.active_layer) + + def BIND_art_toggle_flip_affects_xforms(self): + self.ui.flip_affects_xforms = not self.ui.flip_affects_xforms + self.ui.menu_bar.refresh_active_menu() + + def BIND_run_art_script(self): + self.ui.open_dialog(RunArtScriptDialog) + + def BIND_run_art_script_last(self): + # if user hasn't run a script this session, pick one + if not self.ui.app.last_art_script: + self.BIND_run_art_script() + else: + self.ui.active_art.run_script(self.ui.app.last_art_script, log=False) + + def BIND_art_switch_to(self, art_filename): + self.ui.set_active_art_by_filename(art_filename) + self.ui.menu_bar.refresh_active_menu() + + def BIND_add_frame(self): + self.ui.open_dialog(AddFrameDialog) + + def BIND_duplicate_frame(self): + self.ui.open_dialog(DuplicateFrameDialog) + + def BIND_change_frame_delay(self): + self.ui.open_dialog(FrameDelayDialog) + + def BIND_change_frame_delay_all(self): + self.ui.open_dialog(FrameDelayAllDialog) + + def BIND_delete_frame(self): + self.ui.active_art.delete_frame_at(self.ui.active_art.active_frame) + # if we're now down to 1 frame, refresh to dim this item! + # FIXME: this doesn't dim it - why? - but it is unselectable + self.ui.menu_bar.refresh_active_menu() + + def BIND_change_frame_index(self): + self.ui.open_dialog(FrameIndexDialog) + + def BIND_add_layer(self): + self.ui.open_dialog(AddLayerDialog) + + def BIND_duplicate_layer(self): + self.ui.open_dialog(DuplicateLayerDialog) + + def BIND_layer_switch_to(self, layer_number): + self.ui.set_active_layer(layer_number) + self.ui.menu_bar.refresh_active_menu() + + def BIND_change_layer_name(self): + self.ui.open_dialog(SetLayerNameDialog) + + def BIND_change_layer_z(self): + self.ui.open_dialog(SetLayerZDialog) + + def BIND_toggle_layer_visibility(self): + art = self.ui.active_art + is_visible = art.layers_visibility[art.active_layer] + art.layers_visibility[art.active_layer] = not is_visible + art.set_unsaved_changes(True) + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_hidden_layers_visible(self): + self.app.show_hidden_layers = not self.app.show_hidden_layers + self.ui.menu_bar.refresh_active_menu() + + def BIND_delete_layer(self): + self.ui.active_art.delete_layer(self.ui.active_art.active_layer) + self.ui.menu_bar.refresh_active_menu() + + def BIND_choose_charset(self): + self.ui.open_dialog(CharSetChooserDialog) + + def BIND_choose_palette(self): + self.ui.open_dialog(PaletteChooserDialog) + + def BIND_palette_from_file(self): + self.ui.open_dialog(PaletteFromImageChooserDialog) + + def BIND_toggle_onion_visibility(self): + self.app.onion_frames_visible = not self.app.onion_frames_visible + if self.app.onion_frames_visible: + self.ui.reset_onion_frames() + self.ui.menu_bar.refresh_active_menu() + + def BIND_cycle_onion_frames(self): + self.app.onion_show_frames += 1 + self.app.onion_show_frames %= self.app.max_onion_frames + 1 + # start cycle at 1, not 0 + self.app.onion_show_frames = max(1, self.app.onion_show_frames) + self.ui.menu_bar.refresh_active_menu() + + def BIND_cycle_onion_ahead_behind(self): + # cycle between next, previous, next & previous + if self.app.onion_show_frames_behind and self.app.onion_show_frames_ahead: + self.app.onion_show_frames_behind = False + elif not self.app.onion_show_frames_behind and self.app.onion_show_frames_ahead: + self.app.onion_show_frames_behind = True + self.app.onion_show_frames_ahead = False + else: + self.app.onion_show_frames_ahead = True + self.app.onion_show_frames_ahead = True + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_debug_text(self): + self.ui.debug_text.visible = not self.ui.debug_text.visible + + def BIND_toggle_fps_counter(self): + self.ui.fps_counter.visible = not self.ui.fps_counter.visible + + def BIND_open_all_game_assets(self): + for game_obj in self.app.gw.objects.values(): + for art_filename in game_obj.get_all_art(): + self.app.load_art_for_edit(art_filename) + # open all hud assets too + for art in self.app.gw.hud.arts: + self.app.load_art_for_edit(art.filename) + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_all_collision_viz(self): + self.app.gw.toggle_all_collision_viz() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_all_bounds_viz(self): + self.app.gw.toggle_all_bounds_viz() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_all_origin_viz(self): + self.app.gw.toggle_all_origin_viz() + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_collision_on_selected(self): + for obj in self.app.gw.selected_objects: + if obj.orig_collision_type and obj.collision_type == CT_NONE: + obj.enable_collision() + self.ui.message_line.post_line('Collision enabled for %s' % obj.name) + elif obj.collision_type != CT_NONE: + obj.disable_collision() + self.ui.message_line.post_line('Collision disabled for %s' % obj.name) + + def BIND_toggle_game_edit_ui(self): + self.ui.toggle_game_edit_ui() + + # + # game mode binds + # + def accept_normal_game_input(self): + return self.app.game_mode and self.app.gw.player and not self.ui.active_dialog and not self.ui.pulldown.visible + + # TODO: generalize these two somehow + def BIND_game_frob(self): + if self.accept_normal_game_input(): + self.app.gw.player.button_pressed(1) + + def BIND_game_grab(self): + if self.accept_normal_game_input(): + self.app.gw.player.button_pressed(0) + + def BIND_center_cursor_in_art(self): + self.app.cursor.center_in_art() + + def BIND_choose_spawn_object_class(self): + if self.app.game_mode and self.app.gw.game_dir: + self.ui.edit_list_panel.set_list_operation(LO_SET_SPAWN_CLASS) + + def BIND_duplicate_selected_objects(self): + self.app.gw.duplicate_selected_objects() + + def BIND_select_objects(self): + if self.app.game_mode and self.app.gw.game_dir: + self.ui.edit_list_panel.set_list_operation(LO_SELECT_OBJECTS) + + def BIND_edit_art_for_selected_objects(self): + self.app.gw.edit_art_for_selected() + + def BIND_edit_world_properties(self): + self.app.gw.deselect_all() + self.app.gw.select_object(self.app.gw.properties, force=True) + + def BIND_change_current_room(self): + self.ui.edit_list_panel.set_list_operation(LO_SET_ROOM) + + def BIND_change_current_room_to(self, new_room_name): + self.app.gw.change_room(new_room_name) + self.ui.menu_bar.refresh_active_menu() + + def BIND_add_room(self): + self.ui.open_dialog(AddRoomDialog) + + def BIND_remove_current_room(self): + self.app.gw.remove_room(self.app.gw.current_room.name) + + def BIND_set_room_objects(self): + self.ui.edit_list_panel.set_list_operation(LO_SET_ROOM_OBJECTS) + + def BIND_set_object_rooms(self): + self.ui.edit_list_panel.set_list_operation(LO_SET_OBJECT_ROOMS) + + def BIND_toggle_all_rooms_visible(self): + self.app.gw.show_all_rooms = not self.app.gw.show_all_rooms + self.ui.menu_bar.refresh_active_menu() + + def BIND_toggle_room_camera_changes(self): + self.app.gw.properties.set_object_property('room_camera_changes_enabled', not self.app.gw.room_camera_changes_enabled) + self.ui.menu_bar.refresh_active_menu() + + def BIND_set_room_camera_marker(self): + self.ui.open_dialog(SetRoomCamDialog) + self.ui.edit_list_panel.set_list_operation(LO_SET_ROOM_CAMERA) + + def BIND_objects_to_camera(self): + cam = self.app.gw.camera + for obj in self.app.gw.selected_objects: + obj.set_loc(cam.x, cam.y, cam.z) + + def BIND_camera_to_objects(self): + if len(self.app.gw.selected_objects) == 0: + return + obj = self.app.gw.selected_objects[0] + self.app.gw.camera.set_loc_from_obj(obj) + + def BIND_add_selected_to_room(self): + if not self.app.gw.current_room: + return + for obj in self.app.gw.selected_objects: + self.app.gw.current_room.add_object(obj) + + def BIND_remove_selected_from_room(self): + if not self.app.gw.current_room: + return + for obj in self.app.gw.selected_objects: + self.app.gw.current_room.remove_object(obj) + + def BIND_switch_edit_panel_focus(self): + self.ui.switch_edit_panel_focus() + + def BIND_switch_edit_panel_focus_reverse(self): + self.ui.switch_edit_panel_focus(reverse=True) + + def BIND_set_room_edge_warps(self): + # bring up dialog before setting list so list knows about it + self.ui.open_dialog(SetRoomEdgeWarpsDialog) + self.ui.edit_list_panel.set_list_operation(LO_SET_ROOM_EDGE_WARP) + + def BIND_set_room_bounds_obj(self): + self.ui.open_dialog(SetRoomBoundsObjDialog) + self.ui.edit_list_panel.set_list_operation(LO_SET_ROOM_EDGE_OBJ) + + def BIND_toggle_list_only_room_objects(self): + self.app.gw.list_only_current_room_objects = not self.app.gw.list_only_current_room_objects + self.ui.menu_bar.refresh_active_menu() + + def BIND_rename_current_room(self): + self.ui.open_dialog(RenameRoomDialog) + + def BIND_toggle_debug_objects(self): + if not self.app.gw.properties: + return + self.app.gw.properties.set_object_property('draw_debug_objects', not self.app.gw.draw_debug_objects) + self.ui.menu_bar.refresh_active_menu() diff --git a/key_shifts.py b/key_shifts.py new file mode 100644 index 0000000..d5c6307 --- /dev/null +++ b/key_shifts.py @@ -0,0 +1,44 @@ +# dict for key shift-char mappings + +import sdl2 + +# MAYBE-TODO: find out if this breaks for non-US english KB layouts + +SHIFT_MAP = { + '1': '!', '2': '@', '3': '#', '4': '$', '5': '%', '6': '^', '7': '&', '8': '*', + '9': '(', '0': ')', '-': '_', '=': '+', '`': '~', '[': '{', ']': '}', '\\': '|', + ';': ':', "'": '"', ',': '<', '.': '>', '/': '?' +} + +NUMLOCK_ON_MAP = { + sdl2.SDLK_KP_0: sdl2.SDLK_0, + sdl2.SDLK_KP_1: sdl2.SDLK_1, + sdl2.SDLK_KP_2: sdl2.SDLK_2, + sdl2.SDLK_KP_3: sdl2.SDLK_3, + sdl2.SDLK_KP_4: sdl2.SDLK_4, + sdl2.SDLK_KP_5: sdl2.SDLK_5, + sdl2.SDLK_KP_6: sdl2.SDLK_6, + sdl2.SDLK_KP_7: sdl2.SDLK_7, + sdl2.SDLK_KP_8: sdl2.SDLK_8, + sdl2.SDLK_KP_9: sdl2.SDLK_9, + sdl2.SDLK_KP_DIVIDE: sdl2.SDLK_SLASH, + sdl2.SDLK_KP_MULTIPLY: sdl2.SDLK_ASTERISK, + sdl2.SDLK_KP_PLUS: sdl2.SDLK_PLUS, + sdl2.SDLK_KP_MINUS: sdl2.SDLK_MINUS, + sdl2.SDLK_KP_PERIOD: sdl2.SDLK_PERIOD, + sdl2.SDLK_KP_ENTER: sdl2.SDLK_RETURN +} + +NUMLOCK_OFF_MAP = { + sdl2.SDLK_KP_0: sdl2.SDLK_INSERT, + sdl2.SDLK_KP_1: sdl2.SDLK_END, + sdl2.SDLK_KP_2: sdl2.SDLK_DOWN, + sdl2.SDLK_KP_3: sdl2.SDLK_PAGEDOWN, + sdl2.SDLK_KP_4: sdl2.SDLK_LEFT, + sdl2.SDLK_KP_6: sdl2.SDLK_RIGHT, + sdl2.SDLK_KP_7: sdl2.SDLK_HOME, + sdl2.SDLK_KP_8: sdl2.SDLK_UP, + sdl2.SDLK_KP_9: sdl2.SDLK_PAGEUP, + sdl2.SDLK_KP_PERIOD: sdl2.SDLK_DELETE, + sdl2.SDLK_KP_ENTER: sdl2.SDLK_RETURN +} diff --git a/lab_color.py b/lab_color.py new file mode 100644 index 0000000..e84561b --- /dev/null +++ b/lab_color.py @@ -0,0 +1,62 @@ +# L*a*b color space conversion +# from EDSCII + +import math + +def rgb_to_xyz(r, g, b): + r /= 255.0 + g /= 255.0 + b /= 255.0 + if r > 0.04045: + r = ((r + 0.055) / 1.055)**2.4 + else: + r /= 12.92 + if g > 0.04045: + g = ((g + 0.055) / 1.055)**2.4 + else: + g /= 12.92 + if b > 0.04045: + b = ((b + 0.055) / 1.055)**2.4 + else: + b /= 12.92 + r *= 100 + g *= 100 + b *= 100 + # observer: 2deg, illuminant: D65 + x = r * 0.4124 + g * 0.3576 + b * 0.1805 + y = r * 0.2126 + g * 0.7152 + b * 0.0722 + z = r * 0.0193 + g * 0.1192 + b * 0.9505 + return x, y, z + +def xyz_to_lab(x, y, z): + # observer: 2deg, illuminant: D65 + x /= 95.047 + y /= 100.0 + z /= 108.883 + if x > 0.008856: + x = x**(1.0/3) + else: + x = (7.787 * x) + (16.0 / 116) + if y > 0.008856: + y = y**(1.0/3) + else: + y = (7.787 * y) + (16.0 / 116) + if z > 0.008856: + z = z**(1.0/3) + else: + z = (7.787 * z) + (16.0 / 116) + l = (116 * y) - 16 + a = 500 * (x - y) + b = 200 * (y - z) + return l, a, b + +def rgb_to_lab(r, g, b): + x, y, z = rgb_to_xyz(r, g, b) + return xyz_to_lab(x, y, z) + +def lab_color_diff(l1, a1, b1, l2, a2, b2): + "quick n' dirty CIE 1976 color delta" + dl = (l1 - l2)**2 + da = (a1 - a2)**2 + db = (b1 - b2)**2 + return math.sqrt(dl + da + db) diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..b8de7b9 --- /dev/null +++ b/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2022 JP LeBreton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/palette.py b/palette.py new file mode 100644 index 0000000..31b1bca --- /dev/null +++ b/palette.py @@ -0,0 +1,280 @@ +import os.path, math, time +from random import randint +from PIL import Image + +from texture import Texture +from lab_color import rgb_to_lab, lab_color_diff + +PALETTE_DIR = 'palettes/' +PALETTE_EXTENSIONS = ['png', 'gif', 'bmp'] +MAX_COLORS = 1024 + +class PaletteLord: + + # time in ms between checks for hot reload + hot_reload_check_interval = 2 * 1000 + + def __init__(self, app): + self.app = app + self.last_check = 0 + + def check_hot_reload(self): + if self.app.get_elapsed_time() - self.last_check < self.hot_reload_check_interval: + return + self.last_check = self.app.get_elapsed_time() + changed = None + for palette in self.app.palettes: + if palette.has_updated(): + changed = palette.filename + try: + palette.load_image() + self.app.log('PaletteLord: success reloading %s' % palette.filename) + except: + self.app.log('PaletteLord: failed reloading %s' % palette.filename, True) + + +class Palette: + + def __init__(self, app, src_filename, log): + self.init_success = False + self.app = app + self.filename = self.app.find_filename_path(src_filename, PALETTE_DIR, + PALETTE_EXTENSIONS) + if self.filename is None: + self.app.log("Couldn't find palette image %s" % src_filename) + return + self.last_image_change = os.path.getmtime(self.filename) + self.name = os.path.basename(self.filename) + self.name = os.path.splitext(self.name)[0] + self.load_image() + self.base_filename = os.path.splitext(os.path.basename(self.filename))[0] + if log and not self.app.game_mode: + self.app.log("loaded palette '%s' from %s:" % (self.name, self.filename)) + self.app.log(' unique colors found: %s' % int(len(self.colors)-1)) + self.app.log(' darkest color index: %s' % self.darkest_index) + self.app.log(' lightest color index: %s' % self.lightest_index) + self.init_success = True + + def load_image(self): + "loads palette data from the given bitmap image" + src_img = Image.open(self.filename) + src_img = src_img.convert('RGBA') + width, height = src_img.size + # store texture for chooser preview etc + self.src_texture = Texture(src_img.tobytes(), width, height) + # scan image L->R T->B for unique colors, store em as tuples + # color 0 is always fully transparent + self.colors = [(0, 0, 0, 0)] + # determine lightest and darkest colors in palette for defaults + lightest = 0 + darkest = 255 * 3 + 1 + self.lightest_index, self.darkest_index = 0, 0 + for y in range(height): + for x in range(width): + # bail if we've now read max colors + if len(self.colors) >= MAX_COLORS: + break + color = src_img.getpixel((x, y)) + if not color in self.colors: + self.colors.append(color) + # is this lightest/darkest unique color so far? save index + luminosity = color[0]*0.21 + color[1]*0.72 + color[2]*0.07 + if luminosity < darkest: + darkest = luminosity + self.darkest_index = len(self.colors) - 1 + elif luminosity > lightest: + lightest = luminosity + self.lightest_index = len(self.colors) - 1 + # create new 1D image with unique colors + img = Image.new('RGBA', (MAX_COLORS, 1), (0, 0, 0, 0)) + x = 0 + for color in self.colors: + img.putpixel((x, 0), color) + x += 1 + # debug: save out generated palette texture + #img.save('palette.png') + self.texture = Texture(img.tobytes(), MAX_COLORS, 1) + + def has_updated(self): + "return True if source image file has changed since last check" + changed = os.path.getmtime(self.filename) > self.last_image_change + if changed: + self.last_image_change = time.time() + return changed + + def generate_image(self): + width = min(16, len(self.colors) - 1) + height = math.floor((len(self.colors) - 1) / width) + # new PIL image, blank (0 alpha) pixels + img = Image.new('RGBA', (width, height), (0, 0, 0, 0)) + # set each pixel from color list (minus first, transparent color) + color_index = 1 + for y in range(height): + for x in range(width): + if color_index > len(self.colors) - 1: + break + img.putpixel((x, y), self.colors[color_index]) + color_index += 1 + return img + + def export_as_image(self): + img = self.generate_image() + block_size = 8 + # scale up + width, height = img.size + img = img.resize((width * block_size, height * block_size), + resample=Image.NEAREST) + # write to file + img_filename = self.app.documents_dir + PALETTE_DIR + self.name + '.png' + img.save(img_filename) + + def all_colors_opaque(self): + "returns True if we have any non-opaque (<1 alpha) colors" + for color in self.colors[1:]: + if color[3] < 255: + return False + return True + + def get_random_non_palette_color(self): + "returns random color not in this palette, eg for 8-bit transparency" + def rand_byte(): + return randint(0, 255) + # assume full alpha + r, g, b, a = rand_byte(), rand_byte(), rand_byte(), 255 + while (r, g, b, a) in self.colors: + r, g, b = rand_byte(), rand_byte(), rand_byte() + return r, g, b, a + + def get_palettized_image(self, src_img, transparent_color=(0, 0, 0), + force_no_transparency=False): + "returns a copy of source image quantized to this palette" + pal_img = Image.new('P', (1, 1)) + # source must be in RGB (no alpha) format + out_img = src_img.convert('RGB') + # Image.putpalette needs a flat tuple :/ + colors = [] + for i,color in enumerate(self.colors): + # ignore alpha for palettized image output + for channel in color[:-1]: + colors.append(channel) + # user-defined color 0 in case we want to do 8-bit transparency + if not force_no_transparency: + colors[0:3] = transparent_color + # PIL will fill out <256 color palettes with bogus values :/ + while len(colors) < MAX_COLORS * 3: + for i in range(3): + colors.append(0) + # palette for PIL must be exactly 256 colors + colors = colors[:256*3] + pal_img.putpalette(tuple(colors)) + return out_img.quantize(palette=pal_img) + + def are_colors_similar(self, color_index_a, palette_b, color_index_b, + tolerance=50): + """ + returns True if color index A is similar to color index B from + another palette. + """ + color_a = self.colors[color_index_a] + color_b = palette_b.colors[color_index_b % len(palette_b.colors)] + r_diff = abs(color_a[0] - color_b[0]) + g_diff = abs(color_a[1] - color_b[1]) + b_diff = abs(color_a[2] - color_b[2]) + return (r_diff + g_diff + b_diff) <= tolerance + + def get_closest_color_index(self, r, g, b): + "returns index of closest color in this palette to given color (kinda slow?)" + closest_diff = 99999999999 + closest_diff_index = -1 + for i,color in enumerate(self.colors): + l1, a1, b1 = rgb_to_lab(r, g, b) + l2, a2, b2 = rgb_to_lab(*color[:3]) + diff = lab_color_diff(l1, a1, b1, l2, a2, b2) + if diff < closest_diff: + closest_diff = diff + closest_diff_index = i + #print('%s is closest to input color %s' % (self.colors[closest_diff_index], (r, g, b))) + return closest_diff_index + + def get_random_color_index(self): + # exclude transparent first index + return randint(1, len(self.colors)) + + +class PaletteFromList(Palette): + + "palette created from list of 3/4-tuple base-255 colors instead of image" + + def __init__(self, app, src_color_list, log): + self.init_success = False + self.app = app + # generate a unique non-user-facing palette name + name = 'PaletteFromList_%s' % time.time() + self.filename = self.name = self.base_filename = name + colors = [] + for color in src_color_list: + # assume 1 alpha if not given + if len(color) == 3: + colors.append((color[0], color[1], color[2], 255)) + else: + colors.append(color) + self.colors = [(0, 0, 0, 0)] + colors + lightest = 0 + darkest = 255 * 3 + 1 + for color in self.colors: + luminosity = color[0]*0.21 + color[1]*0.72 + color[2]*0.07 + if luminosity < darkest: + darkest = luminosity + self.darkest_index = len(self.colors) - 1 + elif luminosity > lightest: + lightest = luminosity + self.lightest_index = len(self.colors) - 1 + # create texture + img = Image.new('RGBA', (MAX_COLORS, 1), (0, 0, 0, 0)) + x = 0 + for color in self.colors: + img.putpixel((x, 0), color) + x += 1 + self.texture = Texture(img.tobytes(), MAX_COLORS, 1) + if log and not self.app.game_mode: + self.app.log("generated new palette '%s'" % (self.name)) + self.app.log(' unique colors: %s' % int(len(self.colors)-1)) + self.app.log(' darkest color index: %s' % self.darkest_index) + self.app.log(' lightest color index: %s' % self.lightest_index) + + def has_updated(self): + "No bitmap source for this type of palette, so no hot-reload" + return False + + +class PaletteFromFile(Palette): + + def __init__(self, app, src_filename, palette_filename, colors=MAX_COLORS): + self.init_success = False + src_filename = app.find_filename_path(src_filename) + if not src_filename: + app.log("Couldn't find palette source image %s" % src_filename) + return + # dither source image, re-save it, use that as the source for a palette + src_img = Image.open(src_filename) + # method: + src_img = src_img.convert('P', None, Image.FLOYDSTEINBERG, Image.ADAPTIVE, colors) + src_img = src_img.convert('RGBA') + # write converted source image with new filename + # snip path & extension if it has em + palette_filename = os.path.basename(palette_filename) + palette_filename = os.path.splitext(palette_filename)[0] + # get most appropriate path for palette image + palette_path = app.get_dirnames(PALETTE_DIR, False)[0] + # if new filename exists, add a number to avoid overwriting + if os.path.exists(palette_path + palette_filename + '.png'): + i = 0 + while os.path.exists('%s%s%s.png' % (palette_path, palette_filename, str(i))): + i += 1 + palette_filename += str(i) + # (re-)add path and PNG extension + palette_filename = palette_path + palette_filename + '.png' + src_img.save(palette_filename) + # create the actual palette and export it as an image + Palette.__init__(self, app, palette_filename, True) + self.export_as_image() diff --git a/palettes/ansi-240.png b/palettes/ansi-240.png new file mode 100644 index 0000000..e4db743 Binary files /dev/null and b/palettes/ansi-240.png differ diff --git a/palettes/ansi.png b/palettes/ansi.png new file mode 100644 index 0000000..24a9ac8 Binary files /dev/null and b/palettes/ansi.png differ diff --git a/palettes/apple2.png b/palettes/apple2.png new file mode 100644 index 0000000..93e93a5 Binary files /dev/null and b/palettes/apple2.png differ diff --git a/palettes/arne16.png b/palettes/arne16.png new file mode 100644 index 0000000..caa77a5 Binary files /dev/null and b/palettes/arne16.png differ diff --git a/palettes/atari.png b/palettes/atari.png new file mode 100644 index 0000000..5641af2 Binary files /dev/null and b/palettes/atari.png differ diff --git a/palettes/bw.png b/palettes/bw.png new file mode 100644 index 0000000..7be5d95 Binary files /dev/null and b/palettes/bw.png differ diff --git a/palettes/c64_edscii.png b/palettes/c64_edscii.png new file mode 100644 index 0000000..a5f6d3c Binary files /dev/null and b/palettes/c64_edscii.png differ diff --git a/palettes/c64_original.png b/palettes/c64_original.png new file mode 100644 index 0000000..0cc83a6 Binary files /dev/null and b/palettes/c64_original.png differ diff --git a/palettes/c64_pepto.png b/palettes/c64_pepto.png new file mode 100644 index 0000000..7083135 Binary files /dev/null and b/palettes/c64_pepto.png differ diff --git a/palettes/cpc.png b/palettes/cpc.png new file mode 100644 index 0000000..f74196f Binary files /dev/null and b/palettes/cpc.png differ diff --git a/palettes/dawnbringer16.png b/palettes/dawnbringer16.png new file mode 100644 index 0000000..019e8a5 Binary files /dev/null and b/palettes/dawnbringer16.png differ diff --git a/palettes/doom.png b/palettes/doom.png new file mode 100644 index 0000000..772f1d4 Binary files /dev/null and b/palettes/doom.png differ diff --git a/palettes/dpaint.png b/palettes/dpaint.png new file mode 100644 index 0000000..597397c Binary files /dev/null and b/palettes/dpaint.png differ diff --git a/palettes/ega.png b/palettes/ega.png new file mode 100644 index 0000000..1b2b1d2 Binary files /dev/null and b/palettes/ega.png differ diff --git a/palettes/gameboy.png b/palettes/gameboy.png new file mode 100644 index 0000000..4305780 Binary files /dev/null and b/palettes/gameboy.png differ diff --git a/palettes/hercules.png b/palettes/hercules.png new file mode 100644 index 0000000..38c1dff Binary files /dev/null and b/palettes/hercules.png differ diff --git a/palettes/heretic.png b/palettes/heretic.png new file mode 100644 index 0000000..959393a Binary files /dev/null and b/palettes/heretic.png differ diff --git a/palettes/intellivision.png b/palettes/intellivision.png new file mode 100644 index 0000000..f7ea5ca Binary files /dev/null and b/palettes/intellivision.png differ diff --git a/palettes/macintosh2.png b/palettes/macintosh2.png new file mode 100644 index 0000000..f1e0de7 Binary files /dev/null and b/palettes/macintosh2.png differ diff --git a/palettes/mspaint.png b/palettes/mspaint.png new file mode 100644 index 0000000..bb5b8af Binary files /dev/null and b/palettes/mspaint.png differ diff --git a/palettes/msx.png b/palettes/msx.png new file mode 100644 index 0000000..bae69c4 Binary files /dev/null and b/palettes/msx.png differ diff --git a/palettes/nes.png b/palettes/nes.png new file mode 100644 index 0000000..619c1ed Binary files /dev/null and b/palettes/nes.png differ diff --git a/palettes/pacman.png b/palettes/pacman.png new file mode 100644 index 0000000..a873e68 Binary files /dev/null and b/palettes/pacman.png differ diff --git a/palettes/pico8.png b/palettes/pico8.png new file mode 100644 index 0000000..490141f Binary files /dev/null and b/palettes/pico8.png differ diff --git a/palettes/quake.png b/palettes/quake.png new file mode 100644 index 0000000..c8973ee Binary files /dev/null and b/palettes/quake.png differ diff --git a/palettes/sharecart1000.png b/palettes/sharecart1000.png new file mode 100644 index 0000000..6fd4e6b Binary files /dev/null and b/palettes/sharecart1000.png differ diff --git a/palettes/speccy.png b/palettes/speccy.png new file mode 100644 index 0000000..8ee287c Binary files /dev/null and b/palettes/speccy.png differ diff --git a/palettes/teletext.png b/palettes/teletext.png new file mode 100644 index 0000000..1a6d5e5 Binary files /dev/null and b/palettes/teletext.png differ diff --git a/playscii.cfg.default b/playscii.cfg.default new file mode 100644 index 0000000..56f678f --- /dev/null +++ b/playscii.cfg.default @@ -0,0 +1,46 @@ +# DEFAULT CONFIG FILE TEMPLATE, DO NOT MODIFY +# playscii local config file + +# override class defaults here. +# everything in this file must be a valid Python expression. +# many lines are here for reference but commented out, uncomment to activate. + +# most of these settings require restarting Playscii to take effect. + +Application.fullscreen = False +Application.window_width, Application.window_height = 1280, 720 + +# try it, you'll like it :] +Application.capslock_is_ctrl = True + +Art.DEFAULT_CHARSET = 'c64_petscii' +Art.DEFAULT_PALETTE = 'c64_original' +#Art.DEFAULT_WIDTH, Art.DEFAULT_HEIGHT = 40, 25 + +Camera.start_x, Camera.start_y = 20, -12 +Camera.start_zoom = 15 + +# amount of camera zoom each mouse wheel event produces +#InputLord.wheel_zoom_amount = 3.0 +# same but for keyboard zooming (shift-X/Z) +#InputLord.keyboard_zoom_amount = 1.0 + +#CharacterSetSwatch.char_scale = 3 + +#UIRenderable.grain_strength = 0 + +# CRT shader starts on +#Framebuffer.start_crt_enabled = True + +# disable CRT shader entirely +# use this if playscii starts up really slowly on your video card +#Framebuffer.disable_crt = True + +# hold space to show/hide main popup rather than pressing space +#UI.popup_hold_to_show = True + +#Application.show_dev_log = True + +# log shader compilation progress to console - enable if something is +# failing or going slow +#Shader.log_compile = True diff --git a/playscii.py b/playscii.py new file mode 100755 index 0000000..b7b7c37 --- /dev/null +++ b/playscii.py @@ -0,0 +1,1228 @@ +#!/usr/bin/env python3 +# coding=utf-8 + +from __future__ import print_function +import sys, os.path + +if sys.version_info.major < 3: + print('Python 3 is required to run Playscii.', file=sys.stderr) + sys.exit(1) + +import platform +if platform.system() == 'Windows' or platform.system() == 'Darwin': + import os + # set env variable so pysdl2 can find sdl2.dll + os.environ['PYSDL2_DLL_PATH'] = '.' + sys.path += ['.'] + +# fix the working directory when running in a mac app +if platform.system() == 'Darwin' and hasattr(sys, 'frozen'): + os.chdir(os.path.abspath(os.path.dirname(sys.executable))) + +# app imports +import ctypes, time, hashlib, importlib, traceback +import webbrowser +import sdl2 +import sdl2.ext +import appdirs +import PIL, OpenGL, numpy # just for version checks +# DEBUG: GL context checking, must be set before other imports and calls +#OpenGL.CONTEXT_CHECKING = True +from sdl2 import video, sdlmixer +from OpenGL import GL +from PIL import Image +from packaging import version +# work around a name being deprecated in different versions of PIL +if version.parse(Image.__version__) > version.parse('10.0.0'): + Image.ANTIALIAS = Image.LANCZOS +# cache whether pdoc is available for help menu item +pdoc_available = False +try: + import pdoc + pdoc_available = True +except: pass + +# submodules - set here so cfg file can modify them all easily +from audio import AudioLord +from shader import ShaderLord +from camera import Camera +from charset import CharacterSet, CharacterSetLord, CHARSET_DIR +from palette import Palette, PaletteLord, PALETTE_DIR +from art import Art, ArtFromDisk, DEFAULT_CHARSET, DEFAULT_PALETTE, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_ART_FILENAME +from art_import import ArtImporter +from art_export import ArtExporter +from renderable import TileRenderable, OnionTileRenderable +from renderable_line import DebugLineRenderable +from renderable_sprite import UIBGTextureRenderable, SpriteRenderable +from framebuffer import Framebuffer +from art import ART_DIR, ART_FILE_EXTENSION, ART_SCRIPT_DIR +from ui import UI, OIS_WIDTH +from cursor import Cursor +from grid import ArtGrid +from input_handler import InputLord +from ui_file_chooser_dialog import THUMBNAIL_CACHE_DIR +# some classes are imported only so the cfg file can modify their defaults +from renderable_line import LineRenderable +from ui_swatch import CharacterSetSwatch +from ui_element import UIRenderable, FPSCounterUI, DebugTextUI +from ui_menu_pulldown import PulldownMenu +from ui_dialog import UIDialog +from ui_chooser_dialog import ScrollArrowButton, ChooserDialog +from image_convert import ImageConverter +from game_world import GameWorld, TOP_GAME_DIR +from game_object import GameObject +from shader import Shader + +APP_NAME = 'Playscii' +VERSION_FILENAME = 'version' + +CONFIG_FILENAME = 'playscii.cfg' +CONFIG_TEMPLATE_FILENAME = CONFIG_FILENAME + '.default' +LOG_FILENAME = 'console.log' +SESSION_FILENAME = 'playscii.session' +LOGO_FILENAME = 'ui/logo.png' +SCREENSHOT_DIR = 'screenshots/' +FORMATS_DIR = 'formats/' +AUTOPLAY_GAME_FILENAME = 'autoplay_this_game' + +WEBSITE_URL = 'https://jplebreton.com/playscii' +WEBSITE_HELP_URL = 'docs/html/howto_main.html' +AUTOGEN_DOCS_PATH = 'docs/html/generated/' +AUTOGEN_DOC_MODULES = ['game_object', 'game_world', 'game_room', 'collision', + 'game_util_objects', 'art', 'renderable', 'vector', + 'art_import', 'art_export'] +AUTOGEN_DOC_TOC_PAGE = 'pdoc_toc.html' + +MAX_ONION_FRAMES = 3 + +class Application: + # default window dimensions, may be updated during screen res detection + window_width, window_height = 1280, 720 + # if window gets extremely small it causes problems, enforce a minumum size + # (UI becomes hard to use below 640 x 480, but allow it in case user is + # doing something weird or reshuffling their desktop) + min_window_width, min_window_height = 320, 240 + # if True, use the older method of creating a test window to determine + # desktop resolution - used to be needed on Linux, but maybe no longer. + create_test_window = False + fullscreen = False + # framerate: uncapped if -1 + framerate = 30 + # fixed timestep for game physics + update_rate = 30 + # force to run even if we can't get an OpenGL 2.1 context + run_if_opengl_incompatible = False + # arbitrary size cap, but something bigger = probably a bad idea + max_art_width, max_art_height = 9999, 9999 + # use capslock as another ctrl key - SDL2 doesn't seem to respect OS setting + capslock_is_ctrl = False + bg_color = [0.2, 0.2, 0.2, 2] + default_overlay_image_opacity = 0.25 + show_bg_texture = True + # if True, ignore camera loc saved in .psci files + override_saved_camera = False + # launch into art mode even if a game dir is specified via CLI + always_launch_art_mode = False + # show dev-only log messages + show_dev_log = False + # in art mode, show layers marked invisible to game mode + show_hidden_layers = False + welcome_message = 'Welcome to Playscii! Press SPACE to select characters and colors to paint.' + compat_fail_message = "your hardware doesn't appear to meet Playscii's requirements! Sorry ;________;" + game_mode_message = 'Game Mode active, press %s to return to Art Mode.' + img_convert_message = 'converting bitmap image: %s' + # can_edit: if False, user can't use art or edit functionality + can_edit = True + # these values should be written to cfg files on exit + # key = module path, value = [member object (blank if self), var name] + persistent_setting_names = { + 'UI.popup_hold_to_show': ['ui', 'popup_hold_to_show'], + 'Framebuffer.start_crt_enabled': ['fb', 'crt'], + 'Application.show_bg_texture': ['', 'show_bg_texture'], + 'ArtGrid.visible': ['art_grid', 'visible'] + } + # characters that can't appear in filenames (any OS; Windows is least permissive) + forbidden_filename_chars = ['/', '\\', '*', ':'] + + def __init__(self, config_dir, documents_dir, cache_dir, logger, + art_filename, game_dir_to_load, state_to_load, autoplay_game): + self.init_success = False + self.config_dir = config_dir + # keep playscii.cfg lines in case we want to add some + self.config_lines = open(self.config_dir + CONFIG_FILENAME).readlines() + self.documents_dir = documents_dir + self.cache_dir = cache_dir + # last dir art was opened from + self.last_art_dir = None + # last dir file was imported from + self.last_import_dir = None + # class to use for temp thumbnail renderable + self.thumbnail_renderable_class = TileRenderable + # logger fed in from __main__ + self.logger = logger + self.last_time = 0 + self.this_frame_start, self.last_frame_end = 0, 0 + # number of updates (world, etc) and rendered frames this session + self.updates, self.frames = 0, 0 + self.timestep = (1 / self.update_rate) * 1000 + # for FPS counter + self.frame_time, self.fps = 0, 0 + self.should_quit = False + self.mouse_x, self.mouse_y = 0, 0 + self.mouse_dx, self.mouse_dy = 0, 0 + self.has_input_focus = self.has_mouse_focus = False + self.inactive_layer_visibility = 1 + self.version = get_version() + # last edit came from keyboard or mouse, used by cursor control logic + self.keyboard_editing = False + # set ui None so other objects can check it None, eg load_art check + # for its active art on later runs (audiolord too) + self.ui, self.al = None, None + # on linux, prefer wayland, via SDL 2.0.22's SDL_HINT_VIDEODRIVER + # http://wiki.libsdl.org/SDL_SetHint + if platform.system() == 'Linux': + # but if we're running x11, wayland won't be available + # and we'll get an SDLError - so handle the exception. + # seems like we should be able to ask for, eg + # sdl2.SDL_SetHint(sdl2.SDL_HINT_VIDEODRIVER, b'wayland, x11'), + # though. TODO research this further, see how other progs do it. + try: + sdl2.SDL_SetHint(sdl2.SDL_HINT_VIDEODRIVER, b'wayland') + sdl2.ext.init() + except: + try: + sdl2.SDL_SetHint(sdl2.SDL_HINT_VIDEODRIVER, b'x11') + sdl2.ext.init() + except: + sdl2.ext.init() + winpos = sdl2.SDL_WINDOWPOS_UNDEFINED + screen_width, screen_height = self.get_desktop_resolution() + # make sure main window won't be too big for screen + max_width = int(screen_width * 0.8) + max_height = int(screen_height * 0.8) + self.window_width = min(self.window_width, max_width) + self.window_height = min(self.window_height, max_height) + # TODO: SDL_WINDOW_ALLOW_HIGHDPI doesn't seem to work right, + # determine whether we're using it wrong or it's broken + flags = sdl2.SDL_WINDOW_OPENGL | sdl2.SDL_WINDOW_RESIZABLE# | sdl2.SDL_WINDOW_ALLOW_HIGHDPI + if self.fullscreen: + flags = flags | sdl2.SDL_WINDOW_FULLSCREEN_DESKTOP + self.window = sdl2.SDL_CreateWindow(bytes(APP_NAME, 'utf-8'), + winpos, winpos, + self.window_width, self.window_height, + flags) + sdl2.SDL_SetWindowMinimumSize(self.window, self.min_window_width, + self.min_window_height) + # force GL2.1 'core' before creating context + video.SDL_GL_SetAttribute(video.SDL_GL_CONTEXT_MAJOR_VERSION, 2) + video.SDL_GL_SetAttribute(video.SDL_GL_CONTEXT_MINOR_VERSION, 1) + video.SDL_GL_SetAttribute(video.SDL_GL_CONTEXT_PROFILE_MASK, + video.SDL_GL_CONTEXT_PROFILE_CORE) + self.context = sdl2.SDL_GL_CreateContext(self.window) + # if creating a core profile context fails, try GL ES 2.0 + if not self.context: + video.SDL_GL_SetAttribute(video.SDL_GL_CONTEXT_MAJOR_VERSION, 2) + video.SDL_GL_SetAttribute(video.SDL_GL_CONTEXT_MINOR_VERSION, 0) + video.SDL_GL_SetAttribute(video.SDL_GL_CONTEXT_PROFILE_MASK, + video.SDL_GL_CONTEXT_PROFILE_ES) + self.context = sdl2.SDL_GL_CreateContext(self.window) + # save ES status for later use by eg Shaders + self.context_es = True + else: + self.context_es = False + self.log('Detecting hardware...') + cpu = platform.processor() or platform.machine() + self.log(' CPU: %s' % (cpu if cpu != '' else "[couldn't detect CPU]")) + # report GL vendor, version, GLSL version etc + try: gpu_vendor = GL.glGetString(GL.GL_VENDOR).decode('utf-8') + except: gpu_vendor = "[couldn't detect vendor]" + try: gpu_renderer = GL.glGetString(GL.GL_RENDERER).decode('utf-8') + except: gpu_renderer = "[couldn't detect renderer]" + self.log(' GPU: %s - %s' % (gpu_vendor, gpu_renderer)) + try: + # try single-argument GL2.0 version first + gl_ver = GL.glGetString(GL.GL_VERSION) + if not gl_ver: + gl_ver = GL.glGetString(GL.GL_VERSION, ctypes.c_int(0)) + gl_ver = gl_ver.decode('utf-8') + except: + gl_ver = "[couldn't detect GL version]" + self.log(' OpenGL detected: %s' % gl_ver) + # GL 1.1 doesn't even habla shaders, quit if we fail GLSL version check + try: + glsl_ver = GL.glGetString(GL.GL_SHADING_LANGUAGE_VERSION) + if not glsl_ver: + glsl_ver = GL.glGetString(GL.GL_SHADING_LANGUAGE_VERSION, ctypes.c_int(0)) + except: + self.log('GLSL support not detected, ' + self.compat_fail_message) + self.should_quit = True + return + glsl_ver = glsl_ver.decode('utf-8') if glsl_ver != None else None + self.log(' GLSL detected: %s' % glsl_ver or '[unknown]') + # verify that we got at least a 2.1 context + majorv, minorv = ctypes.c_int(0), ctypes.c_int(0) + video.SDL_GL_GetAttribute(video.SDL_GL_CONTEXT_MAJOR_VERSION, majorv) + video.SDL_GL_GetAttribute(video.SDL_GL_CONTEXT_MINOR_VERSION, minorv) + context_version = majorv.value + (minorv.value * 0.1) + self.use_vao = bool(GL.glGenVertexArrays) + self.log(' Vertex Array Object support %sfound.' % ['NOT ', ''][self.use_vao]) + if not self.context: + self.log("No OpenGL context found!") + # enforce GL version requirement + if not self.context or context_version < 2.1 or gl_ver.startswith('2.0'): + self.log("Couldn't create a compatible OpenGL context, " + self.compat_fail_message) + if not self.run_if_opengl_incompatible: + self.should_quit = True + return + # enforce GLSL version requirement + try: + gv = float(glsl_ver.split()[0]) + if bool(glsl_ver) and gv <= 1.2: + self.log("GLSL 1.30 or higher is required, " + self.compat_fail_message) + if not self.run_if_opengl_incompatible: + self.should_quit = True + return + except: + # can't get a firm number out of reported GLSL version string :/ + pass + # detect max texture size + mts = ctypes.c_int(0) + GL.glGetIntegerv(GL.GL_MAX_TEXTURE_SIZE, mts) + self.max_texture_size = mts.value + self.log(' Maximum supported texture size: %s x %s' % (self.max_texture_size, self.max_texture_size)) + self.log(' Detected screen resolution: %.0f x %.0f, window: %s x %s' % (screen_width, screen_height, self.window_width, self.window_height)) + self.log('Detecting software environment...') + self.log(' OS: %s' % platform.platform()) + py_version = ' '.join(sys.version.split('\n')) + # report 32 vs 64 bit as it's not clear from sys.version or OS + bitness = platform.architecture()[0] + # on linux, report whether we're running x11 or wayland + if platform.system() == 'Linux': + driver = sdl2.SDL_GetCurrentVideoDriver().decode('utf-8') + self.log(' Linux SDL2 "video driver": %s' % driver) + self.log(' Python: %s (%s)' % (py_version, bitness)) + module_versions = 'PySDL2 %s, ' % sdl2.__version__ + module_versions += 'numpy %s, ' % numpy.__version__ + module_versions += 'PyOpenGL %s, ' % OpenGL.__version__ + module_versions += 'appdirs %s, ' % appdirs.__version__ + module_versions += 'PIL %s' % PIL.__version__ + self.log(' Modules: %s' % module_versions) + sdl_version = '%s.%s.%s ' % (sdl2.version.SDL_MAJOR_VERSION, + sdl2.version.SDL_MINOR_VERSION, + sdl2.version.SDL_PATCHLEVEL) + sdl_version += sdl2.version.SDL_GetRevision().decode('utf-8') + sdl_version += ', SDLmixer: %s.%s.%s' % (sdlmixer.SDL_MIXER_MAJOR_VERSION, + sdlmixer.SDL_MIXER_MINOR_VERSION, + sdlmixer.SDL_MIXER_PATCHLEVEL) + self.log(' SDL: %s' % sdl_version) + # draw black screen while doing other init + GL.glClearColor(0.0, 0.0, 0.0, 1.0) + GL.glClear(GL.GL_COLOR_BUFFER_BIT) + # initialize audio + self.al = AudioLord(self) + self.set_icon() + # SHADERLORD rules shader init/destroy, hot reload + self.sl = ShaderLord(self) + # separate cameras for edit vs game mode + self.art_camera = Camera(self) + self.camera = self.art_camera + self.art_loaded_for_edit, self.edit_renderables = [], [] + # raster image overlay + self.overlay_renderable = None + self.draw_overlay = False + self.overlay_scale_type = OIS_WIDTH + self.converter = None + # set when an import is in progress + self.importer = None + # set when an exporter is chosen, remains so last_export can run + self.exporter = None + self.last_export_options = {} + # dict of available importer/exporter modules + self.converter_modules = {} + # last art script run (remember for "run last") + self.last_art_script = None + self.game_mode = False + self.gw = GameWorld(self) + # if game dir specified, set it before we try to load any art + if game_dir_to_load or autoplay_game: + self.gw.set_game_dir(game_dir_to_load or autoplay_game, False) + # autoplay = distribution mode, no editing + if autoplay_game and not game_dir_to_load and self.gw.game_dir: + self.can_edit = False + # debug line renderable + self.debug_line_renderable = DebugLineRenderable(self, None) + # onion skin renderables + self.onion_frames_visible = False + self.onion_show_frames = MAX_ONION_FRAMES + # store constant so input_handler etc can read it + self.max_onion_frames = MAX_ONION_FRAMES + self.onion_show_frames_behind = self.onion_show_frames_ahead = True + self.onion_renderables_prev, self.onion_renderables_next = [], [] + # lists of currently loaded character sets and palettes + self.charsets, self.palettes = [], [] + self.csl = CharacterSetLord(self) + self.pl = PaletteLord(self) + # set/create an active art + self.load_art_for_edit(art_filename) + self.fb = Framebuffer(self) + # setting cursor None now makes for easier check in status bar drawing + self.cursor, self.grid = None, None + # separate grids for art vs game mode + self.art_grid = None + # forward-declare inputlord in case UI looks for it + self.il = None + # initialize UI with first art loaded active + self.ui = UI(self, self.art_loaded_for_edit[0]) + # textured background renderable + self.bg_texture = UIBGTextureRenderable(self) + # init onion skin + for i in range(self.onion_show_frames): + renderable = OnionTileRenderable(self, self.ui.active_art) + self.onion_renderables_prev.append(renderable) + for i in range(self.onion_show_frames): + renderable = OnionTileRenderable(self, self.ui.active_art) + self.onion_renderables_next.append(renderable) + # set camera bounds based on art size + self.camera.set_for_art(self.ui.active_art) + self.update_window_title() + self.cursor = Cursor(self) + self.art_grid = ArtGrid(self, self.ui.active_art) + self.grid = self.art_grid + self.ui.set_active_layer(self.ui.active_art.active_layer) + # INPUTLORD rules input handling and keybinds + self.il = InputLord(self) + # update UI (hovered elements) and cursor now that we have input + self.ui.update() + self.cursor.pre_first_update() + self.pdoc_available = pdoc_available + self.init_success = True + self.log('Init done.') + if self.can_edit: + self.restore_session() + # if art file was given in arguments, set it active + if art_filename: + self.ui.set_active_art_by_filename(art_filename) + if (game_dir_to_load or autoplay_game) and self.gw.game_dir: + # set initial game state + if state_to_load: + self.gw.load_game_state(state_to_load) + else: + self.gw.load_game_state() + else: + #self.ui.message_line.post_line(self.welcome_message, 10) + pass + # if "autoplay_this_game" used and game is valid, lock out edit mode + if not self.can_edit: + self.enter_game_mode() + self.ui.set_game_edit_ui_visibility(False, False) + self.gw.draw_debug_objects = False + elif self.gw.game_dir and self.always_launch_art_mode: + self.exit_game_mode() + + def get_desktop_resolution(self): + winpos = sdl2.SDL_WINDOWPOS_UNDEFINED + # use the more direct way of getting desktop resolution + if not self.create_test_window: + desktop = sdl2.video.SDL_DisplayMode() + sdl2.SDL_GetDesktopDisplayMode(0, desktop) + return desktop.w, desktop.h + # this method seems to have broken recently (2022-06) on our Linux + + # Nvidia + X11 + SDL2.20 setup; default it off but keep it around... + test_window = sdl2.SDL_CreateWindow(bytes(APP_NAME, 'utf-8'), + winpos, winpos, + 128, 128, + sdl2.SDL_WINDOW_FULLSCREEN_DESKTOP) + sdl2.SDL_HideWindow(test_window) + screen_width, screen_height = ctypes.c_int(0), ctypes.c_int(0) + sdl2.SDL_GetWindowSize(test_window, ctypes.pointer(screen_width), + ctypes.pointer(screen_height)) + screen_width = screen_width.value + screen_height = screen_height.value + sdl2.SDL_DestroyWindow(test_window) + return screen_width, screen_height + + def is_mouse_inside_window(self): + "returns True if mouse is inside application window" + wx, wy = ctypes.c_int(0), ctypes.c_int(0) + sdl2.SDL_GetWindowPosition(self.window, wx, wy) + wx, wy = int(wx.value), int(wy.value) + mx, my = ctypes.c_int(0), ctypes.c_int(0) + # "global" mouse state = whole-desktop mouse coordinates + sdl2.mouse.SDL_GetGlobalMouseState(mx, my) + mx, my = int(mx.value), int(my.value) + return wx <= mx <= wx + self.window_width and \ + wy <= my <= wy + self.window_height + + def set_icon(self): + # TODO: this doesn't seem to work in Ubuntu, what am i missing? + img = Image.open(LOGO_FILENAME).convert('RGBA') + # does icon need to be a specific size? + img = img.resize((32, 32), Image.Resampling.LANCZOS) + w, h = img.size + depth, pitch = 32, w * 4 + #SDL_CreateRGBSurfaceFrom((pixels, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask) + #mask = (0x0f00, 0x00f0, 0x000f, 0xf000) + mask = (0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000) + icon_surf = sdl2.SDL_CreateRGBSurfaceFrom(img.tobytes(), w, h, depth, pitch, *mask) + # SDL_SetWindowIcon(self.window, SDL_Surface* icon) + sdl2.SDL_SetWindowIcon(self.window, icon_surf) + sdl2.SDL_FreeSurface(icon_surf) + + def log(self, new_line, error=False): + "write to log file, stdout, and in-app console log" + self.logger.log(new_line) + if self.ui and self.can_edit: + self.ui.message_line.post_line(new_line, hold_time=None, error=error) + + def dev_log(self, new_line): + if self.show_dev_log: + self.log(new_line) + + def log_import_exception(self, e, module_name): + """ + Logs a readable version of stack trace of given exception encountered + importing given module name. + """ + for line in traceback.format_exc().split('\n'): + # ignore the importlib parts of the call stack, + # not useful and always the same + if line and not 'importlib' in line and \ + not 'in _import_all' in line and \ + not '_bootstrap._gcd_import' in line: + self.log(line.rstrip()) + s = 'Error importing module %s! See console.' % module_name + if self.ui: + self.ui.message_line.post_line(s, 10, True) + + def new_art(self, filename, width=None, height=None, + charset=None, palette=None): + width, height = width or DEFAULT_WIDTH, height or DEFAULT_HEIGHT + filename = filename if filename and filename != '' else DEFAULT_ART_FILENAME + charset = self.load_charset(charset or DEFAULT_CHARSET) + palette = self.load_palette(palette or DEFAULT_PALETTE) + art = Art(filename, self, charset, palette, width, height) + art.set_filename(filename) + art.time_loaded = time.time() + return art + + def load_art(self, filename, autocreate=True): + """ + load given file from disk; by default autocreate new file if it + couldn't be found + """ + valid_filename = self.find_filename_path(filename, ART_DIR, + ART_FILE_EXTENSION) + art = None + if not valid_filename: + if autocreate: + self.log('Creating new art %s' % filename) + return self.new_art(filename) + else: + #self.log("Couldn't find art %s" % filename) + return None + # if already loaded, return that + for a in self.art_loaded_for_edit + self.gw.art_loaded: + if a.filename == valid_filename: + return a + art = ArtFromDisk(valid_filename, self) + # if loading failed, create new file + if not art or not art.valid: + return self.new_art(valid_filename) + # remember time loaded for UI list sorting + art.time_loaded = time.time() + return art + + def new_art_for_edit(self, filename, width=None, height=None): + "Create a new Art and set it editable in Art Mode." + art = self.new_art(filename, width, height) + self.set_new_art_for_edit(art) + + def set_new_art_for_edit(self, art): + "Makes given Art editable in Art Mode UI." + self.art_loaded_for_edit.insert(0, art) + renderable = TileRenderable(self, art) + self.edit_renderables.insert(0, renderable) + self.ui.set_active_art(art) + self.camera.toggle_zoom_extents() + art.set_unsaved_changes(True) + + def load_art_for_edit(self, filename): + art = self.load_art(filename) + if art in self.art_loaded_for_edit: + self.ui.set_active_art(art) + #self.ui.message_line.post_line('Art file %s already loaded' % filename) + return + self.art_loaded_for_edit.insert(0, art) + renderable = TileRenderable(self, art) + self.edit_renderables.insert(0, renderable) + if self.ui: + self.ui.set_active_art(art) + + def close_art(self, art): + if not art in self.art_loaded_for_edit: + return + self.art_loaded_for_edit.remove(art) + for r in art.renderables: + if r in self.edit_renderables: + self.edit_renderables.remove(r) + if art is self.ui.active_art: + self.ui.active_art = None + self.log('Unloaded %s' % art.filename) + if len(self.art_loaded_for_edit) > 0: + self.ui.set_active_art(self.art_loaded_for_edit[0]) + self.update_window_title() + + def revert_active_art(self): + filename = self.ui.active_art.filename + self.close_art(self.ui.active_art) + self.load_art_for_edit(filename) + + def get_file_hash(self, filename): + f_data = open(filename, 'rb').read() + return hashlib.md5(f_data).hexdigest() + + def get_dirnames(self, subdir=None, include_base=True): + "returns list of suitable directory names across app and user dirs" + dirnames = [] + # build list of dirs to check, by priority: + # gamedir/subdir if it exists, then ./subdir, then ./ + if self.gw.game_dir is not None: + game_dir = self.gw.game_dir + if subdir: + game_dir += subdir + if os.path.exists(game_dir): + dirnames.append(game_dir) + if subdir is not None: + dirnames.append(subdir) + if include_base: + dirnames.append('') + # add duplicate set of dirs in user documents path + doc_dirs = [] + for dirname in dirnames: + # dir might already have documents path in it, add as-is if so + if dirname.startswith(self.documents_dir) and os.path.exists(dirname): + doc_dirs.append(dirname) + continue + doc_dir = self.documents_dir + dirname + if os.path.exists(doc_dir): + doc_dirs.append(doc_dir) + # check in user document dirs first + return doc_dirs + dirnames + + def find_filename_path(self, filename, subdir=None, extensions=None): + "returns a valid path for given file, extension, subdir (art/ etc)" + if not filename or filename == '': + return None + dirnames = self.get_dirnames(subdir) + # build list of filenames from each dir, first w/ extension then w/o + filenames = [] + # extensions: accept list or single item, + # list with one empty string if None passed + if extensions is None or len(extensions) == 0: + extensions = [''] + elif not type(extensions) is list: + extensions = [extensions] + for dirname in dirnames: + for ext in extensions: + f = '%s%s' % (dirname, filename) + # filename passed in might already have intended extension, + # eg from a directory listing + if ext and ext != '' and not filename.endswith(ext): + f += '.' + ext + filenames.append(f) + # return first one we find + for f in filenames: + if f is not None and os.path.exists(f) and os.path.isfile(f): + return f + return None + + def get_converter_classes(self, base_class): + "return a list of converter classes for importer/exporter selection" + classes = [] + # on first load, documents dir may not be in import path + if not self.documents_dir in sys.path: + sys.path += [self.documents_dir] + # read from application (builtins) and user documents dirs + files = os.listdir(FORMATS_DIR) + files += os.listdir(self.documents_dir + FORMATS_DIR) + for filename in files: + basename, ext = os.path.splitext(filename) + if not ext.lower() == '.py': + continue + try: + if basename in self.converter_modules: + m = importlib.reload(self.converter_modules[basename]) + else: + m = importlib.import_module('formats.%s' % basename) + self.converter_modules[basename] = m + except Exception as e: + self.log_import_exception(e, basename) + for k,v in m.__dict__.items(): + if not type(v) is type: + continue + # don't add duplicates + # (can happen if eg one importer extends another) + if v in classes: + continue + if issubclass(v, base_class) and v is not base_class: + classes.append(v) + return classes + + def get_importers(self): + "Returns list of all ArtImporter subclasses found in formats/ dir." + return self.get_converter_classes(ArtImporter) + + def get_exporters(self): + "Returns list of all ArtExporter subclasses found in formats/ dir." + return self.get_converter_classes(ArtExporter) + + def load_charset(self, charset_to_load, log=False): + "creates and returns a character set with the given name" + # already loaded? + base_charset_to_load = os.path.basename(charset_to_load) + base_charset_to_load = os.path.splitext(base_charset_to_load)[0] + for charset in self.charsets: + if charset.base_filename == base_charset_to_load: + return charset + new_charset = CharacterSet(self, charset_to_load, log) + if new_charset.init_success: + self.charsets.append(new_charset) + return new_charset + elif self.ui and self.ui.active_art: + # if init failed (eg bad filename) return something safe + return self.ui.active_art.charset + + def load_palette(self, palette_to_load, log=False): + base_palette_to_load = os.path.basename(palette_to_load) + base_palette_to_load = os.path.splitext(base_palette_to_load)[0] + for palette in self.palettes: + if palette.base_filename == base_palette_to_load: + return palette + new_palette = Palette(self, palette_to_load, log) + if new_palette.init_success: + self.palettes.append(new_palette) + return new_palette + elif self.ui and self.ui.active_art: + # if init failed (eg bad filename) return something safe + return self.ui.active_art.palette + + def set_window_title(self, text=None): + # if editing is locked, don't even show Playscii name + new_title = '%s - %s' % (APP_NAME, text) if self.can_edit else str(text) + new_title = bytes(new_title, 'utf-8') + sdl2.SDL_SetWindowTitle(self.window, new_title) + + def update_window_title(self): + if self.game_mode: + if self.gw and self.gw.game_dir: + # if edit UI is up, show last loaded state + if self.ui.game_menu_bar.visible: + title = self.gw.last_state_loaded + # if not, show user-friendly game name + else: + title = self.gw.game_title + else: + title = 'Game Mode' + self.set_window_title(title) + return + if not self.ui or not self.ui.active_art: + self.set_window_title() + return + # show message if converting + if self.converter: + title = self.img_convert_message % self.converter.image_filename + self.set_window_title(title) + return + # display current active document's name and info + filename = self.ui.active_art.filename + if filename and os.path.exists(filename): + full_filename = os.path.abspath(filename) + else: + full_filename = filename + if self.ui.active_art.unsaved_changes: + full_filename += '*' + self.set_window_title(full_filename) + + def resize_window(self, new_width, new_height): + GL.glViewport(0, 0, new_width, new_height) + self.window_width, self.window_height = new_width, new_height + # tell FB, camera, and UI that view aspect has changed + self.fb.resize(new_width, new_height) + self.camera.window_resized() + self.ui.window_resized() + + def toggle_fullscreen(self): + self.fullscreen = not self.fullscreen + flags = 0 + if self.fullscreen: + flags = sdl2.SDL_WINDOW_FULLSCREEN_DESKTOP + sdl2.SDL_SetWindowFullscreen(self.window, flags) + # for all intents and purposes, this is like resizing the window + self.resize_window(self.window_width, self.window_height) + + def screenshot(self): + "saves a date + time-stamped screenshot" + timestamp = time.strftime('%Y-%m-%d_%H-%M-%S') + output_filename = 'playscii_%s.png' % timestamp + w, h = self.window_width, self.window_height + pixels = GL.glReadPixels(0, 0, w, h, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, + outputType=None) + pixel_bytes = pixels.flatten().tobytes() + img = Image.frombytes(mode='RGBA', size=(w, h), data=pixel_bytes) + img = img.transpose(Image.FLIP_TOP_BOTTOM) + img.save('%s%s' % (self.documents_dir + SCREENSHOT_DIR, output_filename)) + self.log('Saved screenshot %s' % output_filename) + + def enter_game_mode(self): + self.game_mode = True + self.camera = self.gw.camera + self.grid = self.gw.grid + # cursor might be hovering an object's art, undo preview viz + self.cursor.undo_preview_edits() + # display message on how to toggle game mode + mode_bind = self.il.get_command_shortcut('toggle_game_mode') + mode_bind = mode_bind.title() + if self.can_edit: + self.ui.message_line.post_line(self.game_mode_message % mode_bind, 10) + self.al.resume_music() + self.ui.menu_bar.close_active_menu() + self.ui.menu_bar = self.ui.game_menu_bar + + def exit_game_mode(self): + self.game_mode = False + self.camera = self.art_camera + self.grid = self.art_grid + if self.ui.active_art: + self.camera.set_for_art(self.ui.active_art) + self.ui.message_line.post_line('', 1) + self.update_window_title() + self.al.pause_music() + self.ui.menu_bar.close_active_menu() + self.ui.menu_bar = self.ui.art_menu_bar + + def get_elapsed_time(self): + return sdl2.timer.SDL_GetTicks() + + def main_loop(self): + self.last_time = self.get_elapsed_time() + while not self.should_quit: + self.this_frame_start = self.get_elapsed_time() + self.update() + self.render() + self.last_frame_end = self.get_elapsed_time() + self.frames += 1 + self.sl.check_hot_reload() + self.csl.check_hot_reload() + self.pl.check_hot_reload() + # determine FPS + # alpha: lower = smoother + alpha = 0.05 + dt = self.get_elapsed_time() - self.this_frame_start + self.frame_time = alpha * dt + (1 - alpha) * self.frame_time + self.fps = 1000 / self.frame_time + # delay to maintain framerate, if uncapped + if self.framerate != -1: + delay = 1000 / self.framerate + # subtract work time from delay to maintain framerate + delay -= min(delay, dt) + #print('frame time %s, delaying %sms to hit %s' % (self.frame_time, delay, self.framerate)) + sdl2.timer.SDL_Delay(int(delay)) + return 1 + + def update(self): + # update whether app has mouse + input (keybaord) focus + flags = ctypes.c_uint(0) + flags = sdl2.SDL_GetWindowFlags(self.window) + self.has_input_focus = flags & sdl2.SDL_WINDOW_INPUT_FOCUS + self.has_mouse_focus = flags & sdl2.SDL_WINDOW_MOUSE_FOCUS + # start-of-frame stuff + if self.game_mode: + self.gw.frame_begin() + else: + # set all arts to "not updated" + for art in self.art_loaded_for_edit: + art.updated_this_tick = False + # handle input - once per frame + self.il.handle_input() + # update game world & anything else that should happen on fixed timestep + # avoid too many updates if eg machine straight up hangs + if self.get_elapsed_time() - self.last_time > 1000: + self.last_time = self.get_elapsed_time() + updates = (self.get_elapsed_time() - self.last_time) / self.timestep + for i in range(int(updates)): + if self.game_mode: + self.gw.pre_update() + self.gw.update() + self.gw.post_update() + self.last_time += self.timestep + self.updates += 1 + self.frame_update() + + def frame_update(self): + "updates that should happen once per frame" + if self.converter: + self.converter.update() + # game world has its own once-a-frame updates, eg art/renderables + if self.game_mode: + self.gw.frame_update() + else: + for art in self.art_loaded_for_edit: + art.update() + if self.ui.active_art and \ + not self.ui.console.visible and not self.game_mode and \ + not self.ui.menu_bar in self.ui.hovered_elements and \ + not self.ui.status_bar in self.ui.hovered_elements and \ + not self.ui.menu_bar.active_menu_name and not self.ui.active_dialog: + self.cursor.update() + self.camera.update() + if not self.game_mode: + self.grid.update() + self.cursor.end_update() + if self.ui.visible: + self.ui.update() + self.al.update() + + def debug_onion_frames(self): + "debug function to log onion renderable state" + # TODO: remove this once it's served its purpose + debug = ['current frame: %s' % self.ui.active_art.active_frame, ''] + debug.append('onion_renderables_prev:') + def get_onion_info(i, r): + visible = 'VISIBLE' if r.visible else '' + return '%s: %s frame %s %s' % (i, r.art.filename.ljust(20), r.frame, visible) + for i,r in enumerate(self.onion_renderables_prev): + debug.append(get_onion_info(i, r)) + debug.append('') + debug.append('onion_renderables_next:') + for i,r in enumerate(self.onion_renderables_next): + debug.append(get_onion_info(i, r)) + self.ui.debug_text.post_lines(debug) + + def set_overlay_image(self, image_filename): + "sets given image to draw over the active art" + try: + img = Image.open(image_filename).convert('RGBA') + r = SpriteRenderable(self, image_filename, img) + r.alpha = self.default_overlay_image_opacity + except Exception as e: + for line in traceback.format_exc().split('\n')[3:]: + if line.strip(): + self.log(line.rstrip()) + return + self.log('Using %s as overlay image.' % image_filename) + self.overlay_renderable = r + self.ui.size_and_position_overlay_image() + self.draw_overlay = True + + def render(self): + # draw main scene to framebuffer + GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fb.framebuffer) + bg_color = self.gw.bg_color if self.game_mode else self.bg_color + GL.glClearColor(*bg_color) + GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) + if self.game_mode: + self.gw.render() + else: + for renderable in self.edit_renderables: + renderable.update() + if self.show_bg_texture: + self.bg_texture.render() + if self.converter: + self.converter.preview_sprite.render() + for r in self.edit_renderables: + r.render() + #self.debug_onion_frames() + if self.onion_frames_visible: + # draw "nearest" frames first + i = 0 + while i < self.onion_show_frames: + if self.onion_show_frames_behind: + self.onion_renderables_prev[i].render() + if self.onion_show_frames_ahead: + self.onion_renderables_next[i].render() + i += 1 + # draw selection grid, then selection, then cursor + if self.ui.active_art: + self.grid.render() + self.ui.select_tool.render_selections() + if self.ui.active_art and not self.ui.console.visible and \ + not self.ui.menu_bar in self.ui.hovered_elements and \ + not self.ui.status_bar in self.ui.hovered_elements and \ + not self.ui.popup in self.ui.hovered_elements and \ + not self.ui.menu_bar.active_menu_name and \ + not self.ui.active_dialog: + self.cursor.render() + self.debug_line_renderable.render() + if self.draw_overlay and not self.game_mode: + self.overlay_renderable.render() + # draw framebuffer to screen + GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0) + self.fb.render() + if self.ui.visible: + self.ui.render() + GL.glUseProgram(0) + sdl2.SDL_GL_SwapWindow(self.window) + + def save_persistent_setting(self, setting_name, setting_value): + # iterate over list backwards so we may safely remove from it + for line in reversed(self.config_lines): + if line.strip().startswith(setting_name): + # ignore lines that contain setting name but don't set it + if line.find('=') == -1: + continue + # setting already found, remove this redundant line + self.config_lines.remove(line) + # get current value from top-level scope and write it to end of cfg + self.config_lines += '%s = %s\n' % (setting_name, setting_value) + + def save_persistent_config(self): + "write options we want to persist across sessions to config file" + for name in self.persistent_setting_names: + # get current setting value from top-level scope + obj, member = self.persistent_setting_names[name] + obj = self if obj == '' else getattr(self, obj) + value = getattr(obj, member) + self.save_persistent_setting(name, value) + + def restore_session(self): + session_filename = self.config_dir + SESSION_FILENAME + if not os.path.exists(session_filename): + return + # more recent arts should open later + filenames = open(session_filename).readlines() + filenames.reverse() + for filename in filenames: + self.load_art_for_edit(filename.strip()) + + def save_session(self): + if not self.can_edit: + return + # write all currently open art to a file + session_file = open(self.config_dir + SESSION_FILENAME, 'w') + for art in self.art_loaded_for_edit: + # if an art has never been saved, don't bother storing it + if not os.path.exists(art.filename): + continue + session_file.write(art.filename + '\n') + session_file.close() + + def quit(self): + if self.init_success: + self.save_persistent_config() + self.save_session() + for r in self.edit_renderables: + r.destroy() + self.gw.destroy() + self.fb.destroy() + self.ui.destroy() + for charset in self.charsets: + charset.texture.destroy() + for palette in self.palettes: + palette.texture.destroy() + self.sl.destroy() + if self.al: + self.al.destroy() + sdl2.SDL_GL_DeleteContext(self.context) + sdl2.SDL_DestroyWindow(self.window) + sdl2.SDL_Quit() + # write to config file + cfg_file = open(self.config_dir + CONFIG_FILENAME, 'w') + cfg_file.writelines(self.config_lines) + cfg_file.close() + self.log('Thank you for using Playscii! <3') + + def edit_cfg(self): + cfg_path = self.config_dir + CONFIG_FILENAME + if platform.system() == 'Windows': + editor_bin = 'notepad' + elif platform.system() == 'Darwin': + editor_bin = 'open -a TextEdit' + else: + editor_bin = os.environ.get('EDITOR', None) + if not editor_bin: + return + cmd = '%s "%s"' % (editor_bin, cfg_path) + os.system(cmd) + # update resident cfg file lines, which will be saved out on exit + self.config_lines = open(cfg_path).readlines() + # execute newly edited cfg! (but only if changes were made?) + for line in self.config_lines: + exec(line) + + def open_local_url(self, url): + "opens given local (this file system) URL in a cross-platform way" + webbrowser.open('file://%s/%s' % (os.getcwd(), url)) + + def open_help_docs(self): + self.open_local_url(WEBSITE_HELP_URL) + + def open_website(self): + webbrowser.open(WEBSITE_URL) + + def generate_docs(self): + # fail gracefully if pdoc not found + try: + import pdoc + except: + self.log("pdoc module needed for documentation generation not found.") + return + for module_name in AUTOGEN_DOC_MODULES: + # pdoc.pdoc takes module name as string, returns HTML doc string + html = pdoc.pdoc(module_name) + docfile = open(AUTOGEN_DOCS_PATH + module_name + '.html', 'w') + docfile.write(html) + docfile.close() + self.log('Documentation generated successfully.') + # open ToC page + self.open_local_url(AUTOGEN_DOCS_PATH + AUTOGEN_DOC_TOC_PAGE) + + +def get_win_documents_path(): + # from http://stackoverflow.com/a/30924555/1191587 + # (winshell module too much of a pain to get working with py2exe) + import ctypes.wintypes + CSIDL_PERSONAL = 5 # My Documents + SHGFP_TYPE_CURRENT = 1 # Get current, not default value + buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) + ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) + return buf.value + +def get_paths(): + # pass False as second arg to disable "app author" windows dir convention + config_dir = appdirs.user_config_dir(APP_NAME, False) + '/' + cache_dir = appdirs.user_cache_dir(APP_NAME, False) + '/' + if not os.path.exists(config_dir): + os.mkdir(config_dir) + if not os.path.exists(cache_dir): + os.mkdir(cache_dir) + if not os.path.exists(cache_dir + THUMBNAIL_CACHE_DIR): + os.mkdir(cache_dir + THUMBNAIL_CACHE_DIR) + DOCUMENTS_SUBDIR = '/Documents' + if platform.system() == 'Windows': + documents_dir = get_win_documents_path() + # issue #18: win documents path may not exist?! + if not os.path.exists(documents_dir): + os.mkdir(documents_dir) + elif platform.system() == 'Darwin': + documents_dir = os.path.expanduser('~') + DOCUMENTS_SUBDIR + # assume anything that isn't Win/Mac is a UNIX + else: + # XDG spec doesn't cover any concept of a documents folder :[ + # if ~/Documents exists use that, else just use ~/Playscii + documents_dir = os.path.expanduser('~') + if os.path.exists(documents_dir + DOCUMENTS_SUBDIR): + documents_dir += DOCUMENTS_SUBDIR + # add Playscii/ to documents path + documents_dir += '/%s/' % APP_NAME + # create Playscii dir AND subdirs for user art, charsets etc if not present + for subdir in ['', ART_DIR, CHARSET_DIR, PALETTE_DIR, FORMATS_DIR, + ART_SCRIPT_DIR, SCREENSHOT_DIR, TOP_GAME_DIR]: + new_dir = os.path.abspath(documents_dir + subdir) + # os.path.exists can fail in Windows b/c case insensitivity, + # so just try and fail :[ + try: os.mkdir(new_dir) + except: pass + return config_dir, documents_dir, cache_dir + +def get_version(): + return open(VERSION_FILENAME).readlines()[0].strip() + + +class Logger: + """ + Minimal object for logging, starts very early so we can write to it even + before Application has initialized. + """ + def __init__(self, config_dir): + self.lines = [] + config_dir, docs_dir, cache_dir = get_paths() + # use line buffering (last lines should appear even in case of crash) + bufsize = 1 + self.log_file = open(config_dir + LOG_FILENAME, 'w', bufsize) + + def log(self, new_line): + self.log_file.write('%s\n' % new_line) + self.lines.append(str(new_line)) + print(new_line) + + def close(self): + self.log_file.close() + + +def get_app(): + "creates and returns the Application instance" + # get paths for config file, later to be passed into Application + config_dir, documents_dir, cache_dir = get_paths() + # start logger even before Application has initialized so we can write to it + # startup message: application and version # + logger = Logger(config_dir) + logger.log('%s v%s' % (APP_NAME, get_version())) + # see if "autoplay this game" file exists and has anything in it + autoplay_game = None + if os.path.exists(AUTOPLAY_GAME_FILENAME): + ap = open(AUTOPLAY_GAME_FILENAME).readlines() + if len(ap) > 0: + autoplay_game = ap[0].strip() + # load in config - may change above values and submodule class defaults + cfg_filename = config_dir + CONFIG_FILENAME + if os.path.exists(cfg_filename): + logger.log('Loading config from %s...' % cfg_filename) + # execute cfg line by line so we can continue past lines with errors. + # this does mean that commenting out blocks with triple-quotes fails, + # but that's not a good practice anyway. + cfg_lines = open(cfg_filename).readlines() + # compile a new cfg with any error lines stripped out + new_cfg_lines = [] + for i,cfg_line in enumerate(cfg_lines): + cfg_line = cfg_line.strip() + try: + exec(cfg_line) + new_cfg_lines.append(cfg_line + '\n') + except: + # find line with "Error", ie the exception name, log that + error_lines = traceback.format_exc().split('\n') + error = '[an unknown error]' + for el in error_lines: + if 'Error' in el: + error = el + break + logger.log(' Removing line %s with %s' % (i, error)) + new_cfg = open(cfg_filename, 'w') + new_cfg.writelines(new_cfg_lines) + new_cfg.close() + logger.log('Config loaded.') + # if cfg file doesn't exist, copy a new one from playscii.cfg.default + else: + # snip first "this is a template" line + default_data = open(CONFIG_TEMPLATE_FILENAME).readlines()[1:] + new_cfg = open(cfg_filename, 'w') + new_cfg.writelines(default_data) + new_cfg.close() + exec(''.join(default_data)) + logger.log('Created new config file %s' % cfg_filename) + art_to_load, game_dir_to_load, state_to_load = None, None, None + # usage: + # playscii.py [artfile] | [-game gamedir [-state statefile | artfile]] + if len(sys.argv) > 1: + # "-game test1" args will set test1/ as game dir + if len(sys.argv) > 2 and sys.argv[1] == '-game': + game_dir_to_load = sys.argv[2] + # "-state testX" args will load testX game state from given game dir + if len(sys.argv) > 4 and sys.argv[3] == '-state': + state_to_load = sys.argv[4] + elif len(sys.argv) > 3: + art_to_load = sys.argv[3] + else: + # else assume first arg is an art file to load in art mode + art_to_load = sys.argv[1] + app = Application(config_dir, documents_dir, cache_dir, logger, + art_to_load or DEFAULT_ART_FILENAME, game_dir_to_load, + state_to_load, autoplay_game) + return app + +if __name__ == "__main__": + app = get_app() + error = app.main_loop() + app.quit() + app.logger.close() + sys.exit(error) diff --git a/playscii_linux.sh b/playscii_linux.sh new file mode 100755 index 0000000..8f01b68 --- /dev/null +++ b/playscii_linux.sh @@ -0,0 +1,2 @@ +python3 playscii.py "$1" "$2" "$3" "$4" + diff --git a/playscii_linux.spec b/playscii_linux.spec new file mode 100644 index 0000000..e81ab3d --- /dev/null +++ b/playscii_linux.spec @@ -0,0 +1,48 @@ +# -*- mode: python -*- + +block_cipher = None + +include_files = [ + ('./README.md', '.'), + ('license.txt', '.'), + ('*.cfg.default', '.'), + ('version', '.'), + ('art', 'art'), + ('charsets', 'charsets'), + ('palettes', 'palettes'), + ('artscripts', 'artscripts'), + ('shaders', 'shaders'), + ('games', 'games'), + ('ui/*.png', 'ui'), + ('docs/html/*.*', 'docs/html'), + ('docs/html/generated/pdoc_toc.html', 'docs/html/generated'), +] + +a = Analysis(['playscii.py'], + pathex=['./'], + binaries=None, + datas=include_files, + hiddenimports=[], + hookspath=None, + runtime_hooks=None, + excludes=None, + win_no_prefer_redirects=None, + win_private_assemblies=None, + cipher=block_cipher) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + exclude_binaries=True, + name='playscii', + debug=False, + strip=None, + upx=True, + console=True ) +coll = COLLECT(exe, + a.binaries, + a.zipfiles, + a.datas, + strip=None, + upx=True, + name='playscii') diff --git a/playscii_mac.spec b/playscii_mac.spec new file mode 100644 index 0000000..409fa9a --- /dev/null +++ b/playscii_mac.spec @@ -0,0 +1,67 @@ +# -*- mode: python -*- + +block_cipher = None + +from site import getsitepackages + +include_files = [ + ('./README.md', '.'), + ('license.txt', '.'), + ('*.cfg.default', '.'), + ('version', '.'), + ('art', 'art'), + ('charsets', 'charsets'), + ('palettes', 'palettes'), + ('artscripts', 'artscripts'), + ('formats', 'formats'), + ('shaders', 'shaders'), + ('games', 'games'), + ('ui/*.png', 'ui'), + ('docs/html/*.*', 'docs/html'), + ('docs/html/generated/*.*', 'docs/html/generated') +] + +include_bins = [ + ('/usr/local/Cellar/sdl2/2.0.16/lib/libSDL2-2.0.0.dylib', '.'), + ('/usr/local/Cellar/sdl2_mixer/2.0.4_2/lib/libSDL2_mixer-2.0.0.dylib', '.'), + ('/usr/local/Cellar/flac/1.3.3/lib/libFLAC.8.dylib', '.'), + ('/usr/local/Cellar/libmikmod/3.3.11.1/lib/libmikmod.3.dylib', '.'), + ('/usr/local/Cellar/libmodplug/0.8.9.0/lib/libmodplug.1.dylib', '.'), + ('/usr/local/Cellar/libogg/1.3.5/lib/libogg.0.dylib', '.'), + ('/usr/local/Cellar/libvorbis/1.3.7/lib/libvorbis.0.dylib', '.'), + ('/usr/local/Cellar/libvorbis/1.3.7/lib/libvorbisfile.3.dylib', '.'), + ('/usr/local/Cellar/smpeg2/2.0.0/lib/libsmpeg2-2.0.0.dylib', '.') +] + +a = Analysis(['playscii.py'], + pathex=['./'], + binaries=include_bins, + datas=include_files, + hiddenimports=[], + hookspath=None, + runtime_hooks=None, + excludes=['pdoc'], + win_no_prefer_redirects=None, + win_private_assemblies=None, + cipher=block_cipher) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + exclude_binaries=True, + name='playscii', + debug=False, + strip=None, + upx=True, + console=False ) +coll = COLLECT(exe, + a.binaries, + a.zipfiles, + a.datas, + strip=None, + upx=True, + name='playscii') +app = BUNDLE(coll, + name='Playscii.app', + icon='ui/playscii.icns', + bundle_identifier='net.jplebreton.playscii') diff --git a/profile b/profile new file mode 100755 index 0000000..f4b0394 --- /dev/null +++ b/profile @@ -0,0 +1,2 @@ +python3 -m cProfile -o playscii.profile playscii.py "$1" "$2" "$3" +gprof2dot -f pstats playscii.profile | dot -Tpng -o profile.png diff --git a/renderable.py b/renderable.py new file mode 100644 index 0000000..8727efa --- /dev/null +++ b/renderable.py @@ -0,0 +1,483 @@ +import os, math, ctypes +import numpy as np +from OpenGL import GL +from art import VERT_LENGTH +from palette import MAX_COLORS + +# inactive layer alphas +LAYER_VIS_FULL = 1 +LAYER_VIS_DIM = 0.25 +LAYER_VIS_NONE = 0 + + +class TileRenderable: + """ + 3D visual representation of an Art. Each layer is rendered as grids of + rectangular OpenGL triangle-pairs. Animation frames are uploaded into our + buffers from source Art's numpy arrays. + """ + vert_shader_source = 'renderable_v.glsl' + "vertex shader: includes view projection matrix, XYZ camera uniforms." + frag_shader_source = 'renderable_f.glsl' + "Pixel shader: handles FG/BG colors." + log_create_destroy = False + log_animation = False + log_buffer_updates = False + grain_strength = 0. + alpha = 1. + "Alpha (0 to 1) for entire Renderable." + bg_alpha = 1. + "Alpha (0 to 1) *only* for tile background colors." + default_move_rate = 1 + use_art_offset = True + "Use game object's art_off_pct values." + + def __init__(self, app, art, game_object=None): + "Create Renderable with given Art, optionally bound to given GameObject" + self.app = app + "Application that renders us." + self.art = art + "Art we get data from." + self.art.renderables.append(self) + self.go = game_object + "GameObject we're attached to." + self.exporting = False + "Set True momentarily by image export process; users shouldn't touch." + self.visible = True + "Boolean for easy render / don't-render functionality." + self.frame = self.art.active_frame or 0 + "Frame of our art's animation we're currently on" + self.animating = False + self.anim_timer, self.last_frame_time = 0, 0 + # world space position and scale + self.x, self.y, self.z = 0, 0, 0 + self.scale_x, self.scale_y, self.scale_z = 1, 1, 1 + if self.go: + self.scale_x = self.go.scale_x + self.scale_y = self.go.scale_y + self.scale_z = self.go.scale_z + # width and height in XY render space + self.width, self.height = 1, 1 + self.reset_size() + # TODO: object rotation matrix, if needed + self.goal_x, self.goal_y, self.goal_z = 0, 0, 0 + self.move_rate = self.default_move_rate + # marked True when UI is interpolating it + self.ui_moving = False + self.camera = self.app.camera + # bind VAO etc before doing shaders etc + if self.app.use_vao: + self.vao = GL.glGenVertexArrays(1) + GL.glBindVertexArray(self.vao) + self.shader = self.app.sl.new_shader(self.vert_shader_source, self.frag_shader_source) + self.proj_matrix_uniform = self.shader.get_uniform_location('projection') + self.view_matrix_uniform = self.shader.get_uniform_location('view') + self.position_uniform = self.shader.get_uniform_location('objectPosition') + self.scale_uniform = self.shader.get_uniform_location('objectScale') + self.charset_width_uniform = self.shader.get_uniform_location('charMapWidth') + self.charset_height_uniform = self.shader.get_uniform_location('charMapHeight') + self.char_uv_width_uniform = self.shader.get_uniform_location('charUVWidth') + self.char_uv_height_uniform = self.shader.get_uniform_location('charUVHeight') + self.charset_tex_uniform = self.shader.get_uniform_location('charset') + self.palette_tex_uniform = self.shader.get_uniform_location('palette') + self.grain_tex_uniform = self.shader.get_uniform_location('grain') + self.palette_width_uniform = self.shader.get_uniform_location('palTextureWidth') + self.grain_strength_uniform = self.shader.get_uniform_location('grainStrength') + self.alpha_uniform = self.shader.get_uniform_location('alpha') + self.brightness_uniform = self.shader.get_uniform_location('brightness') + self.bg_alpha_uniform = self.shader.get_uniform_location('bgColorAlpha') + self.create_buffers() + # finish + if self.app.use_vao: + GL.glBindVertexArray(0) + if self.log_create_destroy: + self.app.log('created: %s' % self) + + def __str__(self): + "for debug purposes, return a concise unique name" + for i,r in enumerate(self.art.renderables): + if r is self: + break + return '%s %s %s' % (self.art.get_simple_name(), self.__class__.__name__, i) + + def create_buffers(self): + # vertex positions and elements + # determine vertex count needed for render + self.vert_count = int(len(self.art.elem_array)) + self.vert_buffer, self.elem_buffer = GL.glGenBuffers(2) + self.update_buffer(self.vert_buffer, self.art.vert_array, + GL.GL_ARRAY_BUFFER, GL.GL_STATIC_DRAW, GL.GL_FLOAT, 'vertPosition', VERT_LENGTH) + self.update_buffer(self.elem_buffer, self.art.elem_array, + GL.GL_ELEMENT_ARRAY_BUFFER, GL.GL_STATIC_DRAW, GL.GL_UNSIGNED_INT, None, None) + # tile data buffers + # use GL_DYNAMIC_DRAW given they change every time a char/color changes + self.char_buffer, self.uv_buffer = GL.glGenBuffers(2) + # character indices (which become vertex UVs) + self.update_buffer(self.char_buffer, self.art.chars[self.frame], + GL.GL_ARRAY_BUFFER, GL.GL_DYNAMIC_DRAW, GL.GL_FLOAT, 'charIndex', 1) + # UV "mods" - modify UV derived from character index + self.update_buffer(self.uv_buffer, self.art.uv_mods[self.frame], + GL.GL_ARRAY_BUFFER, GL.GL_DYNAMIC_DRAW, GL.GL_FLOAT, 'uvMod', 2) + self.fg_buffer, self.bg_buffer = GL.glGenBuffers(2) + # foreground/background color indices (which become rgba colors) + self.update_buffer(self.fg_buffer, self.art.fg_colors[self.frame], + GL.GL_ARRAY_BUFFER, GL.GL_DYNAMIC_DRAW, GL.GL_FLOAT, 'fgColorIndex', 1) + self.update_buffer(self.bg_buffer, self.art.bg_colors[self.frame], + GL.GL_ARRAY_BUFFER, GL.GL_DYNAMIC_DRAW, GL.GL_FLOAT, 'bgColorIndex', 1) + + def update_geo_buffers(self): + self.update_buffer(self.vert_buffer, self.art.vert_array, GL.GL_ARRAY_BUFFER, GL.GL_STATIC_DRAW, GL.GL_FLOAT, None, None) + self.update_buffer(self.elem_buffer, self.art.elem_array, GL.GL_ELEMENT_ARRAY_BUFFER, GL.GL_STATIC_DRAW, GL.GL_UNSIGNED_INT, None, None) + # total vertex count probably changed + self.vert_count = int(len(self.art.elem_array)) + + def update_tile_buffers(self, update_chars, update_uvs, update_fg, update_bg): + "Update GL data arrays for tile characters, fg/bg colors, transforms." + updates = {} + if update_chars: + updates[self.char_buffer] = self.art.chars + if update_uvs: + updates[self.uv_buffer] = self.art.uv_mods + if update_fg: + updates[self.fg_buffer] = self.art.fg_colors + if update_bg: + updates[self.bg_buffer] = self.art.bg_colors + for update in updates: + self.update_buffer(update, updates[update][self.frame], + GL.GL_ARRAY_BUFFER, GL.GL_DYNAMIC_DRAW, + GL.GL_FLOAT, None, None) + + def update_buffer(self, buffer_index, array, target, buffer_type, data_type, + attrib_name, attrib_size): + if self.log_buffer_updates: + self.app.log('update_buffer: %s, %s, %s, %s, %s, %s, %s' % (buffer_index, array, target, buffer_type, data_type, attrib_name, attrib_size)) + GL.glBindBuffer(target, buffer_index) + GL.glBufferData(target, array.nbytes, array, buffer_type) + if attrib_name: + attrib = self.shader.get_attrib_location(attrib_name) + GL.glEnableVertexAttribArray(attrib) + GL.glVertexAttribPointer(attrib, attrib_size, data_type, + GL.GL_FALSE, 0, ctypes.c_void_p(0)) + # unbind each buffer before binding next + GL.glBindBuffer(target, 0) + + def advance_frame(self): + "Advance to our Art's next animation frame." + self.set_frame(self.frame + 1) + + def rewind_frame(self): + "Rewind to our Art's previous animation frame." + self.set_frame(self.frame - 1) + + def set_frame(self, new_frame_index): + "Set us to display our Art's given animation frame." + if new_frame_index == self.frame: + return + old_frame = self.frame + self.frame = new_frame_index % self.art.frames + self.update_tile_buffers(True, True, True, True) + if self.log_animation: + self.app.log('%s animating from frames %s to %s' % (self, old_frame, self.frame)) + + def start_animating(self): + "Start animation playback." + self.animating = True + self.anim_timer = 0 + + def stop_animating(self): + "Pause animation playback on current frame (in game mode)." + self.animating = False + # restore to active frame if stopping + if not self.app.game_mode: + self.set_frame(self.art.active_frame) + + def set_art(self, new_art): + "Display and bind to given Art." + if self.art: + self.art.renderables.remove(self) + self.art = new_art + self.reset_size() + self.art.renderables.append(self) + # make sure frame is valid + self.frame %= self.art.frames + self.update_geo_buffers() + self.update_tile_buffers(True, True, True, True) + #print('%s now uses Art %s' % (self, self.art.filename)) + + def reset_size(self): + self.width = self.art.width * self.art.quad_width * abs(self.scale_x) + self.height = self.art.height * self.art.quad_height * self.scale_y + + def move_to(self, x, y, z, travel_time=None): + """ + Start simple linear interpolation to given destination over given time. + Not very useful in Game Mode, mainly used for document switch UI effect + in Art Mode. + """ + # for fixed travel time, set move rate accordingly + if travel_time: + frames = (travel_time * 1000) / max(self.app.framerate, 30) + dx = x - self.x + dy = y - self.y + dz = z - self.z + dist = math.sqrt(dx ** 2 + dy ** 2 + dz ** 2) + self.move_rate = dist / frames + else: + self.move_rate = self.default_move_rate + self.ui_moving = True + self.goal_x, self.goal_y, self.goal_z = x, y, z + if self.log_animation: + self.app.log('%s will move to %s,%s' % (self.art.filename, self.goal_x, self.goal_y)) + + def snap_to(self, x, y, z): + self.x, self.y, self.z = x, y, z + self.goal_x, self.goal_y, self.goal_z = x, y, z + self.ui_moving = False + + def update_transform_from_object(self, obj): + "Update our position & scale based on that of given game object." + self.z = obj.z + if self.scale_x != obj.scale_x or self.scale_y != obj.scale_y: + self.reset_size() + self.x, self.y = obj.x, obj.y + if self.use_art_offset: + if obj.flip_x: + self.x += self.width * obj.art_off_pct_x + else: + self.x -= self.width * obj.art_off_pct_x + self.y += self.height * obj.art_off_pct_y + self.scale_x, self.scale_y = obj.scale_x, obj.scale_y + if obj.flip_x: + self.scale_x *= -1 + self.scale_z = obj.scale_z + + def update_loc(self): + # TODO: probably time to bust out the ol' vector module for this stuff + # get delta + dx = self.goal_x - self.x + dy = self.goal_y - self.y + dz = self.goal_z - self.z + dist = math.sqrt(dx ** 2 + dy ** 2 + dz ** 2) + # close enough? + if dist <= self.move_rate: + self.x = self.goal_x + self.y = self.goal_y + self.z = self.goal_z + self.ui_moving = False + return + # normalize + inv_dist = 1 / dist + dir_x = dx * inv_dist + dir_y = dy * inv_dist + dir_z = dz * inv_dist + self.x += self.move_rate * dir_x + self.y += self.move_rate * dir_y + self.z += self.move_rate * dir_z + #self.app.log('%s moved to %s,%s' % (self, self.x, self.y)) + + def update(self): + if self.go: + self.update_transform_from_object(self.go) + if self.ui_moving: + self.update_loc() + if not self.animating: + return + if self.app.game_mode and self.app.gw.paused: + return + elapsed = self.app.get_elapsed_time() - self.last_frame_time + self.anim_timer += elapsed + new_frame = self.frame + this_frame_delay = self.art.frame_delays[new_frame] * 1000 + while self.anim_timer >= this_frame_delay: + self.anim_timer -= this_frame_delay + # iterate through frames, but don't call set_frame until we're done + new_frame += 1 + new_frame %= self.art.frames + this_frame_delay = self.art.frame_delays[new_frame] * 1000 + # TODO: if new_frame < self.frame, count anim loop? + self.set_frame(new_frame) + self.last_frame_time = self.app.get_elapsed_time() + + def destroy(self): + if self.app.use_vao: + GL.glDeleteVertexArrays(1, [self.vao]) + GL.glDeleteBuffers(6, [self.vert_buffer, self.elem_buffer, self.char_buffer, self.uv_buffer, self.fg_buffer, self.bg_buffer]) + if self.art and self in self.art.renderables: + self.art.renderables.remove(self) + if self.log_create_destroy: + self.app.log('destroyed: %s' % self) + + def get_projection_matrix(self): + """ + UIRenderable overrides this so it doesn't have to override + Renderable.render and duplicate lots of code. + """ + return np.eye(4, 4) if self.exporting else self.camera.projection_matrix + + def get_view_matrix(self): + return np.eye(4, 4) if self.exporting else self.camera.view_matrix + + def get_loc(self): + "Returns world space location as (x, y, z) tuple." + export_loc = (-1, 1, 0) + return export_loc if self.exporting else (self.x, self.y, self.z) + + def get_scale(self): + "Returns world space scale as (x, y, z) tuple." + if not self.exporting: + return (self.scale_x, self.scale_y, self.scale_z) + x = 2 / (self.art.width * self.art.quad_width) + y = 2 / (self.art.height * self.art.quad_height) + return (x, y, 1) + + def render_frame_for_export(self, frame): + self.exporting = True + self.set_frame(frame) + # cache "inactive layer visibility", restore after render + ilv = self.art.app.inactive_layer_visibility + self.art.app.inactive_layer_visibility = LAYER_VIS_FULL + # cursor might be hovering, undo any preview changes + for edit in self.art.app.cursor.preview_edits: + edit.undo() + # update art to commit changes to the renderable + self.art.update() + self.render() + self.art.app.inactive_layer_visibility = ilv + self.exporting = False + + def render(self, layers=None, z_override=None, brightness=1.0): + """ + Render given list of layers at given Z depth. + If layers is None, render all layers. + If layers is an int, just render that layer. + If z_override is None, render each layer at Z defined in our Art. + """ + if not self.visible: + return + GL.glUseProgram(self.shader.program) + # bind textures - character set, palette, UI grain + GL.glActiveTexture(GL.GL_TEXTURE0) + GL.glUniform1i(self.charset_tex_uniform, 0) + GL.glBindTexture(GL.GL_TEXTURE_2D, self.art.charset.texture.gltex) + GL.glActiveTexture(GL.GL_TEXTURE1) + GL.glUniform1i(self.palette_tex_uniform, 1) + GL.glBindTexture(GL.GL_TEXTURE_2D, self.art.palette.texture.gltex) + GL.glActiveTexture(GL.GL_TEXTURE2) + GL.glUniform1i(self.grain_tex_uniform, 2) + GL.glBindTexture(GL.GL_TEXTURE_2D, self.app.ui.grain_texture.gltex) + # set active texture unit back after binding 2nd-Nth textures + GL.glActiveTexture(GL.GL_TEXTURE0) + GL.glUniform1i(self.charset_width_uniform, self.art.charset.map_width) + GL.glUniform1i(self.charset_height_uniform, self.art.charset.map_height) + GL.glUniform1f(self.char_uv_width_uniform, self.art.charset.u_width) + GL.glUniform1f(self.char_uv_height_uniform, self.art.charset.v_height) + GL.glUniform1f(self.palette_width_uniform, MAX_COLORS) + GL.glUniform1f(self.grain_strength_uniform, self.grain_strength) + # camera uniforms + GL.glUniformMatrix4fv(self.proj_matrix_uniform, 1, GL.GL_FALSE, + self.get_projection_matrix()) + GL.glUniformMatrix4fv(self.view_matrix_uniform, 1, GL.GL_FALSE, + self.get_view_matrix()) + # TODO: determine if cost of setting all above uniforms for each + # Renderable is significant enough to warrant opti where they're set once + GL.glUniform1f(self.bg_alpha_uniform, self.bg_alpha) + GL.glUniform1f(self.brightness_uniform, brightness) + GL.glUniform3f(self.scale_uniform, *self.get_scale()) + # VAO vs non-VAO paths + if self.app.use_vao: + GL.glBindVertexArray(self.vao) + else: + attrib = self.shader.get_attrib_location # for brevity + vp = ctypes.c_void_p(0) + # bind each buffer and set its attrib: + # verts + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vert_buffer) + GL.glVertexAttribPointer(attrib('vertPosition'), VERT_LENGTH, GL.GL_FLOAT, GL.GL_FALSE, 0, vp) + GL.glEnableVertexAttribArray(attrib('vertPosition')) + # chars + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.char_buffer) + GL.glVertexAttribPointer(attrib('charIndex'), 1, GL.GL_FLOAT, GL.GL_FALSE, 0, vp) + GL.glEnableVertexAttribArray(attrib('charIndex')) + # uvs + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.uv_buffer) + GL.glVertexAttribPointer(attrib('uvMod'), 2, GL.GL_FLOAT, GL.GL_FALSE, 0, vp) + GL.glEnableVertexAttribArray(attrib('uvMod')) + # fg colors + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.fg_buffer) + GL.glVertexAttribPointer(attrib('fgColorIndex'), 1, GL.GL_FLOAT, GL.GL_FALSE, 0, vp) + GL.glEnableVertexAttribArray(attrib('fgColorIndex')) + # bg colors + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.bg_buffer) + GL.glVertexAttribPointer(attrib('bgColorIndex'), 1, GL.GL_FLOAT, GL.GL_FALSE, 0, vp) + GL.glEnableVertexAttribArray(attrib('bgColorIndex')) + # finally, bind element buffer + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_buffer) + GL.glEnable(GL.GL_BLEND) + GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA) + # draw all specified layers if no list given + if layers is None: + # sort layers in Z depth + layers = list(range(self.art.layers)) + layers.sort(key=lambda i: self.art.layers_z[i], reverse=False) + # handle a single int param + elif type(layers) is int: + layers = [layers] + layer_size = int(len(self.art.elem_array) / self.art.layers) + for i in layers: + # skip game mode-hidden layers + if not self.app.show_hidden_layers and not self.art.layers_visibility[i]: + continue + layer_start = i * layer_size + layer_end = layer_start + layer_size + # for active art, dim all but active layer based on UI setting + if not self.app.game_mode and self.art is self.app.ui.active_art and i != self.art.active_layer: + GL.glUniform1f(self.alpha_uniform, self.alpha * self.app.inactive_layer_visibility) + else: + GL.glUniform1f(self.alpha_uniform, self.alpha) + # use position offset instead of baked-in Z for layers - this + # way a layer's Z can change w/o rebuilding its vert array + x, y, z = self.get_loc() + # for export, render all layers at same Z + if not self.exporting: + z += self.art.layers_z[i] + z = z_override if z_override else z + GL.glUniform3f(self.position_uniform, x, y, z) + GL.glDrawElements(GL.GL_TRIANGLES, layer_size, GL.GL_UNSIGNED_INT, + ctypes.c_void_p(layer_start * ctypes.sizeof(ctypes.c_uint))) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0) + GL.glDisable(GL.GL_BLEND) + if self.app.use_vao: + GL.glBindVertexArray(0) + GL.glUseProgram(0) + + +class OnionTileRenderable(TileRenderable): + + "TileRenderable subclass used for onion skin display in Art Mode animation." + + # never animate + def start_animating(self): + pass + + def stop_animating(self): + pass + + +class GameObjectRenderable(TileRenderable): + + """ + TileRenderable subclass used by GameObjects. Almost no custom logic for now. + """ + + def get_loc(self): + """ + Returns world space location as (x, y, z) tuple, offset by our + GameObject's location. + """ + x, y, z = self.x, self.y, self.z + if self.go: + off_x, off_y, off_z = self.go.get_render_offset() + x += off_x + y += off_y + z += off_z + return x, y, z diff --git a/renderable_line.py b/renderable_line.py new file mode 100644 index 0000000..799fff0 --- /dev/null +++ b/renderable_line.py @@ -0,0 +1,494 @@ +import math, time, ctypes, platform +import numpy as np +from OpenGL import GL +from renderable import TileRenderable + +class LineRenderable(): + + "Renderable comprised of GL_LINES" + + vert_shader_source = 'lines_v.glsl' + vert_shader_source_3d = 'lines_3d_v.glsl' + frag_shader_source = 'lines_f.glsl' + log_create_destroy = False + line_width = 1 + # items in vert array: 2 for XY-only renderables, 3 for ones that include Z + vert_items = 2 + # use game object's art_off_pct values + use_art_offset = True + visible = True + + def __init__(self, app, quad_size_ref=None, game_object=None): + self.app = app + # we may be attached to a game object + self.go = game_object + self.unique_name = '%s_%s' % (int(time.time()), self.__class__.__name__) + self.quad_size_ref = quad_size_ref + self.x, self.y, self.z = 0, 0, 0 + self.scale_x, self.scale_y = 1, 1 + # handle Z differently if verts are 2D vs 3D + self.scale_z = 0 if self.vert_items == 2 else 1 + self.build_geo() + self.width, self.height = self.get_size() + self.reset_loc() + if self.app.use_vao: + self.vao = GL.glGenVertexArrays(1) + GL.glBindVertexArray(self.vao) + if self.vert_items == 3: + self.vert_shader_source = self.vert_shader_source_3d + self.shader = self.app.sl.new_shader(self.vert_shader_source, self.frag_shader_source) + # uniforms + self.proj_matrix_uniform = self.shader.get_uniform_location('projection') + self.view_matrix_uniform = self.shader.get_uniform_location('view') + self.position_uniform = self.shader.get_uniform_location('objectPosition') + self.scale_uniform = self.shader.get_uniform_location('objectScale') + self.quad_size_uniform = self.shader.get_uniform_location('quadSize') + self.color_uniform = self.shader.get_uniform_location('objectColor') + # vert buffers + self.vert_buffer, self.elem_buffer = GL.glGenBuffers(2) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vert_buffer) + GL.glBufferData(GL.GL_ARRAY_BUFFER, self.vert_array.nbytes, + self.vert_array, GL.GL_STATIC_DRAW) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_buffer) + GL.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_array.nbytes, + self.elem_array, GL.GL_STATIC_DRAW) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0) + self.vert_count = int(len(self.elem_array)) + self.pos_attrib = self.shader.get_attrib_location('vertPosition') + GL.glEnableVertexAttribArray(self.pos_attrib) + offset = ctypes.c_void_p(0) + GL.glVertexAttribPointer(self.pos_attrib, self.vert_items, + GL.GL_FLOAT, GL.GL_FALSE, 0, offset) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) + # vert colors + self.color_buffer = GL.glGenBuffers(1) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.color_buffer) + GL.glBufferData(GL.GL_ARRAY_BUFFER, self.color_array.nbytes, + self.color_array, GL.GL_STATIC_DRAW) + self.color_attrib = self.shader.get_attrib_location('vertColor') + GL.glEnableVertexAttribArray(self.color_attrib) + GL.glVertexAttribPointer(self.color_attrib, 4, + GL.GL_FLOAT, GL.GL_FALSE, 0, offset) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) + if self.app.use_vao: + GL.glBindVertexArray(0) + if self.log_create_destroy: + self.app.log('created: %s' % self) + + def __str__(self): + "for debug purposes, return a unique name" + return self.unique_name + + def build_geo(self): + """ + create self.vert_array, self.elem_array, self.color_array + """ + pass + + def reset_loc(self): + pass + + def update(self): + if self.go: + self.update_transform_from_object(self.go) + + def reset_size(self): + self.width, self.height = self.get_size() + + def update_transform_from_object(self, obj): + TileRenderable.update_transform_from_object(self, obj) + + def rebind_buffers(self): + # resend verts + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vert_buffer) + GL.glBufferData(GL.GL_ARRAY_BUFFER, self.vert_array.nbytes, + self.vert_array, GL.GL_STATIC_DRAW) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_buffer) + GL.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_array.nbytes, + self.elem_array, GL.GL_STATIC_DRAW) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) + self.vert_count = int(len(self.elem_array)) + # resend color + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.color_buffer) + GL.glBufferData(GL.GL_ARRAY_BUFFER, self.color_array.nbytes, + self.color_array, GL.GL_STATIC_DRAW) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) + + def get_projection_matrix(self): + return np.eye(4, 4) + + def get_view_matrix(self): + return np.eye(4, 4) + + def get_loc(self): + return self.x, self.y, self.z + + def get_size(self): + # overriden in subclasses that need specific width/height data + return 1, 1 + + def get_quad_size(self): + if self.quad_size_ref: + return self.quad_size_ref.quad_width, self.quad_size_ref.quad_height + else: + return 1, 1 + + def get_color(self): + return (1, 1, 1, 1) + + def get_line_width(self): + return self.line_width + + def destroy(self): + if self.app.use_vao: + GL.glDeleteVertexArrays(1, [self.vao]) + GL.glDeleteBuffers(3, [self.vert_buffer, self.elem_buffer, self.color_buffer]) + if self.log_create_destroy: + self.app.log('destroyed: %s' % self) + + def render(self): + if not self.visible: + return + GL.glUseProgram(self.shader.program) + GL.glUniformMatrix4fv(self.proj_matrix_uniform, 1, GL.GL_FALSE, self.get_projection_matrix()) + GL.glUniformMatrix4fv(self.view_matrix_uniform, 1, GL.GL_FALSE, self.get_view_matrix()) + GL.glUniform3f(self.position_uniform, *self.get_loc()) + GL.glUniform3f(self.scale_uniform, self.scale_x, self.scale_y, self.scale_z) + GL.glUniform2f(self.quad_size_uniform, *self.get_quad_size()) + GL.glUniform4f(self.color_uniform, *self.get_color()) + # VAO vs non-VAO paths + if self.app.use_vao: + GL.glBindVertexArray(self.vao) + else: + offset = ctypes.c_void_p(0) + # attribs: + # pos + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vert_buffer) + GL.glVertexAttribPointer(self.pos_attrib, self.vert_items, + GL.GL_FLOAT, GL.GL_FALSE, 0, ctypes.c_void_p(0)) + GL.glEnableVertexAttribArray(self.pos_attrib) + # color + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.color_buffer) + GL.glVertexAttribPointer(self.color_attrib, 4, + GL.GL_FLOAT, GL.GL_FALSE, 0, offset) + GL.glEnableVertexAttribArray(self.color_attrib) + # bind elem array - see similar behavior in Cursor.render + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, self.elem_buffer) + GL.glEnable(GL.GL_BLEND) + GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA) + if platform.system() != 'Darwin': + GL.glLineWidth(self.get_line_width()) + GL.glDrawElements(GL.GL_LINES, self.vert_count, + GL.GL_UNSIGNED_INT, None) + GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0) + GL.glDisable(GL.GL_BLEND) + if self.app.use_vao: + GL.glBindVertexArray(0) + GL.glUseProgram(0) + + +# common data/code used by various boxes +BOX_VERTS = [(0, 0), (1, 0), (1, -1), (0, -1)] + +def get_box_arrays(vert_list=None, color=(1, 1, 1, 1)): + verts = np.array(vert_list or BOX_VERTS, dtype=np.float32) + elems = np.array([0, 1, 1, 2, 2, 3, 3, 0], dtype=np.uint32) + colors = np.array([color * 4], dtype=np.float32) + return verts, elems, colors + + +class UIRenderableX(LineRenderable): + + "Red X used to denote transparent color in various places" + color = (1, 0, 0, 1) + line_width = 2 + + def build_geo(self): + self.vert_array = np.array([(0, 0), (1, 1), (1, 0), (0, 1)], dtype=np.float32) + self.elem_array = np.array([0, 1, 2, 3], dtype=np.uint32) + self.color_array = np.array([self.color * 4], dtype=np.float32) + + +class SwatchSelectionBoxRenderable(LineRenderable): + + "used for UI selection boxes etc" + + color = (0.5, 0.5, 0.5, 1) + line_width = 2 + + def __init__(self, app, quad_size_ref): + LineRenderable.__init__(self, app, quad_size_ref) + # track tile X and Y for cursor movement + self.tile_x, self.tile_y = 0,0 + + def get_color(self): + return self.color + + def build_geo(self): + self.vert_array, self.elem_array, self.color_array = get_box_arrays(None, self.color) + + +class ToolSelectionBoxRenderable(LineRenderable): + line_width = 2 + + def get_color(self): + return (1.0, 1.0, 1.0, 1.0) + + def build_geo(self): + self.vert_array, self.elem_array, self.color_array = get_box_arrays(None) + + +class WorldLineRenderable(LineRenderable): + "any LineRenderable that draws in world, ie in 3D perspective" + def get_projection_matrix(self): + return self.app.camera.projection_matrix + + def get_view_matrix(self): + return self.app.camera.view_matrix + + +class DebugLineRenderable(WorldLineRenderable): + + """ + renderable for drawing debug lines in the world. + use set_lines and add_lines to replace and add to, respectively, the list + of 3D vertex locations (and, optionally, colors). + """ + + color = (0.5, 0, 0, 1) + vert_items = 3 + line_width = 3 + + def set_lines(self, new_verts, new_colors=None): + "replace current debug lines with new given lines" + self.vert_array = np.array(new_verts, dtype=np.float32) + elements = [] + # TODO: possible OB1 bug here, sometimes draws line to object origin(?) + for i in range(1, len(new_verts)): + elements += [i - 1, i] + self.elem_array = np.array(elements, dtype=np.uint32) + self.color_array = np.array(new_colors or self.color * len(new_verts), + dtype=np.float32) + self.rebind_buffers() + + def set_color(self, new_color): + "changes all debug lines to given color" + self.color = new_color + lines = int(len(self.vert_array) / self.vert_items) + self.color_array = np.array(self.color * lines, dtype=np.float32) + self.rebind_buffers() + + def get_quad_size(self): + return 1, 1 + + def add_lines(self, new_verts, new_colors=None): + "add lines to the current ones" + line_items = len(self.vert_array) + lines = int(line_items / self.vert_items) + # if new_verts is a list of tuples, unpack into flat list + if type(new_verts[0]) is tuple: + new_verts_unpacked = [] + for (x, y, z) in new_verts: + new_verts_unpacked += [x, y, z] + new_verts = new_verts_unpacked + new_size = int(line_items + len(new_verts)) + self.vert_array.resize(new_size) + self.vert_array[line_items:new_size] = new_verts + # grow elem buffer + old_elem_size = len(self.elem_array) + new_elem_size = int(old_elem_size + len(new_verts) / self.vert_items) + # TODO: "contiguous" parameter that joins new lines with previous + self.elem_array.resize(new_elem_size) + self.elem_array[old_elem_size:new_elem_size] = range(old_elem_size, + new_elem_size) + # grow color buffer + old_color_size = len(self.color_array) + new_color_size = int(old_color_size + len(new_verts) / self.vert_items * 4) + self.color_array.resize(new_color_size) + self.color_array[old_color_size:new_color_size] = new_colors or self.color * int(len(new_verts) / self.vert_items) + self.rebind_buffers() + + def reset_lines(self): + self.build_geo() + + def build_geo(self): + # start empty + self.vert_array = np.array([], dtype=np.float32) + self.elem_array = np.array([], dtype=np.uint32) + self.color_array = np.array([], dtype=np.float32) + + def render(self): + # only render if we have any data + if len(self.vert_array) == 0: + return + WorldLineRenderable.render(self) + + +class OriginIndicatorRenderable(WorldLineRenderable): + + "classic 3-axis thingy showing location/rotation/scale" + + red = (1.0, 0.1, 0.1, 1.0) + green = (0.1, 1.0, 0.1, 1.0) + blue = (0.1, 0.1, 1.0, 1.0) + origin = (0, 0, 0) + x_axis = (1, 0, 0) + y_axis = (0, 1, 0) + z_axis = (0, 0, 1) + vert_items = 3 + line_width = 3 + use_art_offset = False + + def __init__(self, app, game_object): + LineRenderable.__init__(self, app, None, game_object) + + def get_quad_size(self): + return 1, 1 + + def get_size(self): + return self.go.scale_x, self.go.scale_y + + def update_transform_from_object(self, obj): + self.x, self.y, self.z = obj.x, obj.y, obj.z + self.scale_x, self.scale_y = obj.scale_x, obj.scale_y + if obj.flip_x: + self.scale_x *= -1 + self.scale_z = obj.scale_z + + def build_geo(self): + self.vert_array = np.array([self.origin, self.x_axis, + self.origin, self.y_axis, + self.origin, self.z_axis], + dtype=np.float32) + self.elem_array = np.array([0, 1, 2, 3, 4, 5], dtype=np.uint32) + self.color_array = np.array([self.red, self.red, self.green, self.green, + self.blue, self.blue], dtype=np.float32) + +class BoundsIndicatorRenderable(WorldLineRenderable): + color = (1, 1, 1, 0.5) + line_width_active = 2 + line_width_inactive = 1 + + def __init__(self, app, game_object): + self.art = game_object.renderable.art + LineRenderable.__init__(self, app, None, game_object) + + def set_art(self, new_art): + self.art = new_art + self.reset_size() + + def get_size(self): + art = self.go.art + w = (art.width * art.quad_width) * self.go.scale_x + h = (art.height * art.quad_height) * self.go.scale_y + return w, h + + def get_color(self): + # pulse if selected + if self.go in self.app.gw.selected_objects: + color = 0.75 + (math.sin(self.app.get_elapsed_time() / 100) / 2) + return (color, color, color, 1) + else: + return (1, 1, 1, 1) + + def get_line_width(self): + return self.line_width_active if self.go in self.app.gw.selected_objects else self.line_width_inactive + + def get_quad_size(self): + if not self.go: + return 1, 1 + return self.art.width * self.art.quad_width, self.art.height * self.art.quad_height + + def build_geo(self): + self.vert_array, self.elem_array, self.color_array = get_box_arrays(None, self.color) + + +class CollisionRenderable(WorldLineRenderable): + + # green = dynamic, blue = static + dynamic_color = (0, 1, 0, 1) + static_color = (0, 0, 1, 1) + + def __init__(self, shape): + self.color = self.dynamic_color if shape.go.is_dynamic() else self.static_color + self.shape = shape + WorldLineRenderable.__init__(self, shape.go.app, None, shape.go) + + def update(self): + self.update_transform_from_object(self.shape) + + def update_transform_from_object(self, obj): + self.x = obj.x + self.y = obj.y + + +def get_circle_points(radius, steps=24): + angle = 0 + points = [(radius, 0)] + for i in range(steps): + angle += math.radians(360 / steps) + x = math.cos(angle) * radius + y = math.sin(angle) * radius + points.append((x, y)) + return points + + +class CircleCollisionRenderable(CollisionRenderable): + + line_width = 2 + segments = 24 + + def get_quad_size(self): + return self.shape.radius, self.shape.radius + + def get_size(self): + w = h = self.shape.radius * 2 + w *= self.go.scale_x + h *= self.go.scale_y + return w, h + + def build_geo(self): + verts, elements, colors = [], [], [] + angle = 0 + last_x, last_y = 1, 0 + i = 0 + while i < self.segments * 4: + angle += math.radians(360 / self.segments) + verts.append((last_x, last_y)) + x = math.cos(angle) + y = math.sin(angle) + verts.append((x, y)) + last_x, last_y = x, y + elements.append((i, i+1)) + i += 2 + colors.append([self.color * 2]) + self.vert_array = np.array(verts, dtype=np.float32) + self.elem_array = np.array(elements, dtype=np.uint32) + self.color_array = np.array(colors, dtype=np.float32) + + +class BoxCollisionRenderable(CollisionRenderable): + + line_width = 2 + + def get_quad_size(self): + return self.shape.halfwidth * 2, self.shape.halfheight * 2 + + def get_size(self): + w, h = self.shape.halfwidth * 2, self.shape.halfheight * 2 + w *= self.go.scale_x + h *= self.go.scale_y + return w, h + + def build_geo(self): + verts = [(-0.5, 0.5), (0.5, 0.5), (0.5, -0.5), (-0.5, -0.5)] + self.vert_array, self.elem_array, self.color_array = get_box_arrays(verts, self.color) + + +class TileBoxCollisionRenderable(BoxCollisionRenderable): + "box for each tile in a CST_TILE object" + line_width = 1 + def get_loc(self): + # draw at Z level of collision layer + return self.x, self.y, self.go.get_layer_z(self.go.col_layer_name) diff --git a/renderable_sprite.py b/renderable_sprite.py new file mode 100644 index 0000000..67e70d7 --- /dev/null +++ b/renderable_sprite.py @@ -0,0 +1,132 @@ +import ctypes, time +import numpy as np + +from OpenGL import GL +from PIL import Image +from texture import Texture + +class SpriteRenderable: + + "basic renderable object using an image for a texture" + + vert_array = np.array([[0, 0], [1, 0], [0, 1], [1, 1]], dtype=np.float32) + vert_shader_source = 'sprite_v.glsl' + frag_shader_source = 'sprite_f.glsl' + texture_filename = 'ui/icon.png' + alpha = 1 + tex_scale_x, tex_scale_y = 1, 1 + blend = True + flip_y = True + tex_wrap = False + + def __init__(self, app, texture_filename=None, image_data=None): + self.app = app + self.unique_name = '%s_%s' % (int(time.time()), self.__class__.__name__) + self.x, self.y, self.z = self.get_initial_position() + self.scale_x, self.scale_y, self.scale_z = self.get_initial_scale() + if self.app.use_vao: + self.vao = GL.glGenVertexArrays(1) + GL.glBindVertexArray(self.vao) + # support loading texture from file or from provided data + # (remember the filename for later use) + if texture_filename: + self.texture_filename = texture_filename + if not image_data: + image_data = Image.open(self.texture_filename) + image_data = image_data.convert('RGBA') + if self.flip_y: + image_data = image_data.transpose(Image.FLIP_TOP_BOTTOM) + w, h = image_data.size + self.texture = Texture(image_data.tobytes(), w, h) + self.shader = self.app.sl.new_shader(self.vert_shader_source, self.frag_shader_source) + self.proj_matrix_uniform = self.shader.get_uniform_location('projection') + self.view_matrix_uniform = self.shader.get_uniform_location('view') + self.position_uniform = self.shader.get_uniform_location('objectPosition') + self.scale_uniform = self.shader.get_uniform_location('objectScale') + self.tex_uniform = self.shader.get_uniform_location('texture0') + self.tex_scale_uniform = self.shader.get_uniform_location('texScale') + self.alpha_uniform = self.shader.get_uniform_location('alpha') + self.vert_buffer = GL.glGenBuffers(1) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vert_buffer) + GL.glBufferData(GL.GL_ARRAY_BUFFER, self.vert_array.nbytes, + self.vert_array, GL.GL_STATIC_DRAW) + self.vert_count = 4 + self.pos_attrib = self.shader.get_attrib_location('vertPosition') + GL.glEnableVertexAttribArray(self.pos_attrib) + offset = ctypes.c_void_p(0) + GL.glVertexAttribPointer(self.pos_attrib, 2, + GL.GL_FLOAT, GL.GL_FALSE, 0, offset) + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) + if self.app.use_vao: + GL.glBindVertexArray(0) + self.texture.set_wrap(self.tex_wrap) + + def get_initial_position(self): + return 0, 0, 0 + + def get_initial_scale(self): + return 1, 1, 1 + + def get_projection_matrix(self): + return self.app.camera.projection_matrix + + def get_view_matrix(self): + return self.app.camera.view_matrix + + def get_texture_scale(self): + return self.tex_scale_x, self.tex_scale_y + + def destroy(self): + if self.app.use_vao: + GL.glDeleteVertexArrays(1, [self.vao]) + GL.glDeleteBuffers(1, [self.vert_buffer]) + + def render(self): + GL.glUseProgram(self.shader.program) + GL.glActiveTexture(GL.GL_TEXTURE0) + GL.glUniform1i(self.tex_uniform, 0) + GL.glUniform2f(self.tex_scale_uniform, *self.get_texture_scale()) + GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture.gltex) + GL.glUniformMatrix4fv(self.proj_matrix_uniform, 1, GL.GL_FALSE, self.get_projection_matrix()) + GL.glUniformMatrix4fv(self.view_matrix_uniform, 1, GL.GL_FALSE, self.get_view_matrix()) + GL.glUniform3f(self.position_uniform, self.x, self.y, self.z) + GL.glUniform3f(self.scale_uniform, self.scale_x, self.scale_y, self.scale_z) + GL.glUniform1f(self.alpha_uniform, self.alpha) + if self.app.use_vao: + GL.glBindVertexArray(self.vao) + else: + GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vert_buffer) + GL.glVertexAttribPointer(self.pos_attrib, 2, + GL.GL_FLOAT, GL.GL_FALSE, 0, ctypes.c_void_p(0)) + GL.glEnableVertexAttribArray(self.pos_attrib) + if self.blend: + GL.glEnable(GL.GL_BLEND) + GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA) + GL.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, self.vert_count) + if self.blend: + GL.glDisable(GL.GL_BLEND) + if self.app.use_vao: + GL.glBindVertexArray(0) + GL.glUseProgram(0) + + +class UISpriteRenderable(SpriteRenderable): + + def get_projection_matrix(self): + return self.app.ui.view_matrix + + def get_view_matrix(self): + return self.app.ui.view_matrix + + +class UIBGTextureRenderable(UISpriteRenderable): + alpha = 0.8 + tex_wrap = True + texture_filename = 'ui/bgnoise_alpha.png' + tex_scale_x, tex_scale_y = 8, 8 + + def get_initial_position(self): + return -1, -1, 0 + + def get_initial_scale(self): + return 2, 2, 1 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c9d5ef5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +appdirs==1.4.0 +numpy==1.20.1 +Pillow==8.1.2 +PyOpenGL==3.1.5 +PySDL2==0.9.7 diff --git a/selection.py b/selection.py new file mode 100644 index 0000000..e2add0e --- /dev/null +++ b/selection.py @@ -0,0 +1,76 @@ +import math +import numpy as np + +from renderable_line import LineRenderable + +class SelectionRenderable(LineRenderable): + + color = (0.8, 0.8, 0.8, 1) + line_width = 2 + x, y, z = 0, 0, 0 + + def build_geo(self): + # init empty arrays; geo is rebuilt every time selection changes + self.vert_array = np.array([], dtype=np.float32) + self.elem_array = np.array([], dtype=np.uint32) + self.color_array = np.array([], dtype=np.float32) + + def get_adjacent_tile(self, tiles, x, y, dir_x, dir_y): + "returns True or False based on tile dict lookup relative to given tile" + return tiles.get((x + dir_x, y + dir_y), False) + + def rebuild_geo(self, tiles): + # array source lists of verts, elements, colors + v, e, c = [], [], [] + index = 0 + for tile in tiles: + x, y = tile[0], tile[1] + # use rules to detect if a tile is above, below, + # to left or right of this one, draw lines accordingly + above = self.get_adjacent_tile(tiles, x, y, 0, -1) + below = self.get_adjacent_tile(tiles, x, y, 0, 1) + left = self.get_adjacent_tile(tiles, x, y, -1, 0) + right = self.get_adjacent_tile(tiles, x, y, 1, 0) + top_left = ( x, -y) + top_right = (x+1, -y) + bottom_right = (x+1, -y-1) + bottom_left = ( x, -y-1) + def add_line(vert_a, vert_b, verts, elems, colors, element_index): + verts += [vert_a, vert_b] + elems += [element_index, element_index+1] + colors += self.color * 2 + # verts = corners + if not above: + # top edge + add_line(top_left, top_right, v, e, c, index) + index += 2 + if not below: + # bottom edge + add_line(bottom_left, bottom_right, v, e, c, index) + index += 2 + if not left: + # left edge + add_line(top_left, bottom_left, v, e, c, index) + index += 2 + if not right: + # right edge + add_line(top_right, bottom_right, v, e, c, index) + index += 2 + self.z = self.app.ui.active_art.layers_z[self.app.ui.active_art.active_layer] + self.vert_array = np.array(v, dtype=np.float32) + self.elem_array = np.array(e, dtype=np.uint32) + self.color_array = np.array(c, dtype=np.float32) + + def reset_loc(self): + pass + + def get_projection_matrix(self): + return self.app.camera.projection_matrix + + def get_view_matrix(self): + return self.app.camera.view_matrix + + def get_color(self): + # pulse for visibility + a = 0.75 + (math.sin(self.app.get_elapsed_time() / 100) / 2) + return (a, a, a, 1) diff --git a/shader.py b/shader.py new file mode 100644 index 0000000..436c632 --- /dev/null +++ b/shader.py @@ -0,0 +1,154 @@ +import os.path, time, platform +from OpenGL import GL +from OpenGL.GL import shaders + +SHADER_PATH = 'shaders/' + +class ShaderLord: + + # time in ms between checks for hot reload + hot_reload_check_interval = 2 * 1000 + + def __init__(self, app): + "AWAKENS THE SHADERLORD" + self.app = app + self.shaders = [] + + def new_shader(self, vert_source_file, frag_source_file): + self.last_check = 0 + for shader in self.shaders: + if shader.vert_source_file == vert_source_file and shader.frag_source_file == frag_source_file: + #self.app.log('%s already uses same source' % shader) + return shader + s = Shader(self, vert_source_file, frag_source_file) + self.shaders.append(s) + return s + + def check_hot_reload(self): + if self.app.get_elapsed_time() - self.last_check < self.hot_reload_check_interval: + return + self.last_check = self.app.get_elapsed_time() + for shader in self.shaders: + vert_shader_updated, frag_shader_updated = shader.has_updated() + if vert_shader_updated: + shader.recompile(GL.GL_VERTEX_SHADER) + if frag_shader_updated: + shader.recompile(GL.GL_FRAGMENT_SHADER) + + def destroy(self): + for shader in self.shaders: + shader.destroy() + + +class Shader: + + log_compile = False + "If True, log shader compilation" + # per-platform shader versions, declared here for easier CFG fiddling + glsl_version_windows = 130 + glsl_version_unix = 130 + glsl_version_macos = 150 + glsl_version_es = 100 + + def __init__(self, shader_lord, vert_source_file, frag_source_file): + self.sl = shader_lord + # vertex shader + self.vert_source_file = vert_source_file + self.last_vert_change = time.time() + vert_source = self.get_shader_source(self.vert_source_file) + if self.log_compile: + self.sl.app.log('Compiling vertex shader %s...' % self.vert_source_file) + self.vert_shader = self.try_compile_shader(vert_source, GL.GL_VERTEX_SHADER, self.vert_source_file) + if self.log_compile and self.vert_shader: + self.sl.app.log('Compiled vertex shader %s in %.6f seconds' % (self.vert_source_file, time.time() - self.last_vert_change)) + # fragment shader + self.frag_source_file = frag_source_file + self.last_frag_change = time.time() + frag_source = self.get_shader_source(self.frag_source_file) + if self.log_compile: + self.sl.app.log('Compiling fragment shader %s...' % self.frag_source_file) + self.frag_shader = self.try_compile_shader(frag_source, GL.GL_FRAGMENT_SHADER, self.frag_source_file) + if self.log_compile and self.frag_shader: + self.sl.app.log('Compiled fragment shader %s in %.6f seconds' % (self.frag_source_file, time.time() - self.last_frag_change)) + # shader program + if self.vert_shader and self.frag_shader: + self.program = shaders.compileProgram(self.vert_shader, self.frag_shader) + + def get_shader_source(self, source_file): + src = open(SHADER_PATH + source_file, 'rb').read() + # prepend shader version for different platforms + if self.sl.app.context_es: + shader_version = self.glsl_version_es + elif platform.system() == 'Windows': + shader_version = self.glsl_version_windows + elif platform.system() == 'Darwin': + shader_version = self.glsl_version_macos + else: + shader_version = self.glsl_version_unix + version_string = '#version %s\n' % shader_version + src = bytes(version_string, 'utf-8') + src + return src + + def try_compile_shader(self, source, shader_type, source_filename): + "Catch and print shader compilation exceptions" + try: + shader = shaders.compileShader(source, shader_type) + except Exception as e: + self.sl.app.log('%s: ' % source_filename) + lines = e.args[0].split('\\n') + # salvage block after "shader compile failure" enclosed in b"" + pre = lines.pop(0).split('b"') + for line in pre + lines[:-1]: + self.sl.app.log(' ' + line) + return + return shader + + def has_updated(self): + vert_mod_time = os.path.getmtime(SHADER_PATH + self.vert_source_file) + frag_mod_time = os.path.getmtime(SHADER_PATH + self.frag_source_file) + # return two values: vert shader changed, frag shader changed + vert_changed = vert_mod_time > self.last_vert_change + frag_changed = frag_mod_time > self.last_frag_change + # store new last modified time if changed + if vert_changed: + self.last_vert_change = time.time() + if frag_changed: + self.last_frag_change = time.time() + return vert_changed, frag_changed + + def recompile(self, shader_type): + file_to_reload = self.vert_source_file + if shader_type == GL.GL_FRAGMENT_SHADER: + file_to_reload = self.frag_source_file + new_shader_source = self.get_shader_source(file_to_reload) + try: + new_shader = shaders.compileShader(new_shader_source, shader_type) + # TODO: use try_compile_shader instead here, make sure exception passes thru ok + self.sl.app.log('ShaderLord: success reloading %s' % file_to_reload) + except: + self.sl.app.log('ShaderLord: failed reloading %s' % file_to_reload) + return + # recompile program with new shader + if shader_type == GL.GL_VERTEX_SHADER: + self.vert_shader = new_shader + else: + self.frag_shader = new_shader + self.program = shaders.compileProgram(self.vert_shader, self.frag_shader) + + def get_uniform_location(self, uniform_name): + return GL.glGetUniformLocation(self.program, uniform_name) + + def get_attrib_location(self, attrib_name): + return GL.glGetAttribLocation(self.program, attrib_name) + + def destroy(self): + GL.glDeleteProgram(self.program) + + +class ShaderUniform: + # MAYBE-TODO: class for remembering uniform name, type, index. + # a Shader keeps a list of these, Renderables tell their Shader to set + # them. set methods use correct type and "try" to avoid crashes on + # hot-reload when a uniform is commented out of live GLSL. + # (try same for attributes? more data) + pass diff --git a/shaders/cursor_f.glsl b/shaders/cursor_f.glsl new file mode 100644 index 0000000..9c56fea --- /dev/null +++ b/shaders/cursor_f.glsl @@ -0,0 +1,12 @@ +precision mediump float; + +uniform vec4 baseColor; +uniform float baseAlpha; + +out vec4 outColor; + +void main() +{ + outColor = baseColor; + outColor.a *= baseAlpha; +} diff --git a/shaders/cursor_v.glsl b/shaders/cursor_v.glsl new file mode 100644 index 0000000..64dfde8 --- /dev/null +++ b/shaders/cursor_v.glsl @@ -0,0 +1,35 @@ +uniform mat4 projection; +uniform mat4 view; +uniform vec3 objectPosition; +uniform vec3 objectScale; +uniform vec2 quadSize; +uniform vec2 vertTransform; +uniform vec2 vertOffset; + +in vec3 vertPosition; + +mat4 scale(float x, float y, float z) +{ + return mat4( + vec4(x, 0.0, 0.0, 0.0), + vec4(0.0, y, 0.0, 0.0), + vec4(0.0, 0.0, z, 0.0), + vec4(0.0, 0.0, 0.0, 1.0) + ); +} + +void main() +{ + float z = vertPosition.z; + vec4 xform = vec4(vertTransform, 1, 1); + vec4 offset = vec4(vertOffset, 0, 0); + // apply scale to offsets rather than to model; more space between brackets + offset *= scale(objectScale.x, objectScale.y, objectScale.z); + // model = all 4 corners in the right place + vec4 model = vec4(vertPosition, 1) * xform + offset; + model += vec4(objectPosition, 0); + // this stretches the cursor according to charset aspect, but fixes Y weirdness + model *= vec4(quadSize, 1, 1); + // apply camera + gl_Position = projection * view * model; +} diff --git a/shaders/framebuffer_f.glsl b/shaders/framebuffer_f.glsl new file mode 100644 index 0000000..4a69482 --- /dev/null +++ b/shaders/framebuffer_f.glsl @@ -0,0 +1,13 @@ +// plain vanilla (non CRT) screen shader + +precision mediump float; + +uniform sampler2D fbo_texture; +uniform float elapsed_time; +in vec2 f_texcoord; +out vec4 f_outPixel; + +void main(void) { + vec2 texcoord = f_texcoord; + f_outPixel = texture(fbo_texture, texcoord); +} diff --git a/shaders/framebuffer_f_crt.glsl b/shaders/framebuffer_f_crt.glsl new file mode 100644 index 0000000..fa68120 --- /dev/null +++ b/shaders/framebuffer_f_crt.glsl @@ -0,0 +1,101 @@ +// CRT shader via Mattias Gustavsson - https://www.shadertoy.com/view/lsB3DV +// (screen warp, scanlines, and vignetting removed) + +precision mediump float; + +uniform sampler2D fbo_texture; +uniform float elapsed_time; +uniform vec2 resolution; +out vec4 f_outPixel; + +vec3 sample( sampler2D tex, vec2 tc ) +{ + // FIXME: apparently tons of these "dependent texture reads" are what + // kills linux intel GPU perf + vec3 s = pow(texture(tex,tc).rgb, vec3(2.2)); + return s; +} + +vec3 blur(sampler2D tex, vec2 tc, float offs) +{ + vec4 xoffs = offs * vec4(-2.0, -1.0, 1.0, 2.0) / resolution.x; + vec4 yoffs = offs * vec4(-2.0, -1.0, 1.0, 2.0) / resolution.y; + + // remember: GLSL is picky about casts, every # literal should be a float! + vec3 color = vec3(0.0, 0.0, 0.0); + + color += sample(tex,tc + vec2(xoffs.x, yoffs.x)) * 0.00366; + color += sample(tex,tc + vec2(xoffs.y, yoffs.x)) * 0.01465; + color += sample(tex,tc + vec2( 0.0, yoffs.x)) * 0.02564; + color += sample(tex,tc + vec2(xoffs.z, yoffs.x)) * 0.01465; + color += sample(tex,tc + vec2(xoffs.w, yoffs.x)) * 0.00366; + + color += sample(tex,tc + vec2(xoffs.x, yoffs.y)) * 0.01465; + color += sample(tex,tc + vec2(xoffs.y, yoffs.y)) * 0.05861; + color += sample(tex,tc + vec2( 0.0, yoffs.y)) * 0.09524; + color += sample(tex,tc + vec2(xoffs.z, yoffs.y)) * 0.05861; + color += sample(tex,tc + vec2(xoffs.w, yoffs.y)) * 0.01465; + + color += sample(tex,tc + vec2(xoffs.x, 0.0)) * 0.02564; + color += sample(tex,tc + vec2(xoffs.y, 0.0)) * 0.09524; + color += sample(tex,tc + vec2( 0.0, 0.0)) * 0.15018; + color += sample(tex,tc + vec2(xoffs.z, 0.0)) * 0.09524; + color += sample(tex,tc + vec2(xoffs.w, 0.0)) * 0.02564; + + color += sample(tex,tc + vec2(xoffs.x, yoffs.z)) * 0.01465; + color += sample(tex,tc + vec2(xoffs.y, yoffs.z)) * 0.05861; + color += sample(tex,tc + vec2( 0.0, yoffs.z)) * 0.09524; + color += sample(tex,tc + vec2(xoffs.z, yoffs.z)) * 0.05861; + color += sample(tex,tc + vec2(xoffs.w, yoffs.z)) * 0.01465; + + color += sample(tex,tc + vec2(xoffs.x, yoffs.w)) * 0.00366; + color += sample(tex,tc + vec2(xoffs.y, yoffs.w)) * 0.01465; + color += sample(tex,tc + vec2( 0.0, yoffs.w)) * 0.02564; + color += sample(tex,tc + vec2(xoffs.z, yoffs.w)) * 0.01465; + color += sample(tex,tc + vec2(xoffs.w, yoffs.w)) * 0.00366; + + return color; +} + +// http://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl +float rand(vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +void main(void) { + vec2 q = gl_FragCoord.xy / resolution.xy; + vec2 uv = q; + vec3 oricol = texture( fbo_texture, vec2(q.x,q.y) ).xyz; + float orialpha = texture( fbo_texture, vec2(q.x,q.y) ).a; + vec3 col; + // warbley in X + float x = sin(0.1*elapsed_time+uv.y*21.0)*sin(0.23*elapsed_time+uv.y*29.0)*sin(0.3+0.11*elapsed_time+uv.y*31.0)*0.0017; + // tone it waay down + x *= 0.05; + float o = 2.0*mod(gl_FragCoord.y,1.0)/resolution.x; + x += o; + col.r = 1.0*blur(fbo_texture,vec2(x+uv.x+0.0009,uv.y+0.0009),1.2).x+0.005; + col.g = 1.0*blur(fbo_texture,vec2(x+uv.x+0.000,uv.y-0.0015),1.2).y+0.005; + col.b = 1.0*blur(fbo_texture,vec2(x+uv.x-0.0015,uv.y+0.000),1.2).z+0.005; + col.r += 0.2*blur(fbo_texture,vec2(x+uv.x+0.0009,uv.y+0.0009),2.25).x-0.005; + col.g += 0.2*blur(fbo_texture,vec2(x+uv.x+0.000,uv.y-0.0015),1.75).y-0.005; + col.b += 0.2*blur(fbo_texture,vec2(x+uv.x-0.0015,uv.y+0.000),1.25).z-0.005; + float ghs = 0.05; + col.r += ghs*(1.0-0.299)*blur(fbo_texture,0.75*vec2(x-0.01, -0.027)+vec2(uv.x+0.001,uv.y+0.001),7.0).x; + col.g += ghs*(1.0-0.587)*blur(fbo_texture,0.75*vec2(x+-0.022, -0.02)+vec2(uv.x+0.000,uv.y-0.002),5.0).y; + col.b += ghs*(1.0-0.114)*blur(fbo_texture,0.75*vec2(x+-0.02, -0.0)+vec2(uv.x-0.002,uv.y+0.000),3.0).z; + col = clamp(col*0.4+0.6*col*col*1.0,0.0,1.0); + col *= vec3(0.95,1.05,0.95); + col = mix( col, col * col, 0.3) * 3.8; + col *= 1.0+0.0015*sin(300.0*elapsed_time); + col*=1.0-0.15*vec3(clamp((mod(gl_FragCoord.x+o, 2.0)-1.0)*2.0,0.0,1.0)); + col *= vec3( 1.0 ) - 0.25*vec3( rand( uv+0.0001*elapsed_time), rand( uv+0.0001*elapsed_time + 0.3 ), rand( uv+0.0001*elapsed_time+ 0.5 ) ); + col = pow(col, vec3(0.45)); + if (uv.x < 0.0 || uv.x > 1.0) + col *= 0.0; + if (uv.y < 0.0 || uv.y > 1.0) + col *= 0.0; + // improvise alpha based on source + intensity + orialpha += (col.r + col.g + col.b) / 3.0; + f_outPixel = vec4(col,orialpha); +} diff --git a/shaders/framebuffer_v.glsl b/shaders/framebuffer_v.glsl new file mode 100644 index 0000000..37dad0a --- /dev/null +++ b/shaders/framebuffer_v.glsl @@ -0,0 +1,8 @@ +in vec2 v_coord; +uniform sampler2D fbo_texture; +out vec2 f_texcoord; + +void main(void) { + gl_Position = vec4(v_coord, 0.0, 1.0); + f_texcoord = (v_coord + 1.0) / 2.0; +} diff --git a/shaders/lines_3d_v.glsl b/shaders/lines_3d_v.glsl new file mode 100644 index 0000000..6953027 --- /dev/null +++ b/shaders/lines_3d_v.glsl @@ -0,0 +1,31 @@ +uniform mat4 projection; +uniform mat4 view; +uniform vec3 objectPosition; +uniform vec3 objectScale; +uniform vec2 quadSize; + +in vec3 vertPosition; +in vec4 vertColor; + +out vec4 theColor; + +mat4 scale(float x, float y, float z) +{ + return mat4( + vec4(x, 0.0, 0.0, 0.0), + vec4(0.0, y, 0.0, 0.0), + vec4(0.0, 0.0, z, 0.0), + vec4(0.0, 0.0, 0.0, 1.0) + ); +} + +void main() +{ + vec4 model = vec4(vertPosition * vec3(quadSize, 1), 1); + // scale and transform model + model *= scale(objectScale.x, objectScale.y, objectScale.z); + model += vec4(objectPosition, 0); + // apply camera + gl_Position = projection * view * model; + theColor = vertColor; +} diff --git a/shaders/lines_f.glsl b/shaders/lines_f.glsl new file mode 100644 index 0000000..1b240e3 --- /dev/null +++ b/shaders/lines_f.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform vec4 objectColor; + +in vec4 theColor; +out vec4 outColor; + +void main() +{ + outColor = theColor * objectColor; +} diff --git a/shaders/lines_v.glsl b/shaders/lines_v.glsl new file mode 100644 index 0000000..98a800a --- /dev/null +++ b/shaders/lines_v.glsl @@ -0,0 +1,31 @@ +uniform mat4 projection; +uniform mat4 view; +uniform vec3 objectPosition; +uniform vec3 objectScale; +uniform vec2 quadSize; + +in vec2 vertPosition; +in vec4 vertColor; + +out vec4 theColor; + +mat4 scale(float x, float y, float z) +{ + return mat4( + vec4(x, 0.0, 0.0, 0.0), + vec4(0.0, y, 0.0, 0.0), + vec4(0.0, 0.0, z, 0.0), + vec4(0.0, 0.0, 0.0, 1.0) + ); +} + +void main() +{ + vec4 model = vec4(vertPosition * quadSize, objectPosition.z, 1); + // scale and transform model + model *= scale(objectScale.x, objectScale.y, objectScale.z); + model += vec4(objectPosition, 0); + // apply camera + gl_Position = projection * view * model; + theColor = vertColor; +} diff --git a/shaders/renderable_f.glsl b/shaders/renderable_f.glsl new file mode 100644 index 0000000..6a5d7d1 --- /dev/null +++ b/shaders/renderable_f.glsl @@ -0,0 +1,52 @@ +precision mediump float; + +uniform sampler2D charset; +uniform sampler2D palette; +uniform sampler2D grain; +// width of the generated palette texture, ie palette.MAX_COLORS +uniform float palTextureWidth; +uniform float grainStrength; +uniform float bgColorAlpha; +uniform float alpha; +uniform float brightness; + +in vec2 texCoords; +in float theFgColorIndex; +in float theBgColorIndex; + +const float grainSize = 0.0075; + +out vec4 outColor; + +void main() +{ + // add tiny offsets to UVs to account for sampling imprecision + vec2 nudge = vec2(0.000001, 0.000001); + outColor = texture(charset, texCoords + nudge); + // look up fg/bg colors from palette texture + vec2 colorUV = vec2(0.0, 0.0); + // offset U coord slightly so we're not sampling from pixel boundary + colorUV.x = (theFgColorIndex + 0.01) / palTextureWidth; + vec4 fgColor = texture(palette, colorUV); + colorUV.x = (theBgColorIndex + 0.01) / palTextureWidth; + vec4 bgColor = texture(palette, colorUV); + // separate paths for full vs FG vs BG transparency + if ( theFgColorIndex < 0.99 && theBgColorIndex < 0.99 ) { + outColor.rgba = vec4(0.0, 0.0, 0.0, 0.0); + } else if ( theFgColorIndex < 0.99 ) { + // this produces a cut-out effect + outColor.a = (1.0 - outColor.a) * bgColorAlpha; + outColor.rgb = bgColor.rgb; + } else { + outColor.rgb *= fgColor.rgb; + bgColor.a *= bgColorAlpha; + // any totally transparent pixels in source get the BG color + outColor = mix(bgColor, outColor, outColor.a); + } + outColor.rgb *= brightness; + // apply "grain" for eg UI elements + vec4 grainColor = texture(grain, gl_FragCoord.xy * grainSize); + outColor.rgb += (0.5 - grainColor.rgb) * grainStrength; + // overall alpha + outColor.a *= alpha; +} diff --git a/shaders/renderable_v.glsl b/shaders/renderable_v.glsl new file mode 100644 index 0000000..36a9138 --- /dev/null +++ b/shaders/renderable_v.glsl @@ -0,0 +1,46 @@ +uniform mat4 projection; +uniform mat4 view; +uniform vec3 objectPosition; +uniform vec3 objectScale; +uniform int charMapWidth; +uniform int charMapHeight; + +uniform float charUVWidth; +uniform float charUVHeight; + +in vec3 vertPosition; +in float charIndex; +in vec2 uvMod; +in float fgColorIndex; +in float bgColorIndex; + +out vec2 texCoords; +out float theFgColorIndex; +out float theBgColorIndex; + +mat4 scale(float x, float y, float z) +{ + return mat4( + vec4(x, 0.0, 0.0, 0.0), + vec4(0.0, y, 0.0, 0.0), + vec4(0.0, 0.0, z, 0.0), + vec4(0.0, 0.0, 0.0, 1.0) + ); +} + +void main() +{ + vec4 model = vec4(vertPosition, 1); + model *= scale(objectScale.x, objectScale.y, objectScale.z); + model += vec4(objectPosition, 0); + gl_Position = projection * view * model; + // translate 1D character index into tile UV coordinates + // thanks Ian MacLarty, Sean Barrett and goldbuick for help with this! + float tileX = mod(charIndex, charMapWidth); + float tileY = charMapHeight - floor(charIndex / charMapWidth); + vec2 uv0 = vec2(tileX * charUVWidth, tileY * charUVHeight); + vec2 uv1 = vec2(uvMod.x * charUVWidth, uvMod.y * -charUVHeight); + texCoords = uv0 + uv1; + theFgColorIndex = fgColorIndex; + theBgColorIndex = bgColorIndex; +} diff --git a/shaders/sprite_f.glsl b/shaders/sprite_f.glsl new file mode 100644 index 0000000..96aa178 --- /dev/null +++ b/shaders/sprite_f.glsl @@ -0,0 +1,15 @@ +precision mediump float; + +uniform sampler2D texture0; +uniform float alpha; +uniform vec2 texScale; + +in vec2 theCoords; + +out vec4 outColor; + +void main() +{ + outColor = texture(texture0, theCoords.xy * texScale); + outColor.a *= alpha; +} diff --git a/shaders/sprite_v.glsl b/shaders/sprite_v.glsl new file mode 100644 index 0000000..e584f5b --- /dev/null +++ b/shaders/sprite_v.glsl @@ -0,0 +1,30 @@ +uniform mat4 projection; +uniform mat4 view; +uniform vec3 objectPosition; +uniform vec3 objectScale; + +in vec2 vertPosition; +//in vec2 vertCoords; + +out vec2 theCoords; + +mat4 scale(float x, float y, float z) +{ + return mat4( + vec4(x, 0.0, 0.0, 0.0), + vec4(0.0, y, 0.0, 0.0), + vec4(0.0, 0.0, z, 0.0), + vec4(0.0, 0.0, 0.0, 1.0) + ); +} + +void main() +{ + vec4 model = vec4(vertPosition, objectPosition.z, 1); + // scale and transform model + model *= scale(objectScale.x, objectScale.y, objectScale.z); + model += vec4(objectPosition, 0); + // apply camera + gl_Position = projection * view * model; + theCoords = vertPosition; +} diff --git a/texture.py b/texture.py new file mode 100644 index 0000000..24b5f34 --- /dev/null +++ b/texture.py @@ -0,0 +1,40 @@ +import numpy as np +from OpenGL import GL + +class Texture: + + # TODO: move texture data init to a set method to make hot reload trivial(?) + + mag_filter = GL.GL_NEAREST + min_filter = GL.GL_NEAREST + #min_filter = GL.GL_NEAREST_MIPMAP_NEAREST + packing = GL.GL_UNPACK_ALIGNMENT + + def __init__(self, data, width, height): + self.width, self.height = width, height + img_data = np.frombuffer(data, dtype=np.uint8) + self.gltex = GL.glGenTextures(1) + GL.glPixelStorei(self.packing, 1) + GL.glBindTexture(GL.GL_TEXTURE_2D, self.gltex) + self.set_filter(self.mag_filter, self.min_filter, False) + self.set_wrap(False, False) + GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, + GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, img_data) + if bool(GL.glGenerateMipmap): + GL.glGenerateMipmap(GL.GL_TEXTURE_2D) + + def set_filter(self, new_mag_filter, new_min_filter, bind_first=True): + if bind_first: + GL.glBindTexture(GL.GL_TEXTURE_2D, self.gltex) + GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, new_mag_filter) + GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, new_min_filter) + + def set_wrap(self, new_wrap, bind_first=True): + if bind_first: + GL.glBindTexture(GL.GL_TEXTURE_2D, self.gltex) + wrap = GL.GL_REPEAT if new_wrap else GL.GL_CLAMP_TO_EDGE + GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, wrap) + GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, wrap) + + def destroy(self): + GL.glDeleteTextures([self.gltex]) diff --git a/ui.py b/ui.py new file mode 100644 index 0000000..9e14538 --- /dev/null +++ b/ui.py @@ -0,0 +1,791 @@ +import sdl2 +import numpy as np +from PIL import Image +from OpenGL import GL + +from texture import Texture +from ui_element import UIArt, FPSCounterUI, MessageLineUI, DebugTextUI, GameSelectionLabel, GameHoverLabel, ToolTip +from ui_console import ConsoleUI +from ui_status_bar import StatusBarUI +from ui_popup import ToolPopup +from ui_menu_bar import ArtMenuBar, GameMenuBar +from ui_menu_pulldown import PulldownMenu +from ui_edit_panel import EditListPanel +from ui_object_panel import EditObjectPanel +from ui_colors import UIColors +from ui_tool import PencilTool, EraseTool, GrabTool, RotateTool, TextTool, SelectTool, PasteTool, FillTool +from ui_toolbar import ArtToolBar +from art import UV_NORMAL, UV_ROTATE90, UV_ROTATE180, UV_ROTATE270, UV_FLIPX, UV_FLIPY, UV_FLIP90, UV_FLIP270, uv_names +from edit_command import EditCommand, EditCommandTile, EntireArtCommand + +UI_ASSET_DIR = 'ui/' +SCALE_INCREMENT = 0.25 +# spacing factor of each non-active document's scale from active document +MDI_MARGIN = 1.1 + +# overlay image scale types +OIS_WIDTH = 0 +OIS_HEIGHT = 1 +OIS_FILL = 2 + + +class UI: + + # user-configured UI scale factor + scale = 1.0 + max_onion_alpha = 0.5 + charset_name = 'ui' + palette_name = 'c64_original' + # red color for warnings + error_color_index = UIColors.brightred + # low-contrast background texture that distinguishes UI from flat color + grain_texture_path = UI_ASSET_DIR + 'bgnoise_alpha.png' + # expose to classes that don't want to import this module + asset_dir = UI_ASSET_DIR + visible = True + logg = False + popup_hold_to_show = False + flip_affects_xforms = True + tool_classes = [ PencilTool, EraseTool, GrabTool, RotateTool, TextTool, + SelectTool, PasteTool, FillTool ] + tool_selected_log = 'tool selected' + art_selected_log = 'Now editing' + frame_selected_log = 'Now editing frame %s (hold time %ss)' + layer_selected_log = 'Now editing layer: %s' + swap_color_log = 'Swapped FG/BG colors' + affects_char_on_log = 'will affect characters' + affects_char_off_log = 'will not affect characters' + affects_fg_on_log = 'will affect foreground colors' + affects_fg_off_log = 'will not affect foreground colors' + affects_bg_on_log = 'will affect background colors' + affects_bg_off_log = 'will not affect background colors' + affects_xform_on_log = 'will affect character rotation/flip' + affects_xform_off_log = 'will not affect character rotation/flip' + xform_selected_log = 'Selected character transform:' + show_edit_ui_log = 'Edit UI hidden, press %s to unhide.' + + def __init__(self, app, active_art): + self.app = app + # the current art being edited + self.active_art = active_art + # dialog box set here + self.active_dialog = None + # keyboard-navigabnle element with current focus + self.keyboard_focus_element = None + # easy color index lookups + self.colors = UIColors() + # for UI, view /and/ projection matrix are identity + # (aspect correction is done in set_scale) + self.view_matrix = np.eye(4, 4, dtype=np.float32) + self.charset = self.app.load_charset(self.charset_name, False) + self.palette = self.app.load_palette(self.palette_name, False) + # currently selected char, fg color, bg color, xform - from art + self.selected_char = self.active_art.selected_char + self.selected_fg_color = self.active_art.selected_fg_color + self.selected_bg_color = self.active_art.selected_bg_color + self.selected_xform = self.active_art.selected_xform + self.selected_tool, self.previous_tool = None, None + # set True when tool settings change, cleared after update, used by + # cursor to determine if cursor update needed + self.tool_settings_changed = False + self.tools = [] + # create tools + for t in self.tool_classes: + new_tool = t(self) + tool_name = '%s_tool' % new_tool.name + setattr(self, tool_name, new_tool) + # stick in a list for popup tool tab + self.tools.append(new_tool) + self.selected_tool = self.pencil_tool + # clipboard: list of EditCommandTiles, set by cut/copy, used by paste + self.clipboard = [] + # track clipboard contents' size so we don't have to recompute it every + # cursor preview update + self.clipboard_width = 0 + self.clipboard_height = 0 + # create elements + self.elements = [] + self.hovered_elements = [] + # set geo sizes, force scale update + self.set_scale(self.scale) + self.fps_counter = FPSCounterUI(self) + self.console = ConsoleUI(self) + self.status_bar = StatusBarUI(self) + self.popup = ToolPopup(self) + self.message_line = MessageLineUI(self) + self.debug_text = DebugTextUI(self) + self.pulldown = PulldownMenu(self) + self.tooltip = ToolTip(self) + self.menu_bar = None + self.art_menu_bar = ArtMenuBar(self) + self.game_menu_bar = GameMenuBar(self) + self.menu_bar = self.art_menu_bar + self.art_toolbar = ArtToolBar(self) + self.edit_list_panel = EditListPanel(self) + self.edit_object_panel = EditObjectPanel(self) + self.game_selection_label = GameSelectionLabel(self) + self.game_hover_label = GameHoverLabel(self) + self.elements += [self.fps_counter, self.status_bar, self.popup, + self.message_line, self.debug_text, self.pulldown, + self.art_menu_bar, self.game_menu_bar, self.tooltip, + self.art_toolbar, + self.edit_list_panel, self.edit_object_panel, + self.game_hover_label, self.game_selection_label] + # add console last so it draws last + self.elements.append(self.console) + # grain texture + img = Image.open(self.grain_texture_path) + img = img.convert('RGBA') + width, height = img.size + self.grain_texture = Texture(img.tobytes(), width, height) + self.grain_texture.set_wrap(True) + self.grain_texture.set_filter(GL.GL_LINEAR, GL.GL_LINEAR_MIPMAP_LINEAR) + # update elements that weren't created when UI scale was determined + self.set_elements_scale() + # if editing is disallowed, hide game mode UI + if not self.app.can_edit: + self.set_game_edit_ui_visibility(False) + + def set_scale(self, new_scale): + old_scale = self.scale + self.scale = new_scale + # update UI renderable geo sizes for new scale + # determine width and height of current window in chars + # use floats, window might be a fractional # of chars wide/tall + aspect = float(self.app.window_width) / self.app.window_height + inv_aspect = float(self.app.window_height) / self.app.window_width + # MAYBE-TODO: this math is correct but hard to follow, rewrite for clarity + width = self.app.window_width / (self.charset.char_width * self.scale * inv_aspect) + height = self.app.window_height / (self.charset.char_height * self.scale * inv_aspect) + # any new UI elements created should use new scale + UIArt.quad_width = 2 / width * aspect + UIArt.quad_height = 2 / height * aspect + self.width_tiles = width * (inv_aspect / self.scale) + self.height_tiles = height / self.scale + # tell elements to refresh + self.set_elements_scale() + if self.scale != old_scale: + self.message_line.post_line('UI scale is now %s (%.3f x %.3f)' % (self.scale, self.width_tiles, self.height_tiles)) + + def set_elements_scale(self): + for e in self.elements: + e.art.quad_width, e.art.quad_height = UIArt.quad_width, UIArt.quad_height + # Art dimensions may well need to change + e.reset_art() + e.reset_loc() + e.art.geo_changed = True + + def window_resized(self): + # recalc renderables' quad size (same scale, different aspect) + self.set_scale(self.scale) + + def size_and_position_overlay_image(self): + # called any time active art changes, or active art changes size + r = self.app.overlay_renderable + if not r: + return + # scale aspect based on user setting + aspect = float(r.texture.width) / r.texture.height + if self.app.overlay_scale_type == OIS_WIDTH: + r.scale_x = self.active_art.width * self.active_art.quad_width + r.scale_y = r.scale_x / aspect + elif self.app.overlay_scale_type == OIS_HEIGHT: + r.scale_y = self.active_art.height * self.active_art.quad_height + r.scale_x = r.scale_y * aspect + elif self.app.overlay_scale_type == OIS_FILL: + r.scale_x = self.active_art.width * self.active_art.quad_width + r.scale_y = self.active_art.height * self.active_art.quad_height + r.y = -r.scale_y + r.z = self.active_art.layers_z[self.active_art.active_layer] + + def set_active_art(self, new_art): + self.active_art = new_art + new_charset = self.active_art.charset + new_palette = self.active_art.palette + # make sure selection isn't out of bounds in new art + old_selection = self.select_tool.selected_tiles.copy() + for tile in old_selection: + x, y = tile[0], tile[1] + if x >= new_art.width or y >= new_art.height: + self.select_tool.selected_tiles.pop(tile, None) + # keep cursor in bounds + self.app.cursor.clamp_to_active_art() + # set camera bounds based on art size + self.app.camera.set_for_art(new_art) + # set for popup + self.popup.set_active_charset(new_charset) + self.popup.set_active_palette(new_palette) + # if popup up eg toggled, redraw it completely + if self.popup.visible: + self.popup.reset_art() + self.popup.reset_loc() + # set to art's selected tile attributes + self.selected_char = self.active_art.selected_char + self.selected_fg_color = self.active_art.selected_fg_color + self.selected_bg_color = self.active_art.selected_bg_color + self.selected_xform = self.active_art.selected_xform + self.reset_onion_frames() + self.reset_edit_renderables() + # now that renderables are moved, rescale/reposition grid + self.app.grid.reset() + # rescale/reposition overlay image + self.size_and_position_overlay_image() + # tell select tool renderables + for r in [self.select_tool.select_renderable, + self.select_tool.drag_renderable]: + r.quad_size_ref = new_art + r.rebuild_geo(self.select_tool.selected_tiles) + self.app.update_window_title() + if self.app.can_edit: + self.message_line.post_line('%s %s' % (self.art_selected_log, self.active_art.filename)) + + def set_active_art_by_filename(self, art_filename): + for i,art in enumerate(self.app.art_loaded_for_edit): + if art_filename == art.filename: + break + new_active_art = self.app.art_loaded_for_edit.pop(i) + self.app.art_loaded_for_edit.insert(0, new_active_art) + new_active_renderable = self.app.edit_renderables.pop(i) + self.app.edit_renderables.insert(0, new_active_renderable) + self.set_active_art(new_active_art) + + def previous_active_art(self): + "cycles to next art in app.art_loaded_for_edit" + if len(self.app.art_loaded_for_edit) == 1: + return + next_active_art = self.app.art_loaded_for_edit.pop(-1) + self.app.art_loaded_for_edit.insert(0, next_active_art) + next_active_renderable = self.app.edit_renderables.pop(-1) + self.app.edit_renderables.insert(0, next_active_renderable) + self.set_active_art(self.app.art_loaded_for_edit[0]) + + def next_active_art(self): + if len(self.app.art_loaded_for_edit) == 1: + return + last_active_art = self.app.art_loaded_for_edit.pop(0) + self.app.art_loaded_for_edit.append(last_active_art) + last_active_renderable = self.app.edit_renderables.pop(0) + self.app.edit_renderables.append(last_active_renderable) + self.set_active_art(self.app.art_loaded_for_edit[0]) + + def set_selected_tool(self, new_tool): + if self.app.game_mode: + return + # don't re-select same tool, except to cycle fill tool (see below) + if new_tool == self.selected_tool and not type(new_tool) is FillTool: + return + # bail out of text entry if active + if self.selected_tool is self.text_tool: + self.text_tool.finish_entry() + self.previous_tool = self.selected_tool + self.selected_tool = new_tool + self.popup.reset_art() + self.tool_settings_changed = True + # special case: + # if we're selecting the fill tool and it's already selected, + # cycle through its 3 modes (char/fg/bg boundary) + cycled_fill = False + if type(self.selected_tool) is FillTool and \ + type(self.previous_tool) is FillTool: + self.selected_tool.boundary_mode = self.selected_tool.next_boundary_modes[self.selected_tool.boundary_mode] + # TODO: do we need a message line message for this? + #self.app.log(self.selected_tool.boundary_mode) + cycled_fill = True + # close menu if we selected tool from it + if self.menu_bar.active_menu_name and not cycled_fill: + self.menu_bar.close_active_menu() + self.message_line.post_line('%s %s' % (self.selected_tool.get_button_caption(), self.tool_selected_log)) + + def cycle_fill_tool_mode(self): + self.set_selected_tool(self.fill_tool) + + def get_longest_tool_name_length(self): + "VERY specific function to help status bar draw its buttons" + longest = 0 + for tool in self.tools: + if len(tool.button_caption) > longest: + longest = len(tool.button_caption) + return longest + + def cycle_selected_tool(self, back=False): + if not self.active_art: + return + tool_index = self.tools.index(self.selected_tool) + if back: + tool_index -= 1 + else: + tool_index += 1 + tool_index %= len(self.tools) + self.set_selected_tool(self.tools[tool_index]) + + def set_selected_xform(self, new_xform): + self.selected_xform = new_xform + self.popup.set_xform(new_xform) + self.tool_settings_changed = True + line = '%s %s' % (self.xform_selected_log, uv_names[self.selected_xform]) + self.message_line.post_line(line) + + def cycle_selected_xform(self, back=False): + if self.app.game_mode: return + xform = self.selected_xform + if back: + xform -= 1 + else: + xform += 1 + xform %= UV_FLIP270 + 1 + self.set_selected_xform(xform) + + def reset_onion_frames(self, new_art=None): + "set correct visibility, frame, and alpha for all onion renderables" + new_art = new_art or self.active_art + alpha = self.max_onion_alpha + total_onion_frames = 0 + def set_onion(r, new_frame, alpha): + # scale back if fewer than MAX_ONION_FRAMES in either direction + if total_onion_frames >= new_art.frames: + r.visible = False + return + r.visible = True + if not new_art is r.art: + r.set_art(new_art) + r.set_frame(new_frame) + r.alpha = alpha + # make BG dimmer so it's easier to see + r.bg_alpha = alpha / 2 + # populate "next" frames first + for i,r in enumerate(self.app.onion_renderables_next): + total_onion_frames += 1 + new_frame = new_art.active_frame + i + 1 + set_onion(r, new_frame, alpha) + alpha /= 2 + #print('next onion %s set to frame %s alpha %s' % (i, new_frame, alpha)) + alpha = self.max_onion_alpha + for i,r in enumerate(self.app.onion_renderables_prev): + total_onion_frames += 1 + new_frame = new_art.active_frame - (i + 1) + set_onion(r, new_frame, alpha) + # each successive onion layer is dimmer + alpha /= 2 + #print('previous onion %s set to frame %s alpha %s' % (i, new_frame, alpha)) + + def set_active_frame(self, new_frame): + if not self.active_art.set_active_frame(new_frame): + return + self.reset_onion_frames() + self.tool_settings_changed = True + frame = self.active_art.active_frame + delay = self.active_art.frame_delays[frame] + if self.app.can_edit: + self.message_line.post_line(self.frame_selected_log % (frame + 1, delay)) + + def set_active_layer(self, new_layer): + self.active_art.set_active_layer(new_layer) + z = self.active_art.layers_z[self.active_art.active_layer] + self.app.grid.z = z + self.select_tool.select_renderable.z = z + self.select_tool.drag_renderable.z = z + self.app.cursor.z = z + self.app.update_window_title() + self.tool_settings_changed = True + layer_name = self.active_art.layer_names[self.active_art.active_layer] + if self.app.can_edit: + self.message_line.post_line(self.layer_selected_log % layer_name) + self.size_and_position_overlay_image() + + def select_char(self, new_char_index): + if not self.active_art: + return + # wrap at last valid index + self.selected_char = new_char_index % self.active_art.charset.last_index + # only update char tooltip if it was already up; avoid stomping others + char_cycle_button = self.status_bar.button_map['char_cycle'] + char_toggle_button = self.status_bar.button_map['char_toggle'] + if char_cycle_button in self.status_bar.hovered_buttons or \ + char_toggle_button in self.status_bar.hovered_buttons: + char_toggle_button.update_tooltip() + self.tool_settings_changed = True + + def select_color(self, new_color_index, fg): + "common code for select_fg/bg" + if not self.active_art: + return + new_color_index %= len(self.active_art.palette.colors) + if fg: + self.selected_fg_color = new_color_index + else: + self.selected_bg_color = new_color_index + # same don't-stomp-another-tooltip check as above + toggle_button = self.status_bar.button_map['fg_toggle'] if fg else self.status_bar.button_map['bg_toggle'] + cycle_button = self.status_bar.button_map['fg_cycle'] if fg else self.status_bar.button_map['bg_cycle'] + if toggle_button in self.status_bar.hovered_buttons or \ + cycle_button in self.status_bar.hovered_buttons: + toggle_button.update_tooltip() + self.tool_settings_changed = True + + def select_fg(self, new_fg_index): + self.select_color(new_fg_index, True) + + def select_bg(self, new_bg_index): + self.select_color(new_bg_index, False) + + def swap_fg_bg_colors(self): + if self.app.game_mode: + return + fg, bg = self.selected_fg_color, self.selected_bg_color + self.selected_fg_color, self.selected_bg_color = bg, fg + self.tool_settings_changed = True + self.message_line.post_line(self.swap_color_log) + + def cut_selection(self): + self.copy_selection() + self.erase_tiles_in_selection() + + def erase_selection_or_art(self): + if len(self.select_tool.selected_tiles) > 0: + self.erase_tiles_in_selection() + return + self.select_all() + self.erase_tiles_in_selection() + self.select_none() + + def erase_tiles_in_selection(self): + # create and commit command group to clear all tiles in selection + frame, layer = self.active_art.active_frame, self.active_art.active_layer + new_command = EditCommand(self.active_art) + for tile in self.select_tool.selected_tiles: + new_tile_command = EditCommandTile(self.active_art) + new_tile_command.set_tile(frame, layer, *tile) + b_char, b_fg, b_bg, b_xform = self.active_art.get_tile_at(frame, layer, *tile) + new_tile_command.set_before(b_char, b_fg, b_bg, b_xform) + a_char = a_fg = 0 + a_xform = UV_NORMAL + # clear to current BG + a_bg = self.selected_bg_color + new_tile_command.set_after(a_char, a_fg, a_bg, a_xform) + new_command.add_command_tiles([new_tile_command]) + new_command.apply() + self.active_art.command_stack.commit_commands([new_command]) + self.active_art.set_unsaved_changes(True) + + def copy_selection(self): + # convert current selection tiles (active frame+layer) into + # EditCommandTiles for Cursor.preview_edits + # (via PasteTool get_paint_commands) + self.clipboard = [] + frame, layer = self.active_art.active_frame, self.active_art.active_layer + min_x, min_y = 9999, 9999 + max_x, max_y = -1, -1 + for tile in self.select_tool.selected_tiles: + x, y = tile[0], tile[1] + if x < min_x: + min_x = x + elif x > max_x: + max_x = x + if y < min_y: + min_y = y + elif y > max_y: + max_y = y + art = self.active_art + new_tile_command = EditCommandTile(art) + new_tile_command.set_tile(frame, layer, x, y) + a_char, a_fg, a_bg, a_xform = art.get_tile_at(frame, layer, x, y) + # set data as "after" state, before will be set by cursor hover + new_tile_command.set_after(a_char, a_fg, a_bg, a_xform) + self.clipboard.append(new_tile_command) + # rebase tiles at top left corner of clipboard tiles + for tile_command in self.clipboard: + x = tile_command.x - min_x + y = tile_command.y - min_y + tile_command.set_tile(frame, layer, x, y) + self.clipboard_width = max_x - min_x + self.clipboard_height = max_y - min_y + + def crop_to_selection(self, art): + # ignore non-rectangular selection features, use top left and bottom + # right corners + if len(self.select_tool.selected_tiles) == 0: + return + min_x, max_x = 99999, -1 + min_y, max_y = 99999, -1 + for tile in self.select_tool.selected_tiles: + x, y = tile[0], tile[1] + if x < min_x: + min_x = x + elif x > max_x: + max_x = x + if y < min_y: + min_y = y + elif y > max_y: + max_y = y + w = max_x - min_x + 1 + h = max_y - min_y + 1 + # create command for undo/redo + command = EntireArtCommand(art, min_x, min_y) + command.save_tiles(before=True) + art.resize(w, h, min_x, min_y) + self.app.log('Resized %s to %s x %s' % (art.filename, w, h)) + art.set_unsaved_changes(True) + # clear selection to avoid having tiles we know are OoB selected + self.select_tool.selected_tiles = {} + self.adjust_for_art_resize(art) + # commit command + command.save_tiles(before=False) + art.command_stack.commit_commands([command]) + + def reset_edit_renderables(self): + # reposition all art renderables and change their opacity + x, y = 0, 0 + for i,r in enumerate(self.app.edit_renderables): + # always put active art at 0,0 + if r in self.active_art.renderables: + r.alpha = 1 + # if game mode, don't lerp + if self.app.game_mode: + r.snap_to(0, 0, 0) + else: + r.move_to(0, 0, 0, 0.2) + else: + r.alpha = 0.5 + if self.app.game_mode: + # shift arts progressively further back + r.snap_to(x, y, -i) + else: + r.move_to(x * MDI_MARGIN, 0, -i, 0.2) + x += r.art.width * r.art.quad_width + y -= r.art.height * r.art.quad_height + + def adjust_for_art_resize(self, art): + if art is not self.active_art: + return + # update grid, camera, cursor, overlay + self.app.camera.set_for_art(art) + self.app.camera.toggle_zoom_extents(override=True) + self.size_and_position_overlay_image() + self.reset_edit_renderables() + self.app.grid.reset() + if self.app.cursor.x > art.width: + self.app.cursor.x = art.width + if self.app.cursor.y > art.height: + self.app.cursor.y = art.height + self.app.cursor.moved = True + + def resize_art(self, art, new_width, new_height, origin_x, origin_y, bg_fill): + # create command for undo/redo + command = EntireArtCommand(art, origin_x, origin_y) + command.save_tiles(before=True) + # resize + art.resize(new_width, new_height, origin_x, origin_y, bg_fill) + self.adjust_for_art_resize(art) + # commit command + command.save_tiles(before=False) + art.command_stack.commit_commands([command]) + art.set_unsaved_changes(True) + + def select_none(self): + self.select_tool.selected_tiles = {} + + def select_all(self): + self.select_tool.selected_tiles = {} + for y in range(self.active_art.height): + for x in range(self.active_art.width): + self.select_tool.selected_tiles[(x, y)] = True + + def invert_selection(self): + old_selection = self.select_tool.selected_tiles.copy() + self.select_tool.selected_tiles = {} + for y in range(self.active_art.height): + for x in range(self.active_art.width): + if not old_selection.get((x, y), False): + self.select_tool.selected_tiles[(x, y)] = True + + def get_screen_coords(self, window_x, window_y): + x = (2 * window_x) / self.app.window_width - 1 + y = (-2 * window_y) / self.app.window_height + 1 + return x, y + + def update(self): + self.select_tool.update() + # window coordinates -> OpenGL coordinates + mx, my = self.get_screen_coords(self.app.mouse_x, self.app.mouse_y) + # test elements for hover + was_hovering = self.hovered_elements[:] + self.hovered_elements = [] + for e in self.elements: + # don't hover anything while console is up + if self.console.visible: + continue + # only check visible elements + if self.app.has_mouse_focus and e.is_visible() and e.can_hover and e.is_inside(mx, my): + self.hovered_elements.append(e) + # only hover if we weren't last update + if not e in was_hovering: + e.hovered() + for e in was_hovering: + # unhover if app window loses mouse focus + if not self.app.has_mouse_focus or not e in self.hovered_elements: + e.unhovered() + # update all elements, regardless of whether they're being hovered etc + for e in self.elements: + # don't update invisible items + if e.is_visible() or e.update_when_invisible: + e.update() + # art update: tell renderables to refresh buffers + e.art.update() + self.tool_settings_changed = False + + def clicked(self, mouse_button): + handled = False + # return True if any button handled the input + for e in self.hovered_elements: + if not e.is_visible(): + continue + if e.clicked(mouse_button): + handled = True + # close pulldown if clicking outside it / the menu bar + if self.pulldown.visible and not self.pulldown in self.hovered_elements and not self.menu_bar in self.hovered_elements: + self.menu_bar.close_active_menu() + return handled + + def unclicked(self, mouse_button): + handled = False + for e in self.hovered_elements: + if e.unclicked(mouse_button): + handled = True + return handled + + def wheel_moved(self, wheel_y): + handled = False + # use wheel to scroll chooser dialogs + # TODO: look up "up arrow" bind instead? how to get + # an SDL keycode from that? + if self.active_dialog: + keycode = sdl2.SDLK_UP if wheel_y > 0 else sdl2.SDLK_DOWN + self.active_dialog.handle_input(keycode, + self.app.il.shift_pressed, + self.app.il.alt_pressed, + self.app.il.ctrl_pressed) + handled = True + elif len(self.hovered_elements) > 0: + for e in self.hovered_elements: + if e.wheel_moved(wheel_y): + handled = True + return handled + + def quick_grab(self): + if self.app.game_mode: + return + if self.console.visible or self.popup in self.hovered_elements: + return + self.grab_tool.grab() + self.tool_settings_changed = True + + def undo(self): + # if still painting, finish + if self.app.cursor.current_command: + self.app.cursor.finish_paint() + self.active_art.command_stack.undo() + self.active_art.set_unsaved_changes(True) + + def redo(self): + self.active_art.command_stack.redo() + + def open_dialog(self, dialog_class, options={}): + if self.app.game_mode and not dialog_class.game_mode_visible: + return + dialog = dialog_class(self, options) + self.active_dialog = dialog + self.keyboard_focus_element = self.active_dialog + # insert dialog at index 0 so it draws first instead of last + #self.elements.insert(0, dialog) + self.elements.remove(self.console) + self.elements.append(dialog) + self.elements.append(self.console) + + def is_game_edit_ui_visible(self): + return self.game_menu_bar.visible + + def set_game_edit_ui_visibility(self, visible, show_message=True): + self.game_menu_bar.visible = visible + self.edit_list_panel.visible = visible + self.edit_object_panel.visible = visible + if not visible: + # relinquish keyboard focus in play mode + self.keyboard_focus_element = None + if show_message and self.app.il: + bind = self.app.il.get_command_shortcut('toggle_game_edit_ui') + bind = bind.title() + self.message_line.post_line(self.show_edit_ui_log % bind, 10) + else: + self.message_line.post_line('') + self.app.update_window_title() + + def object_selection_changed(self): + if len(self.app.gw.selected_objects) == 0: + self.keyboard_focus_element = None + self.refocus_keyboard() + + def switch_edit_panel_focus(self, reverse=False): + # only allow tabbing away if list panel is in allowed mode + lp = self.edit_list_panel + if self.keyboard_focus_element is lp and \ + lp.list_operation in lp.list_operations_allow_kb_focus and \ + self.active_dialog: + self.keyboard_focus_element = self.active_dialog + # prevent any other tabbing away from active dialog + if self.active_dialog: + return + # cycle keyboard focus between possible panels + focus_elements = [None] + if self.edit_list_panel.is_visible(): + focus_elements.append(self.edit_list_panel) + if self.edit_object_panel.is_visible(): + focus_elements.append(self.edit_object_panel) + if len(focus_elements) == 1: + return + focus_elements.append(None) + # handle shift-tab + if reverse: + focus_elements.reverse() + for i,element in enumerate(focus_elements[:-1]): + if self.keyboard_focus_element is element: + self.keyboard_focus_element = focus_elements[i+1] + break + # update keyboard hover for both + self.edit_object_panel.update_keyboard_hover() + self.edit_list_panel.update_keyboard_hover() + + def refocus_keyboard(self): + "called when an element closes, sets new keyboard_focus_element" + if self.active_dialog: + self.keyboard_focus_element = self.active_dialog + if self.keyboard_focus_element: + return + if self.popup.visible: + self.keyboard_focus_element = self.popup + elif self.pulldown.visible: + self.keyboard_focus_element = self.pulldown + elif self.edit_list_panel.is_visible() and not self.edit_object_panel.is_visible(): + self.keyboard_focus_element = self.edit_list_panel + elif self.edit_object_panel.is_visible() and not self.edit_list_panel.is_visible(): + self.keyboard_focus_element = self.edit_object_panel + + def keyboard_navigate(self, move_x, move_y): + self.keyboard_focus_element.keyboard_navigate(move_x, move_y) + + def toggle_game_edit_ui(self): + # if editing is disallowed, only run this once to disable UI + if not self.app.can_edit: + return + elif not self.app.game_mode: + return + self.set_game_edit_ui_visibility(not self.game_menu_bar.visible) + + def destroy(self): + for e in self.elements: + e.destroy() + self.grain_texture.destroy() + + def render(self): + for e in self.elements: + if e.is_visible(): + e.render() diff --git a/ui/bgnoise.xcf b/ui/bgnoise.xcf new file mode 100644 index 0000000..5062539 Binary files /dev/null and b/ui/bgnoise.xcf differ diff --git a/ui/bgnoise_alpha.png b/ui/bgnoise_alpha.png new file mode 100644 index 0000000..1c1164c Binary files /dev/null and b/ui/bgnoise_alpha.png differ diff --git a/ui/icon.png b/ui/icon.png new file mode 100644 index 0000000..e8eafd2 Binary files /dev/null and b/ui/icon.png differ diff --git a/ui/logo.png b/ui/logo.png new file mode 100644 index 0000000..3bbfbd3 Binary files /dev/null and b/ui/logo.png differ diff --git a/ui/playscii.icns b/ui/playscii.icns new file mode 100644 index 0000000..05c94b8 Binary files /dev/null and b/ui/playscii.icns differ diff --git a/ui/playscii.ico b/ui/playscii.ico new file mode 100644 index 0000000..948d3aa Binary files /dev/null and b/ui/playscii.ico differ diff --git a/ui/tool_erase.png b/ui/tool_erase.png new file mode 100644 index 0000000..bc63d89 Binary files /dev/null and b/ui/tool_erase.png differ diff --git a/ui/tool_fill_bg.png b/ui/tool_fill_bg.png new file mode 100644 index 0000000..6e545dd Binary files /dev/null and b/ui/tool_fill_bg.png differ diff --git a/ui/tool_fill_char.png b/ui/tool_fill_char.png new file mode 100644 index 0000000..26ec516 Binary files /dev/null and b/ui/tool_fill_char.png differ diff --git a/ui/tool_fill_fg.png b/ui/tool_fill_fg.png new file mode 100644 index 0000000..090a2c9 Binary files /dev/null and b/ui/tool_fill_fg.png differ diff --git a/ui/tool_grab.png b/ui/tool_grab.png new file mode 100644 index 0000000..df86da8 Binary files /dev/null and b/ui/tool_grab.png differ diff --git a/ui/tool_paint.png b/ui/tool_paint.png new file mode 100644 index 0000000..3ef7d2e Binary files /dev/null and b/ui/tool_paint.png differ diff --git a/ui/tool_paste.png b/ui/tool_paste.png new file mode 100644 index 0000000..2d6076b Binary files /dev/null and b/ui/tool_paste.png differ diff --git a/ui/tool_rotate.png b/ui/tool_rotate.png new file mode 100644 index 0000000..72b1cbe Binary files /dev/null and b/ui/tool_rotate.png differ diff --git a/ui/tool_select.png b/ui/tool_select.png new file mode 100644 index 0000000..c4c22f0 Binary files /dev/null and b/ui/tool_select.png differ diff --git a/ui/tool_select_add.png b/ui/tool_select_add.png new file mode 100644 index 0000000..2993f34 Binary files /dev/null and b/ui/tool_select_add.png differ diff --git a/ui/tool_select_sub.png b/ui/tool_select_sub.png new file mode 100644 index 0000000..8798067 Binary files /dev/null and b/ui/tool_select_sub.png differ diff --git a/ui/tool_text.png b/ui/tool_text.png new file mode 100644 index 0000000..c0b78d0 Binary files /dev/null and b/ui/tool_text.png differ diff --git a/ui_art_dialog.py b/ui_art_dialog.py new file mode 100644 index 0000000..7e34f0a --- /dev/null +++ b/ui_art_dialog.py @@ -0,0 +1,770 @@ +import os.path + +from ui_dialog import UIDialog, Field +from ui_chooser_dialog import ChooserDialog, ChooserItemButton, ChooserItem + +from ui_console import OpenCommand, SaveCommand +from art import ART_DIR, ART_FILE_EXTENSION, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FRAME_DELAY, DEFAULT_LAYER_Z_OFFSET +from palette import PaletteFromFile + + +class BaseFileDialog(UIDialog): + + invalid_filename_error = 'Filename is not valid.' + filename_exists_error = 'File by that name already exists.' + + def get_file_extension(self): + return '' + + def get_dir(self): + return '' + + def get_full_filename(self, filename, dir=None): + for forbidden_char in self.ui.app.forbidden_filename_chars: + if forbidden_char in filename: + return + full_filename = self.get_dir() + '/' + filename + full_filename += '.' + self.get_file_extension() + return full_filename + + def is_filename_valid(self, field_number): + filename = self.field_texts[field_number].strip() + # filename can't be only whitespace + if not filename: + return False, self.invalid_filename_error + full_filename = self.get_full_filename(filename) + if not full_filename: + return False, self.invalid_filename_error + # if file exists, allow saving but show the warning + if os.path.exists(full_filename): + return True, self.filename_exists_error + return True, None + +class NewArtDialog(BaseFileDialog): + + title = 'New art' + field0_label = 'Filename of new art:' + field2_label = 'Width:' + field4_label = 'Height:' + field6_label = 'Save folder:' + field7_label = ' %s' + tile_width = 60 + field0_width = 56 + y_spacing = 0 + field1_width = field2_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=str, width=field0_width, oneline=False), + Field(label='', type=None, width=0, oneline=True), + Field(label=field2_label, type=int, width=field1_width, oneline=True), + Field(label='', type=None, width=0, oneline=True), + Field(label=field4_label, type=int, width=field2_width, oneline=True), + Field(label='', type=None, width=0, oneline=True), + Field(label=field6_label, type=None, width=0, oneline=True), + Field(label=field7_label, type=None, width=0, oneline=True), + Field(label='', type=None, width=0, oneline=True) + ] + confirm_caption = 'Create' + invalid_width_error = 'Invalid width.' + invalid_height_error = 'Invalid height.' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return 'new%s' % len(self.ui.app.art_loaded_for_edit) + elif field_number == 2: + return str(DEFAULT_WIDTH) + elif field_number == 4: + return str(DEFAULT_HEIGHT) + return '' + + def get_field_label(self, field_index): + label = self.fields[field_index].label + # show dir art will be saved into + if field_index == 7: + label %= self.get_dir() + return label + + def get_file_extension(self): + return ART_FILE_EXTENSION + + def get_dir(self): + return self.ui.app.documents_dir + ART_DIR + + def is_input_valid(self): + "warn if file already exists, dimensions must be >0 and <= max" + if not self.is_valid_dimension(self.field_texts[2], self.ui.app.max_art_width): + return False, self.invalid_width_error + if not self.is_valid_dimension(self.field_texts[4], self.ui.app.max_art_height): + return False, self.invalid_height_error + return self.is_filename_valid(0) + + def is_valid_dimension(self, dimension, max_dimension): + try: dimension = int(dimension) + except: return False + return 0 < dimension <= max_dimension + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + name = self.field_texts[0] + w, h = int(self.field_texts[2]), int(self.field_texts[4]) + self.ui.app.new_art_for_edit(name, w, h) + self.ui.app.log('Created %s.psci with size %s x %s' % (name, w, h)) + self.dismiss() + + +class SaveAsDialog(BaseFileDialog): + + title = 'Save art' + field0_label = 'New filename for art:' + field2_label = 'Save folder:' + field3_label = ' %s' + tile_width = 60 + field0_width = 56 + y_spacing = 0 + fields = [ + Field(label=field0_label, type=str, width=field0_width, oneline=False), + Field(label='', type=None, width=0, oneline=True), + Field(label=field2_label, type=None, width=0, oneline=True), + Field(label=field3_label, type=None, width=0, oneline=True), + Field(label='', type=None, width=0, oneline=True) + ] + confirm_caption = 'Save' + always_redraw_labels = True + + def get_initial_field_text(self, field_number): + if field_number == 0: + # special case: if opening playscii/art/new, change + # it to documents dir to avoid writing to application dir + # (still possible if you open other files) + if os.path.dirname(self.ui.active_art.filename) == ART_DIR[:-1]: + self.ui.active_art.filename = self.ui.app.documents_dir + self.ui.active_art.filename + # TODO: handle other files from app dir as well? not as important + filename = os.path.basename(self.ui.active_art.filename) + filename = os.path.splitext(filename)[0] + return filename + return '' + + def get_file_extension(self): + """ + Return file extension this dialog saves as; other dialogs + are based on this class so we don't want to hardcore .psci + """ + return ART_FILE_EXTENSION + + def get_dir(self): + return os.path.dirname(self.ui.active_art.filename) + + def get_field_label(self, field_index): + label = self.fields[field_index].label + # show dir art will be saved into + if field_index == 3: + label %= self.get_dir() + return label + + def is_input_valid(self): + return self.is_filename_valid(0) + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + SaveCommand.execute(self.ui.console, [self.field_texts[0]]) + self.dismiss() + +class ConvertItemButton(ChooserItemButton): + width = 15 + big_width = 20 + +class ConvertChooserItem(ChooserItem): + + def picked(self, element): + + # TODO: following is c+p'd from BaseFileChooserItem.picked, + # move this functionality into ChooserItem and override in BFCI? + + # if this is different from the last clicked item, pick it + if element.selected_item_index != self.index: + ChooserItem.picked(self, element) + element.first_selection_made = True + return + # if we haven't yet clicked something in this view, require another + # click before opening it (consistent double click behavior for + # initial selections) + if not element.first_selection_made: + element.first_selection_made = True + return + element.confirm_pressed() + element.first_selection_made = False + + def get_description_lines(self): + return self.description.split('\n') + +class ConvertFileDialog(ChooserDialog): + "Common functionality for importer and exporter selection dialogs" + tile_width, big_width = 85, 90 + tile_height, big_height = 15, 25 + confirm_caption = 'Choose' + show_preview_image = False + item_button_class = ConvertItemButton + chooser_item_class = ConvertChooserItem + + def get_converters(self): + return [] + + def get_items(self): + items = [] + converters = self.get_converters() + # sort alphabetically + converters.sort(key=lambda item: item.format_name.lower()) + i = 0 + for converter in converters: + item = self.chooser_item_class(i, converter.__name__) + item.converter_class = converter + item.label = converter.format_name + item.description = converter.format_description + items.append(item) + i += 1 + return items + + +class ImportFileDialog(ConvertFileDialog): + title = 'Choose an importer' + + def get_converters(self): + return self.ui.app.get_importers() + + def confirm_pressed(self): + # open file select dialog so user can choose what to import + item = self.get_selected_item() + self.ui.app.importer = item.converter_class + if not self.ui.app.importer: + return + self.dismiss() + self.ui.open_dialog(self.ui.app.importer.file_chooser_dialog_class) + +class ImportOptionsDialog(UIDialog): + "Generic base class for importer options" + confirm_caption = 'Import' + def do_import(app, filename, options): + "Common 'run importer' code for end of import options dialog" + # if importer needs no options, run it + importer = app.importer(app, filename, options) + if importer.success: + if app.importer.completes_instantly: + app.log('Imported %s successfully.' % filename) + app.importer = None + +class ExportOptionsDialog(UIDialog): + "Generic base class for exporter options" + confirm_caption = 'Export' + def do_export(app, filename, options): + "Common 'run exporter' code for end of import options dialog" + # if importer needs no options, run it + exporter = app.exporter(app, filename, options) + if exporter.success: + app.log('Exported %s successfully.' % exporter.out_filename) + +class ExportFileDialog(ConvertFileDialog): + title = 'Choose an exporter' + + def get_converters(self): + return self.ui.app.get_exporters() + + def confirm_pressed(self): + # open file select dialog so user can choose what to import + item = self.get_selected_item() + self.ui.app.exporter = item.converter_class + if not self.ui.app.exporter: + return + self.dismiss() + self.ui.open_dialog(ExportFilenameInputDialog) + + +class ExportFilenameInputDialog(SaveAsDialog): + title = 'Export art' + field0_label = 'New filename for exported art:' + confirm_caption = 'Export' + + def get_initial_field_text(self, field_number): + # base output filename on art filename + if field_number == 0: + out_filename = self.ui.active_art.filename + out_filename = os.path.basename(out_filename) + out_filename = os.path.splitext(out_filename)[0] + return out_filename + + def get_file_extension(self): + return self.ui.app.exporter.file_extension + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + filename = self.field_texts[0] + self.dismiss() + # invoke options dialog if exporter has one, else invoke exporter + if self.ui.app.exporter.options_dialog_class: + # pass filename into new dialog + options = {'filename': filename} + self.ui.open_dialog(self.ui.app.exporter.options_dialog_class, + options) + else: + ExportOptionsDialog.do_export(self.ui.app, filename, {}) + + +class QuitUnsavedChangesDialog(UIDialog): + + title = 'Unsaved changes' + message = 'Save changes to %s?' + confirm_caption = 'Save' + other_button_visible = True + other_caption = "Don't Save" + + def confirm_pressed(self): + SaveCommand.execute(self.ui.console, []) + self.dismiss() + # try again, see if another art has unsaved changes + self.ui.app.il.BIND_quit() + + def other_pressed(self): + # kind of a hack: make the check BIND_quit does come up false + # for this art. externalities fairly minor. + self.ui.active_art.unsaved_changes = False + self.dismiss() + self.ui.app.il.BIND_quit() + + def get_message(self): + # get base name (ie no dirs) + filename = os.path.basename(self.ui.active_art.filename) + return [self.message % filename] + + +class CloseUnsavedChangesDialog(QuitUnsavedChangesDialog): + + def confirm_pressed(self): + SaveCommand.execute(self.ui.console, []) + self.dismiss() + self.ui.app.il.BIND_close_art() + + def other_pressed(self): + self.ui.active_art.unsaved_changes = False + self.dismiss() + self.ui.app.il.BIND_close_art() + + +class RevertChangesDialog(UIDialog): + + title = 'Revert changes' + message = 'Revert changes to %s?' + confirm_caption = 'Revert' + + def confirm_pressed(self): + self.ui.app.revert_active_art() + self.dismiss() + + def get_message(self): + filename = os.path.basename(self.ui.active_art.filename) + return [self.message % filename] + + +class ResizeArtDialog(UIDialog): + + title = 'Resize art' + field_width = UIDialog.default_short_field_width + field0_label = 'New Width:' + field1_label = 'New Height:' + field2_label = 'Crop Start X:' + field3_label = 'Crop Start Y:' + field4_label = 'Fill new tiles with BG color' + fields = [ + Field(label=field0_label, type=int, width=field_width, oneline=True), + Field(label=field1_label, type=int, width=field_width, oneline=True), + Field(label=field2_label, type=int, width=field_width, oneline=True), + Field(label=field3_label, type=int, width=field_width, oneline=True), + Field(label=field4_label, type=bool, width=0, oneline=True) + ] + confirm_caption = 'Resize' + invalid_width_error = 'Invalid width.' + invalid_height_error = 'Invalid height.' + invalid_start_error = 'Invalid crop origin.' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return str(self.ui.active_art.width) + elif field_number == 1: + return str(self.ui.active_art.height) + elif field_number == 4: + return UIDialog.true_field_text + else: + return '0' + + def is_input_valid(self): + "file can't already exist, dimensions must be >0 and <= max" + if not self.is_valid_dimension(self.field_texts[0], self.ui.app.max_art_width): + return False, self.invalid_width_error + if not self.is_valid_dimension(self.field_texts[1], self.ui.app.max_art_height): + return False, self.invalid_height_error + try: int(self.field_texts[2]) + except: return False, self.invalid_start_error + if not 0 <= int(self.field_texts[2]) < self.ui.active_art.width: + return False, self.invalid_start_error + try: int(self.field_texts[3]) + except: return False, self.invalid_start_error + if not 0 <= int(self.field_texts[3]) < self.ui.active_art.height: + return False, self.invalid_start_error + return True, None + + def is_valid_dimension(self, dimension, max_dimension): + try: dimension = int(dimension) + except: return False + return 0 < dimension <= max_dimension + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + w, h = int(self.field_texts[0]), int(self.field_texts[1]) + start_x, start_y = int(self.field_texts[2]), int(self.field_texts[3]) + bg_fill = bool(self.field_texts[4].strip()) + self.ui.resize_art(self.ui.active_art, w, h, start_x, start_y, bg_fill) + self.dismiss() + + +# +# layer menu dialogs +# + +class AddFrameDialog(UIDialog): + + title = 'Add new frame' + field0_label = 'Index to add frame before:' + field1_label = 'Hold time (in seconds) for new frame:' + field_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=int, width=field_width, oneline=True), + Field(label=field1_label, type=float, width=field_width, oneline=False) + ] + confirm_caption = 'Add' + invalid_index_error = 'Invalid index. (1-%s allowed)' + invalid_delay_error = 'Invalid hold time.' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return str(self.ui.active_art.frames + 1) + elif field_number == 1: + return str(DEFAULT_FRAME_DELAY) + + def is_valid_frame_index(self, index): + try: index = int(index) + except: return False + if index < 1 or index > self.ui.active_art.frames + 1: + return False + return True + + def is_valid_frame_delay(self, delay): + try: delay = float(delay) + except: return False + return delay > 0 + + def is_input_valid(self): + if not self.is_valid_frame_index(self.field_texts[0]): + return False, self.invalid_index_error % str(self.ui.active_art.frames + 1) + if not self.is_valid_frame_delay(self.field_texts[1]): + return False, self.invalid_delay_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + index = int(self.field_texts[0]) + delay = float(self.field_texts[1]) + self.ui.active_art.insert_frame_before_index(index - 1, delay) + self.dismiss() + +class DuplicateFrameDialog(AddFrameDialog): + title = 'Duplicate frame' + confirm_caption = 'Duplicate' + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + index = int(self.field_texts[0]) + delay = float(self.field_texts[1]) + self.ui.active_art.duplicate_frame(self.ui.active_art.active_frame, index - 1, delay) + self.dismiss() + +class FrameDelayDialog(AddFrameDialog): + + field0_label = 'New hold time (in seconds) for frame:' + field_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=float, width=field_width, oneline=False) + ] + confirm_caption = 'Set' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return str(self.ui.active_art.frame_delays[self.ui.active_art.active_frame]) + + def is_input_valid(self): + if not self.is_valid_frame_delay(self.field_texts[0]): + return False, self.invalid_delay_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + delay = float(self.field_texts[0]) + self.ui.active_art.frame_delays[self.ui.active_art.active_frame] = delay + self.dismiss() + +class FrameDelayAllDialog(FrameDelayDialog): + field0_label = 'New hold time (in seconds) for all frames:' + field_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=float, width=field_width, oneline=False) + ] + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + delay = float(self.field_texts[0]) + for i in range(self.ui.active_art.frames): + self.ui.active_art.frame_delays[i] = delay + self.dismiss() + +class FrameIndexDialog(AddFrameDialog): + field0_label = 'Move this frame before index:' + field_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=int, width=field_width, oneline=False) + ] + confirm_caption = 'Set' + + def is_input_valid(self): + if not self.is_valid_frame_index(self.field_texts[0]): + return False, self.invalid_index_error % str(self.ui.active_art.frames + 1) + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + # set new frame index (effectively moving it in the sequence) + dest_index = int(self.field_texts[0]) + self.ui.active_art.move_frame_to_index(self.ui.active_art.active_frame, dest_index) + self.dismiss() + + +# +# layer menu dialogs +# + +class AddLayerDialog(UIDialog): + + title = 'Add new layer' + field0_label = 'Name for new layer:' + field1_label = 'Z-depth for new layer:' + field0_width = UIDialog.default_field_width + field1_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=str, width=field0_width, oneline=False), + Field(label=field1_label, type=float, width=field1_width, oneline=True) + ] + confirm_caption = 'Add' + name_exists_error = 'Layer by that name already exists.' + invalid_z_error = 'Invalid number.' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return 'Layer %s' % str(self.ui.active_art.layers + 1) + elif field_number == 1: + return str(self.ui.active_art.layers_z[self.ui.active_art.active_layer] + DEFAULT_LAYER_Z_OFFSET) + + def is_valid_layer_name(self, name, exclude_active_layer=False): + for i,layer_name in enumerate(self.ui.active_art.layer_names): + if exclude_active_layer and i == self.ui.active_layer: + continue + if layer_name == name: + return False + return True + + def is_input_valid(self): + valid_name = self.is_valid_layer_name(self.field_texts[0]) + if not valid_name: + return False, self.name_exists_error + try: z = float(self.field_texts[1]) + except: return False, self.invalid_z_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + name = self.field_texts[0] + z = float(self.field_texts[1]) + self.ui.active_art.add_layer(z, name) + self.dismiss() + + +class DuplicateLayerDialog(AddLayerDialog): + title = 'Duplicate layer' + confirm_caption = 'Duplicate' + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + name = self.field_texts[0] + z = float(self.field_texts[1]) + self.ui.active_art.duplicate_layer(self.ui.active_art.active_layer, z, name) + self.dismiss() + + +class SetLayerNameDialog(AddLayerDialog): + + title = 'Set layer name' + field0_label = 'New name for this layer:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field0_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Rename' + + def confirm_pressed(self): + new_name = self.field_texts[0] + self.ui.active_art.layer_names[self.ui.active_art.active_layer] = new_name + self.ui.active_art.set_unsaved_changes(True) + self.dismiss() + + +class SetLayerZDialog(UIDialog): + title = 'Set layer Z-depth' + field0_label = 'Z-depth for layer:' + field_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=float, width=field_width, oneline=False) + ] + confirm_caption = 'Set' + invalid_z_error = 'Invalid number.' + + def get_initial_field_text(self, field_number): + # populate with existing z + if field_number == 0: + return str(self.ui.active_art.layers_z[self.ui.active_art.active_layer]) + + def is_input_valid(self): + try: z = float(self.field_texts[0]) + except: return False, self.invalid_z_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + new_z = float(self.field_texts[0]) + self.ui.active_art.layers_z[self.ui.active_art.active_layer] = new_z + self.ui.active_art.set_unsaved_changes(True) + self.ui.app.grid.reset() + self.dismiss() + + +class PaletteFromFileDialog(UIDialog): + title = 'Create palette from file' + field0_label = 'Filename to create palette from:' + field1_label = 'Filename for new palette:' + field2_label = 'Colors in new palette:' + field0_width = field1_width = UIDialog.default_field_width + field2_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=str, width=field0_width, oneline=False), + Field(label=field1_label, type=str, width=field1_width, oneline=False), + Field(label=field2_label, type=int, width=field2_width, oneline=True) + ] + confirm_caption = 'Create' + invalid_color_error = 'Palettes must be between 2 and 256 colors.' + bad_output_filename_error = 'Enter a filename for the new palette.' + + def get_initial_field_text(self, field_number): + # NOTE: PaletteFromImageChooserDialog.confirm_pressed which invokes us + # sets fields 0 and 1 + if field_number == 2: + return str(256) + return '' + + def valid_colors(self, colors): + try: c = int(colors) + except: return False + return 2 <= c <= 256 + + def is_input_valid(self): + valid_colors = self.valid_colors(self.field_texts[2]) + if not valid_colors: + return False, self.invalid_color_error + if not self.field_texts[1].strip(): + return False, self.bad_output_filename_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + src_filename = self.field_texts[0] + palette_filename = self.field_texts[1] + colors = int(self.field_texts[2]) + new_pal = PaletteFromFile(self.ui.app, src_filename, palette_filename, colors) + self.dismiss() + + +class SetCameraZoomDialog(UIDialog): + title = 'Set camera zoom' + field0_label = 'New camera zoom %:' + field_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=float, width=field_width, oneline=True) + ] + confirm_caption = 'Set' + invalid_zoom_error = 'Zoom % must be a number greater than zero.' + all_modes_visible = True + game_mode_visible = True + + def get_initial_field_text(self, field_number): + if field_number == 0: + return '%.1f' % self.ui.app.camera.get_current_zoom_pct() + return '' + + def is_input_valid(self): + try: zoom = float(self.field_texts[0]) + except: return False, self.invalid_zoom_error + if zoom <= 0: + return False, self.invalid_zoom_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + new_zoom_pct = float(self.field_texts[0]) + camera = self.ui.app.camera + camera.z = camera.get_base_zoom() / (new_zoom_pct / 100) + self.dismiss() + + +class OverlayImageOpacityDialog(UIDialog): + title = 'Set overlay image opacity' + field0_label = 'New overlay opacity %:' + field_width = UIDialog.default_short_field_width + fields = [ + Field(label=field0_label, type=float, width=field_width, oneline=True) + ] + confirm_caption = 'Set' + invalid_opacity_error = 'Opacity % must be between 0 and 100.' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return '%.1f' % (self.ui.app.overlay_renderable.alpha * 100) + return '' + + def is_input_valid(self): + try: opacity = float(self.field_texts[0]) + except: return False, self.invalid_opacity_error + if opacity <= 0 or opacity > 100: + return False, self.invalid_opacity_error + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + new_opacity = float(self.field_texts[0]) + self.ui.app.overlay_renderable.alpha = new_opacity / 100 + self.dismiss() diff --git a/ui_button.py b/ui_button.py new file mode 100644 index 0000000..e7d69c4 --- /dev/null +++ b/ui_button.py @@ -0,0 +1,162 @@ + +from ui_colors import UIColors + +TEXT_LEFT = 0 +TEXT_CENTER = 1 +TEXT_RIGHT = 2 + +BUTTON_STATES = ['normal', 'hovered', 'clicked', 'dimmed'] + +class UIButton: + + "clickable button that does something in a UIElement" + + # x/y/width/height given in tile scale + x, y = 0, 0 + width, height = 1, 1 + caption = 'TEST' + caption_justify = TEXT_LEFT + # paint caption from string, or not + should_draw_caption = True + caption_y = 0 + callback = None + normal_fg_color = UIColors.black + normal_bg_color = UIColors.lightgrey + hovered_fg_color = UIColors.black + hovered_bg_color = UIColors.white + clicked_fg_color = UIColors.white + clicked_bg_color = UIColors.black + dimmed_fg_color = UIColors.black + dimmed_bg_color = UIColors.medgrey + # dimmed is a special, alternative-to-normal state + dimmed = False + can_hover = True + can_click = True + visible = True + # if true, this button is invisible and used for special trickery + never_draw = False + # weird (gross?) thing: other code can stash an argument to callback here + cb_arg = None + # if True, pass in mouse button # + pass_mouse_button = False + # if true, clear all characters before painting a new caption + clear_before_caption_draw = False + # if true, display a tooltip when hovered, and dismiss it when unhovered. + # contents set from get_tooltip_text and positioned by get_tooltip_location. + tooltip_on_hover = False + + def __init__(self, element, starting_state=None): + self.element = element + self.state = starting_state or 'normal' + + def log_event(self, event_type): + "common code for button event logging" + if self.element.ui.logg: + self.element.ui.app.log("UIButton: %s's %s %s" % (self.element.__class__.__name__, self.__class__.__name__, event_type)) + + def set_state(self, new_state): + if not new_state in BUTTON_STATES: + self.element.ui.app.log('Unrecognized state for button %s: %s' % (self.__class__.__name__, new_state)) + return + self.dimmed = new_state == 'dimmed' + self.state = new_state + self.set_state_colors() + + def get_state_colors(self, state): + fg = getattr(self, '%s_fg_color' % state) + bg = getattr(self, '%s_bg_color' % state) + return fg, bg + + def set_state_colors(self): + if self.never_draw: + return + # set colors for entire button area based on current state + if self.dimmed and self.state == 'normal': + self.state = 'dimmed' + # just bail if we're trying to draw something out of bounds + if self.x + self.width > self.element.art.width: + return + elif self.y + self.height > self.element.art.height: + return + fg, bg = self.get_state_colors(self.state) + for y in range(self.height): + for x in range(self.width): + self.element.art.set_tile_at(0, 0, self.x + x, self.y + y, None, fg, bg) + + def update_tooltip(self): + tt = self.element.ui.tooltip + tt.reset_art() + tt.set_text(self.get_tooltip_text()) + tt.tile_x, tt.tile_y = self.get_tooltip_location() + tt.reset_loc() + + def hover(self): + self.log_event('hovered') + self.set_state('hovered') + if self.tooltip_on_hover: + self.element.ui.tooltip.visible = True + self.update_tooltip() + + def unhover(self): + self.log_event('unhovered') + if self.dimmed: + self.set_state('dimmed') + else: + self.set_state('normal') + if self.tooltip_on_hover: + # if two buttons are adjacent, we might be unhovering this one + # right after hovering the other in the same frame. if so, + # don't dismiss the tooltip + another_tooltip = False + for b in self.element.hovered_buttons: + if b is self: + continue + if b.tooltip_on_hover: + another_tooltip = True + if not another_tooltip: + self.element.ui.tooltip.visible = False + + def click(self): + self.log_event('clicked') + self.set_state('clicked') + + def unclick(self): + self.log_event('unclicked') + if self in self.element.hovered_buttons: + self.hover() + else: + self.unhover() + + def get_tooltip_text(self): + "override in a subclass to define this button's tooltip text" + return 'ERROR' + + def get_tooltip_location(self): + "override in a subclass to define this button's tooltip screen location" + return 10, 10 + + def draw_caption(self): + y = self.y + self.caption_y + text = self.caption + # trim if too long + text = text[:self.width] + if self.caption_justify == TEXT_CENTER: + text = text.center(self.width) + elif self.caption_justify == TEXT_RIGHT: + text = text.rjust(self.width) + # just bail if we're trying to draw something out of bounds + if self.x + len(text) > self.element.art.width: + return + if self.clear_before_caption_draw: + for ty in range(self.height): + for tx in range(self.width): + self.element.art.set_char_index_at(0, 0, self.x+tx, y+ty, 0) + # leave FG color None; should already have been set + self.element.art.write_string(0, 0, self.x, y, text, None) + + def draw(self): + if self.never_draw: + return + self.set_state_colors() + if self.should_draw_caption: + self.draw_caption() diff --git a/ui_chooser_dialog.py b/ui_chooser_dialog.py new file mode 100644 index 0000000..db29ad7 --- /dev/null +++ b/ui_chooser_dialog.py @@ -0,0 +1,483 @@ +# coding=utf-8 + +import os +import sdl2 + +from renderable_sprite import UISpriteRenderable +from ui_dialog import UIDialog, Field +from ui_button import UIButton +from art import UV_NORMAL, UV_ROTATE90, UV_ROTATE180, UV_ROTATE270, UV_FLIPX, UV_FLIPY +from ui_colors import UIColors + + +class ChooserItemButton(UIButton): + + "button representing a ChooserItem" + + item = None + width = 20 + big_width = 30 + clear_before_caption_draw = True + + def __init__(self, element): + # more room for list items if screen is wide enough + if element.ui.width_tiles - 20 > element.big_width: + self.width = self.big_width + UIButton.__init__(self, element) + self.callback = self.pick_item + + def pick_item(self): + if not self.item: + return + self.item.picked(self.element) + + +class ScrollArrowButton(UIButton): + + "button that scrolls up or down in a chooser item view" + + arrow_char = 129 + up = True + normal_bg_color = UIDialog.bg_color + dimmed_fg_color = UIColors.medgrey + dimmed_bg_color = UIDialog.bg_color + + def draw_caption(self): + xform = [UV_FLIPY, UV_NORMAL][self.up] + self.element.art.set_tile_at(0, 0, self.x, self.y + self.caption_y, + self.arrow_char, None, None, xform) + + def callback(self): + if self.up and self.element.scroll_index > 0: + self.element.scroll_index -= 1 + elif not self.up and self.element.scroll_index < self.element.get_max_scroll(): + self.element.scroll_index += 1 + self.element.load_selected_item() + self.element.reset_art(False) + self.element.set_preview() + self.element.position_preview() + + +class ChooserItem: + + label = 'Chooser item' + + def __init__(self, index, name): + self.index = index + # item's unique name, eg a filename + self.name = name + self.label = self.get_label() + # validity flag lets ChooserItem subclasses exclude themselves + self.valid = True + + def get_label(self): return self.name + + def get_description_lines(self): return [] + + def get_preview_texture(self): return None + + def load(self, app): pass + + def picked(self, element): + # set item selected and refresh preview + element.set_selected_item_index(self.index) + + +class ChooserDialog(UIDialog): + + title = 'Chooser' + confirm_caption = 'Set' + cancel_caption = 'Close' + message = '' + # if True, chooser shows files; show filename on first line of description + show_filenames = False + directory_aware = False + tile_width, tile_height = 60, 20 + # use these if screen is big enough + big_width, big_height = 80, 30 + fields = [ + Field(label='', type=str, width=tile_width - 4, oneline=True) + ] + item_start_x, item_start_y = 2, 4 + no_preview_label = 'No preview available!' + show_preview_image = True + item_button_class = ChooserItemButton + chooser_item_class = ChooserItem + scrollbar_shade_char = 54 + flip_preview_y = True + + def __init__(self, ui, options): + self.ui = ui + # semikludge: track whether user has selected anything in a new dir, + # so double click behavior is consistent even on initial selections + self.first_selection_made = False + if self.ui.width_tiles - 20 > self.big_width: + self.tile_width = self.big_width + self.fields[0] = Field(label='', type=str, + width=self.tile_width - 4, oneline=True) + if self.ui.height_tiles - 30 > self.big_height: + self.tile_height = self.big_height + self.items_in_view = self.tile_height - self.item_start_y - 3 + self.field_texts = [''] + # set active field earlier than UIDialog.init so set_initial_dir + # can change its text + self.active_field = 0 + if self.directory_aware: + self.set_initial_dir() + self.selected_item_index = 0 + # scroll index - how far into items list current screen view begins + self.scroll_index = 0 + self.items = self.get_items() + self.set_selected_item_index(self.get_initial_selection(), True, False) + self.load_selected_item() + # start scroll index higher if initial selection would be offscreen + if self.selected_item_index >= self.items_in_view: + self.scroll_index = self.selected_item_index - self.items_in_view + 1 + # for convenience, create another list where 1st item button starts at 0 + self.item_buttons = [] + self.up_arrow_button, self.down_arrow_button = None, None + # marker for preview drawing + self.description_end_y = 0 + # UIDialog init runs: reset_art, draw_buttons etc + UIDialog.__init__(self, ui, options) + # UIDialog/UIElement initializes self.buttons, create item buttons after + self.init_buttons() + self.reset_art(False) + # preview SpriteRenderable (loaded on item change?) + self.preview_renderable = UISpriteRenderable(ui.app) + # don't blend preview images, eg charsets + self.preview_renderable.blend = False + # offset into items list view provided by buttons starts from + self.position_preview() + + def init_buttons(self): + for i in range(self.items_in_view): + button = self.item_button_class(self) + button.x = self.item_start_x + button.y = i + self.item_start_y + self.buttons.append(button) + self.item_buttons.append(button) + # create scrollbar buttons + self.item_button_width = self.item_buttons[0].width + self.up_arrow_button = ScrollArrowButton(self) + self.up_arrow_button.x = self.item_start_x + self.item_button_width + self.up_arrow_button.y = self.item_start_y + self.down_arrow_button = ScrollArrowButton(self) + self.down_arrow_button.x = self.item_start_x + self.item_button_width + self.down_arrow_button.y = self.item_start_y + self.items_in_view - 1 + self.down_arrow_button.up = False + self.buttons += [self.up_arrow_button, self.down_arrow_button] + + def set_initial_dir(self): + # for directory-aware dialogs, subclasses specify here where to start + self.current_dir = '.' + + def change_current_dir(self, new_dir): + # check permissions: + # os.access(new_dir, os.R_OK) seems to always return True, + # so try/catch listdir instead + try: + l = os.listdir(new_dir) + except PermissionError as e: + line = 'No permission to access %s!' % os.path.abspath(new_dir) + self.ui.message_line.post_line(line, error=True) + return False + self.current_dir = new_dir + if not self.current_dir.endswith('/'): + self.current_dir += '/' + # redo items and redraw + self.selected_item_index = 0 + self.scroll_index = 0 + self.field_texts[self.active_field] = self.current_dir + self.items = self.get_items() + self.reset_art(False) + return True + + def set_selected_item_index(self, new_index, set_field_text=True, + update_view=True): + """ + set the view's selected item to specified index + perform usually-necessary refresh functions for convenience + """ + move_dir = new_index - self.selected_item_index + self.selected_item_index = new_index + can_scroll = len(self.items) > self.items_in_view + should_scroll = self.selected_item_index >= self.scroll_index + self.items_in_view or self.selected_item_index < self.scroll_index + if not can_scroll: + self.scroll_index = 0 + elif should_scroll: + # keep selection in bounds + self.selected_item_index = min(self.selected_item_index, len(self.items)-1) + # scrolling up + if move_dir <= 0: + self.scroll_index = self.selected_item_index + # scrolling down + elif move_dir > 0 and self.selected_item_index - self.scroll_index == self.items_in_view: + self.scroll_index = self.selected_item_index - self.items_in_view + 1 + # keep scroll in bounds + self.scroll_index = min(self.scroll_index, self.get_max_scroll()) + # don't select/load null items + if set_field_text: + item = self.get_selected_item() + if item: + self.field_texts[self.active_field] = item.name + if update_view: + self.load_selected_item() + self.reset_art(False) + self.position_preview() + + def get_max_scroll(self): + return len(self.items) - self.items_in_view + + def get_selected_item(self): + # return None if out of bounds + return self.items[self.selected_item_index] if self.selected_item_index < len(self.items) else None + + def load_selected_item(self): + item = self.get_selected_item() + item.load(self.ui.app) + + def get_initial_selection(self): + # subclasses return index of initial selection + return 0 + + def set_preview(self): + item = self.get_selected_item() + if self.show_preview_image: + self.preview_renderable.texture = item.get_preview_texture(self.ui.app) + + def get_items(self): + # subclasses generate lists of items here + return [] + + def position_preview(self, reset=True): + if reset: + self.set_preview() + if not self.preview_renderable.texture: + return + qw, qh = self.art.quad_width, self.art.quad_height + # determine x position, then width as (dialog width - x) + x = (self.item_button_width + self.item_start_x + 3) * qw + self.preview_renderable.x = self.x + x + self.preview_renderable.scale_x = (self.tile_width - 2) * qw - x + # determine height based on width, then y position + img_inv_aspect = self.preview_renderable.texture.height / self.preview_renderable.texture.width + screen_aspect = self.ui.app.window_width / self.ui.app.window_height + self.preview_renderable.scale_y = self.preview_renderable.scale_x * img_inv_aspect * screen_aspect + y = (self.description_end_y + 1) * qh + # if preview height is above max allotted size, set height to fill size + # and scale down width + max_y = (self.tile_height - 3) * qh + if self.preview_renderable.scale_y > max_y - y: + self.preview_renderable.scale_y = max_y - y + self.preview_renderable.scale_x = self.preview_renderable.scale_y * (1 / img_inv_aspect) * (1 / screen_aspect) + # flip in Y for some (palettes) but not for others (charsets) + if self.flip_preview_y: + self.preview_renderable.scale_y = -self.preview_renderable.scale_y + else: + y += self.preview_renderable.scale_y + self.preview_renderable.y = self.y - y + + def get_height(self, msg_lines): + return self.tile_height + + def reset_buttons(self): + # (re)generate buttons from contents of self.items + for i,button in enumerate(self.item_buttons): + # ??? each button's callback loads charset/palette/whatev + if i >= len(self.items): + button.never_draw = True + # clear item, might be left over from a previous dir view! + button.item = None + continue + item = self.items[self.scroll_index + i] + button.caption = item.label + button.item = item + button.never_draw = False + # highlight selected item + if i == self.selected_item_index - self.scroll_index: + button.normal_fg_color = UIButton.clicked_fg_color + button.normal_bg_color = UIButton.clicked_bg_color + # still allow hover and click + button.hovered_fg_color = UIButton.clicked_fg_color + button.hovered_bg_color = UIButton.clicked_bg_color + else: + button.normal_fg_color = UIButton.normal_fg_color + button.normal_bg_color = UIButton.normal_bg_color + button.hovered_fg_color = UIButton.hovered_fg_color + button.hovered_bg_color = UIButton.hovered_bg_color + # init_buttons has not yet run on first reset_art + if not self.up_arrow_button: + return + # dim scroll buttons if we don't have enough items to scroll + state, hover = 'normal', True + if len(self.items) <= self.items_in_view: + state = 'dimmed' + hover = False + for button in [self.up_arrow_button, self.down_arrow_button]: + button.set_state(state) + button.can_hover = hover + + def get_description_filename(self, item): + "returns a description-appropriate filename for given item" + # truncate from start to fit in description area if needed + max_width = self.tile_width + max_width -= self.item_start_x + self.item_button_width + 5 + if len(item.name) > max_width - 1: + return '…' + item.name[-max_width:] + return item.name + + def get_selected_description_lines(self): + item = self.get_selected_item() + lines = [] + if self.show_filenames: + lines += [self.get_description_filename(item)] + lines += item.get_description_lines() or [] + return lines + + def draw_selected_description(self): + x = self.tile_width - 2 + y = self.item_start_y + lines = self.get_selected_description_lines() + for line in lines: + # trim line if it's too long + max_width = self.tile_width - self.item_button_width - 7 + line = line[:max_width] + self.art.write_string(0, 0, x, y, line, None, None, + right_justify=True) + y += 1 + self.description_end_y = y + + def reset_art(self, resize=True): + self.reset_buttons() + # UIDialog does: clear window, draw titlebar and confirm/cancel buttons + # doesn't: draw message or fields + UIDialog.reset_art(self, resize, clear_buttons=False) + # init_buttons hasn't run yet on first call to reset_art + if not self.up_arrow_button: + return + self.draw_selected_description() + # draw scrollbar shading + # dim if no scrolling + fg = self.up_arrow_button.normal_fg_color + if len(self.items) <= self.items_in_view: + fg = self.up_arrow_button.dimmed_fg_color + for y in range(self.up_arrow_button.y + 1, self.down_arrow_button.y): + self.art.set_tile_at(0, 0, self.up_arrow_button.x, y, + self.scrollbar_shade_char, fg) + + def update_drag(self, mouse_dx, mouse_dy): + UIDialog.update_drag(self, mouse_dx, mouse_dy) + # update thumbnail renderable's position too + self.position_preview(False) + + def handle_input(self, key, shift_pressed, alt_pressed, ctrl_pressed): + keystr = sdl2.SDL_GetKeyName(key).decode() + # up/down keys navigate list + new_index = self.selected_item_index + navigated = False + if keystr == 'Return': + # if handle_enter returns True, bail before rest of input handling - + # make sure any changes to handle_enter are safe for this! + if self.handle_enter(shift_pressed, alt_pressed, ctrl_pressed): + return + elif keystr == 'Up': + navigated = True + if self.selected_item_index > 0: + new_index -= 1 + elif keystr == 'Down': + navigated = True + if self.selected_item_index < len(self.items) - 1: + new_index += 1 + elif keystr == 'PageUp': + navigated = True + page_size = int(self.items_in_view / 2) + new_index -= page_size + new_index = max(0, new_index) + # scroll follows selection jumps + self.scroll_index -= page_size + self.scroll_index = max(0, self.scroll_index) + elif keystr == 'PageDown': + navigated = True + page_size = int(self.items_in_view / 2) + new_index += page_size + new_index = min(new_index, len(self.items) - 1) + self.scroll_index += page_size + self.scroll_index = min(self.scroll_index, self.get_max_scroll()) + # home/end: beginning/end of list, respectively + elif keystr == 'Home': + navigated = True + new_index = 0 + self.scroll_index = 0 + elif keystr == 'End': + navigated = True + new_index = len(self.items) - 1 + self.scroll_index = len(self.items) - self.items_in_view + self.set_selected_item_index(new_index, set_field_text=navigated) + # handle alphanumeric input etc + UIDialog.handle_input(self, key, shift_pressed, alt_pressed, ctrl_pressed) + # if we didn't navigate, seek based on new alphanumeric input + if not navigated: + self.text_input_seek() + + def text_input_seek(self): + field_text = self.field_texts[self.active_field] + if field_text.strip() == '': + return + # seek should be case-insensitive + field_text = field_text.lower() + # field text may be a full path; only care about the base + field_text = os.path.basename(field_text) + for i,item in enumerate(self.items): + # match to base item name within dir + # (if it's a dir, snip last / for match) + item_base = item.name.lower() + if item_base.endswith('/'): + item_base = item_base[:-1] + item_base = os.path.basename(item_base) + item_base = os.path.splitext(item_base)[0] + if item_base.startswith(field_text): + self.set_selected_item_index(i, set_field_text=False) + break + + def handle_enter(self, shift_pressed, alt_pressed, ctrl_pressed): + "handle Enter key, return False if rest of handle_input should continue" + # if selected item is already in text field, pick it + field_text = self.field_texts[self.active_field] + selected_item = self.get_selected_item() + if field_text.strip() == '': + self.field_texts[self.active_field] = field_text = selected_item.name + return True + if field_text == selected_item.name: + # this (and similar following cases) should count as having + # made a selection + self.first_selection_made = True + selected_item.picked(self) + return True + # else navigate to directory or file if it's real + if not os.path.exists(field_text): + self.field_texts[self.active_field] = selected_item.name + return True + # special case for parent dir .. + if self.directory_aware and field_text == self.current_dir and selected_item.name == '..': + self.first_selection_made = True + return self.change_current_dir('..') + if self.directory_aware and os.path.isdir(field_text): + self.first_selection_made = True + return self.change_current_dir(field_text) + if os.path.isfile(field_text): + file_dir_name = os.path.dirname(field_text) + # if a file, change to its dir and select it + if self.directory_aware and file_dir_name != self.current_dir: + if self.change_current_dir(file_dir_name): + for i,item in enumerate(self.items): + if item.name == field_text: + self.set_selected_item_index(i) + item.picked(self) + return True + return False + + def render(self): + UIDialog.render(self) + if self.show_preview_image and self.preview_renderable.texture: + self.preview_renderable.render() diff --git a/ui_colors.py b/ui_colors.py new file mode 100644 index 0000000..ade2691 --- /dev/null +++ b/ui_colors.py @@ -0,0 +1,11 @@ + +class UIColors: + "color indices for UI (c64 original) palette" + white = 2 + lightgrey = 16 + medgrey = 13 + darkgrey = 12 + black = 1 + yellow = 8 + red = 3 + brightred = 11 diff --git a/ui_console.py b/ui_console.py new file mode 100644 index 0000000..075a78d --- /dev/null +++ b/ui_console.py @@ -0,0 +1,538 @@ +import os +import sdl2 +from math import ceil + +from ui_element import UIElement +from art import UV_FLIPY +from key_shifts import SHIFT_MAP + +from image_convert import ImageConverter +from palette import PaletteFromFile + +from image_export import export_still_image, export_animation + +from PIL import Image + +# imports for console execution namespace - be careful! +from OpenGL import GL + + +CONSOLE_HISTORY_FILENAME = 'console_history' + +class ConsoleCommand: + "parent class for console commands" + description = '[Enter a description for this command!]' + def execute(console, args): + return 'Test command executed.' + + +class QuitCommand(ConsoleCommand): + description = 'Quit Playscii.' + def execute(console, args): + console.ui.app.should_quit = True + + +class SaveCommand(ConsoleCommand): + description = 'Save active art, under new filename if given.' + def execute(console, args): + # save currently active file + art = console.ui.active_art + # set new filename if given + if len(args) > 0: + old_filename = art.filename + art.set_filename(' '.join(args)) + art.save_to_file() + console.ui.app.load_art_for_edit(old_filename) + console.ui.set_active_art_by_filename(art.filename) + else: + art.save_to_file() + console.ui.app.update_window_title() + + +class OpenCommand(ConsoleCommand): + description = 'Open art with given filename.' + def execute(console, args): + if len(args) == 0: + return 'Usage: open [art filename]' + filename = ' '.join(args) + console.ui.app.load_art_for_edit(filename) + +class RevertArtCommand(ConsoleCommand): + description = 'Revert active art to last saved version.' + def execute(console, args): + console.ui.app.revert_active_art() + +class LoadPaletteCommand(ConsoleCommand): + description = 'Set the given color palette as active.' + def execute(console, args): + if len(args) == 0: + return 'Usage: pal [palette filename]' + filename = ' '.join(args) + # load AND set + palette = console.ui.app.load_palette(filename) + console.ui.active_art.set_palette(palette) + console.ui.popup.set_active_palette(palette) + +class LoadCharSetCommand(ConsoleCommand): + description = 'Set the given character set as active.' + def execute(console, args): + if len(args) == 0: + return 'Usage: char [character set filename]' + filename = ' '.join(args) + charset = console.ui.app.load_charset(filename) + console.ui.active_art.set_charset(charset) + console.ui.popup.set_active_charset(charset) + +class ImageExportCommand(ConsoleCommand): + description = 'Export active art as PNG image.' + def execute(console, args): + export_still_image(console.ui.app, console.ui.active_art) + +class AnimExportCommand(ConsoleCommand): + description = 'Export active art as animated GIF image.' + def execute(console, args): + export_animation(console.ui.app, console.ui.active_art) + +class ConvertImageCommand(ConsoleCommand): + description = 'Convert given bitmap image to current character set + color palette.' + def execute(console, args): + if len(args) == 0: + return 'Usage: conv [image filename]' + image_filename = ' '.join(args) + ImageConverter(console.ui.app, image_filename, console.ui.active_art) + console.ui.app.update_window_title() + +class OverlayImageCommand(ConsoleCommand): + description = 'Draw given bitmap image over active art document.' + def execute(console, args): + if len(args) == 0: + return 'Usage: img [image filename]' + image_filename = ' '.join(args) + console.ui.app.set_overlay_image(image_filename) + +class ImportCommand(ConsoleCommand): + description = 'Import file using an ArtImport class' + def execute(console, args): + if len(args) < 2: + return 'Usage: imp [ArtImporter class name] [filename]' + importers = console.ui.app.get_importers() + importer_classname, filename = args[0], args[1] + importer_class = None + for c in importers: + if c.__name__ == importer_classname: + importer_class = c + if not importer_class: + console.ui.app.log("Couldn't find importer class %s" % importer_classname) + if not os.path.exists(filename): + console.ui.app.log("Couldn't find file %s" % filename) + importer = importer_class(console.ui.app, filename) + +class ExportCommand(ConsoleCommand): + description = 'Export current art using an ArtExport class' + def execute(console, args): + if len(args) < 2: + return 'Usage: exp [ArtExporter class name] [filename]' + exporters = console.ui.app.get_exporters() + exporter_classname, filename = args[0], args[1] + exporter_class = None + for c in exporters: + if c.__name__ == exporter_classname: + exporter_class = c + if not exporter_class: + console.ui.app.log("Couldn't find exporter class %s" % exporter_classname) + exporter = exporter_class(console.ui.app, filename) + +class PaletteFromImageCommand(ConsoleCommand): + description = 'Convert given image into a palette file.' + def execute(console, args): + if len(args) == 0: + return 'Usage: getpal [image filename]' + src_filename = ' '.join(args) + new_pal = PaletteFromFile(console.ui.app, src_filename, src_filename) + if not new_pal.init_success: + return + #console.ui.app.load_palette(new_pal.filename) + console.ui.app.palettes.append(new_pal) + console.ui.active_art.set_palette(new_pal) + console.ui.popup.set_active_palette(new_pal) + +class SetGameDirCommand(ConsoleCommand): + description = 'Load game from the given folder.' + def execute(console, args): + if len(args) == 0: + return 'Usage: setgame [game dir name]' + game_dir_name = ' '.join(args) + console.ui.app.gw.set_game_dir(game_dir_name, True) + +class LoadGameStateCommand(ConsoleCommand): + description = 'Load the given game state save file.' + def execute(console, args): + if len(args) == 0: + return 'Usage: game [game state filename]' + gs_name = ' '.join(args) + console.ui.app.gw.load_game_state(gs_name) + +class SaveGameStateCommand(ConsoleCommand): + description = 'Save the current game state as the given filename.' + def execute(console, args): + "Usage: savegame [game state filename]" + gs_name = ' '.join(args) + console.ui.app.gw.save_to_file(gs_name) + +class SpawnObjectCommand(ConsoleCommand): + description = 'Spawn an object of the given class name.' + def execute(console, args): + if len(args) == 0: + return 'Usage: spawn [class name]' + class_name = ' '.join(args) + console.ui.app.gw.spawn_object_of_class(class_name) + +class CommandListCommand(ConsoleCommand): + description = 'Show the list of console commands.' + def execute(console, args): + # TODO: print a command with usage if available + console.ui.app.log('Commands:') + # alphabetize command list + command_list = list(commands.keys()) + command_list.sort() + for command in command_list: + desc = commands[command].description + console.ui.app.log(' %s - %s' % (command, desc)) + +class RunArtScriptCommand(ConsoleCommand): + description = 'Run art script with given filename on active art.' + def execute(console, args): + if len(args) == 0: + return 'Usage: src [art script filename]' + filename = ' '.join(args) + console.ui.active_art.run_script(filename) + +class RunEveryArtScriptCommand(ConsoleCommand): + description = 'Run art script with given filename on active art at given rate.' + def execute(console, args): + if len(args) < 2: + return 'Usage: srcev [rate] [art script filename]' + rate = float(args[0]) + filename = ' '.join(args[1:]) + console.ui.active_art.run_script_every(filename, rate) + # hide so user can immediately see what script is doing + console.hide() + +class StopArtScriptsCommand(ConsoleCommand): + description = 'Stop all actively running art scripts.' + def execute(console, args): + console.ui.active_art.stop_all_scripts() + +# map strings to command classes for ConsoleUI.parse +commands = { + 'exit': QuitCommand, + 'quit': QuitCommand, + 'save': SaveCommand, + 'open': OpenCommand, + 'char': LoadCharSetCommand, + 'pal': LoadPaletteCommand, + 'imgexp': ImageExportCommand, + 'animexport': AnimExportCommand, + 'conv': ConvertImageCommand, + 'getpal': PaletteFromImageCommand, + 'setgame': SetGameDirCommand, + 'game': LoadGameStateCommand, + 'savegame': SaveGameStateCommand, + 'spawn': SpawnObjectCommand, + 'help': CommandListCommand, + 'scr': RunArtScriptCommand, + 'screv': RunEveryArtScriptCommand, + 'scrstop': StopArtScriptsCommand, + 'revert': RevertArtCommand, + 'img': OverlayImageCommand, + 'imp': ImportCommand, + 'exp': ExportCommand +} + + +class ConsoleUI(UIElement): + + visible = False + snap_top = True + snap_left = True + # how far down the screen the console reaches when visible + height_screen_pct = 0.75 + # how long (seconds) to shift/fade into view when invoked + show_anim_time = 0.75 + bg_alpha = 0.75 + prompt = '>' + # _ ish char + bottom_line_char_index = 76 + right_margin = 3 + # transient, but must be set here b/c UIElement.init calls reset_art + current_line = '' + game_mode_visible = True + all_modes_visible = True + + def __init__(self, ui): + self.bg_color_index = ui.colors.darkgrey + self.highlight_color = 8 # yellow + UIElement.__init__(self, ui) + # state stuff for console move/fade + self.alpha = 0 + self.target_alpha = 0 + self.target_y = 2 + # start off top of screen + self.renderable.y = self.y = 2 + # user input and log + self.last_lines = [] + self.history_filename = self.ui.app.config_dir + CONSOLE_HISTORY_FILENAME + if os.path.exists(self.history_filename): + self.history_file = open(self.history_filename, 'r') + try: + self.command_history = self.history_file.readlines() + except: + self.command_history = [] + self.history_file = open(self.history_filename, 'a') + else: + self.history_file = open(self.history_filename, 'w+') + self.command_history = [] + self.history_index = 0 + # junk data in last user line so it changes on first update + self.last_user_line = 'test' + # max line length = width of console minus prompt + _ + self.max_line_length = int(self.art.width) - self.right_margin + + def reset_art(self): + self.width = ceil(self.ui.width_tiles * self.ui.scale) + # % of screen must take aspect into account + inv_aspect = self.ui.app.window_height / self.ui.app.window_width + self.height = int(self.ui.height_tiles * self.height_screen_pct * inv_aspect * self.ui.scale) + # dim background + self.renderable.bg_alpha = self.bg_alpha + # must resize here, as window width will vary + self.art.resize(self.width, self.height) + self.max_line_length = int(self.width) - self.right_margin + self.text_color = self.ui.palette.lightest_index + self.clear() + # truncate current user line if it's too long for new width + self.current_line = self.current_line[:self.max_line_length] + #self.update_user_line() + # empty log lines so they refresh from app + self.last_user_line = 'XXtestXX' + self.last_lines = [] + + def toggle(self): + if self.visible: + self.hide() + else: + self.show() + + def show(self): + self.visible = True + self.target_alpha = 1 + self.target_y = 1 + self.ui.menu_bar.visible = False + self.ui.pulldown.visible = False + + def hide(self): + self.target_alpha = 0 + self.target_y = 2 + if self.ui.app.can_edit: + self.ui.menu_bar.visible = True + + def update_loc(self): + # TODO: this lerp is super awful, simpler way based on dt? + # TODO: use self.show_anim_time instead of this garbage! + speed = 0.25 + + if self.y > self.target_y: + self.y -= speed + elif self.y < self.target_y: + self.y += speed + if abs(self.y - self.target_y) < speed: + self.y = self.target_y + + if self.alpha > self.target_alpha: + self.alpha -= speed / 2 + elif self.alpha < self.target_alpha: + self.alpha += speed / 2 + if abs(self.alpha - self.target_alpha) < speed: + self.alpha = self.target_alpha + if self.alpha == 0: + self.visible = False + + self.renderable.y = self.y + self.renderable.alpha = self.alpha + + def clear(self): + self.art.clear_frame_layer(0, 0, self.bg_color_index) + # line -1 is always a line of ____________ + for x in range(self.width): + self.art.set_tile_at(0, 0, x, -1, self.bottom_line_char_index, self.text_color, None, UV_FLIPY) + + def update_user_line(self): + "draw current user input on second to last line, with >_ prompt" + # clear entire user line first + self.art.write_string(0, 0, 0, -2, ' ' * self.width, self.text_color) + self.art.write_string(0, 0, 0, -2, '%s ' % self.prompt, self.text_color) + # if first item of line is a valid command, change its color + items = self.current_line.split() + if len(items) > 0 and items[0] in commands: + self.art.write_string(0, 0, 2, -2, items[0], self.highlight_color) + offset = 2 + len(items[0]) + 1 + args = ' '.join(items[1:]) + self.art.write_string(0, 0, offset, -2, args, self.text_color) + else: + self.art.write_string(0, 0, 2, -2, self.current_line, self.text_color) + # draw underscore for caret at end of input string + x = len(self.prompt) + len(self.current_line) + 1 + i = self.ui.charset.get_char_index('_') + self.art.set_char_index_at(0, 0, x, -2, i) + + def update_log_lines(self): + "update art from log lines" + log_index = -1 + for y in range(self.height - 3, -1, -1): + try: + line = self.ui.app.logger.lines[log_index] + except IndexError: + break + # trim line to width of console + if len(line) >= self.max_line_length: + line = line[:self.max_line_length] + self.art.write_string(0, 0, 1, y, line, self.text_color) + log_index -= 1 + + def update(self): + "update our Art with the current console log lines + user input" + self.update_loc() + if not self.visible: + return + # check for various early out scenarios, updating all chars every frame + # gets expensive + user_input_changed = self.last_user_line != self.current_line + log_changed = self.last_lines != self.ui.app.logger.lines + # remember log & user lines, bail early next update if no change + self.last_lines = self.ui.app.logger.lines[:] + self.last_user_line = self.current_line + if not user_input_changed and not log_changed: + return + # if log lines changed, clear all tiles to shift in new text + if log_changed: + self.clear() + self.update_log_lines() + # if user pressed enter on a blank line, user_input_changed will + # be False but we should still update + self.update_user_line() + # update user line independently of log, it changes at a different rate + if user_input_changed: + self.update_user_line() + + def visit_command_history(self, index): + if len(self.command_history) == 0: + return + self.history_index = index + self.history_index %= len(self.command_history) + self.current_line = self.command_history[self.history_index].strip() + + def handle_input(self, key, shift_pressed, alt_pressed, ctrl_pressed): + "handles a key from Application.input" + keystr = sdl2.SDL_GetKeyName(key).decode() + # TODO: get console bound key from InputLord, detect that instead of + # hard-coded backquote + if keystr == '`': + self.toggle() + return + elif keystr == 'Return': + line = '%s %s' % (self.prompt, self.current_line) + self.ui.app.log(line) + # if command is same as last, don't repeat it + if len(self.command_history) == 0 or (len(self.command_history) > 0 and self.current_line != self.command_history[-1]): + # don't add blank lines to history + if self.current_line.strip(): + self.command_history.append(self.current_line) + self.history_file.write(self.current_line + '\n') + self.parse(self.current_line) + self.current_line = '' + self.history_index = 0 + elif keystr == 'Tab': + # TODO: autocomplete (commands, filenames) + pass + elif keystr == 'Up': + # page back through command history + self.visit_command_history(self.history_index - 1) + elif keystr == 'Down': + # page forward through command history + self.visit_command_history(self.history_index + 1) + elif keystr == 'Backspace' and len(self.current_line) > 0: + # alt-backspace: delete to last delimiter, eg periods + if alt_pressed: + # "index to delete to" + delete_index = -1 + for delimiter in delimiters: + this_delimiter_index = self.current_line.rfind(delimiter) + if this_delimiter_index > delete_index: + delete_index = this_delimiter_index + if delete_index > -1: + self.current_line = self.current_line[:delete_index] + else: + self.current_line = '' + # user is bailing on whatever they were typing, + # reset position in cmd history + self.history_index = 0 + else: + self.current_line = self.current_line[:-1] + if len(self.current_line) == 0: + # same as above: reset position in cmd history + self.history_index = 0 + elif keystr == 'Space': + keystr = ' ' + # ignore any other non-character keys + if len(keystr) > 1: + return + if keystr.isalpha() and not shift_pressed: + keystr = keystr.lower() + elif not keystr.isalpha() and shift_pressed: + keystr = SHIFT_MAP.get(keystr, '') + if len(self.current_line) < self.max_line_length: + self.current_line += keystr + + def parse(self, line): + # is line in a list of know commands? if so, handle it. + items = line.split() + output = None + if len(items) == 0: + pass + elif items[0] in commands: + cmd = commands[items[0]] + output = cmd.execute(self, items[1:]) + else: + # if not, try python eval, give useful error if it fails + try: + # set some locals for easy access from eval + ui = self.ui + app = ui.app + camera = app.camera + art = ui.active_art + player = app.gw.player + sel = None if len(app.gw.selected_objects) == 0 else app.gw.selected_objects[0] + world = app.gw + hud = app.gw.hud + # special handling of assignment statements, eg x = 3: + # detect strings that pattern-match, send them to exec(), + # send all other strings to eval() + eq_index = line.find('=') + is_assignment = eq_index != -1 and line[eq_index+1] != '=' + if is_assignment: + exec(line) + else: + output = str(eval(line)) + except Exception as e: + # try to output useful error text + output = '%s: %s' % (e.__class__.__name__, str(e)) + # commands CAN return None, so only log if there's something + if output and output != 'None': + self.ui.app.log(output) + + def destroy(self): + self.history_file.close() + + +# delimiters - alt-backspace deletes to most recent one of these +delimiters = [' ', '.', ')', ']', ',', '_'] diff --git a/ui_dialog.py b/ui_dialog.py new file mode 100644 index 0000000..24f839c --- /dev/null +++ b/ui_dialog.py @@ -0,0 +1,455 @@ +import platform +import sdl2 +from collections import namedtuple + +from ui_element import UIElement +from ui_button import UIButton, TEXT_LEFT, TEXT_CENTER, TEXT_RIGHT +from ui_colors import UIColors + +from key_shifts import SHIFT_MAP + + +Field = namedtuple('Field', ['label', # text label for field + 'type', # supported: str int float bool + 'width', # width in tiles of the field + 'oneline']) # label and field drawn on same line + + +# "null" field type that tells UI drawing to skip it +class SkipFieldType: pass + +class ConfirmButton(UIButton): + caption = 'Confirm' + caption_justify = TEXT_CENTER + width = len(caption) + 2 + dimmed_fg_color = UIColors.lightgrey + dimmed_bg_color = UIColors.white + +class CancelButton(ConfirmButton): + caption = 'Cancel' + width = len(caption) + 2 + +class OtherButton(ConfirmButton): + "button for 3rd option in some dialogs, eg Don't Save" + caption = 'Other' + width = len(caption) + 2 + visible = False + + +class UIDialog(UIElement): + + tile_width, tile_height = 40, 8 + # extra lines added to height beyond contents length + extra_lines = 0 + fg_color = UIColors.black + bg_color = UIColors.white + title = 'Test Dialog Box' + # string message not tied to a specific field + message = None + other_button_visible = False + titlebar_fg_color = UIColors.white + titlebar_bg_color = UIColors.black + fields = [] + # list of tuples of field #s for linked radio button options + radio_groups = [] + default_field_width = 36 + default_short_field_width = int(default_field_width / 4) + # default amount of lines padding each field + y_spacing = 1 + active_field_fg_color = UIColors.white + active_field_bg_color = UIColors.darkgrey + inactive_field_fg_color = UIColors.black + inactive_field_bg_color = UIColors.lightgrey + # allow subclasses to override confirm caption, eg Save + confirm_caption = None + other_caption = None + cancel_caption = None + # center in window vs use tile_x/y to place + center_in_window = True + # checkbox char index (UI charset) + checkbox_char_index = 131 + # radio buttons, filled and unfilled + radio_true_char_index = 127 + radio_false_char_index = 126 + # field text set for bool fields with True value + true_field_text = 'x' + # if True, field labels will redraw with fields after handling input + always_redraw_labels = False + + def __init__(self, ui, options): + self.ui = ui + # apply options, eg passed in from UI.open_dialog + for k,v in options.items(): + setattr(self, k, v) + self.confirm_button = ConfirmButton(self) + self.other_button = OtherButton(self) + self.cancel_button = CancelButton(self) + # handle caption overrides + def caption_override(button, alt_caption): + if alt_caption and button.caption != alt_caption: + button.caption = alt_caption + button.width = len(alt_caption) + 2 + caption_override(self.confirm_button, self.confirm_caption) + caption_override(self.other_button, self.other_caption) + caption_override(self.cancel_button, self.cancel_caption) + self.confirm_button.callback = self.confirm_pressed + self.other_button.callback = self.other_pressed + self.cancel_button.callback = self.cancel_pressed + self.buttons = [self.confirm_button, self.other_button, self.cancel_button] + # populate fields with text + self.field_texts = [] + for i,field in enumerate(self.fields): + self.field_texts.append(self.get_initial_field_text(i)) + # field cursor starts on + self.active_field = 0 + UIElement.__init__(self, ui) + if self.ui.menu_bar and self.ui.menu_bar.active_menu_name: + self.ui.menu_bar.close_active_menu() + + def get_initial_field_text(self, field_number): + "subclasses specify a given field's initial text here" + return '' + + def get_height(self, msg_lines): + "determine size based on contents (subclasses can use custom logic)" + # base height = 4, titlebar + padding + buttons + padding + h = 4 + h += 0 if len(msg_lines) == 0 else len(msg_lines) + 1 + # determine height of each field from self.fields + for field in self.fields: + if field.type is SkipFieldType: + continue + elif field.oneline or field.type is bool or field.type is None: + h += self.y_spacing + 1 + else: + h += self.y_spacing + 2 + h += self.extra_lines + return h + + def reset_art(self, resize=True, clear_buttons=True): + # get_message splits into >1 line if too long + msg_lines = self.get_message() if self.message else [] + if resize: + self.tile_height = self.get_height(msg_lines) + self.art.resize(self.tile_width, self.tile_height) + if self.center_in_window: + qw, qh = self.art.quad_width, self.art.quad_height + self.x = -(self.tile_width * qw) / 2 + self.y = (self.tile_height * qh) / 2 + # draw window + self.art.clear_frame_layer(0, 0, self.bg_color, self.fg_color) + s = ' ' + self.title.ljust(self.tile_width - 1) + # invert titlebar (if kb focus) + fg = self.titlebar_fg_color + bg = self.titlebar_bg_color + if not self is self.ui.keyboard_focus_element and \ + self is self.ui.active_dialog: + fg = self.fg_color + bg = self.bg_color + self.art.write_string(0, 0, 0, 0, s, fg, bg) + # message + if self.message: + y = 2 + for i,line in enumerate(msg_lines): + self.art.write_string(0, 0, 2, y+i, line) + # field caption(s) + self.draw_fields() + # position buttons + self.confirm_button.x = self.tile_width - self.confirm_button.width - 2 + self.confirm_button.y = self.tile_height - 2 + if self.other_button_visible: + self.other_button.x = self.confirm_button.x + self.other_button.x -= self.other_button.width + 2 + self.other_button.y = self.confirm_button.y + self.other_button.visible = True + self.cancel_button.x = 2 + self.cancel_button.y = self.tile_height - 2 + # create field buttons so you can click em + if clear_buttons: + self.buttons = [self.confirm_button, self.other_button, self.cancel_button] + for i,field in enumerate(self.fields): + # None-type field = just a label + if field.type is None: + continue + field_button = DialogFieldButton(self) + field_button.field_number = i + # field settings mean button can be in a variety of places + field_button.width = 1 if field.type is bool else field.width + field_button.x = 2 if not field.oneline or field.type is bool else len(field.label) + 1 + field_button.y = self.get_field_y(i) + if not field.oneline: + field_button.y += 1 + self.buttons.append(field_button) + # draw buttons + UIElement.reset_art(self) + + def update_drag(self, mouse_dx, mouse_dy): + win_w, win_h = self.ui.app.window_width, self.ui.app.window_height + self.x += (mouse_dx / win_w) * 2 + self.y -= (mouse_dy / win_h) * 2 + self.renderable.x, self.renderable.y = self.x, self.y + + def hovered(self): + # mouse hover on focus + if (self.ui.app.mouse_dx or self.ui.app.mouse_dy) and \ + not self is self.ui.keyboard_focus_element: + self.ui.keyboard_focus_element = self + self.reset_art() + + def update(self): + # redraw fields every update for cursor blink + # (seems a waste, no real perf impact tho) + self.draw_fields(False) + # don't allow confirmation if all field input isn't valid + valid, reason = self.is_input_valid() + # if input invalid, show reason in red along button of window + bottom_y = self.tile_height - 1 + # first clear any previous warnings + self.art.clear_line(0, 0, bottom_y) + self.confirm_button.set_state('normal') + # some dialogs use reason for warning + valid input + if reason: + fg = self.ui.error_color_index + self.art.write_string(0, 0, 1, bottom_y, reason, fg) + if not valid: + self.confirm_button.set_state('dimmed') + UIElement.update(self) + + def get_message(self): + # if a triple quoted string, split line breaks + msg = self.message.rstrip().split('\n') + msg_lines = [] + for line in msg: + if line != '': + msg_lines.append(line) + # TODO: split over multiple lines if too long + return msg_lines + + def get_field_colors(self, index): + "return FG and BG colors for field with given index" + fg, bg = self.inactive_field_fg_color, self.inactive_field_bg_color + # only highlight active field if we have kb focus + if self is self.ui.keyboard_focus_element and index == self.active_field: + fg, bg = self.active_field_fg_color, self.active_field_bg_color + return fg, bg + + def get_field_label(self, field_index): + "Subclasses can override to do custom label logic eg string formatting" + return self.fields[field_index].label + + def draw_fields(self, with_labels=True): + y = 2 + if self.message: + y += len(self.get_message()) + 1 + for i,field in enumerate(self.fields): + if field.type is SkipFieldType: + continue + x = 2 + # bool values: checkbox or radio button, always draw label to right + if field.type is bool: + # if field index is in any radio group, it's a radio button + is_radio = False + for group in self.radio_groups: + if i in group: + is_radio = True + break + # true/false ~ field text is 'x' + field_true = self.field_texts[i] == self.true_field_text + if is_radio: + char = self.radio_true_char_index if field_true else self.radio_false_char_index + else: + char = self.checkbox_char_index if field_true else 0 + fg, bg = self.get_field_colors(i) + self.art.set_tile_at(0, 0, x, y, char, fg, bg) + x += 2 + # draw label + if field.label: + label = self.get_field_label(i) + if with_labels: + self.art.clear_line(0, 0, y) + self.art.write_string(0, 0, x, y, label, self.fg_color) + if field.type in [bool, None]: + pass + elif field.oneline: + x += len(label) + 1 + else: + y += 1 + # draw field contents + if not field.type in [bool, None]: + fg, bg = self.get_field_colors(i) + text = self.field_texts[i] + # caret for active field (if kb focus) + if i == self.active_field and self is self.ui.keyboard_focus_element: + blink_on = int(self.ui.app.get_elapsed_time() / 250) % 2 + if blink_on: + text += '_' + # pad with spaces to full width of field + text = text.ljust(field.width) + self.art.write_string(0, 0, x, y, text, fg, bg) + y += self.y_spacing + 1 + + def get_field_y(self, field_index): + "returns a Y value for where the given field (caption) should start" + y = 2 + # add # of message lines + if self.message: + y += len(self.get_message()) + 1 + for i in range(field_index): + if self.fields[i].oneline or self.fields[i].type in [bool, None]: + y += self.y_spacing + 1 + else: + y += self.y_spacing + 2 + return y + + def get_toggled_bool_field(self, field_index): + field_text = self.field_texts[field_index] + on = field_text == self.true_field_text + # if in a radio group and turning on, toggle off the others + radio_button = False + for group in self.radio_groups: + if field_index in group: + radio_button = True + if not on: + for i in group: + if i != field_index: + self.field_texts[i] = ' ' + break + # toggle checkbox + if not radio_button: + return ' ' if on else self.true_field_text + # only toggle radio button on; selecting others toggles it off + elif on: + return field_text + else: + return self.true_field_text + + def handle_input(self, key, shift_pressed, alt_pressed, ctrl_pressed): + keystr = sdl2.SDL_GetKeyName(key).decode() + field = None + field_text = '' + if self.active_field < len(self.fields): + field = self.fields[self.active_field] + field_text = self.field_texts[self.active_field] + # special case: shortcut 'D' for 3rd button if no field input + if len(self.fields) == 0 and keystr.lower() == 'd': + self.other_pressed() + return + if keystr == '`' and not shift_pressed: + self.ui.console.toggle() + return + # if list panel is up don't let user tab away + lp = self.ui.edit_list_panel + # only allow tab to focus shift IF list panel accepts it + if keystr == 'Tab' and lp.is_visible() and \ + lp.list_operation in lp.list_operations_allow_kb_focus: + self.ui.keyboard_focus_element = self.ui.edit_list_panel + return + elif keystr == 'Return': + self.confirm_pressed() + elif keystr == 'Escape': + self.cancel_pressed() + # cycle through fields with up/down + elif keystr == 'Up' or (keystr == 'Tab' and shift_pressed): + if len(self.fields) > 1: + self.active_field -= 1 + self.active_field %= len(self.fields) + # skip over None-type fields aka dead labels + while self.fields[self.active_field].type is None or self.fields[self.active_field].type is SkipFieldType: + self.active_field -= 1 + self.active_field %= len(self.fields) + return + elif keystr == 'Down' or keystr == 'Tab': + if len(self.fields) > 1: + self.active_field += 1 + self.active_field %= len(self.fields) + while self.fields[self.active_field].type is None or self.fields[self.active_field].type is SkipFieldType: + self.active_field += 1 + self.active_field %= len(self.fields) + return + elif keystr == 'Backspace': + if len(field_text) == 0: + pass + # don't let user clear a bool value + # TODO: allow for checkboxes but not radio buttons + elif field and field.type is bool: + pass + elif alt_pressed: + # for file dialogs, delete back to last slash + last_slash = field_text[:-1].rfind('/') + # on windows, recognize backslash as well + if platform.system() == 'Windows': + last_backslash = field_text[:-1].rfind('\\') + if last_backslash != -1 and last_slash != -1: + last_slash = min(last_backslash, last_slash) + if last_slash == -1: + field_text = '' + else: + field_text = field_text[:last_slash+1] + else: + field_text = field_text[:-1] + elif keystr == 'Space': + # if field.type is bool, toggle value + if field.type is bool: + field_text = self.get_toggled_bool_field(self.active_field) + else: + field_text += ' ' + elif len(keystr) > 1: + return + # alphanumeric text input + elif field and not field.type is bool: + if field.type is str: + if not shift_pressed: + keystr = keystr.lower() + if not keystr.isalpha() and shift_pressed: + keystr = SHIFT_MAP.get(keystr, '') + elif field.type is int and not keystr.isdigit() and keystr != '-': + return + # this doesn't guard against things like 0.00.001 + elif field.type is float and not keystr.isdigit() and keystr != '.' and keystr != '-': + return + field_text += keystr + # apply new field text and redraw + if field and (len(field_text) < field.width or field.type is bool): + self.field_texts[self.active_field] = field_text + self.draw_fields(self.always_redraw_labels) + + def is_input_valid(self): + "subclasses that want to filter input put logic here" + return True, None + + def dismiss(self): + # let UI forget about us + self.ui.active_dialog = None + if self is self.ui.keyboard_focus_element: + self.ui.keyboard_focus_element = None + self.ui.refocus_keyboard() + self.ui.elements.remove(self) + + def confirm_pressed(self): + # subclasses do more here :] + self.dismiss() + + def cancel_pressed(self): + self.dismiss() + + def other_pressed(self): + self.dismiss() + + +class DialogFieldButton(UIButton): + + "invisible button that provides clickability for input fields" + + caption = '' + # re-set by dialog constructor + field_number = 0 + never_draw = True + + def click(self): + UIButton.click(self) + self.element.active_field = self.field_number + # toggle if a bool field + if self.element.fields[self.field_number].type is bool: + self.element.field_texts[self.field_number] = self.element.get_toggled_bool_field(self.field_number) + # redraw fields & labels + self.element.draw_fields(self.element.always_redraw_labels) diff --git a/ui_edit_panel.py b/ui_edit_panel.py new file mode 100644 index 0000000..382339e --- /dev/null +++ b/ui_edit_panel.py @@ -0,0 +1,493 @@ +import os + +from ui_element import UIElement +from ui_button import UIButton +from ui_game_dialog import LoadGameStateDialog, SaveGameStateDialog +from ui_chooser_dialog import ScrollArrowButton +from ui_colors import UIColors + +from game_world import TOP_GAME_DIR, STATE_FILE_EXTENSION +from ui_list_operations import LO_NONE, LO_SELECT_OBJECTS, LO_SET_SPAWN_CLASS, LO_LOAD_STATE, LO_SET_ROOM, LO_SET_ROOM_OBJECTS, LO_SET_OBJECT_ROOMS, LO_OPEN_GAME_DIR, LO_SET_ROOM_EDGE_WARP, LO_SET_ROOM_EDGE_OBJ, LO_SET_ROOM_CAMERA + + +class GamePanel(UIElement): + "base class of game edit UI panels" + tile_y = 5 + game_mode_visible = True + fg_color = UIColors.black + bg_color = UIColors.lightgrey + titlebar_fg = UIColors.white + titlebar_bg = UIColors.darkgrey + text_left = True + support_keyboard_navigation = True + support_scrolling = True + keyboard_nav_offset = -2 + + def __init__(self, ui): + self.ui = ui + self.world = self.ui.app.gw + UIElement.__init__(self, ui) + self.buttons = [] + self.create_buttons() + self.keyboard_nav_index = 0 + + def create_buttons(self): pass + # label and main item draw functions - overridden in subclasses + def get_label(self): pass + def refresh_items(self): pass + + # reset all buttons to default state + def clear_buttons(self, button_list=None): + buttons = button_list or self.buttons + for button in buttons: + self.reset_button(button) + + def reset_button(self, button): + button.normal_fg_color = UIButton.normal_fg_color + button.normal_bg_color = UIButton.normal_bg_color + button.hovered_fg_color = UIButton.hovered_fg_color + button.hovered_bg_color = UIButton.hovered_bg_color + button.can_hover = True + + def highlight_button(self, button): + button.normal_fg_color = UIButton.clicked_fg_color + button.normal_bg_color = UIButton.clicked_bg_color + button.hovered_fg_color = UIButton.clicked_fg_color + button.hovered_bg_color = UIButton.clicked_bg_color + button.can_hover = True + + def draw_titlebar(self): + # only shade titlebar if panel has keyboard focus + fg = self.titlebar_fg if self is self.ui.keyboard_focus_element else self.fg_color + bg = self.titlebar_bg if self is self.ui.keyboard_focus_element else self.bg_color + self.art.clear_line(0, 0, 0, fg, bg) + label = self.get_label() + if len(label) > self.tile_width: + label = label[:self.tile_width] + if self.text_left: + self.art.write_string(0, 0, 0, 0, label) + else: + self.art.write_string(0, 0, -1, 0, label, None, None, True) + + def reset_art(self): + self.art.clear_frame_layer(0, 0, self.bg_color, self.fg_color) + self.draw_titlebar() + self.refresh_items() + UIElement.reset_art(self) + + def clicked(self, mouse_button): + # always handle input, even if we didn't hit a button + UIElement.clicked(self, mouse_button) + return True + + def hovered(self): + # mouse hover on focus + if self.ui.app.mouse_dx or self.ui.app.mouse_dy and \ + not self is self.ui.keyboard_focus_element: + self.ui.keyboard_focus_element = self + if self.ui.active_dialog: + self.ui.active_dialog.reset_art() + + +class ListButton(UIButton): + width = 28 + clear_before_caption_draw = True + +class ListScrollArrowButton(ScrollArrowButton): + x = ListButton.width + normal_bg_color = UIButton.normal_bg_color + +class ListScrollUpArrowButton(ListScrollArrowButton): + y = 1 + +class ListScrollDownArrowButton(ListScrollArrowButton): + up = False + +class EditListPanel(GamePanel): + tile_width = ListButton.width + 1 + tile_y = 5 + scrollbar_shade_char = 54 + # height will change based on how many items in list + tile_height = 30 + snap_left = True + spawn_msg = 'Click anywhere in the world view to spawn a %s' + # transient state + titlebar = 'List titlebar' + items = [] + # text helping user know how to bail + cancel_tip = 'ESC cancels' + list_operation_labels = { + LO_NONE: 'Stuff:', + LO_SELECT_OBJECTS: 'Select objects:', + LO_SET_SPAWN_CLASS: 'Class to spawn:', + LO_LOAD_STATE: 'State to load:', + LO_SET_ROOM: 'Change room:', + LO_SET_ROOM_OBJECTS: "Set objects for %s:", + LO_SET_OBJECT_ROOMS: "Set rooms for %s:", + LO_OPEN_GAME_DIR: 'Open game:', + LO_SET_ROOM_EDGE_WARP: 'Set edge warp room/object:', + LO_SET_ROOM_EDGE_OBJ: 'Set edge bounds object:', + LO_SET_ROOM_CAMERA: 'Set room camera marker:' + } + list_operations_allow_kb_focus = [ + LO_SET_ROOM_EDGE_WARP, + LO_SET_ROOM_EDGE_OBJ, + LO_SET_ROOM_CAMERA + ] + + class ListItem: + def __init__(self, name, obj): self.name, self.obj = name, obj + def __str__(self): return self.name + + def __init__(self, ui): + # topmost index of items to show in view + self.list_scroll_index = 0 + # list operation, ie what does clicking in list do + self.list_operation = LO_NONE + # save & restore a scroll index for each flavor of list + self.scroll_indices = {} + for list_op in self.list_operation_labels: + self.scroll_indices[list_op] = 0 + # map list operations to list builder functions + self.list_functions = {LO_NONE: self.list_none, + LO_SELECT_OBJECTS: self.list_objects, + LO_SET_SPAWN_CLASS: self.list_classes, + LO_LOAD_STATE: self.list_states, + LO_SET_ROOM: self.list_rooms, + LO_SET_ROOM_OBJECTS: self.list_objects, + LO_SET_OBJECT_ROOMS: self.list_rooms, + LO_OPEN_GAME_DIR: self.list_games, + LO_SET_ROOM_EDGE_WARP: self.list_rooms_and_objects, + LO_SET_ROOM_EDGE_OBJ: self.list_objects, + LO_SET_ROOM_CAMERA: self.list_objects + } + # map list operations to "item clicked" functions + self.click_functions = {LO_SELECT_OBJECTS: self.select_object, + LO_SET_SPAWN_CLASS: self.set_spawn_class, + LO_LOAD_STATE: self.load_state, + LO_SET_ROOM: self.set_room, + LO_SET_ROOM_OBJECTS: self.set_room_object, + LO_SET_OBJECT_ROOMS: self.set_object_room, + LO_OPEN_GAME_DIR: self.open_game_dir, + LO_SET_ROOM_EDGE_WARP: self.set_room_edge_warp, + LO_SET_ROOM_EDGE_OBJ: self.set_room_bounds_obj, + LO_SET_ROOM_CAMERA: self.set_room_camera + } + # separate lists for item buttons vs other controls + self.list_buttons = [] + # set when game resets + self.should_reset_list = False + GamePanel.__init__(self, ui) + + def create_buttons(self): + def list_callback(item=None): + if not item: return + self.clicked_item(item) + for y in range(self.tile_height-1): + button = ListButton(self) + button.y = y + 1 + button.callback = list_callback + # button.cb_art set by refresh_items() + self.list_buttons.append(button) + self.buttons = self.list_buttons[:] + self.up_button = ListScrollUpArrowButton(self) + self.up_button.callback = self.scroll_list_up + self.buttons.append(self.up_button) + self.down_button = ListScrollDownArrowButton(self) + self.down_button.callback = self.scroll_list_down + # TODO: adjust height according to screen tile height + self.down_button.y = self.tile_height - 1 + self.buttons.append(self.down_button) + + def reset_art(self): + GamePanel.reset_art(self) + x = self.tile_width - 1 + for y in range(1, self.tile_height): + self.art.set_tile_at(0, 0, x, y, self.scrollbar_shade_char, + UIColors.medgrey) + + def cancel(self): + self.set_list_operation(LO_NONE) + self.world.classname_to_spawn = None + + def scroll_list_up(self): + if self.list_scroll_index > 0: + self.list_scroll_index -= 1 + + def scroll_list_down(self): + max_scroll = len(self.items) - self.tile_height + #max_scroll = len(self.element.items) - self.element.items_in_view + if self.list_scroll_index <= max_scroll: + self.list_scroll_index += 1 + + def clicked_item(self, item): + # do thing appropriate to current list operation + self.click_functions[self.list_operation](item) + + def wheel_moved(self, wheel_y): + if wheel_y > 0: + self.scroll_list_up() + return True + if wheel_y < 0: + self.scroll_list_down() + return True + + def set_list_operation(self, new_op): + "changes list type and sets new items" + if new_op == LO_LOAD_STATE and not self.world.game_dir: + return + if new_op == LO_NONE: + self.list_operation = new_op + self.ui.keyboard_focus_element = None + self.ui.refocus_keyboard() + return + # list is doing something, set us as keyboard focus + # (but not if a dialog just came up) + if not self.ui.active_dialog: + self.ui.keyboard_focus_element = self + self.items = [] + self.clear_buttons(self.list_buttons) + # save old list type's scroll index so we can restore it later + self.scroll_indices[self.list_operation] = self.list_scroll_index + self.list_operation = new_op + self.items = self.list_functions[self.list_operation]() + # restore saved scroll index for new list type + self.list_scroll_index = self.scroll_indices[self.list_operation] + # keep in bounds if list size changed since last view + self.list_scroll_index = min(self.list_scroll_index, len(self.items)) + + def get_label(self): + label = '%s (%s)' % (self.list_operation_labels[self.list_operation], self.cancel_tip) + # some labels contain variables + if '%s' in label: + if self.list_operation == LO_SET_ROOM_OBJECTS: + if self.world.current_room: + label %= self.world.current_room.name + elif self.list_operation == LO_SET_OBJECT_ROOMS: + if len(self.world.selected_objects) == 1: + label %= self.world.selected_objects[0].name + return label + + def should_highlight(self, item): + if self.list_operation == LO_SELECT_OBJECTS: + return item.obj in self.world.selected_objects + elif self.list_operation == LO_SET_SPAWN_CLASS: + return item.name == self.world.classname_to_spawn + elif self.list_operation == LO_LOAD_STATE: + last_gs = os.path.basename(self.world.last_state_loaded) + last_gs = os.path.splitext(last_gs)[0] + return item.name == last_gs + elif self.list_operation == LO_SET_ROOM: + return self.world.current_room and item.name == self.world.current_room.name + elif self.list_operation == LO_SET_ROOM_OBJECTS: + return self.world.current_room and item.name in self.world.current_room.objects + elif self.list_operation == LO_SET_OBJECT_ROOMS: + return len(self.world.selected_objects) == 1 and item.name in self.world.selected_objects[0].rooms + return False + + def game_reset(self): + self.should_reset_list = True + + def items_changed(self): + "called by anything that changes the items list, eg object add/delete" + self.items = self.list_functions[self.list_operation]() + # change selected item index if it's OOB + if self.keyboard_nav_index >= len(self.items): + self.keyboard_nav_index = len(self.items) - 1 + + def refresh_items(self): + for i,b in enumerate(self.list_buttons): + if i >= len(self.items): + b.caption = '' + b.cb_arg = None + self.reset_button(b) + b.can_hover = False + else: + index = self.list_scroll_index + i + item = self.items[index] + b.cb_arg = item + b.caption = item.name[:self.tile_width - 1] + b.can_hover = True + # change button appearance if this item should remain + # highlighted/selected + if self.should_highlight(item): + self.highlight_button(b) + else: + self.reset_button(b) + self.draw_buttons() + + def post_keyboard_navigate(self): + # check for scrolling + if len(self.items) <= len(self.list_buttons): + return + # wrap if at end of list + if self.keyboard_nav_index + self.list_scroll_index >= len(self.items): + self.keyboard_nav_index = 0 + self.list_scroll_index = 0 + # scroll down + elif self.keyboard_nav_index >= len(self.list_buttons): + self.scroll_list_down() + self.keyboard_nav_index -= 1 + # wrap if at top of list + elif self.list_scroll_index == 0 and self.keyboard_nav_index < 0: + self.list_scroll_index = len(self.items) - len(self.list_buttons) + self.keyboard_nav_index = len(self.list_buttons) - 1 + # scroll up + elif self.keyboard_nav_index < 0: + self.scroll_list_up() + self.keyboard_nav_index += 1 + + def update(self): + if self.should_reset_list: + self.set_list_operation(self.list_operation) + self.should_reset_list = False + # redraw contents every update + self.draw_titlebar() + self.refresh_items() + GamePanel.update(self) + self.renderable.alpha = 1 if self is self.ui.keyboard_focus_element else 0.5 + + def is_visible(self): + return GamePanel.is_visible(self) and self.list_operation != LO_NONE + + # + # list functions + # + def list_classes(self): + items = [] + base_class = self.world.modules['game_object'].GameObject + # get list of available classes from GameWorld + for classname,classdef in self.world._get_all_loaded_classes().items(): + # ignore non-GO classes, eg GameRoom, GameHUD + if not issubclass(classdef, base_class): + continue + if classdef.exclude_from_class_list: + continue + item = self.ListItem(classname, classdef) + items.append(item) + # sort classes alphabetically + items.sort(key=lambda i: i.name) + return items + + def list_objects(self): + items = [] + # include just-spawned objects too + all_objects = self.world.objects.copy() + all_objects.update(self.world.new_objects) + for obj in all_objects.values(): + if obj.exclude_from_object_list: + continue + if self.world.list_only_current_room_objects and not self.world.current_room.name in obj.rooms: + continue + li = self.ListItem(obj.name, obj) + items.append(li) + # sort object names alphabetically + items.sort(key=lambda i: i.name) + return items + + def list_states(self): + items = [] + # list state files in current game dir + for filename in os.listdir(self.world.game_dir): + if filename.endswith('.' + STATE_FILE_EXTENSION): + li = self.ListItem(filename[:-3], None) + items.append(li) + items.sort(key=lambda i: i.name) + return items + + def list_rooms(self): + items = [] + for room in self.world.rooms.values(): + li = self.ListItem(room.name, room) + items.append(li) + items.sort(key=lambda i: i.name) + return items + + def list_games(self): + def get_dirs(dirname): + dirs = [] + for filename in os.listdir(dirname): + if os.path.isdir(dirname + filename): + dirs.append(filename) + return dirs + # get list of both app dir games and user dir games + docs_game_dir = self.ui.app.documents_dir + TOP_GAME_DIR + items = [] + game_dirs = get_dirs(TOP_GAME_DIR) + get_dirs(docs_game_dir) + game_dirs.sort() + for game in game_dirs: + li = self.ListItem(game, None) + items.append(li) + return items + + def list_rooms_and_objects(self): + items = self.list_rooms() + # prefix room names with "ROOM:" + for i,item in enumerate(items): + item.name = 'ROOM: %s' % item.name + items += self.list_objects() + return items + + def list_none(self): + return [] + + # + # "clicked list item" functions + # + def select_object(self, item): + # add to/remove from/overwrite selected list based on mod keys + if self.ui.app.il.ctrl_pressed: + self.world.deselect_object(item.obj) + elif self.ui.app.il.shift_pressed: + self.world.select_object(item.obj, force=True) + else: + self.world.deselect_all() + self.world.select_object(item.obj, force=True) + + def set_spawn_class(self, item): + # set this class to be the one spawned when GameWorld is clicked + self.world.classname_to_spawn = item.name + self.ui.message_line.post_line(self.spawn_msg % self.world.classname_to_spawn, 5) + + def load_state(self, item): + self.world.load_game_state(item.name) + + def set_room(self, item): + self.world.change_room(item.name) + + def set_room_object(self, item): + # add/remove object from current room + if item.name in self.world.current_room.objects: + self.world.current_room.remove_object_by_name(item.name) + else: + self.world.current_room.add_object_by_name(item.name) + + def set_object_room(self, item): + # UI can only show a single object's rooms, do nothing if many selected + if len(self.world.selected_objects) != 1: + return + # add if not in room, remove if in room + obj = self.world.selected_objects[0] + room = self.world.rooms[item.name] + if room.name in obj.rooms: + room.remove_object(obj) + else: + room.add_object(obj) + + def open_game_dir(self, item): + self.world.set_game_dir(item.name, True) + + def set_room_edge_warp(self, item): + dialog = self.ui.active_dialog + dialog.field_texts[dialog.active_field] = item.obj.name + self.ui.keyboard_focus_element = dialog + + def set_room_bounds_obj(self, item): + dialog = self.ui.active_dialog + dialog.field_texts[dialog.active_field] = item.obj.name + self.ui.keyboard_focus_element = dialog + + def set_room_camera(self, item): + dialog = self.ui.active_dialog + dialog.field_texts[dialog.active_field] = item.obj.name + self.ui.keyboard_focus_element = dialog diff --git a/ui_element.py b/ui_element.py new file mode 100644 index 0000000..ccc0827 --- /dev/null +++ b/ui_element.py @@ -0,0 +1,474 @@ +import time +import numpy as np +from math import ceil + +import vector +from art import Art +from renderable import TileRenderable +from renderable_line import LineRenderable +from ui_button import UIButton + +class UIElement: + + # size, in tiles + tile_width, tile_height = 1, 1 + snap_top, snap_bottom, snap_left, snap_right = False, False, False, False + # location in tile coords; snap_* trumps these + tile_x, tile_y = 0, 0 + # location in screen (GL) coords + x, y = 0, 0 + visible = True + # UI calls our update() even when we're invisible + update_when_invisible = False + # cheapo drop shadow effect, draws renderable dark at a small offset + drop_shadow = False + renderables = None + can_hover = True + # always return True for clicked/unclicked, "consuming" the input + always_consume_input = False + buttons = [] + # if True, use shared keyboard navigation controls + support_keyboard_navigation = False + support_scrolling = False + keyboard_nav_left_right = False + # renders in "game mode" + game_mode_visible = False + all_modes_visible = False + keyboard_nav_offset = 0 + + def __init__(self, ui): + self.ui = ui + self.hovered_buttons = [] + # generate a unique name + art_name = '%s_%s' % (int(time.time()), self.__class__.__name__) + self.art = UIArt(art_name, self.ui.app, self.ui.charset, self.ui.palette, self.tile_width, self.tile_height) + self.renderable = UIRenderable(self.ui.app, self.art) + self.renderable.ui = self.ui + # some elements add their own renderables before calling this + # constructor, make sure we're not erasing any + if not self.renderables: + self.renderables = [] + self.renderables.append(self.renderable) + self.reset_art() + self.reset_loc() + if self.support_keyboard_navigation: + self.keyboard_nav_index = 0 + + def is_inside(self, x, y): + "returns True if given point is inside this element's bounds" + w = self.tile_width * self.art.quad_width + h = self.tile_height * self.art.quad_height + return self.x <= x <= self.x+w and self.y >= y >= self.y-h + + def is_inside_button(self, x, y, button): + "returns True if given point is inside the given button's bounds" + aqw, aqh = self.art.quad_width, self.art.quad_height + # put negative values in range + bx, by = (button.x % self.art.width) * aqw, (button.y % self.art.height) * aqh + bw, bh = button.width * aqw, button.height * aqh + bxmin, bymin = self.x + bx, self.y - by + bxmax, bymax = bxmin + bw, bymin - bh + return bxmin <= x <= bxmax and bymin >= y >= bymax + + def reset_art(self): + """ + runs on init and resize, restores state. + """ + self.draw_buttons() + + def draw_buttons(self): + for button in self.buttons: + if button.visible: + button.draw() + + def hovered(self): + self.log_event('hovered') + + def unhovered(self): + self.log_event('unhovered') + + def wheel_moved(self, wheel_y): + handled = False + return handled + + def clicked(self, mouse_button): + self.log_event('clicked', mouse_button) + # return if a button did something + handled = False + # tell any hovered buttons they've been clicked + for b in self.hovered_buttons: + if b.can_click: + b.click() + if b.callback: + # button callback might need extra data (cb_arg) + if b.cb_arg is not None: + # button might want to know which mouse button clicked + if b.pass_mouse_button: + b.callback(mouse_button, b.cb_arg) + else: + b.callback(b.cb_arg) + else: + if b.pass_mouse_button: + b.callback(mouse_button) + else: + b.callback() + handled = True + if self.always_consume_input: + return True + return handled + + def unclicked(self, mouse_button): + self.log_event('unclicked', mouse_button) + handled = False + for b in self.hovered_buttons: + b.unclick() + handled = True + if self.always_consume_input: + return True + return handled + + def log_event(self, event_type, mouse_button=None): + mouse_button = mouse_button or '[n/a]' + if self.ui.logg: + self.ui.app.log('UIElement: %s %s with mouse button %s' % (self.__class__.__name__, event_type, mouse_button)) + + def is_visible(self): + if self.all_modes_visible: + return self.visible + elif not self.ui.app.game_mode and self.game_mode_visible: + return False + elif self.ui.app.game_mode and not self.game_mode_visible: + return False + return self.visible + + def reset_loc(self): + if self.snap_top: + self.y = 1 + elif self.snap_bottom: + self.y = self.art.quad_height * self.tile_height - 1 + elif self.tile_y: + self.y = 1 - (self.tile_y * self.art.quad_height) + if self.snap_left: + self.x = -1 + elif self.snap_right: + self.x = 1 - (self.art.quad_width * self.tile_width) + elif self.tile_x: + self.x = -1 + (self.tile_x * self.art.quad_width) + self.renderable.x, self.renderable.y = self.x, self.y + + def keyboard_navigate(self, move_x, move_y): + if not self.support_keyboard_navigation: + return + if self.keyboard_nav_left_right: + if move_x < 0: + self.ui.menu_bar.previous_menu() + return + elif move_x > 0: + self.ui.menu_bar.next_menu() + return + old_idx = self.keyboard_nav_index + new_idx = self.keyboard_nav_index + move_y + self.keyboard_nav_index += move_y + if not self.support_scrolling: + # if button list starts at >0 Y, use an offset + self.keyboard_nav_index %= len(self.buttons) + self.keyboard_nav_offset + tries = 0 + # recognize two different kinds of inactive items: empty caption and dim state + while tries < len(self.buttons) and (self.buttons[self.keyboard_nav_index].caption == '' or self.buttons[self.keyboard_nav_index].state == 'dimmed'): + # move_y might be zero, give it a direction to avoid infinite loop + # if menu item 0 is dimmed + self.keyboard_nav_index += move_y or 1 + self.keyboard_nav_index %= len(self.buttons) + self.keyboard_nav_offset + tries += 1 + if tries == len(self.buttons): + return + self.post_keyboard_navigate() + self.update_keyboard_hover() + + def update_keyboard_hover(self): + if not self.support_keyboard_navigation: + return + for i,button in enumerate(self.buttons): + # don't higlhight if this panel doesn't have focus + if self.keyboard_nav_index == i and self is self.ui.keyboard_focus_element: + button.set_state('hovered') + elif button.state != 'dimmed': + button.set_state('normal') + + def keyboard_select_item(self): + if not self.support_keyboard_navigation: + return + button = self.buttons[self.keyboard_nav_index] + # don't allow selecting dimmed buttons + if button.state == 'dimmed': + return + # check for None; cb_arg could be 0 + if button.cb_arg is not None: + button.callback(button.cb_arg) + else: + button.callback() + return button + + def post_keyboard_navigate(self): + # subclasses can put stuff here to check scrolling etc + pass + + def update(self): + "runs every frame, checks button states" + # this is very similar to UI.update, implying an alternative structure + # in which UIElements can contain other UIElements. i've seen this get + # really confusing on past projects though, so let's try a flatter + # architecture - UI w/ UIelements, UIElements w/ UIButtons - for now. + mx, my = self.ui.get_screen_coords(self.ui.app.mouse_x, self.ui.app.mouse_y) + was_hovering = self.hovered_buttons[:] + self.hovered_buttons = [] + for b in self.buttons: + # element.clicked might have been set it non-hoverable, acknowledge + # its hoveredness here so it can unhover correctly + if b.visible and (b.can_hover or b.state == 'clicked') and self.is_inside_button(mx, my, b): + self.hovered_buttons.append(b) + if not b in was_hovering: + b.hover() + for b in was_hovering: + if not b in self.hovered_buttons: + b.unhover() + # tiles might have just changed + self.art.update() + + def render(self): + # ("is visible" check happens in UI.render, calls our is_visible) + # render drop shadow first + if self.drop_shadow: + # offset in X and Y, render then restore position + orig_x, orig_y = self.renderable.x, self.renderable.y + self.renderable.x += UIArt.quad_width / 10 + self.renderable.y -= UIArt.quad_height / 10 + self.renderable.render(brightness=0.1) + self.renderable.x, self.renderable.y = orig_x, orig_y + self.renderable.render() + + def destroy(self): + for r in self.renderables: + r.destroy() + + +class UIArt(Art): + recalc_quad_height = False + log_creation = False + + +class UIRenderable(TileRenderable): + + grain_strength = 0.2 + + def get_projection_matrix(self): + # don't use projection matrix, ie identity[0][0]=aspect; + # rather do all aspect correction in UI.set_scale when determining quad size + return self.ui.view_matrix + + def get_view_matrix(self): + return self.ui.view_matrix + + +class FPSCounterUI(UIElement): + + tile_y = 1 + tile_width, tile_height = 12, 2 + snap_right = True + game_mode_visible = True + all_modes_visible = True + visible = False + + def update(self): + bg = 0 + self.art.clear_frame_layer(0, 0, bg) + color = self.ui.colors.white + # yellow or red if framerate dips + if self.ui.app.fps < 30: + color = self.ui.colors.yellow + if self.ui.app.fps < 10: + color = self.ui.colors.red + text = '%.1f fps' % self.ui.app.fps + x = self.tile_width - 1 + self.art.write_string(0, 0, x, 0, text, color, None, True) + # display last tick time; frame_time includes delay, is useless + text = '%.1f ms ' % self.ui.app.frame_time + self.art.write_string(0, 0, x, 1, text, color, None, True) + + def render(self): + # always show FPS if low + if self.visible or self.ui.app.fps < 30: + self.renderable.render() + + +class MessageLineUI(UIElement): + + "when console outputs something new, show last line here before fading out" + + tile_y = 2 + snap_left = True + # just info, don't bother with hover, click etc + can_hover = False + default_hold_time = 1 + fade_rate = 0.025 + game_mode_visible = True + all_modes_visible = True + drop_shadow = True + + def __init__(self, ui): + UIElement.__init__(self, ui) + # line we're currently displaying (even after fading out) + self.line = '' + self.last_post = self.ui.app.get_elapsed_time() + self.hold_time = self.default_hold_time + self.alpha = 1 + + def reset_art(self): + self.tile_width = ceil(self.ui.width_tiles) + self.art.resize(self.tile_width, self.tile_height) + self.art.clear_frame_layer(0, 0, 0, self.ui.colors.white) + UIElement.reset_loc(self) + + def post_line(self, new_line, hold_time=None, error=False): + "write a line to this element (ie so as not to spam console log)" + self.hold_time = hold_time or self.default_hold_time + # use a different color if it's an error + color = self.ui.error_color_index if error else self.ui.colors.white + start_x = 1 + # trim to screen width + self.line = str(new_line)[:self.tile_width-start_x-1] + self.art.clear_frame_layer(0, 0, 0, color) + self.art.write_string(0, 0, start_x, 0, self.line) + self.alpha = 1 + self.last_post = self.ui.app.get_elapsed_time() + + def update(self): + if self.ui.app.get_elapsed_time() > self.last_post + (self.hold_time * 1000): + if self.alpha >= self.fade_rate: + self.alpha -= self.fade_rate + if self.alpha <= self.fade_rate: + self.alpha = 0 + self.renderable.alpha = self.alpha + + def render(self): + # TODO: draw if popup is visible but not obscuring message line? + if not self.ui.popup in self.ui.hovered_elements and not self.ui.console.visible: + UIElement.render(self) + + +class DebugTextUI(UIElement): + + "simple UI element for posting debug text" + + tile_x, tile_y = 1, 4 + tile_height = 20 + clear_lines_after_render = True + game_mode_visible = True + visible = False + + def __init__(self, ui): + UIElement.__init__(self, ui) + self.lines = [] + + def reset_art(self): + self.tile_width = ceil(self.ui.width_tiles) + self.art.resize(self.tile_width, self.tile_height) + self.art.clear_frame_layer(0, 0, 0, self.ui.colors.white) + UIElement.reset_loc(self) + + def post_lines(self, lines): + if type(lines) is list: + self.lines += lines + else: + self.lines += [lines] + + def update(self): + self.art.clear_frame_layer(0, 0, 0, self.ui.colors.white) + for y,line in enumerate(self.lines): + self.art.write_string(0, 0, 0, y, line) + + def render(self): + UIElement.render(self) + if self.clear_lines_after_render: + self.lines = [] + #self.art.clear_frame_layer(0, 0, 0, self.ui.colors.white) + + +class ToolTip(UIElement): + + "popup text label that is invoked and controlled by a UIButton hover" + + visible = False + tile_width, tile_height = 30, 1 + tile_x, tile_y = 10, 5 + + def set_text(self, text): + self.art.write_string(0, 0, 0, 0, text, + self.ui.colors.black, self.ui.colors.white) + # clear tiles past end of text + for x in range(len(text), self.tile_width): + self.art.set_color_at(0, 0, x, 0, 0, 0) + + def reset_art(self): + UIElement.reset_art(self) + self.art.clear_frame_layer(0, 0, + self.ui.colors.white, self.ui.colors.black) + + +class GameLabel(UIElement): + tile_width, tile_height = 50, 1 + game_mode_visible = True + drop_shadow = True + update_when_invisible = True + + +class GameSelectionLabel(GameLabel): + + multi_select_label = '[%s selected]' + + def update(self): + self.visible = False + if self.ui.pulldown.visible or not self.ui.is_game_edit_ui_visible(): + return + if len(self.ui.app.gw.selected_objects) == 0: + return + self.visible = True + if len(self.ui.app.gw.selected_objects) == 1: + obj = self.ui.app.gw.selected_objects[0] + text = obj.name[:self.tile_width-1] + x, y, z = obj.x, obj.y, obj.z + else: + # draw "[N selected]" at avg of selected object locations + text = self.multi_select_label % len(self.ui.app.gw.selected_objects) + x, y, z = 0, 0, 0 + for obj in self.ui.app.gw.selected_objects: + x += obj.x + y += obj.y + z += obj.z + x /= len(self.ui.app.gw.selected_objects) + y /= len(self.ui.app.gw.selected_objects) + z /= len(self.ui.app.gw.selected_objects) + self.art.clear_line(0, 0, 0, self.ui.colors.white, -1) + self.art.write_string(0, 0, 0, 0, text) + self.x, self.y = vector.world_to_screen_normalized(self.ui.app, x, y, z) + self.reset_loc() + +class GameHoverLabel(GameLabel): + + alpha = 0.75 + + def update(self): + self.visible = False + if self.ui.pulldown.visible or not self.ui.is_game_edit_ui_visible(): + return + if not self.ui.app.gw.hovered_focus_object: + return + self.visible = True + obj = self.ui.app.gw.hovered_focus_object + text = obj.name[:self.tile_width-1] + x, y, z = obj.x, obj.y, obj.z + self.art.clear_line(0, 0, 0, self.ui.colors.white, -1) + self.art.write_string(0, 0, 0, 0, text) + self.x, self.y = vector.world_to_screen_normalized(self.ui.app, x, y, z) + self.reset_loc() + self.renderable.alpha = self.alpha diff --git a/ui_file_chooser_dialog.py b/ui_file_chooser_dialog.py new file mode 100644 index 0000000..83f4466 --- /dev/null +++ b/ui_file_chooser_dialog.py @@ -0,0 +1,464 @@ + +import os, time, json + +from PIL import Image + +from texture import Texture +from ui_chooser_dialog import ChooserDialog, ChooserItem, ChooserItemButton +from ui_console import OpenCommand, LoadCharSetCommand, LoadPaletteCommand +from ui_art_dialog import PaletteFromFileDialog, ImportOptionsDialog +from art import ART_DIR, ART_FILE_EXTENSION, THUMBNAIL_CACHE_DIR, SCRIPT_FILE_EXTENSION, ART_SCRIPT_DIR +from palette import Palette, PALETTE_DIR, PALETTE_EXTENSIONS +from charset import CharacterSet, CHARSET_DIR, CHARSET_FILE_EXTENSION +from image_export import write_thumbnail + + +class BaseFileChooserItem(ChooserItem): + + hide_file_extension = False + + def get_short_dir_name(self): + # name should end in / but don't assume + dir_name = self.name[:-1] if self.name.endswith('/') else self.name + return os.path.basename(dir_name) + '/' + + def get_label(self): + if os.path.isdir(self.name): + return self.get_short_dir_name() + else: + label = os.path.basename(self.name) + if self.hide_file_extension: + return os.path.splitext(label)[0] + else: + return label + + def get_description_lines(self): + if os.path.isdir(self.name): + if self.name == '..': + return ['[parent folder]'] + # TODO: # of items in dir? + return [] + return None + + def picked(self, element): + # if this is different from the last clicked item, pick it + if element.selected_item_index != self.index: + ChooserItem.picked(self, element) + element.first_selection_made = True + return + # if we haven't yet clicked something in this view, require another + # click before opening it (consistent double click behavior for + # initial selections) + if not element.first_selection_made: + element.first_selection_made = True + return + if self.name == '..' and self.name != '/': + new_dir = os.path.abspath(os.path.abspath(element.current_dir) + '/..') + element.change_current_dir(new_dir) + elif os.path.isdir(self.name): + new_dir = element.current_dir + self.get_short_dir_name() + element.change_current_dir(new_dir) + else: + element.confirm_pressed() + element.first_selection_made = False + +class BaseFileChooserDialog(ChooserDialog): + + "base class for choosers whose items correspond with files" + chooser_item_class = BaseFileChooserItem + show_filenames = True + file_extensions = [] + + def set_initial_dir(self): + self.current_dir = self.ui.app.documents_dir + self.field_texts[self.active_field] = self.current_dir + + def get_filenames(self): + "subclasses override: get list of desired filenames" + return self.get_sorted_dir_list() + + def get_sorted_dir_list(self): + "common code for getting sorted directory + file lists" + # list parent, then dirs, then filenames with extension(s) + parent = [] if self.current_dir == '/' else ['..'] + if not os.path.exists(self.current_dir): + return parent + dirs, files = [], [] + for filename in os.listdir(self.current_dir): + # skip unix-hidden files + if filename.startswith('.'): + continue + full_filename = self.current_dir + filename + # if no extensions specified, take any file + if len(self.file_extensions) == 0: + self.file_extensions = [''] + for ext in self.file_extensions: + if os.path.isdir(full_filename): + dirs += [full_filename + '/'] + break + elif filename.lower().endswith(ext.lower()): + files += [full_filename] + break + dirs.sort(key=lambda x: x.lower()) + files.sort(key=lambda x: x.lower()) + return parent + dirs + files + + def get_items(self): + "populate and return items from list of files, loading as needed" + items = [] + # find all suitable files (images) + filenames = self.get_filenames() + # use manual counter, as we skip past some files that don't fit + i = 0 + for filename in filenames: + item = self.chooser_item_class(i, filename) + if not item.valid: + continue + items.append(item) + i += 1 + return items + + +# +# art chooser +# + +class ArtChooserItem(BaseFileChooserItem): + + # set in load() + art_width = None + hide_file_extension = True + + def get_description_lines(self): + lines = BaseFileChooserItem.get_description_lines(self) + if lines is not None: + return lines + if not self.art_width: + return [] + mod_time = time.gmtime(self.art_mod_time) + mod_time = time.strftime('%Y-%m-%d %H:%M:%S', mod_time) + lines = ['last change: %s' % mod_time] + line = '%s x %s, ' % (self.art_width, self.art_height) + line += '%s frame' % self.art_frames + # pluralize properly + line += 's' if self.art_frames > 1 else '' + line += ', %s layer' % self.art_layers + line += 's' if self.art_layers > 1 else '' + lines += [line] + lines += ['char: %s, pal: %s' % (self.art_charset, self.art_palette)] + return lines + + def get_preview_texture(self, app): + if os.path.isdir(self.name): + return + thumbnail_filename = app.cache_dir + THUMBNAIL_CACHE_DIR + self.art_hash + '.png' + # create thumbnail if it doesn't exist + if not os.path.exists(thumbnail_filename): + write_thumbnail(app, self.name, thumbnail_filename) + # read thumbnail + img = Image.open(thumbnail_filename) + img = img.convert('RGBA') + img = img.transpose(Image.FLIP_TOP_BOTTOM) + return Texture(img.tobytes(), *img.size) + + def load(self, app): + if os.path.isdir(self.name): + return + if not os.path.exists(self.name): + return + # get last modified time for description + self.art_mod_time = os.path.getmtime(self.name) + # get file's hash for unique thumbnail name + self.art_hash = app.get_file_hash(self.name) + # rather than load the entire art, just get some high level stats + d = json.load(open(self.name)) + self.art_width, self.art_height = d['width'], d['height'] + self.art_frames = len(d['frames']) + self.art_layers = len(d['frames'][0]['layers']) + self.art_charset = d['charset'] + self.art_palette = d['palette'] + + +class ArtChooserDialog(BaseFileChooserDialog): + + title = 'Open art' + confirm_caption = 'Open' + cancel_caption = 'Cancel' + chooser_item_class = ArtChooserItem + flip_preview_y = False + directory_aware = True + file_extensions = [ART_FILE_EXTENSION] + + def set_initial_dir(self): + # TODO: IF no art in Documents dir yet, start in app/art/ for examples? + # get last opened dir, else start in docs/game art dir + if self.ui.app.last_art_dir: + self.current_dir = self.ui.app.last_art_dir + else: + self.current_dir = self.ui.app.gw.game_dir if self.ui.app.gw.game_dir else self.ui.app.documents_dir + self.current_dir += ART_DIR + self.field_texts[self.active_field] = self.current_dir + + def confirm_pressed(self): + if not os.path.exists(self.field_texts[0]): + return + self.ui.app.last_art_dir = self.current_dir + OpenCommand.execute(self.ui.console, [self.field_texts[0]]) + self.dismiss() + + +# +# generic file chooser for importers +# +class GenericImportChooserDialog(BaseFileChooserDialog): + + title = 'Import %s' + confirm_caption = 'Import' + cancel_caption = 'Cancel' + # allowed extensions set by invoking + file_extensions = [] + show_preview_image = False + directory_aware = True + + def __init__(self, ui, options): + self.title %= ui.app.importer.format_name + self.file_extensions = ui.app.importer.allowed_file_extensions + BaseFileChooserDialog.__init__(self, ui, options) + + def set_initial_dir(self): + if self.ui.app.last_import_dir: + self.current_dir = self.ui.app.last_import_dir + else: + self.current_dir = self.ui.app.documents_dir + self.field_texts[self.active_field] = self.current_dir + + def confirm_pressed(self): + filename = self.field_texts[0] + if not os.path.exists(filename): + return + self.ui.app.last_import_dir = self.current_dir + self.dismiss() + # importer might offer a dialog for options + if self.ui.app.importer.options_dialog_class: + options = {'filename': filename} + self.ui.open_dialog(self.ui.app.importer.options_dialog_class, + options) + else: + ImportOptionsDialog.do_import(self.ui.app, filename, {}) + + +class ImageChooserItem(BaseFileChooserItem): + + def get_preview_texture(self, app): + if os.path.isdir(self.name): + return + # may not be a valid image file + try: + img = Image.open(self.name) + except: + return + try: + img = img.convert('RGBA') + except: + # (probably) PIL bug: some images just crash! return None + return + img = img.transpose(Image.FLIP_TOP_BOTTOM) + return Texture(img.tobytes(), *img.size) + +class ImageFileChooserDialog(BaseFileChooserDialog): + + cancel_caption = 'Cancel' + chooser_item_class = ImageChooserItem + flip_preview_y = False + directory_aware = True + file_extensions = ['png', 'jpg', 'jpeg', 'bmp', 'gif'] + +class PaletteFromImageChooserDialog(ImageFileChooserDialog): + + title = 'Palette from image' + confirm_caption = 'Choose' + + def confirm_pressed(self): + if not os.path.exists(self.field_texts[0]): + return + # open new dialog, pipe our field 0 into its field 0 + filename = self.field_texts[0] + self.dismiss() + self.ui.open_dialog(PaletteFromFileDialog) + self.ui.active_dialog.field_texts[0] = filename + # base new palette filename on source image + palette_filename = os.path.basename(filename) + palette_filename = os.path.splitext(palette_filename)[0] + self.ui.active_dialog.field_texts[1] = palette_filename + +# +# palette chooser +# + +class PaletteChooserItem(BaseFileChooserItem): + + def get_label(self): + return os.path.splitext(self.name)[0] + + def get_description_lines(self): + colors = len(self.palette.colors) + return ['Unique colors: %s' % str(colors - 1)] + + def get_preview_texture(self, app): + return self.palette.src_texture + + def load(self, app): + self.palette = app.load_palette(self.name) + + +class PaletteChooserDialog(BaseFileChooserDialog): + + title = 'Choose palette' + chooser_item_class = PaletteChooserItem + + def get_initial_selection(self): + if not self.ui.active_art: + return 0 + for item in self.items: + # depend on label being same as palette's internal name, + # eg filename minus extension + if item.label == self.ui.active_art.palette.name: + return item.index + #print("couldn't find initial selection for %s, returning 0" % self.__class__.__name__) + return 0 + + def get_filenames(self): + filenames = [] + # search all files in dirs with appropriate extensions + for dirname in self.ui.app.get_dirnames(PALETTE_DIR, False): + for filename in os.listdir(dirname): + for ext in PALETTE_EXTENSIONS: + if filename.lower().endswith(ext.lower()): + filenames.append(filename) + filenames.sort(key=lambda x: x.lower()) + return filenames + + def confirm_pressed(self): + item = self.get_selected_item() + self.ui.active_art.set_palette(item.palette, log=True) + self.ui.popup.set_active_palette(item.palette) + +# +# charset chooser +# + +class CharsetChooserItem(BaseFileChooserItem): + + def get_label(self): + return os.path.splitext(self.name)[0] + + def get_description_lines(self): + # first comment in file = description + lines = [] + for line in open(self.charset.filename, encoding='utf-8').readlines(): + line = line.strip() + if line.startswith('//'): + lines.append(line[2:]) + break + lines.append('Characters: %s' % str(self.charset.last_index)) + return lines + + def get_preview_texture(self, app): + return self.charset.texture + + def load(self, app): + self.charset = app.load_charset(self.name) + + +class CharSetChooserDialog(BaseFileChooserDialog): + + title = 'Choose character set' + flip_preview_y = False + chooser_item_class = CharsetChooserItem + + def get_initial_selection(self): + if not self.ui.active_art: + return 0 + for item in self.items: + if item.label == self.ui.active_art.charset.name: + return item.index + #print("couldn't find initial selection for %s, returning 0" % self.__class__.__name__) + return 0 + + def get_filenames(self): + filenames = [] + # search all files in dirs with appropriate extensions + for dirname in self.ui.app.get_dirnames(CHARSET_DIR, False): + for filename in os.listdir(dirname): + if filename.lower().endswith(CHARSET_FILE_EXTENSION.lower()): + filenames.append(filename) + filenames.sort(key=lambda x: x.lower()) + return filenames + + def confirm_pressed(self): + item = self.get_selected_item() + self.ui.active_art.set_charset(item.charset, log=True) + self.ui.popup.set_active_charset(item.charset) + # change in charset aspect should be treated as a resize + # for purposes of grid, camera, cursor, overlay + self.ui.adjust_for_art_resize(self.ui.active_art) + + +class ArtScriptChooserItem(BaseFileChooserItem): + + def get_label(self): + label = os.path.splitext(self.name)[0] + return os.path.basename(label) + + def get_description_lines(self): + lines = [] + # read every comment line until a non-comment line is encountered + for line in self.script.readlines(): + line = line.strip() + if not line: + continue + if not line.startswith('#'): + break + # snip # + line = line[line.index('#')+1:] + lines.append(line) + return lines + + def load(self, app): + self.script = open(self.name) + + +class RunArtScriptDialog(BaseFileChooserDialog): + + title = 'Run Artscript' + tile_width, big_width = 70, 90 + tile_height, big_height = 15, 25 + chooser_item_class = ArtScriptChooserItem + show_preview_image = False + + def get_filenames(self): + filenames = [] + # search all files in dirs with appropriate extensions + for dirname in self.ui.app.get_dirnames(ART_SCRIPT_DIR, False): + for filename in os.listdir(dirname): + if filename.lower().endswith(SCRIPT_FILE_EXTENSION.lower()): + filenames.append(dirname + filename) + filenames.sort(key=lambda x: x.lower()) + return filenames + + def confirm_pressed(self): + item = self.get_selected_item() + self.ui.app.last_art_script = item.name + self.ui.active_art.run_script(item.name, log=False) + self.dismiss() + + +class OverlayImageFileChooserDialog(ImageFileChooserDialog): + + title = 'Choose overlay image' + confirm_caption = 'Choose' + + def confirm_pressed(self): + filename = self.field_texts[0] + self.ui.app.set_overlay_image(filename) + self.dismiss() diff --git a/ui_game_dialog.py b/ui_game_dialog.py new file mode 100644 index 0000000..1c17827 --- /dev/null +++ b/ui_game_dialog.py @@ -0,0 +1,198 @@ + +from ui_dialog import UIDialog, Field + +from ui_console import SetGameDirCommand, LoadGameStateCommand, SaveGameStateCommand +from ui_list_operations import LO_NONE, LO_SELECT_OBJECTS, LO_SET_SPAWN_CLASS, LO_LOAD_STATE, LO_SET_ROOM, LO_SET_ROOM_OBJECTS, LO_SET_OBJECT_ROOMS, LO_OPEN_GAME_DIR, LO_SET_ROOM_EDGE_WARP + + +class NewGameDirDialog(UIDialog): + title = 'New game' + field0_label = 'Name of new game folder:' + field1_label = 'Name of new game:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field0_label, type=str, width=field_width, oneline=False), + Field(label=field1_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Create' + game_mode_visible = True + + # TODO: only allow names that don't already exist + + def get_initial_field_text(self, field_number): + # provide a reasonable non-blank name + if field_number == 0: + return 'newgame' + elif field_number == 1: + return type(self.ui.app.gw).game_title + + def confirm_pressed(self): + if self.ui.app.gw.create_new_game(self.field_texts[0], self.field_texts[1]): + self.ui.app.enter_game_mode() + self.dismiss() + +class LoadGameStateDialog(UIDialog): + + title = 'Open game state' + field_label = 'Game state file to open:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Open' + game_mode_visible = True + + # TODO: only allow valid game state file in current game directory + + def confirm_pressed(self): + LoadGameStateCommand.execute(self.ui.console, [self.field_texts[0]]) + self.dismiss() + +class SaveGameStateDialog(UIDialog): + + title = 'Save game state' + field_label = 'New filename for game state:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Save' + game_mode_visible = True + + def confirm_pressed(self): + SaveGameStateCommand.execute(self.ui.console, [self.field_texts[0]]) + self.dismiss() + +class AddRoomDialog(UIDialog): + title = 'Add new room' + field0_label = 'Name for new room:' + field1_label = 'Class of new room:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field0_label, type=str, width=field_width, oneline=False), + Field(label=field1_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Add' + game_mode_visible = True + invalid_room_name_error = 'Invalid room name.' + + def get_initial_field_text(self, field_number): + # provide a reasonable non-blank name + if field_number == 0: + return 'Room ' + str(len(self.ui.app.gw.rooms) + 1) + elif field_number == 1: + return 'GameRoom' + + def is_input_valid(self): + return self.field_texts[0] != '', self.invalid_room_name_error + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + self.ui.app.gw.add_room(self.field_texts[0], self.field_texts[1]) + self.dismiss() + +class SetRoomCamDialog(UIDialog): + title = 'Set room camera marker' + tile_width = 48 + field0_label = 'Name of location marker object for this room:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field0_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Set' + game_mode_visible = True + + def dismiss(self): + self.ui.edit_list_panel.set_list_operation(LO_NONE) + UIDialog.dismiss(self) + + def confirm_pressed(self): + self.ui.app.gw.current_room.set_camera_marker_name(self.field_texts[0]) + self.dismiss() + +class SetRoomEdgeWarpsDialog(UIDialog): + title = 'Set room edge warps' + tile_width = 48 + fields = 4 + field0_label = 'Name of room/object to warp at LEFT edge:' + field1_label = 'Name of room/object to warp at RIGHT edge:' + field2_label = 'Name of room/object to warp at TOP edge:' + field3_label = 'Name of room/object to warp at BOTTOM edge:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field0_label, type=str, width=field_width, oneline=False), + Field(label=field1_label, type=str, width=field_width, oneline=False), + Field(label=field2_label, type=str, width=field_width, oneline=False), + Field(label=field3_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Set' + game_mode_visible = True + + def get_initial_field_text(self, field_number): + room = self.ui.app.gw.current_room + names = {0: room.left_edge_warp_dest_name, 1: room.right_edge_warp_dest_name, + 2: room.top_edge_warp_dest_name, 3: room.bottom_edge_warp_dest_name} + return names[field_number] + + def dismiss(self): + self.ui.edit_list_panel.set_list_operation(LO_NONE) + UIDialog.dismiss(self) + + def confirm_pressed(self): + room = self.ui.app.gw.current_room + room.left_edge_warp_dest_name = self.field_texts[0] + room.right_edge_warp_dest_name = self.field_texts[1] + room.top_edge_warp_dest_name = self.field_texts[2] + room.bottom_edge_warp_dest_name = self.field_texts[3] + room.reset_edge_warps() + self.dismiss() + +class SetRoomBoundsObjDialog(UIDialog): + title = 'Set room edge object' + field0_label = 'Name of object to use for room bounds:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field0_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Set' + game_mode_visible = True + + def get_initial_field_text(self, field_number): + if field_number == 0: + return self.ui.app.gw.current_room.warp_edge_bounds_obj_name + + def dismiss(self): + self.ui.edit_list_panel.set_list_operation(LO_NONE) + UIDialog.dismiss(self) + + def confirm_pressed(self): + room = self.ui.app.gw.current_room + room.warp_edge_bounds_obj_name = self.field_texts[0] + room.reset_edge_warps() + self.dismiss() + +class RenameRoomDialog(UIDialog): + title = 'Rename room' + field0_label = 'New name for current room:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field0_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Rename' + game_mode_visible = True + invalid_room_name_error = 'Invalid room name.' + + def get_initial_field_text(self, field_number): + if field_number == 0: + return self.ui.app.gw.current_room.name + + def is_input_valid(self): + return self.field_texts[0] != '', self.invalid_room_name_error + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + world = self.ui.app.gw + world.rename_room(world.current_room, self.field_texts[0]) + self.dismiss() diff --git a/ui_game_menu_pulldown_item.py b/ui_game_menu_pulldown_item.py new file mode 100644 index 0000000..deaeac7 --- /dev/null +++ b/ui_game_menu_pulldown_item.py @@ -0,0 +1,345 @@ +# coding=utf-8 + +from ui_menu_pulldown_item import PulldownMenuItem, SeparatorItem, PulldownMenuData, FileQuitItem, ViewToggleCRTItem, ViewToggleCameraTiltItem, ViewSetZoomItem, ViewToggleGridItem + +class GameModePulldownMenuItem(PulldownMenuItem): + # unless overridden, game mode items not allowed in art mode + art_mode_allowed = False + + +# +# game menu +# +class HideEditUIItem(GameModePulldownMenuItem): + label = 'Hide edit UI' + command = 'toggle_game_edit_ui' + close_on_select = True + always_active = True + +class NewGameDirItem(GameModePulldownMenuItem): + label = 'New game…' + command = 'new_game_dir' + always_active = True + +class SetGameDirItem(GameModePulldownMenuItem): + label = 'Open game…' + command = 'set_game_dir' + close_on_select = True + always_active = True + +class PauseGameItem(GameModePulldownMenuItem): + label = 'blah' + command = 'toggle_anim_playback' + always_active = True + def get_label(app): + return ['Pause game', 'Unpause game'][app.gw.paused] + +class OpenConsoleItem(GameModePulldownMenuItem): + label = 'Open dev console' + command = 'toggle_console' + close_on_select = True + always_active = True + art_mode_allowed = True + +# +# state menu +# +class ResetStateItem(GameModePulldownMenuItem): + label = 'Reset to last state' + command = 'reset_game' + close_on_select = True + def should_dim(app): + return not app.gw.game_dir + +class LoadStateItem(GameModePulldownMenuItem): + label = 'Load state…' + command = 'load_game_state' + close_on_select = True + def should_dim(app): + return not app.gw.game_dir + +class SaveStateItem(GameModePulldownMenuItem): + label = 'Save current state' + command = 'save_current' + close_on_select = True + def should_dim(app): + return not app.gw.game_dir + +class SaveNewStateItem(GameModePulldownMenuItem): + label = 'Save new state…' + command = 'save_game_state' + def should_dim(app): + return not app.gw.game_dir + +# +# view menu +# +class ObjectsToCameraItem(GameModePulldownMenuItem): + label = 'Move selected object(s) to camera' + command = 'objects_to_camera' + close_on_select = True + def should_dim(app): + return len(app.gw.selected_objects) == 0 + +class CameraToObjectsItem(GameModePulldownMenuItem): + label = 'Move camera to selected object' + command = 'camera_to_objects' + close_on_select = True + def should_dim(app): + return len(app.gw.selected_objects) != 1 + +class ToggleDebugObjectsItem(GameModePulldownMenuItem): + label = ' Draw debug objects' + command = 'toggle_debug_objects' + def should_dim(app): + return not app.gw.game_dir + def should_mark(ui): + return ui.app.gw.properties and ui.app.gw.properties.draw_debug_objects + +class ToggleOriginVizItem(GameModePulldownMenuItem): + label = ' Show all object origins' + command = 'toggle_all_origin_viz' + def should_dim(app): + return not app.gw.game_dir + def should_mark(ui): + return ui.app.gw.show_origin_all + +class ToggleBoundsVizItem(GameModePulldownMenuItem): + label = ' Show all object bounds' + command = 'toggle_all_bounds_viz' + def should_dim(app): + return not app.gw.game_dir + def should_mark(ui): + return ui.app.gw.show_bounds_all + +class ToggleCollisionVizItem(GameModePulldownMenuItem): + label = ' Show all object collision' + command = 'toggle_all_collision_viz' + def should_dim(app): + return not app.gw.game_dir + def should_mark(ui): + return ui.app.gw.show_collision_all + +# +# world menu +# +class EditWorldPropertiesItem(GameModePulldownMenuItem): + label = 'Edit world properties…' + command = 'edit_world_properties' + close_on_select = True + def should_dim(app): + return not app.gw.game_dir + +# +# room menu +# + +class ChangeRoomItem(GameModePulldownMenuItem): + label = 'Change current room…' + command = 'change_current_room' + close_on_select = True + def should_dim(app): + return len(app.gw.rooms) == 0 + +class AddRoomItem(GameModePulldownMenuItem): + label = 'Add room…' + command = 'add_room' + def should_dim(app): + return not app.gw.game_dir + +class SetRoomObjectsItem(GameModePulldownMenuItem): + label = 'Add/remove objects from room…' + command = 'set_room_objects' + close_on_select = True + def should_dim(app): + return app.gw.current_room is None + +class RemoveRoomItem(GameModePulldownMenuItem): + label = 'Remove this room' + command = 'remove_current_room' + close_on_select = True + def should_dim(app): + return app.gw.current_room is None + +class RenameRoomItem(GameModePulldownMenuItem): + label = 'Rename this room…' + command = 'rename_current_room' + def should_dim(app): + return app.gw.current_room is None + +class ToggleAllRoomsVizItem(GameModePulldownMenuItem): + label = 'blah' + command = 'toggle_all_rooms_visible' + def should_dim(app): + return len(app.gw.rooms) == 0 + def get_label(app): + return ['Show all rooms', 'Show only current room'][app.gw.show_all_rooms] + +class ToggleListOnlyRoomObjectItem(GameModePulldownMenuItem): + label = ' List only objects in this room' + command = 'toggle_list_only_room_objects' + def should_dim(app): + return len(app.gw.rooms) == 0 + def should_mark(ui): + return ui.app.gw.list_only_current_room_objects + +class ToggleRoomCamerasItem(GameModePulldownMenuItem): + label = ' Camera changes with room' + command = 'toggle_room_camera_changes' + def should_dim(app): + return len(app.gw.rooms) == 0 + def should_mark(ui): + return ui.app.gw.room_camera_changes_enabled + +class SetRoomCameraItem(GameModePulldownMenuItem): + label = "Set this room's camera marker…" + command = 'set_room_camera_marker' + def should_dim(app): + return app.gw.current_room is None + +class SetRoomEdgeDestinationsItem(GameModePulldownMenuItem): + label = "Set this room's edge warps…" + command = 'set_room_edge_warps' + def should_dim(app): + return app.gw.current_room is None + +class SetRoomBoundsObject(GameModePulldownMenuItem): + label = "Set this room's edge object…" + command = 'set_room_bounds_obj' + def should_dim(app): + return app.gw.current_room is None + +class AddSelectedToCurrentRoomItem(GameModePulldownMenuItem): + label = 'Add selected objects to this room' + command = 'add_selected_to_room' + def should_dim(app): + return app.gw.current_room is None or len(app.gw.selected_objects) == 0 + +class RemoveSelectedFromCurrentRoomItem(GameModePulldownMenuItem): + label = 'Remove selected objects from this room' + command = 'remove_selected_from_room' + def should_dim(app): + return app.gw.current_room is None or len(app.gw.selected_objects) == 0 + +# +# object menu +# + +class SpawnObjectItem(GameModePulldownMenuItem): + label = 'Spawn object…' + command = 'choose_spawn_object_class' + close_on_select = True + def should_dim(app): + return not app.gw.game_dir + +class DuplicateObjectsItem(GameModePulldownMenuItem): + label = 'Duplicate selected objects' + command = 'duplicate_selected_objects' + close_on_select = True + def should_dim(app): + return len(app.gw.selected_objects) == 0 + +class SelectObjectsItem(GameModePulldownMenuItem): + label = 'Select objects…' + command = 'select_objects' + close_on_select = True + def should_dim(app): + return not app.gw.game_dir + +class EditArtForObjectsItem(GameModePulldownMenuItem): + label = 'Edit art for selected…' + command = 'edit_art_for_selected_objects' + close_on_select = True + def should_dim(app): + return len(app.gw.selected_objects) == 0 + +class SetObjectRoomsItem(GameModePulldownMenuItem): + label = 'Add/remove this object from rooms…' + command = 'set_object_rooms' + close_on_select = True + def should_dim(app): + return len(app.gw.selected_objects) != 1 + +class DeleteSelectedObjectsItem(GameModePulldownMenuItem): + label = 'Delete selected object(s)' + command = 'erase_selection_or_art' + close_on_select = True + def should_dim(app): + return len(app.gw.selected_objects) == 0 + +class GameMenuData(PulldownMenuData): + items = [HideEditUIItem, OpenConsoleItem, SeparatorItem, + NewGameDirItem, SetGameDirItem, PauseGameItem, SeparatorItem, + FileQuitItem] + +class GameStateMenuData(PulldownMenuData): + items = [ResetStateItem, LoadStateItem, SaveStateItem, SaveNewStateItem] + +class GameViewMenuData(PulldownMenuData): + items = [ViewToggleCRTItem, ViewToggleGridItem, SeparatorItem, + ViewSetZoomItem, ViewToggleCameraTiltItem, SeparatorItem, + ObjectsToCameraItem, CameraToObjectsItem, ToggleDebugObjectsItem, + ToggleOriginVizItem, ToggleBoundsVizItem, ToggleCollisionVizItem] + + def should_mark_item(item, ui): + if hasattr(item, 'should_mark'): + return item.should_mark(ui) + return False + +class GameWorldMenuData(PulldownMenuData): + items = [EditWorldPropertiesItem] + +class GameRoomMenuData(PulldownMenuData): + items = [ChangeRoomItem, AddRoomItem, RemoveRoomItem, RenameRoomItem, + ToggleAllRoomsVizItem, ToggleListOnlyRoomObjectItem, ToggleRoomCamerasItem, SeparatorItem, + AddSelectedToCurrentRoomItem, RemoveSelectedFromCurrentRoomItem, + SetRoomObjectsItem, SeparatorItem, + SetRoomCameraItem, SetRoomEdgeDestinationsItem, SetRoomBoundsObject, + SeparatorItem + ] + def should_mark_item(item, ui): + "show checkmark for current room" + if not ui.app.gw.current_room: + return False + if hasattr(item, 'should_mark'): + return item.should_mark(ui) + return ui.app.gw.current_room.name == item.cb_arg + + def get_items(app): + items = [] + if len(app.gw.rooms) == 0: + return items + # TODO: this is almost c+p'd from LayerMenuData, generalize it + # first determine longest line to set width of items + longest_line = 0 + for room_name in app.gw.rooms: + if len(room_name) > longest_line: + longest_line = len(room_name) + # check non-generated menu items too + for item in GameRoomMenuData.items: + if len(item.label) + 1 > longest_line: + longest_line = len(item.label) + 1 + # cap at max allowed line length + for room_name,room in app.gw.rooms.items(): + class TempMenuItemClass(GameModePulldownMenuItem): pass + item = TempMenuItemClass + # leave spaces for mark + item.label = ' %s' % room_name + # pad, put Z depth on far right + item.label = item.label.ljust(longest_line) + # trim to keep below a max length + item.label = item.label[:longest_line] + # tell PulldownMenu's button creation process not to auto-pad + item.no_pad = True + item.command = 'change_current_room_to' + item.cb_arg = room_name + items.append(item) + # sort room list alphabetically so it's stable, if arbitrary + items.sort(key=lambda item: item.label, reverse=False) + return items + + +class GameObjectMenuData(PulldownMenuData): + items = [SpawnObjectItem, DuplicateObjectsItem, SeparatorItem, + SelectObjectsItem, EditArtForObjectsItem, SetObjectRoomsItem, + DeleteSelectedObjectsItem] diff --git a/ui_info_dialog.py b/ui_info_dialog.py new file mode 100644 index 0000000..2f09e58 --- /dev/null +++ b/ui_info_dialog.py @@ -0,0 +1,133 @@ +import sdl2 + +from ui_element import UIElement +from ui_dialog import UIDialog + +class PagedInfoDialog(UIDialog): + + "dialog that presents multiple pages of info w/ buttons to navigate next/last page" + + title = 'Info' + # message = list of page strings, each can be triple-quoted / contain line breaks + message = [''] + tile_width = 54 + confirm_caption = '>>' + other_caption = '<<' + cancel_caption = 'Done' + other_button_visible = True + extra_lines = 1 + + def __init__(self, ui, options): + self.page = 0 + UIDialog.__init__(self, ui, options) + self.reset_art() + + def update(self): + # disable prev/next buttons if we're at either end of the page list + if self.page == 0: + self.other_button.can_hover = False + self.other_button.set_state('dimmed') + elif self.page == len(self.message) - 1: + self.confirm_button.can_hover = False + self.confirm_button.set_state('dimmed') + else: + for button in [self.confirm_button, self.other_button]: + button.can_hover = True + button.dimmed = False + if button.state != 'normal': + button.set_state('normal') + UIElement.update(self) + + def handle_input(self, key, shift_pressed, alt_pressed, ctrl_pressed): + keystr = sdl2.SDL_GetKeyName(key).decode() + if keystr == 'Left': + self.other_pressed() + elif keystr == 'Right': + self.confirm_pressed() + elif keystr == 'Escape': + self.cancel_pressed() + + def get_message(self): + return self.message[self.page].rstrip().split('\n') + + def confirm_pressed(self): + # confirm repurposed to "next page" + if self.page < len(self.message) - 1: + self.page += 1 + # redraw, tell reset_art not to resize + self.reset_art(False) + + def cancel_pressed(self): + self.dismiss() + + def other_pressed(self): + # other repurposed to "previous page" + if self.page > 0: + self.page -= 1 + self.reset_art(False) + + +about_message = [ +# max line width 50 characters! +""" + by JP LeBreton (c) 2014-2022 | + +Playscii was made with the support of many nice +people. + + Patrons: + +Andrew Anderson, Evan Armour, Jason Bakker, +Aaron Brown, Jason Buck, Ben Burbank, Josh Closs, +Lachlan Cooper, Sam Crisp, +Torbjørn Grønnevik Dahle, Holger Dors, +Matthew Duhamel, Jaron Eldon, Jacques Frechet, +Katelyn Gigante, Isaac Halvorson, Leon Hartwig, +Aubrey Hesselgren, Nick Keirle, Jón Kristinsson, +Pat LaBine, Jeremy Lonien, Rohit Nirmal, +James Noble, David Pittman, Richard Porczak, +Dan Sanderson, Shannon Strucci, Pablo López Soriano, +Jack Turner, Chris Welch, Andrew Yoder +""", +""" + Programming Contributions: + +Mattias Gustavsson, Rohit Nirmal, Sean Gubelman, +Erin Congden, Tin Tvrtković, Dan Reeves, +Raigan Burns + + Technical Advice: + +Shawn Walker, Sean Barrett, Mark Wonnacott, +Ian MacLarty, Goldbuick, Chevy Ray Johnston, +Raigan Burns + + Tool Design Inspiration: + +Anna Anthropy, Andi McClure, Bret Victor, +Tim Sweeney (ZZT), Craig Hickman (Kid Pix), +Bill Atkinson (HyperCard) +""", +""" + Love, Encouragement, Moral Support: + +L Stiger +Gail, Gil, and Lee LeBreton +Brendan Sinclair +Liz Ryerson +Johnnemann Nordhagen +Aubrey Hesselgren +Zak McClendon +Claire Hosking +#tool-design +""" +] + +class AboutDialog(PagedInfoDialog): + title = 'Playscii' + message = about_message + game_mode_visible = True + all_modes_visible = True + def __init__(self, ui, options): + self.title += ' %s' % ui.app.version + PagedInfoDialog.__init__(self, ui, options) diff --git a/ui_list_operations.py b/ui_list_operations.py new file mode 100644 index 0000000..6fe5623 --- /dev/null +++ b/ui_list_operations.py @@ -0,0 +1,14 @@ + +# list operations - tells ListPanel what to do when clicked + +LO_NONE = 0 +LO_SELECT_OBJECTS = 1 +LO_SET_SPAWN_CLASS = 2 +LO_LOAD_STATE = 3 +LO_SET_ROOM = 4 +LO_SET_ROOM_OBJECTS = 5 +LO_SET_OBJECT_ROOMS = 6 +LO_OPEN_GAME_DIR = 7 +LO_SET_ROOM_EDGE_WARP = 8 +LO_SET_ROOM_EDGE_OBJ = 9 +LO_SET_ROOM_CAMERA = 10 diff --git a/ui_menu_bar.py b/ui_menu_bar.py new file mode 100644 index 0000000..5d74fbc --- /dev/null +++ b/ui_menu_bar.py @@ -0,0 +1,307 @@ +from math import ceil + +from ui_element import UIElement +from ui_button import UIButton, TEXT_LEFT, TEXT_CENTER, TEXT_RIGHT +from ui_menu_pulldown_item import FileMenuData, EditMenuData, ToolMenuData, ViewMenuData, ArtMenuData, FrameMenuData, LayerMenuData, CharColorMenuData, HelpMenuData +from ui_game_menu_pulldown_item import GameMenuData, GameStateMenuData, GameViewMenuData, GameWorldMenuData, GameRoomMenuData, GameObjectMenuData +from ui_info_dialog import AboutDialog +from ui_colors import UIColors +from renderable_sprite import UISpriteRenderable + +class MenuButton(UIButton): + caption = 'Base Class Menu Button' + caption_justify = TEXT_CENTER + # menu data is just a class w/ little more than a list of items, partly + # so we don't have to list all the items here in a different module + menu_data = None + # styling + normal_bg_color = UIColors.white + hovered_bg_color = UIColors.lightgrey + dimmed_bg_color = UIColors.lightgrey + + def __init__(self, element): + UIButton.__init__(self, element) + self.callback = self.open_pulldown + + def open_pulldown(self): + # don't open menus if a dialog is up + if self.element.ui.active_dialog: + return + # if clicking the same button twice, close it + if self.element.active_menu_name == self.name: + self.element.close_active_menu() + return + # close any existing menu before opening new one + if self.element.active_menu_name: + self.element.close_active_menu() + # tell pulldown what's opening it, it can populate its items based on + # our data + self.pulldown.open_at(self) + self.element.active_menu_name = self.name + # set button state to be dimmed until menu is closed + self.dimmed = True + + +# playscii logo button = normal UIButton, opens About screen directly +class PlaysciiMenuButton(UIButton): + name = 'playscii' + caption = ' ' + caption_justify = TEXT_CENTER + width = len(caption) + 2 + normal_bg_color = MenuButton.normal_bg_color + hovered_bg_color = MenuButton.hovered_bg_color + dimmed_bg_color = MenuButton.dimmed_bg_color + +# +# art mode menu buttons +# + +class FileMenuButton(MenuButton): + name = 'file' + caption = 'File' + menu_data = FileMenuData + +class EditMenuButton(MenuButton): + name = 'edit' + caption = 'Edit' + menu_data = EditMenuData + +class ToolMenuButton(MenuButton): + name = 'tool' + caption = 'Tool' + menu_data = ToolMenuData + +class ViewMenuButton(MenuButton): + name = 'view' + caption = 'View' + menu_data = ViewMenuData + +class ArtMenuButton(MenuButton): + name = 'art' + caption = 'Art' + menu_data = ArtMenuData + +class FrameMenuButton(MenuButton): + name = 'frame' + caption = 'Frame' + menu_data = FrameMenuData + +class LayerMenuButton(MenuButton): + name = 'layer' + caption = 'Layer' + menu_data = LayerMenuData + +class CharColorMenuButton(MenuButton): + name = 'char_color' + caption = 'Char/Color' + menu_data = CharColorMenuData + +# (appears in both art and game mode menus) +class HelpMenuButton(MenuButton): + name = 'help' + caption = 'Help' + menu_data = HelpMenuData + +# +# game mode menu buttons +# + +class GameMenuButton(MenuButton): + name = 'game' + caption = 'Game' + menu_data = GameMenuData + +class StateMenuButton(MenuButton): + name = 'state' + caption = 'State' + menu_data = GameStateMenuData + +class GameViewMenuButton(MenuButton): + name = 'view' + caption = 'View' + menu_data = GameViewMenuData + +class WorldMenuButton(MenuButton): + name = 'world' + caption = 'World' + menu_data = GameWorldMenuData + +class RoomMenuButton(MenuButton): + name = 'room' + caption = 'Room' + menu_data = GameRoomMenuData + +class ObjectMenuButton(MenuButton): + name = 'object' + caption = 'Object' + menu_data = GameObjectMenuData + +class ModeMenuButton(UIButton): + caption_justify = TEXT_CENTER + normal_bg_color = UIColors.black + normal_fg_color = UIColors.white + #hovered_bg_color = UIColors.lightgrey + #dimmed_bg_color = UIColors.lightgrey + +class ArtModeMenuButton(ModeMenuButton): + caption = 'Game Mode' + width = len(caption) + 2 + +class GameModeMenuButton(ModeMenuButton): + caption = 'Art Mode' + width = len(caption) + 2 + + +class MenuBar(UIElement): + + "main menu bar element, has lots of buttons which control the pulldown" + + snap_top = True + snap_left = True + always_consume_input = True + # buttons set in subclasses + button_classes = [] + # button to toggle between art and game mode + mode_button_class = None + # empty tiles between each button + button_padding = 1 + + def __init__(self, ui): + # bitmap icon for about menu button + self.playscii_sprite = UISpriteRenderable(ui.app) + self.mode_button = None + UIElement.__init__(self, ui) + self.active_menu_name = None + # list of menu buttons that can be navigated etc + self.menu_buttons = [] + x = PlaysciiMenuButton.width + self.button_padding + for button_class in self.button_classes: + button = button_class(self) + button.width = len(button.caption) + 2 + button.x = x + x += button.width + self.button_padding + setattr(self, '%s_button' % button.name, button) + # NOTE: callback already defined in MenuButton class, + # menu data for pulldown with set in MenuButton subclass + button.pulldown = self.ui.pulldown + self.menu_buttons.append(button) + playscii_button = PlaysciiMenuButton(self) + playscii_button.callback = self.open_about + # implement Playscii logo menu as a normal UIButton that opens + # the About screen directly + self.menu_buttons.append(playscii_button) + self.reset_icon() + # copy from menu buttons, any buttons past this point are not menus + self.buttons = self.menu_buttons[:] + # toggle mode button at far right + if not self.mode_button_class: + return + self.mode_button = self.mode_button_class(self) + self.mode_button.x = int(self.ui.width_tiles * self.ui.scale) - self.mode_button.width + self.mode_button.callback = self.toggle_game_mode + self.buttons.append(self.mode_button) + + def reset_icon(self): + inv_aspect = self.ui.app.window_height / self.ui.app.window_width + self.playscii_sprite.scale_x = self.art.quad_height * inv_aspect + self.playscii_sprite.scale_y = self.art.quad_height + self.playscii_sprite.x = -1 + self.art.quad_width + self.playscii_sprite.y = 1 - self.art.quad_height + + def open_about(self): + if self.ui.active_dialog: + return + self.ui.open_dialog(AboutDialog) + + def toggle_game_mode(self): + if self.ui.active_dialog: + return + if not self.ui.app.game_mode: + self.ui.app.enter_game_mode() + else: + self.ui.app.exit_game_mode() + self.ui.app.update_window_title() + + def close_active_menu(self): + # un-dim active menu button + for button in self.menu_buttons: + if button.name == self.active_menu_name: + button.dimmed = False + button.set_state('normal') + self.active_menu_name = None + self.ui.pulldown.visible = False + self.ui.keyboard_focus_element = None + self.ui.refocus_keyboard() + + def refresh_active_menu(self): + if not self.ui.pulldown.visible: + return + for button in self.menu_buttons: + if button.name == self.active_menu_name: + # don't reset keyboard nav index + self.ui.pulldown.open_at(button, False) + + def open_menu_by_name(self, menu_name): + if not self.ui.app.can_edit: + return + for button in self.menu_buttons: + if button.name == menu_name: + button.callback() + + def open_menu_by_index(self, index): + if index > len(self.menu_buttons) - 1: + return + # don't navigate to the about menu + # (does this mean it's not accessible via kb-only? probably, that's fine) + if self.menu_buttons[index].name == 'playscii': + return + self.menu_buttons[index].callback() + + def get_menu_index(self, menu_name): + for i,button in enumerate(self.menu_buttons): + if button.name == self.active_menu_name: + return i + + def next_menu(self): + i = self.get_menu_index(self.active_menu_name) + self.open_menu_by_index(i + 1) + + def previous_menu(self): + i = self.get_menu_index(self.active_menu_name) + self.open_menu_by_index(i - 1) + + def reset_art(self): + self.tile_width = ceil(self.ui.width_tiles * self.ui.scale) + # must resize here, as window width will vary + self.art.resize(self.tile_width, self.tile_height) + # repaint bar contents + bg = self.ui.colors.white + fg = self.ui.colors.black + self.art.clear_frame_layer(0, 0, bg, fg) + # reposition right-justified mode switch button + if self.mode_button: + self.mode_button.x = int(self.ui.width_tiles * self.ui.scale) - self.mode_button.width + # draw buttons, etc + UIElement.reset_art(self) + self.reset_icon() + + def render(self): + UIElement.render(self) + self.playscii_sprite.render() + + def destroy(self): + UIElement.destroy(self) + self.playscii_sprite.destroy() + +class ArtMenuBar(MenuBar): + button_classes = [FileMenuButton, EditMenuButton, ToolMenuButton, + ViewMenuButton, ArtMenuButton, FrameMenuButton, + LayerMenuButton, CharColorMenuButton, HelpMenuButton] + mode_button_class = GameModeMenuButton + +class GameMenuBar(MenuBar): + button_classes = [GameMenuButton, StateMenuButton, GameViewMenuButton, + WorldMenuButton, RoomMenuButton, ObjectMenuButton, + HelpMenuButton] + game_mode_visible = True + mode_button_class = ArtModeMenuButton diff --git a/ui_menu_pulldown.py b/ui_menu_pulldown.py new file mode 100644 index 0000000..b5aa4d5 --- /dev/null +++ b/ui_menu_pulldown.py @@ -0,0 +1,182 @@ + +from ui_element import UIElement +from ui_button import UIButton +from ui_colors import UIColors +from art import UV_NORMAL, UV_ROTATE90, UV_ROTATE180, UV_ROTATE270, UV_FLIPX, UV_FLIPY +from ui_menu_pulldown_item import PulldownMenuItem, PulldownMenuData, SeparatorItem + + +class MenuItemButton(UIButton): + dimmed_fg_color = UIColors.medgrey + dimmed_bg_color = UIColors.lightgrey + + def hover(self): + UIButton.hover(self) + # keyboard nav if hovering with mouse + for i,button in enumerate(self.element.buttons): + if button is self: + self.element.keyboard_nav_index = i + self.element.update_keyboard_hover() + break + + def click(self): + UIButton.click(self) + if self.item.close_on_select: + self.element.ui.menu_bar.close_active_menu() + + +class PulldownMenu(UIElement): + + "element that's moved and resized based on currently active pulldown" + + label_shortcut_padding = 5 + visible = False + always_consume_input = True + bg_color = UIColors.lightgrey + border_color = UIColors.medgrey + border_corner_char = 77 + border_horizontal_line_char = 78 + border_vertical_line_char = 79 + mark_char = 131 + all_modes_visible = True + support_keyboard_navigation = True + keyboard_nav_left_right = True + + def open_at(self, menu_button, reset_keyboard_nav_index=True): + # set X and Y based on calling menu button's location + self.tile_x = menu_button.x + self.tile_y = menu_button.y + 1 + # determine pulldown width from longest item label length + self.tile_width = 1 + # save shortcuts as we got through + shortcuts = [] + callbacks = [] + # if menu data has an item generator, use it to add to the existing list + # copy list from class though; this function will run many times + items = menu_button.menu_data.items[:] + if menu_button.menu_data.get_items is not PulldownMenuData.get_items: + items += menu_button.menu_data.get_items(self.ui.app) + for item in items: + shortcut,command = self.get_shortcut(item) + shortcuts.append(shortcut) + callbacks.append(command) + # get label, static or dynamic + label = item.label + if item.get_label is not PulldownMenuItem.get_label: + label = item.get_label(self.ui.app) + # item might have already calculated padding, ie from get_items + if item.no_pad: + item_width = len(label) + 2 + # get full width of item, label shortcut and some padding + else: + item_width = len(label) + self.label_shortcut_padding + item_width += len(shortcut) + if item_width > self.tile_width: + self.tile_width = item_width + self.tile_height = len(items) + 2 + self.art.resize(self.tile_width, self.tile_height) + # draw + fg = self.ui.colors.black + self.art.clear_frame_layer(0, 0, self.bg_color, fg) + self.draw_border(menu_button) + # create as many buttons as needed, set their sizes, captions, callbacks + self.buttons = [] + for i,item in enumerate(items): + # skip button creation for separators, just draw a line + if item is SeparatorItem: + for x in range(1, self.tile_width - 1): + self.art.set_tile_at(0, 0, x, i+1, self.border_horizontal_line_char, self.border_color) + continue + button = MenuItemButton(self) + # give button a handle to its item + button.item = item + full_label = item.label + if item.get_label is not PulldownMenuItem.get_label: + # trim output + full_label = item.get_label(self.ui.app) + if not item.no_pad: + full_label += shortcuts[i].rjust(self.tile_width - 2 - len(full_label)) + button.caption = full_label + button.width = len(full_label) + button.x = 1 + button.y = i+1 + button.callback = callbacks[i] + if item.cb_arg is not None: + button.cb_arg = item.cb_arg + # dim items that aren't applicable to current app state + if not item.always_active and item.should_dim(self.ui.app): + button.set_state('dimmed') + button.can_hover = False + self.buttons.append(button) + # set our X and Y, draw buttons, etc + self.reset_loc() + self.reset_art() + # if this menu has special logic for marking items, use it + if not menu_button.menu_data.should_mark_item is PulldownMenuData.should_mark_item: + for i,item in enumerate(items): + if menu_button.menu_data.should_mark_item(item, self.ui): + self.art.set_char_index_at(0, 0, 1, i+1, self.mark_char) + # reset keyboard nav state for popups + if reset_keyboard_nav_index: + self.keyboard_nav_index = 0 + self.keyboard_navigate(0, 0) + self.visible = True + self.ui.keyboard_focus_element = self + + def draw_border(self, menu_button): + "draws a fancy lil frame around the pulldown's edge" + fg = self.border_color + char = self.border_horizontal_line_char + # top/bottom edges + for x in range(self.tile_width): + self.art.set_tile_at(0, 0, x, 0, char, fg) + self.art.set_tile_at(0, 0, x, self.tile_height-1, char, fg) + # left/right edges + char = self.border_vertical_line_char + for y in range(self.tile_height): + self.art.set_tile_at(0, 0, 0, y, char, fg) + self.art.set_tile_at(0, 0, self.tile_width-1, y, char, fg) + # corners: bottom left, bottom right, top right + char = self.border_corner_char + x, y = 0, self.tile_height - 1 + xform = UV_FLIPY + self.art.set_tile_at(0, 0, x, y, char, fg, None, xform) + x = self.tile_width - 1 + xform = UV_ROTATE180 + self.art.set_tile_at(0, 0, x, y, char, fg, None, xform) + y = 0 + xform = UV_FLIPX + self.art.set_tile_at(0, 0, x, y, char, fg, None, xform) + # gap beneath menu bar button + for x in range(1, len(menu_button.caption) + 2): + self.art.set_tile_at(0, 0, x, 0, 0) + self.art.set_tile_at(0, 0, x, 0, char, fg, None, UV_FLIPY) + + def get_shortcut(self, menu_item): + # get InputLord's binding from given menu item's command name, + # return concise string for bind and the actual function it runs. + def null(): + pass + # special handling of SeparatorMenuItem, no command or label + if menu_item is SeparatorItem: + return '', null + binds = self.ui.app.il.edit_binds + for bind_tuple in binds: + command_functions = binds[bind_tuple] + for f in command_functions: + if f.__name__ == 'BIND_%s' % menu_item.command: + shortcut = '' + # shift, alt, ctrl + if bind_tuple[1]: + shortcut += 'Shift-' + if bind_tuple[2]: + shortcut += 'Alt-' + if bind_tuple[3]: + # TODO: cmd vs ctrl for mac vs non + shortcut += 'C-' + # bind strings that start with _ will be disregarded + if not (bind_tuple[0].startswith('_') and len(bind_tuple[0]) > 1): + shortcut += bind_tuple[0] + return shortcut, f + self.ui.app.log('Shortcut/command not found: %s' % menu_item.command) + return '', null diff --git a/ui_menu_pulldown_item.py b/ui_menu_pulldown_item.py new file mode 100644 index 0000000..be62b36 --- /dev/null +++ b/ui_menu_pulldown_item.py @@ -0,0 +1,769 @@ +from renderable import LAYER_VIS_FULL, LAYER_VIS_DIM, LAYER_VIS_NONE + +from ui_tool import PencilTool, EraseTool, RotateTool, GrabTool, TextTool, SelectTool, PasteTool, FillTool + +# +# specific pulldown menu items, eg File > Save, Edit > Copy +# + +class PulldownMenuItem: + # label that displays for this item + label = 'Test Menu Item' + # bindable command we look up from InputLord to get binding text from + command = 'test_command' + # if not None, passed to button's cb_arg + cb_arg = None + # if True, pulldown button creation process won't auto-pad + no_pad = False + # if True, item will never be dimmed + always_active = False + # if True, pulldown will close when this item is selected + close_on_select = False + # item is allowed in Art Mode + art_mode_allowed = True + # item is allowed in Game Mode + game_mode_allowed = True + def should_dim(app): + "returns True if this item should be dimmed based on current application state" + # so many commands are inapplicable with no active art, default to dimming an + # item if this is the case + return app.ui.active_art is None + def get_label(app): + "returns custom generated label based on app state" + return None + +class SeparatorItem(PulldownMenuItem): + "menu separator, non-interactive and handled specially by menu drawing" + pass + +class ArtModePulldownMenuItem(PulldownMenuItem): + # unless overridden, art mode items not allowed in game mode + game_mode_allowed = False + +# +# file menu +# +class FileNewItem(ArtModePulldownMenuItem): + label = 'New…' + command = 'new_art' + always_active = True + +class FileOpenItem(ArtModePulldownMenuItem): + label = 'Open…' + command = 'open_art' + always_active = True + +class FileSaveItem(ArtModePulldownMenuItem): + label = 'Save' + command = 'save_current' + def should_dim(app): + return not app.ui.active_art or not app.ui.active_art.unsaved_changes + +class FileSaveAsItem(ArtModePulldownMenuItem): + label = 'Save As…' + command = 'save_art_as' + def should_dim(app): + return app.ui.active_art is None + +class FileCloseItem(ArtModePulldownMenuItem): + label = 'Close' + command = 'close_art' + def should_dim(app): + return app.ui.active_art is None + +class FileRevertItem(ArtModePulldownMenuItem): + label = 'Revert' + command = 'revert_art' + def should_dim(app): + return app.ui.active_art is None or not app.ui.active_art.unsaved_changes + +class FileImportItem(ArtModePulldownMenuItem): + label = 'Import…' + command = 'import_file' + always_active = True + +class FileExportItem(ArtModePulldownMenuItem): + label = 'Export…' + command = 'export_file' + def should_dim(app): + return app.ui.active_art is None + +class FileExportLastItem(ArtModePulldownMenuItem): + label = 'Export last' + command = 'export_file_last' + def should_dim(app): + return app.ui.active_art is None + +class FileConvertImageItem(ArtModePulldownMenuItem): + label = 'Convert Image…' + command = 'convert_image' + def should_dim(app): + return app.ui.active_art is None + +class FileQuitItem(ArtModePulldownMenuItem): + label = 'Quit' + command = 'quit' + always_active = True + game_mode_allowed = True + +# +# edit menu +# +class EditUndoItem(ArtModePulldownMenuItem): + label = 'Undo' + command = 'undo' + def should_dim(app): + return not app.ui.active_art or len(app.ui.active_art.command_stack.undo_commands) == 0 + +class EditRedoItem(ArtModePulldownMenuItem): + label = 'Redo' + command = 'redo' + def should_dim(app): + return not app.ui.active_art or len(app.ui.active_art.command_stack.redo_commands) == 0 + +class EditCutItem(ArtModePulldownMenuItem): + label = 'Cut' + command = 'cut_selection' + def should_dim(app): + return len(app.ui.select_tool.selected_tiles) == 0 + +class EditCopyItem(ArtModePulldownMenuItem): + label = 'Copy' + command = 'copy_selection' + def should_dim(app): + return len(app.ui.select_tool.selected_tiles) == 0 + +class EditPasteItem(ArtModePulldownMenuItem): + label = 'Paste' + command = 'select_paste_tool' + def should_dim(app): + return len(app.ui.clipboard) == 0 + +class EditDeleteItem(ArtModePulldownMenuItem): + label = 'Clear' + command = 'erase_selection_or_art' + +class EditSelectAllItem(ArtModePulldownMenuItem): + label = 'Select All' + command = 'select_all' + +class EditSelectNoneItem(ArtModePulldownMenuItem): + label = 'Select None' + command = 'select_none' + +class EditSelectInvertItem(ArtModePulldownMenuItem): + label = 'Invert Selection' + command = 'select_invert' + +class EditPreferences(ArtModePulldownMenuItem): + label = 'Preferences…' + command = 'edit_cfg' + +# +# tool menu +# + +class ToolTogglePickerItem(ArtModePulldownMenuItem): + # two spaces in front of each label to leave room for mark + label = 'Show char/color picker' + command = 'toggle_picker' + +class ToolTogglePickerHoldItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'toggle_picker_hold' + def get_label(app): + return 'Picker toggle key: %s' % ['press', 'hold'][app.ui.popup_hold_to_show] + +class ToolSwapSelectedColors(ArtModePulldownMenuItem): + label = 'Swap selected fg/bg colors' + command = 'swap_fg_bg_colors' + +class ToolToggleArtToolbar(ArtModePulldownMenuItem): + label = ' Show toolbar' + command = 'toggle_art_toolbar' + def should_mark(ui): + return ui.art_toolbar.visible + +class ToolPaintItem(ArtModePulldownMenuItem): + # two spaces in front of each label to leave room for mark + label = ' %s' % PencilTool.button_caption + command = 'select_pencil_tool' + +class ToolEraseItem(ArtModePulldownMenuItem): + label = ' %s' % EraseTool.button_caption + command = 'select_erase_tool' + +class ToolRotateItem(ArtModePulldownMenuItem): + label = ' %s' % RotateTool.button_caption + command = 'select_rotate_tool' + +class ToolGrabItem(ArtModePulldownMenuItem): + label = ' %s' % GrabTool.button_caption + command = 'select_grab_tool' + +class ToolTextItem(ArtModePulldownMenuItem): + label = ' %s' % TextTool.button_caption + command = 'select_text_tool' + +class ToolSelectItem(ArtModePulldownMenuItem): + label = ' %s' % SelectTool.button_caption + command = 'select_select_tool' + +class ToolPasteItem(ArtModePulldownMenuItem): + label = ' %s' % PasteTool.button_caption + command = 'select_paste_tool' + +class ToolFillItem(ArtModePulldownMenuItem): + label = ' %s' % FillTool.button_caption + command = 'select_fill_tool' + +class ToolIncreaseBrushSizeItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'increase_brush_size' + def should_dim(app): + # dim this item for tools where brush size doesn't apply + if not app.ui.active_art or not app.ui.selected_tool.brush_size: + return True + def get_label(app): + if not app.ui.selected_tool.brush_size: + return 'Increase brush size' + size = app.ui.selected_tool.brush_size + 1 + return 'Increase brush size to %s' % size + +class ToolDecreaseBrushSizeItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'decrease_brush_size' + def should_dim(app): + if not app.ui.active_art or not app.ui.selected_tool.brush_size: + return True + return app.ui.selected_tool.brush_size <= 1 + def get_label(app): + if not app.ui.selected_tool.brush_size: + return 'Decrease brush size' + size = app.ui.selected_tool.brush_size - 1 + return 'Decrease brush size to %s' % size + +class ToolSettingsItem(ArtModePulldownMenuItem): + # base class for tool settings toggle items + def should_dim(app): + # blacklist specific tools + return not app.ui.active_art or type(app.ui.selected_tool) in [SelectTool] + +class ToolToggleAffectsCharItem(ToolSettingsItem): + label = ' Affects: character' + command = 'toggle_affects_char' + def should_mark(ui): + return ui.selected_tool.affects_char + +class ToolToggleAffectsFGItem(ToolSettingsItem): + label = ' Affects: foreground color' + command = 'toggle_affects_fg' + def should_mark(ui): + return ui.selected_tool.affects_fg_color + +class ToolToggleAffectsBGItem(ToolSettingsItem): + label = ' Affects: background color' + command = 'toggle_affects_bg' + def should_mark(ui): + return ui.selected_tool.affects_bg_color + +class ToolToggleAffectsXformItem(ToolSettingsItem): + label = ' Affects: character xform' + command = 'toggle_affects_xform' + def should_mark(ui): + return ui.selected_tool.affects_xform + +# cycle between the 3 different fill boundary types +class ToolSetFillBoundariesItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'cycle_fill_boundary_mode' + def should_dim(app): + return not type(app.ui.selected_tool) is FillTool + def get_label(app): + return 'Fill tool bounded by: %s' % app.ui.fill_tool.boundary_mode_names[app.ui.fill_tool.boundary_mode] + + +# +# view menu +# +class ViewToggleCRTItem(ArtModePulldownMenuItem): + label = ' CRT filter' + command = 'toggle_crt' + game_mode_allowed = True + def should_dim(app): + return app.fb.disable_crt + def should_mark(ui): + return ui.app.fb.crt + +class ViewToggleGridItem(ArtModePulldownMenuItem): + label = ' Grid' + command = 'toggle_grid_visibility' + game_mode_allowed = True + def should_mark(ui): + return ui.app.grid.visible + +class ViewBGTextureItem(ArtModePulldownMenuItem): + label = ' Textured background' + command = 'toggle_bg_texture' + always_active = True + def should_mark(ui): + return ui.app.show_bg_texture + +class ViewToggleZoomExtentsItem(ArtModePulldownMenuItem): + label = ' Zoom to Art extents' + command = 'toggle_zoom_extents' + def should_mark(ui): + return ui.active_art and ui.active_art.camera_zoomed_extents + +class ViewZoomInItem(ArtModePulldownMenuItem): + label = 'Zoom in' + command = 'camera_zoom_in_proportional' + +class ViewZoomOutItem(ArtModePulldownMenuItem): + label = 'Zoom out' + command = 'camera_zoom_out_proportional' + +class ViewSetZoomItem(ArtModePulldownMenuItem): + label = 'Set camera zoom…' + command = 'set_camera_zoom' + +class ViewToggleCameraTiltItem(ArtModePulldownMenuItem): + label = ' Camera tilt' + command = 'toggle_camera_tilt' + always_active = True + game_mode_allowed = True + def should_mark(ui): + return ui.app.camera.y_tilt != 0 + +class ViewSetOverlayImageItem(ArtModePulldownMenuItem): + label = 'Set overlay image…' + command = 'select_overlay_image' + +class ViewToggleOverlayImageItem(ArtModePulldownMenuItem): + label = ' Toggle overlay image' + command = 'toggle_overlay_image' + def should_mark(ui): + return ui.app.draw_overlay + def should_dim(app): + return app.overlay_renderable is None + +class ViewSetOverlayImageOpacityItem(ArtModePulldownMenuItem): + label = 'Set overlay image opacity…' + command = 'set_overlay_image_opacity' + def should_dim(app): + return app.overlay_renderable is None or not app.draw_overlay + +class ViewSetOverlayImageScalingItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'set_overlay_image_scaling' + def get_label(app): + return 'Overlay image scaling: %s' % ['width', 'height', 'fill'][app.overlay_scale_type] + def should_dim(app): + return app.overlay_renderable is None or not app.draw_overlay + +# +# art menu +# +class ArtOpenAllGameAssetsItem(ArtModePulldownMenuItem): + label = 'Open all Game Mode assets' + command = 'open_all_game_assets' + def should_dim(app): + return len(app.gw.objects) == 0 + +class ArtPreviousItem(ArtModePulldownMenuItem): + label = 'Previous Art' + command = 'previous_art' + def should_dim(app): + return len(app.art_loaded_for_edit) < 2 + +class ArtNextItem(ArtModePulldownMenuItem): + label = 'Next Art' + command = 'next_art' + def should_dim(app): + return len(app.art_loaded_for_edit) < 2 + +class ArtCropToSelectionItem(ArtModePulldownMenuItem): + label = 'Crop to selection' + command = 'crop_to_selection' + def should_dim(app): + return len(app.ui.select_tool.selected_tiles) == 0 + +class ArtResizeItem(ArtModePulldownMenuItem): + label = 'Resize…' + command = 'resize_art' + +class ArtFlipHorizontal(ArtModePulldownMenuItem): + label = 'Flip horizontally' + command = 'art_flip_horizontal' + +class ArtFlipVertical(ArtModePulldownMenuItem): + label = 'Flip vertically' + command = 'art_flip_vertical' + +class ArtToggleFlipAffectsXforms(ArtModePulldownMenuItem): + label = ' Flip affects xforms' + command = 'art_toggle_flip_affects_xforms' + def should_mark(ui): + return ui.flip_affects_xforms + +class ArtRunScriptItem(ArtModePulldownMenuItem): + label = 'Run Artscript…' + command = 'run_art_script' + +class ArtRunLastScriptItem(ArtModePulldownMenuItem): + label = 'Run last Artscript' + command = 'run_art_script_last' + def should_dim(app): + return app.last_art_script is None + +# +# frame menu +# +class FramePreviousItem(ArtModePulldownMenuItem): + label = 'Previous frame' + command = 'previous_frame' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.frames < 2 + +class FrameNextItem(ArtModePulldownMenuItem): + label = 'Next frame' + command = 'next_frame' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.frames < 2 + +class FrameTogglePlaybackItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'toggle_anim_playback' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.frames < 2 + def get_label(app): + if not app.ui.active_art: + return 'Start animation playback' + animating = app.ui.active_art.renderables[0].animating + return ['Start', 'Stop'][animating] + ' animation playback' + +class FrameToggleOnionItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'toggle_onion_visibility' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.frames < 2 + def get_label(app): + l = '%s onion skin frames' % ['Show', 'Hide'][app.onion_frames_visible] + return l + +class FrameCycleOnionFramesItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'cycle_onion_frames' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.frames < 2 + def get_label(app): + return 'Number of onion frames: %s' % app.onion_show_frames + +class FrameCycleOnionDisplayItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'cycle_onion_ahead_behind' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.frames < 2 + def get_label(app): + if app.onion_show_frames_behind and app.onion_show_frames_ahead: + display = 'Next & Previous' + elif app.onion_show_frames_behind: + display = 'Previous' + else: + display = 'Next' + return 'Onion frames show: %s' % display + +class FrameAddFrameItem(ArtModePulldownMenuItem): + label = 'Add frame…' + command = 'add_frame' + +class FrameDuplicateFrameItem(ArtModePulldownMenuItem): + label = 'Duplicate this frame…' + command = 'duplicate_frame' + +class FrameChangeDelayItem(ArtModePulldownMenuItem): + label = "Change this frame's hold time…" + command = 'change_frame_delay' + +class FrameChangeDelayAllItem(ArtModePulldownMenuItem): + label = "Change all frames' hold times…" + command = 'change_frame_delay_all' + +class FrameChangeIndexItem(ArtModePulldownMenuItem): + label = "Change this frame's index…" + command = 'change_frame_index' + +class FrameDeleteFrameItem(ArtModePulldownMenuItem): + label = 'Delete this frame' + command = 'delete_frame' + def should_dim(app): + # don't delete last frame + return not app.ui.active_art or app.ui.active_art.frames < 2 + +# +# layer menu +# +class LayerAddItem(ArtModePulldownMenuItem): + label = "Add layer…" + command = 'add_layer' + +class LayerDuplicateItem(ArtModePulldownMenuItem): + label = "Duplicate this layer…" + command = 'duplicate_layer' + +class LayerSetNameItem(ArtModePulldownMenuItem): + label = "Change this layer's name…" + command = 'change_layer_name' + +class LayerSetZItem(ArtModePulldownMenuItem): + label = "Change this layer's Z-depth…" + command = 'change_layer_z' + +class LayerToggleVisibleItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'toggle_layer_visibility' + def get_label(app): + if not app.ui.active_art: + return 'Show this layer (Game Mode)' + visible = app.ui.active_art.layers_visibility[app.ui.active_art.active_layer] + return ['Show', 'Hide'][visible] + ' this layer (Game Mode)' + +class LayerDeleteItem(ArtModePulldownMenuItem): + label = "Delete this layer" + command = 'delete_layer' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.layers < 2 + +class LayerSetInactiveVizItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'cycle_inactive_layer_visibility' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.layers < 2 + def get_label(app): + l = 'Inactive layers: ' + if app.inactive_layer_visibility == LAYER_VIS_FULL: + return l + 'Visible' + elif app.inactive_layer_visibility == LAYER_VIS_DIM: + return l + 'Dim' + elif app.inactive_layer_visibility == LAYER_VIS_NONE: + return l + 'Invisible' + +class LayerShowHiddenItem(ArtModePulldownMenuItem): + label = 'blah' + command = 'toggle_hidden_layers_visible' + def get_label(app): + l = 'Art Mode-only layers: ' + l += ['Hidden', 'Visible'][app.show_hidden_layers] + return l + +class LayerPreviousItem(ArtModePulldownMenuItem): + label = 'Previous layer' + command = 'previous_layer' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.layers < 2 + +class LayerNextItem(ArtModePulldownMenuItem): + label = 'Next layer' + command = 'next_layer' + def should_dim(app): + return not app.ui.active_art or app.ui.active_art.layers < 2 + +# +# char/color menu +# +class ChooseCharSetItem(ArtModePulldownMenuItem): + label = 'Choose character set…' + command = 'choose_charset' + +class ChoosePaletteItem(ArtModePulldownMenuItem): + label = 'Choose palette…' + command = 'choose_palette' + +class PaletteFromImageItem(ArtModePulldownMenuItem): + label = 'Palette from image…' + command = 'palette_from_file' + always_active = True + +# +# help menu +# +class HelpDocsItem(ArtModePulldownMenuItem): + label = 'Help (in browser)' + command = 'open_help_docs' + always_active = True + close_on_select = True + game_mode_allowed = True + +class HelpGenerateDocsItem(ArtModePulldownMenuItem): + label = 'Generate documentation' + command = 'generate_docs' + close_on_select = True + def should_dim(app): + return not app.pdoc_available + +class HelpWebsiteItem(ArtModePulldownMenuItem): + label = 'Playscii website' + command = 'open_website' + always_active = True + close_on_select = True + +# +# menu data +# +class PulldownMenuData: + "data for pulldown menus, eg File, Edit, etc; mainly a list of menu items" + items = [] + def should_mark_item(item, ui): + "returns True if this item should be marked, subclasses have custom logic here" + return False + def get_items(app): + """ + returns a list of items generated from app state, used for + dynamically-generated items + """ + return [] + +class FileMenuData(PulldownMenuData): + items = [FileNewItem, FileOpenItem, FileSaveItem, FileSaveAsItem, + FileCloseItem, FileRevertItem, SeparatorItem, FileImportItem, + FileExportItem, FileExportLastItem, SeparatorItem, FileQuitItem] + +class EditMenuData(PulldownMenuData): + items = [EditUndoItem, EditRedoItem, SeparatorItem, + EditCutItem, EditCopyItem, EditPasteItem, EditDeleteItem, + SeparatorItem, EditSelectAllItem, + EditSelectNoneItem, EditSelectInvertItem, SeparatorItem, + EditPreferences] + +class ToolMenuData(PulldownMenuData): + items = [ToolTogglePickerItem, ToolTogglePickerHoldItem, + ToolSwapSelectedColors, ToolToggleArtToolbar, SeparatorItem, + ToolPaintItem, ToolEraseItem, ToolRotateItem, ToolGrabItem, + ToolTextItem, ToolSelectItem, ToolPasteItem, ToolFillItem, SeparatorItem, + ToolIncreaseBrushSizeItem, ToolDecreaseBrushSizeItem, + ToolToggleAffectsCharItem, ToolToggleAffectsFGItem, + ToolToggleAffectsBGItem, ToolToggleAffectsXformItem, SeparatorItem, + ToolSetFillBoundariesItem + ] + # TODO: cycle char/color/xform items? + # TODO: generate list from UI.tools instead of manually specified MenuItems + def should_mark_item(item, ui): + # if it's a tool setting toggle, use its own mark check function + if item.__bases__[0] is ToolSettingsItem: + return item.should_mark(ui) + elif hasattr(item, 'should_mark'): # toolbar toggle, etc + return item.should_mark(ui) + return item.label == ' %s' % ui.selected_tool.button_caption + +class ViewMenuData(PulldownMenuData): + items = [ViewToggleCRTItem, ViewToggleGridItem, ViewBGTextureItem, + SeparatorItem, + ViewToggleZoomExtentsItem, ViewZoomInItem, ViewZoomOutItem, + ViewSetZoomItem, ViewToggleCameraTiltItem, SeparatorItem, + ViewSetOverlayImageItem, ViewToggleOverlayImageItem, + ViewSetOverlayImageOpacityItem, ViewSetOverlayImageScalingItem + ] + + def should_mark_item(item, ui): + if hasattr(item, 'should_mark'): + return item.should_mark(ui) + return False + +class ArtMenuData(PulldownMenuData): + items = [ArtResizeItem, ArtCropToSelectionItem, + ArtFlipHorizontal, ArtFlipVertical, ArtToggleFlipAffectsXforms, + SeparatorItem, + ArtRunScriptItem, ArtRunLastScriptItem, SeparatorItem, + ArtOpenAllGameAssetsItem, SeparatorItem, + ArtPreviousItem, ArtNextItem, SeparatorItem] + + def should_mark_item(item, ui): + "show checkmark for active art" + if hasattr(item, 'should_mark'): + return item.should_mark(ui) + return ui.active_art and ui.active_art.filename == item.cb_arg + + def get_items(app): + "turn each loaded art into a menu item" + items = [] + for art in app.art_loaded_for_edit: + # class just being used to store data, no need to spawn it + class TempMenuItemClass(ArtModePulldownMenuItem): pass + item = TempMenuItemClass + # leave spaces for mark + item.label = ' %s' % art.filename + item.command = 'art_switch_to' + item.cb_arg = art.filename + # order list by art's time loaded + item.time_loaded = art.time_loaded + items.append(item) + items.sort(key=lambda item: item.time_loaded) + return items + + +class FrameMenuData(PulldownMenuData): + items = [FrameAddFrameItem, FrameDuplicateFrameItem, + FrameChangeDelayItem, FrameChangeDelayAllItem, + FrameChangeIndexItem, FrameDeleteFrameItem, SeparatorItem, + FrameTogglePlaybackItem, FramePreviousItem, FrameNextItem, + SeparatorItem, + FrameToggleOnionItem, FrameCycleOnionFramesItem, + FrameCycleOnionDisplayItem] + + +class LayerMenuData(PulldownMenuData): + + items = [LayerAddItem, LayerDuplicateItem, LayerSetNameItem, LayerSetZItem, + LayerDeleteItem, SeparatorItem, + LayerSetInactiveVizItem, LayerPreviousItem,LayerNextItem, + SeparatorItem, LayerToggleVisibleItem, LayerShowHiddenItem, + SeparatorItem] + + def should_mark_item(item, ui): + "show checkmark for active art" + if not ui.active_art: + return False + return ui.active_art.active_layer == item.cb_arg + + def get_items(app): + "turn each layer into a menu item" + items = [] + if not app.ui.active_art: + return items + # first determine longest line to set width of items + longest_line = 0 + for layer_name in app.ui.active_art.layer_names: + if len(layer_name) > longest_line: + longest_line = len(layer_name) + # check non-generated menu items too + for item in LayerMenuData.items: + if len(item.label) + 1 > longest_line: + longest_line = len(item.label) + 1 + # cap at max allowed line length + longest_line = min(longest_line, 50) + for i,layer_name in enumerate(app.ui.active_art.layer_names): + class TempMenuItemClass(ArtModePulldownMenuItem): pass + item = TempMenuItemClass + # leave spaces for mark + item.label = ' %s' % layer_name + if not app.ui.active_art.layers_visibility[i]: + item.label += ' (hidden)' + # pad, put Z depth on far right + item.label = item.label.ljust(longest_line) + # trim to keep below a max length + item.label = item.label[:longest_line] + # spaces between layer name and z depth + item.label += 'z:%.2f' % app.ui.active_art.layers_z[i] + # tell PulldownMenu's button creation process not to auto-pad + item.no_pad = True + item.command = 'layer_switch_to' + item.cb_arg = i + items.append(item) + return items + +class CharColorMenuData(PulldownMenuData): + items = [ChooseCharSetItem, ChoosePaletteItem, SeparatorItem, + PaletteFromImageItem] + +class HelpMenuData(PulldownMenuData): + items = [HelpDocsItem, HelpGenerateDocsItem, HelpWebsiteItem] diff --git a/ui_object_panel.py b/ui_object_panel.py new file mode 100644 index 0000000..70ae028 --- /dev/null +++ b/ui_object_panel.py @@ -0,0 +1,227 @@ +import os + +from ui_button import UIButton, TEXT_RIGHT +from ui_edit_panel import GamePanel +from ui_dialog import UIDialog, Field +from ui_colors import UIColors + + +class ResetObjectButton(UIButton): + caption = 'Reset object properties' + caption_justify = TEXT_RIGHT + def selected(button): + world = button.element.world + world.reset_object_in_place(world.selected_objects[0]) + + +class EditObjectPropertyDialog(UIDialog): + + "dialog invoked by panel property click, modified at runtime as needed" + base_title = 'Set %s' + field0_base_label = 'New %s for %s:' + field_width = UIDialog.default_field_width + fields = [ + Field(label=field0_base_label, type=str, width=field_width, oneline=False) + ] + confirm_caption = 'Set' + center_in_window = False + game_mode_visible = True + + def is_input_valid(self): + try: self.fields[0].type(self.field_texts[0]) + except: return False, '' + return True, None + + def confirm_pressed(self): + valid, reason = self.is_input_valid() + if not valid: return + # set property for selected object(s) + new_value = self.fields[0].type(self.field_texts[0]) + for obj in self.ui.app.gw.selected_objects: + obj.set_object_property(self.item.prop_name, new_value) + self.dismiss() + # restore keyboard focus to edit panel + self.ui.keyboard_focus_element = self.ui.edit_object_panel + + +class EditObjectPropertyButton(UIButton): + caption_justify = TEXT_RIGHT + + +class PropertyItem: + multi_value_text = '[various]' + + def __init__(self, prop_name): + self.prop_name = prop_name + # property value & type filled in after creation + self.prop_value = None + self.prop_type = None + def set_value(self, value): + # convert value to a button-friendly string + if type(value) is float: + valstr = '%.3f' % value + # non-fixed decimal version may be shorter, if so use it + if len(str(value)) < len(valstr): + valstr = str(value) + elif type(value) is str: + # file? shorten to basename minus extension + if os.path.exists: + valstr = os.path.basename(value) + valstr = os.path.splitext(valstr)[0] + else: + valstr = value + else: + valstr = str(value) + # if values vary across objects use [various] + if self.prop_value is not None and self.prop_value != valstr: + self.prop_value = self.multi_value_text + else: + self.prop_value = valstr + + +class EditObjectPanel(GamePanel): + + "panel showing info for selected game object" + tile_width = 36 + tile_height = 36 + snap_right = True + text_left = False + base_button_classes = [ResetObjectButton] + + def __init__(self, ui): + self.base_buttons = [] + self.property_buttons = [] + GamePanel.__init__(self, ui) + + def create_buttons(self): + # buttons for persistent unique commands, eg reset object + for i,button_class in enumerate(self.base_button_classes): + button = button_class(self) + button.caption += ' ' + button.width = self.tile_width + button.y = i + 1 + button.callback = button.selected + if button.clear_before_caption_draw: + button.refresh_caption() + self.base_buttons.append(button) + def callback(item=None): + if not item: return + self.clicked_item(item) + for y in range(self.tile_height - len(self.base_buttons) - 1): + button = EditObjectPropertyButton(self) + button.y = y + len(self.base_buttons) + 1 + # button.cb_arg set in refresh_items + button.callback = callback + # below properties reset every update + button.caption = str(y + 1) + button.width = 10 + self.property_buttons.append(button) + self.buttons = self.base_buttons[:] + self.property_buttons[:] + + def clicked_item(self, item): + # if property is a bool just toggle/set it, no need for a dialog + if item.prop_type is bool: + for obj in self.world.selected_objects: + # if multiple object values vary, set it True + if item.prop_value == PropertyItem.multi_value_text: + obj.set_object_property(item.prop_name, True) + else: + val = getattr(obj, item.prop_name) + obj.set_object_property(item.prop_name, not val) + return + # set dialog values appropriate to property being edited + EditObjectPropertyDialog.title = EditObjectPropertyDialog.base_title % item.prop_name + + # can't set named tuple values directly, build a new one and set it + old_field = EditObjectPropertyDialog.fields[0] + new_label = EditObjectPropertyDialog.field0_base_label % (item.prop_type.__name__, item.prop_name) + new_type = item.prop_type + # if None, assume string + if item.prop_type is type(None): + new_type = str + new_field = Field(label=new_label, type=new_type, width=old_field.width, + oneline=old_field.oneline) + EditObjectPropertyDialog.fields[0] = new_field + + tile_x = int(self.ui.width_tiles * self.ui.scale) - self.tile_width + tile_x -= EditObjectPropertyDialog.tile_width + # give dialog a handle to item + EditObjectPropertyDialog.item = item + self.ui.open_dialog(EditObjectPropertyDialog) + self.ui.active_dialog.field_texts[0] = str(item.prop_value) + self.ui.active_dialog.tile_x, self.ui.active_dialog.tile_y = tile_x, self.tile_y + self.ui.active_dialog.reset_loc() + + def get_label(self): + # if 1 object seleted, show its name; if >1 selected, show # + selected = len(self.world.selected_objects) + # panel shouldn't draw when nothing selected, fill in anyway + if selected == 0: + return '[nothing selected]' + elif selected == 1 and self.world.selected_objects[0]: + return self.world.selected_objects[0].name + else: + return '[%s selected]' % selected + + def refresh_items(self): + if len(self.world.selected_objects) == 0: + return + # get list of unique properties across all selected objects + propnames = [] + for obj in self.world.selected_objects: + # sometimes object deselect puts None into this list + # TODO: understand why, fix if needed + if obj is None: + continue + for propname in obj.serialized + obj.editable: + if not propname in propnames: + propnames.append(propname) + # build list of items from properties + items = [] + for propname in propnames: + item = PropertyItem(propname) + for obj in self.world.selected_objects: + if hasattr(obj, propname): + # fill in type and value + if item.prop_type is None: + item.prop_type = type(getattr(obj, propname)) + item.set_value(getattr(obj, propname)) + items.append(item) + # set each line + for i,b in enumerate(self.property_buttons): + item = None + if i < len(items): + item = items[i] + self.draw_property_line(b, i, item) + self.draw_buttons() + + def draw_property_line(self, button, button_index, item): + "set button + label appearance correctly" + y = button_index + len(self.base_buttons) + 1 + self.art.clear_line(0, 0, y, self.fg_color, self.bg_color) + if item is None: + button.caption = '' + button.cb_arg = None + button.can_hover = False + return + # set button caption, width, x based on value + button.caption = '%s ' % item.prop_value + button.width = len(button.caption) + 1 + button.x = self.tile_width - button.width + button.cb_arg = item + button.can_hover = True + # set non-button text to the left correctly + x = button.x + 1 + label = '%s: ' % item.prop_name + self.art.write_string(0, 0, x, y, label, UIColors.darkgrey, None, True) + + def update(self): + # redraw contents every update + if self.is_visible(): + self.draw_titlebar() + self.refresh_items() + GamePanel.update(self) + self.renderable.alpha = 1 if self is self.ui.keyboard_focus_element else 0.5 + + def is_visible(self): + return GamePanel.is_visible(self) and len(self.world.selected_objects) > 0 diff --git a/ui_popup.py b/ui_popup.py new file mode 100644 index 0000000..523b87f --- /dev/null +++ b/ui_popup.py @@ -0,0 +1,681 @@ + +from ui_element import UIElement, UIArt, UIRenderable +from ui_button import UIButton, TEXT_LEFT, TEXT_CENTER, TEXT_RIGHT +from ui_swatch import CharacterSetSwatch, PaletteSwatch, MIN_CHARSET_WIDTH +from ui_colors import UIColors +from ui_tool import FillTool, FILL_BOUND_CHAR, FILL_BOUND_FG_COLOR, FILL_BOUND_BG_COLOR +from renderable_line import LineRenderable, SwatchSelectionBoxRenderable +from art import UV_NORMAL, UV_ROTATE90, UV_ROTATE180, UV_ROTATE270, UV_FLIPX, UV_FLIPY +from ui_file_chooser_dialog import CharSetChooserDialog, PaletteChooserDialog + +TOOL_PANE_WIDTH = 10 + +class ToolTabButton(UIButton): + x, y = 0, 0 + caption_y = 1 + # width is set on the fly by popup size in reset_art + height = 3 + caption_justify = TEXT_CENTER + caption = 'Tools' + +class CharColorTabButton(UIButton): + caption_y = 1 + height = ToolTabButton.height + caption_justify = TEXT_CENTER + caption = 'Chars/Colors' + +# charset view scale up/down buttons + +class CharSetScaleUpButton(UIButton): + width, height = 3, 1 + x, y = -width, ToolTabButton.height + 1 + caption = '+' + caption_justify = TEXT_CENTER + +class CharSetScaleDownButton(CharSetScaleUpButton): + x = -CharSetScaleUpButton.width + CharSetScaleUpButton.x + caption = '-' + +# charset flip / rotate buttons + +class CharXformButton(UIButton): + hovered_fg_color = UIColors.white + hovered_bg_color = UIColors.medgrey + +class CharFlipNoButton(CharXformButton): + x = 3 + len('Flip:') + 1 + y = CharSetScaleUpButton.y + 1 + caption = 'None' + width = len(caption) + 2 + caption_justify = TEXT_CENTER + +class CharFlipXButton(CharFlipNoButton): + x = CharFlipNoButton.x + CharFlipNoButton.width + 1 + width = 3 + caption = 'X' + +class CharFlipYButton(CharFlipXButton): + x = CharFlipXButton.x + CharFlipXButton.width + 1 + caption = 'Y' + +class CharRot0Button(CharXformButton): + x = 3 + len('Rotation:') + 1 + y = CharFlipNoButton.y + 1 + width = 3 + caption = '0' + caption_justify = TEXT_CENTER + +class CharRot90Button(CharRot0Button): + x = CharRot0Button.x + CharRot0Button.width + 1 + width = 4 + caption = '90' + +class CharRot180Button(CharRot0Button): + x = CharRot90Button.x + CharRot90Button.width + 1 + width = 5 + caption = '180' + +class CharRot270Button(CharRot0Button): + x = CharRot180Button.x + CharRot180Button.width + 1 + width = 5 + caption = '270' + +# tool and tool settings buttons + +class ToolButton(UIButton): + "a tool entry in the tool tab's left hand pane. populated from UI.tools" + width = TOOL_PANE_WIDTH + caption = 'TOOLZ' + y = ToolTabButton.height + 2 + +class BrushSizeUpButton(UIButton): + width = 3 + y = ToolTabButton.height + 3 + caption = '+' + caption_justify = TEXT_CENTER + normal_fg_color = UIColors.white + normal_bg_color = UIColors.medgrey + +class BrushSizeDownButton(BrushSizeUpButton): + caption = '-' + +class AffectCharToggleButton(UIButton): + width = 3 + x = TOOL_PANE_WIDTH + 2 + y = BrushSizeUpButton.y + 3 + # don't paint caption from string + should_draw_caption = False + normal_fg_color = UIColors.white + normal_bg_color = UIColors.medgrey + +class AffectFgToggleButton(AffectCharToggleButton): + y = AffectCharToggleButton.y + 1 + +class AffectBgToggleButton(AffectCharToggleButton): + y = AffectCharToggleButton.y + 2 + +class AffectXformToggleButton(AffectCharToggleButton): + y = AffectCharToggleButton.y + 3 + +# fill boundary mode items +class FillBoundaryModeCharButton(AffectCharToggleButton): + y = AffectXformToggleButton.y + 3 + +class FillBoundaryModeFGButton(AffectCharToggleButton): + y = FillBoundaryModeCharButton.y + 1 + +class FillBoundaryModeBGButton(AffectCharToggleButton): + y = FillBoundaryModeCharButton.y + 2 + + +# charset / palette chooser buttons + +class CharSetChooserButton(UIButton): + caption = 'Set:' + x = 1 + normal_fg_color = UIColors.black + normal_bg_color = UIColors.white + hovered_fg_color = UIColors.white + hovered_bg_color = UIColors.medgrey + +class PaletteChooserButton(CharSetChooserButton): + caption = 'Palette:' + + +TAB_TOOLS = 0 +TAB_CHAR_COLOR = 1 + + +class ToolPopup(UIElement): + + visible = False + # actual width will be based on character set + palette size and scale + tile_width, tile_height = 20, 15 + tab_height = ToolTabButton.height + swatch_margin = 0.05 + fg_color = UIColors.black + bg_color = UIColors.lightgrey + highlight_color = UIColors.white + tool_settings_label = 'Tool Settings:' + brush_size_label = 'Brush size:' + affects_heading_label = 'Affects:' + affects_char_label = 'Character' + affects_fg_label = 'Foreground Color' + affects_bg_label = 'Background Color' + affects_xform_label = 'Rotation/Flip' + fill_boundary_modes_label = 'Fill boundary mode:' + fill_boundary_char_label = affects_char_label + fill_boundary_fg_label = affects_fg_label + fill_boundary_bg_label = affects_bg_label + flip_label = 'Flip:' + rotation_label = 'Rotation:' + # index of check mark character in UI charset + check_char_index = 131 + # index of off and on radio button characters in UI charset + radio_char_0_index = 126 + radio_char_1_index = 127 + # map classes to member names / callbacks + button_names = { + ToolTabButton: 'tool_tab', + CharColorTabButton: 'char_color_tab', + } + char_color_tab_button_names = { + CharSetScaleUpButton: 'scale_charset_up', + CharSetScaleDownButton: 'scale_charset_down', + CharSetChooserButton: 'choose_charset', + CharFlipNoButton: 'xform_normal', + CharFlipXButton: 'xform_flipX', + CharFlipYButton: 'xform_flipY', + CharRot0Button: 'xform_0', + CharRot90Button: 'xform_90', + CharRot180Button: 'xform_180', + CharRot270Button: 'xform_270', + PaletteChooserButton: 'choose_palette', + } + tool_tab_button_names = { + BrushSizeUpButton: 'brush_size_up', + BrushSizeDownButton: 'brush_size_down', + AffectCharToggleButton: 'toggle_affect_char', + AffectFgToggleButton: 'toggle_affect_fg', + AffectBgToggleButton: 'toggle_affect_bg', + AffectXformToggleButton: 'toggle_affect_xform', + } + fill_boundary_mode_button_names = { + FillBoundaryModeCharButton: 'set_fill_boundary_char', + FillBoundaryModeFGButton: 'set_fill_boundary_fg', + FillBoundaryModeBGButton: 'set_fill_boundary_bg' + } + + def __init__(self, ui): + self.ui = ui + self.charset_swatch = CharacterSetSwatch(ui, self) + self.palette_swatch = PaletteSwatch(ui, self) + self.cursor_box = SwatchSelectionBoxRenderable(ui.app, self.charset_swatch.art) + self.renderables = [self.cursor_box] + # set by swatch.set_cursor_loc based on selection validity + self.cursor_char = -1 + self.cursor_color = -1 + self.active_tab = TAB_CHAR_COLOR + # create buttons from button:name map, button & callback names generated + # group these into lists that can be combined into self.buttons + self.common_buttons = self.create_buttons_from_map(self.button_names) + self.char_color_tab_buttons = self.create_buttons_from_map(self.char_color_tab_button_names) + self.fill_boundary_mode_buttons = self.create_buttons_from_map(self.fill_boundary_mode_button_names) + self.tool_tab_buttons = self.create_buttons_from_map(self.tool_tab_button_names) + self.fill_boundary_mode_buttons + # populate more tool tab buttons from UI's list of tools + # similar to create_buttons_from_map, but class name isn't known + # MAYBE-TODO: is there a way to unify this? + for tool in self.ui.tools: + tool_button = ToolButton(self) + # caption: 1-space padding from left + tool_button.caption = ' %s' % tool.button_caption + tool_button_name = '%s_tool_button' % tool.name + setattr(self, tool_button_name, tool_button) + cb_name = '%s_pressed' % tool_button_name + tool_button.callback = getattr(self, cb_name) + # set a special property UI can refer to + tool_button.tool_name = tool.name + self.tool_tab_buttons.append(tool_button) + UIElement.__init__(self, ui) + # set initial tab state + self.char_color_tab_button_pressed() + self.xform_0_button.normal_bg_color = self.xform_normal_button.normal_bg_color = self.highlight_color + + def create_buttons_from_map(self, button_dict): + buttons = [] + for button_class in button_dict: + button = button_class(self) + button_name = '%s_button' % button_dict[button_class] + setattr(self, button_name, button) + cb_name = '%s_pressed' % button_name + button.callback = getattr(self, cb_name) + buttons.append(button) + return buttons + + def tool_tab_button_pressed(self): + self.active_tab = TAB_TOOLS + self.char_color_tab_button.can_hover = True + self.char_color_tab_button.dimmed = True + self.tool_tab_button.can_hover = False + self.tool_tab_button.dimmed = False + self.buttons = self.common_buttons + self.tool_tab_buttons + self.draw_tool_tab() + self.draw_buttons() + + def char_color_tab_button_pressed(self): + self.active_tab = TAB_CHAR_COLOR + self.tool_tab_button.can_hover = True + self.tool_tab_button.dimmed = True + self.char_color_tab_button.can_hover = False + self.char_color_tab_button.dimmed = False + self.buttons = self.common_buttons + self.char_color_tab_buttons + self.draw_char_color_tab() + self.draw_buttons() + + def scale_charset_up_button_pressed(self): + self.charset_swatch.increase_scale() + self.reset_art() + self.charset_swatch.reset_loc() + self.palette_swatch.reset_loc() + + def scale_charset_down_button_pressed(self): + self.charset_swatch.decrease_scale() + self.reset_art() + self.charset_swatch.reset_loc() + self.palette_swatch.reset_loc() + + def brush_size_up_button_pressed(self): + # any changes to tool's setting will force redraw of settings tab + self.ui.selected_tool.increase_brush_size() + + def brush_size_down_button_pressed(self): + self.ui.selected_tool.decrease_brush_size() + + def toggle_affect_char_button_pressed(self): + self.ui.selected_tool.toggle_affects_char() + + def toggle_affect_fg_button_pressed(self): + self.ui.selected_tool.toggle_affects_fg() + + def toggle_affect_bg_button_pressed(self): + self.ui.selected_tool.toggle_affects_bg() + + def toggle_affect_xform_button_pressed(self): + self.ui.selected_tool.toggle_affects_xform() + + def set_fill_boundary_char_button_pressed(self): + self.ui.fill_tool.boundary_mode = FILL_BOUND_CHAR + self.ui.tool_settings_changed = True + + def set_fill_boundary_fg_button_pressed(self): + self.ui.fill_tool.boundary_mode = FILL_BOUND_FG_COLOR + self.ui.tool_settings_changed = True + + def set_fill_boundary_bg_button_pressed(self): + self.ui.fill_tool.boundary_mode = FILL_BOUND_BG_COLOR + self.ui.tool_settings_changed = True + + def pencil_tool_button_pressed(self): + self.ui.set_selected_tool(self.ui.pencil_tool) + + def erase_tool_button_pressed(self): + self.ui.set_selected_tool(self.ui.erase_tool) + + def grab_tool_button_pressed(self): + self.ui.set_selected_tool(self.ui.grab_tool) + + def rotate_tool_button_pressed(self): + self.ui.set_selected_tool(self.ui.rotate_tool) + + def text_tool_button_pressed(self): + self.ui.set_selected_tool(self.ui.text_tool) + + def select_tool_button_pressed(self): + self.ui.set_selected_tool(self.ui.select_tool) + + def paste_tool_button_pressed(self): + self.ui.set_selected_tool(self.ui.paste_tool) + + def fill_tool_button_pressed(self): + self.ui.set_selected_tool(self.ui.fill_tool) + + def set_xform(self, new_xform): + "tells UI elements to respect new xform" + self.charset_swatch.set_xform(new_xform) + self.update_xform_buttons() + + def update_xform_buttons(self): + # light up button for current selected option + button_map = { + UV_NORMAL: self.xform_normal_button, + UV_ROTATE90: self.xform_90_button, + UV_ROTATE180: self.xform_180_button, + UV_ROTATE270: self.xform_270_button, + UV_FLIPX: self.xform_flipX_button, + UV_FLIPY: self.xform_flipY_button + } + for b in button_map: + if b == self.ui.selected_xform: + button_map[b].normal_bg_color = self.highlight_color + else: + button_map[b].normal_bg_color = self.bg_color + self.xform_0_button.normal_bg_color = self.xform_normal_button.normal_bg_color + self.draw_buttons() + + def xform_normal_button_pressed(self): + self.ui.set_selected_xform(UV_NORMAL) + + def xform_flipX_button_pressed(self): + self.ui.set_selected_xform(UV_FLIPX) + + def xform_flipY_button_pressed(self): + self.ui.set_selected_xform(UV_FLIPY) + + def xform_0_button_pressed(self): + self.ui.set_selected_xform(UV_NORMAL) + + def xform_90_button_pressed(self): + self.ui.set_selected_xform(UV_ROTATE90) + + def xform_180_button_pressed(self): + self.ui.set_selected_xform(UV_ROTATE180) + + def xform_270_button_pressed(self): + self.ui.set_selected_xform(UV_ROTATE270) + + def choose_charset_button_pressed(self): + self.hide() + self.ui.open_dialog(CharSetChooserDialog) + + def choose_palette_button_pressed(self): + self.hide() + self.ui.open_dialog(PaletteChooserDialog) + + def draw_char_color_tab(self): + "draw non-button bits of this tab" + # charset renderable location will be set in update() + charset = self.ui.active_art.charset + palette = self.ui.active_art.palette + cqw, cqh = self.charset_swatch.art.quad_width, self.charset_swatch.art.quad_height + self.art.clear_frame_layer(0, 0, self.bg_color, self.fg_color) + # position & caption charset button + y = self.tab_height + 1 + self.choose_charset_button.y = y + self.choose_charset_button.caption = ' %s %s ' % (CharSetChooserButton.caption, charset.name) + self.choose_charset_button.width = len(self.choose_charset_button.caption) + # charset scale + charset_scale = '%.2fx' % self.charset_swatch.char_scale + x = -self.scale_charset_up_button.width * 2 + self.art.write_string(0, 0, x, y, charset_scale, None, None, True) + # transform labels and buttons, eg + # Transform: [Normal] [Flip X] [Flip Y] + # Rotation: [ 0 ] [ 90] [180] [270] + x = 3 + y += 1 + self.art.write_string(0, 0, x, y, self.flip_label) + y += 1 + self.art.write_string(0, 0, x, y, self.rotation_label) + # position & caption palette button + pal_caption_y = (cqh * charset.map_height) / self.art.quad_height + pal_caption_y += self.tab_height + 5 + self.choose_palette_button.y = int(pal_caption_y) + self.choose_palette_button.caption = ' %s %s ' % (PaletteChooserButton.caption, palette.name) + self.choose_palette_button.width = len(self.choose_palette_button.caption) + # set button states so captions draw properly + tab_width = int(self.tile_width / 2) + self.tool_tab_button.width = tab_width + self.char_color_tab_button.width = int(self.tile_width) - tab_width + self.char_color_tab_button.x = tab_width + + def draw_tool_tab(self): + self.art.clear_frame_layer(0, 0, self.bg_color, self.fg_color) + # fill tool bar with dimmer color, highlight selected tool + for y in range(self.art.height): + for x in range(TOOL_PANE_WIDTH): + self.art.set_color_at(0, 0, x, y, self.ui.colors.medgrey, False) + # set selected tool BG lighter + y = self.tab_height + 1 + for i,tool in enumerate(self.ui.tools): + tool_button = None + for button in self.tool_tab_buttons: + try: + if button.tool_name == tool.name: + tool_button = button + except: + pass + tool_button.y = y+i + if tool == self.ui.selected_tool: + tool_button.normal_bg_color = self.ui.colors.lightgrey + else: + tool_button.normal_bg_color = self.ui.colors.medgrey + # draw current tool settings + x = TOOL_PANE_WIDTH + 1 + y = self.tab_height + 1 + label = '%s %s' % (self.ui.selected_tool.button_caption, self.tool_settings_label) + self.art.write_string(0, 0, x, y, label) + x += 1 + y += 2 + # brush size (if applicable) + if self.ui.selected_tool.brush_size: + self.brush_size_down_button.visible = True + self.brush_size_up_button.visible = True + label = self.brush_size_label + # calculate X of + and - buttons based on size string + self.brush_size_down_button.x = TOOL_PANE_WIDTH + len(label) + 2 + label += ' ' * (self.brush_size_down_button.width + 1) + label += '%s' % self.ui.selected_tool.brush_size + self.brush_size_up_button.x = TOOL_PANE_WIDTH + len(label) + 3 + self.art.write_string(0, 0, x, y, label) + else: + # if inapplicable, hide those controls + self.brush_size_down_button.visible = False + self.brush_size_up_button.visible = False + if self.ui.selected_tool.affects_masks: + # affects char/fg/bg settings + self.toggle_affect_char_button.visible = True + self.toggle_affect_fg_button.visible = True + self.toggle_affect_bg_button.visible = True + self.toggle_affect_xform_button.visible = True + y += 2 + self.art.write_string(0, 0, x, y, self.affects_heading_label) + y += 1 + # set affects-* button labels AND captions + def get_affects_char(affects): + return [0, self.check_char_index][affects] + w = self.toggle_affect_char_button.width + label_toggle_pairs = [] + label_toggle_pairs += [(self.affects_char_label, self.ui.selected_tool.affects_char)] + label_toggle_pairs += [(self.affects_fg_label, self.ui.selected_tool.affects_fg_color)] + label_toggle_pairs += [(self.affects_bg_label, self.ui.selected_tool.affects_bg_color)] + label_toggle_pairs += [(self.affects_xform_label, self.ui.selected_tool.affects_xform)] + for label,toggle in label_toggle_pairs: + self.art.write_string(0, 0, x+w+1, y, '%s' % label) + #self.art.set_tile_at(0, 0, x, y, get_affects_char(toggle), 4, 2) + self.art.set_char_index_at(0, 0, x+1, y, get_affects_char(toggle)) + y += 1 + else: + self.toggle_affect_char_button.visible = False + self.toggle_affect_fg_button.visible = False + self.toggle_affect_bg_button.visible = False + self.toggle_affect_xform_button.visible = False + # custom setting for fill tool: boundary mode + if type(self.ui.selected_tool) is FillTool: + y += 1 + self.art.write_string(0, 0, x, y, self.fill_boundary_modes_label) + y += 1 + # boundary mode buttons + labels + #x += + labels = [self.fill_boundary_char_label, + self.fill_boundary_fg_label, + self.fill_boundary_bg_label] + for i,button in enumerate(self.fill_boundary_mode_buttons): + button.visible = True + char = [self.radio_char_0_index, self.radio_char_1_index][i == self.ui.fill_tool.boundary_mode] + #self.ui.app.log(char) + self.art.set_char_index_at(0, 0, x+1, y, char) + self.art.write_string(0, 0, x + FillBoundaryModeCharButton.width + 1, y, labels[i]) + y += 1 + else: + for button in self.fill_boundary_mode_buttons: + button.visible = False + + def reset_art(self): + if not self.ui.active_art: + return + self.charset_swatch.reset_art() + self.palette_swatch.reset_art() + # set panel size based on charset size + margin = self.swatch_margin * 2 + charset = self.ui.active_art.charset + cqw, cqh = self.charset_swatch.art.quad_width, self.charset_swatch.art.quad_height + old_width, old_height = self.tile_width, self.tile_height + # min width in case of tiny charsets + charset_tile_width = max(charset.map_width, MIN_CHARSET_WIDTH) + self.tile_width = (cqw * charset_tile_width + margin) / UIArt.quad_width + # tile height = height of charset + distance from top of popup + self.tile_height = (cqh * charset.map_height) / UIArt.quad_height + margin + # account for popup info lines etc: charset name + palette name + 1 padding each + extra_lines = 7 + # account for size of palette + bottom margin + palette_height = ((self.palette_swatch.art.height * self.palette_swatch.art.quad_height) + self.swatch_margin) / UIArt.quad_height + self.tile_height += self.tab_height + palette_height + extra_lines + if old_width != self.tile_width or old_height != self.tile_height: + self.art.resize(int(self.tile_width), int(self.tile_height)) + # panel text - position different elements based on selected tab + if self.active_tab == TAB_CHAR_COLOR: + self.draw_char_color_tab() + elif self.active_tab == TAB_TOOLS: + self.draw_tool_tab() + self.update_xform_buttons() + # draw button captions + UIElement.reset_art(self) + + def show(self): + # if already visible, bail - key repeat probably triggered this + if self.visible: + return + if self.ui.active_dialog: + return + self.visible = True + # visible, grab keyboard focus + self.ui.keyboard_focus_element = self + # set cursor as starting point for keyboard navigation + self.charset_swatch.set_cursor_selection_index(self.ui.selected_char) + if self.ui.pulldown.visible: + self.ui.menu_bar.close_active_menu() + self.reset_loc() + + def toggle(self): + if self.visible: + self.hide() + else: + self.show() + + def reset_loc(self): + if not self.ui.active_art: + return + x, y = self.ui.get_screen_coords(self.ui.app.mouse_x, self.ui.app.mouse_y) + # center on mouse + w, h = self.tile_width * self.art.quad_width, self.tile_height * self.art.quad_height + x -= w / 2 + y += h / 2 + # clamp to edges of screen + self.x = max(-1, min(1 - w, x)) + self.y = min(1, max(-1 + h, y)) + # set location for sub elements + self.renderable.x, self.renderable.y = self.x, self.y + self.charset_swatch.reset_loc() + self.palette_swatch.reset_loc() + + def hide(self): + self.visible = False + self.ui.keyboard_focus_element = None + self.ui.refocus_keyboard() + + def set_active_charset(self, new_charset): + self.charset_swatch.art.charset = new_charset + self.palette_swatch.art.charset = new_charset + # make sure selected char isn't out of bounds w/ new set + self.ui.selected_char %= new_charset.last_index + self.ui.status_bar.set_active_charset(new_charset) + self.charset_swatch.reset() + # charset width drives palette swatch width + self.palette_swatch.reset() + self.reset_art() + + def set_active_palette(self, new_palette): + self.charset_swatch.art.palette = new_palette + self.palette_swatch.art.palette = new_palette + # make sure selected colors aren't out of bounds w/ new palette + self.ui.selected_fg_color %= len(new_palette.colors) - 1 + self.ui.selected_bg_color %= len(new_palette.colors) - 1 + self.ui.status_bar.set_active_palette(new_palette) + self.palette_swatch.reset() + self.reset_art() + + def update(self): + UIElement.update(self) + if not self.ui.active_art: + return + if self.active_tab == TAB_CHAR_COLOR: + # bail if mouse didn't move, but also respect keyboard editing + mouse_moved = self.ui.app.mouse_dx != 0 or self.ui.app.mouse_dy != 0 + if self.ui.app.keyboard_editing: + self.cursor_box.visible = True + elif mouse_moved and self in self.ui.hovered_elements: + self.cursor_box.visible = False + x, y = self.ui.get_screen_coords(self.ui.app.mouse_x, self.ui.app.mouse_y) + for e in [self.charset_swatch, self.palette_swatch]: + if e.is_inside(x, y): + self.cursor_box.visible = True + e.set_cursor_loc_from_mouse(self.cursor_box, x, y) + break + # note: self.cursor_box updates in charset_swatch.update + self.charset_swatch.update() + self.palette_swatch.update() + elif self.active_tab == TAB_TOOLS and self.ui.tool_settings_changed: + self.draw_tool_tab() + self.draw_buttons() + + def keyboard_navigate(self, dx, dy): + active_swatch = self.charset_swatch if self.cursor_char != -1 else self.palette_swatch + # TODO: can't handle cross-swatch navigation properly, restrict to chars + active_swatch = self.charset_swatch + # reverse up/down direction + active_swatch.move_cursor(self.cursor_box, dx, -dy) + + def keyboard_select_item(self): + # called as ui.keyboard_focus_element + # simulate left/right click in popup to select stuff + self.select_key_pressed(self.ui.app.il.shift_pressed) + + def select_key_pressed(self, mod_pressed): + mouse_button = [1, 3][mod_pressed] + self.clicked(mouse_button) + + def clicked(self, mouse_button): + handled = UIElement.clicked(self, mouse_button) + if handled: + return + # if cursor is over a char or color, make it the ui's selected one + if self.cursor_char != -1: + self.ui.selected_char = self.cursor_char + # update cursor, eg keyboard select when cursor isn't beneath popup + self.ui.app.cursor.undo_preview_edits() + self.ui.app.cursor.update_cursor_preview() + elif self.cursor_color != -1: + if mouse_button == 1: + self.ui.selected_fg_color = self.cursor_color + elif mouse_button == 3: + self.ui.selected_bg_color = self.cursor_color + return True + + def render(self): + if not self.visible: + return + UIElement.render(self) + if self.active_tab == TAB_CHAR_COLOR: + self.charset_swatch.render() + self.palette_swatch.render() + if self.cursor_char != -1 or self.cursor_color != -1: + self.cursor_box.render() diff --git a/ui_status_bar.py b/ui_status_bar.py new file mode 100644 index 0000000..fe9e543 --- /dev/null +++ b/ui_status_bar.py @@ -0,0 +1,476 @@ +import os.path, time +from math import ceil + +from ui_element import UIElement, UIArt, UIRenderable +from ui_button import UIButton, TEXT_LEFT, TEXT_CENTER, TEXT_RIGHT +from ui_colors import UIColors +from renderable_line import UIRenderableX +from art import uv_names + +# buttons to toggle "affects" status / cycle through choices, respectively + +class StatusBarToggleButton(UIButton): + caption_justify = TEXT_RIGHT + +class StatusBarCycleButton(UIButton): + # do different stuff for left vs right click + pass_mouse_button = True + should_draw_caption = False + width = 3 + +class CharToggleButton(StatusBarToggleButton): + x = 0 + caption = 'ch:' + width = len(caption) + 1 + tooltip_on_hover = True + def get_tooltip_text(self): + return 'character index: %s' % self.element.ui.selected_char + def get_tooltip_location(self): + return 1, self.element.get_tile_y() - 1 + +class CharCycleButton(StatusBarCycleButton): + x = CharToggleButton.width + tooltip_on_hover = True + # reuse above + def get_tooltip_text(self): return CharToggleButton.get_tooltip_text(self) + def get_tooltip_location(self): return CharToggleButton.get_tooltip_location(self) + +class FGToggleButton(StatusBarToggleButton): + x = CharCycleButton.x + CharCycleButton.width + caption = 'fg:' + width = len(caption) + 1 + tooltip_on_hover = True + def get_tooltip_text(self): + return 'foreground color index: %s' % self.element.ui.selected_fg_color + def get_tooltip_location(self): + return 8, self.element.get_tile_y() - 1 + +class FGCycleButton(StatusBarCycleButton): + x = FGToggleButton.x + FGToggleButton.width + tooltip_on_hover = True + def get_tooltip_text(self): return FGToggleButton.get_tooltip_text(self) + def get_tooltip_location(self): return FGToggleButton.get_tooltip_location(self) + +class BGToggleButton(StatusBarToggleButton): + x = FGCycleButton.x + FGCycleButton.width + caption = 'bg:' + width = len(caption) + 1 + tooltip_on_hover = True + def get_tooltip_text(self): + return 'background color index: %s' % self.element.ui.selected_bg_color + def get_tooltip_location(self): + return 15, self.element.get_tile_y() - 1 + +class BGCycleButton(StatusBarCycleButton): + x = BGToggleButton.x + BGToggleButton.width + tooltip_on_hover = True + def get_tooltip_text(self): return BGToggleButton.get_tooltip_text(self) + def get_tooltip_location(self): return BGToggleButton.get_tooltip_location(self) + +class XformToggleButton(StatusBarToggleButton): + x = BGCycleButton.x + BGCycleButton.width + caption = 'xform:' + width = len(caption) + 1 + +# class for things like xform and tool whose captions you can cycle through +class StatusBarTextCycleButton(StatusBarCycleButton): + should_draw_caption = True + caption_justify = TEXT_CENTER + normal_fg_color = UIColors.lightgrey + normal_bg_color = UIColors.black + hovered_fg_color = UIColors.lightgrey + hovered_bg_color = UIColors.black + clicked_fg_color = UIColors.black + clicked_bg_color = UIColors.white + +class XformCycleButton(StatusBarTextCycleButton): + x = XformToggleButton.x + XformToggleButton.width + width = len('Rotate 180') + caption = uv_names[0] + +class ToolCycleButton(StatusBarTextCycleButton): + x = XformCycleButton.x + XformCycleButton.width + len('tool:') + 1 + # width and caption are set during status bar init after button is created + +class FileCycleButton(StatusBarTextCycleButton): + caption = '[nothing]' + +class LayerCycleButton(StatusBarTextCycleButton): + caption = 'X/Y' + width = len(caption) + +class FrameCycleButton(StatusBarTextCycleButton): + caption = 'X/Y' + width = len(caption) + +class ZoomSetButton(StatusBarTextCycleButton): + caption = '100.0' + width = len(caption) + +class StatusBarUI(UIElement): + + snap_bottom = True + snap_left = True + always_consume_input = True + dim_color = 12 + swatch_width = 3 + char_swatch_x = CharCycleButton.x + fg_swatch_x = FGCycleButton.x + bg_swatch_x = BGCycleButton.x + tool_label = 'tool:' + tool_label_x = XformCycleButton.x + XformCycleButton.width + 1 + tile_label = 'tile:' + layer_label = 'layer:' + frame_label = 'frame:' + zoom_label = '%' + right_items_width = len(tile_label) + len(layer_label) + len(frame_label) + (len('X/Y') + 2) * 2 + len('XX/YY') + 2 + len(zoom_label) + 10 + button_names = { + CharToggleButton: 'char_toggle', + CharCycleButton: 'char_cycle', + FGToggleButton: 'fg_toggle', + FGCycleButton: 'fg_cycle', + BGToggleButton: 'bg_toggle', + BGCycleButton: 'bg_cycle', + XformToggleButton: 'xform_toggle', + XformCycleButton: 'xform_cycle', + ToolCycleButton: 'tool_cycle', + FileCycleButton: 'file_cycle', + LayerCycleButton: 'layer_cycle', + FrameCycleButton: 'frame_cycle', + ZoomSetButton: 'zoom_set' + } + + def __init__(self, ui): + art = ui.active_art + self.ui = ui + # create 3 custom Arts w/ source charset and palette, renderables for each + art_name = '%s_%s' % (int(time.time()), self.__class__.__name__) + self.char_art = UIArt(art_name, ui.app, art.charset, art.palette, self.swatch_width, 1) + self.char_renderable = UIRenderable(ui.app, self.char_art) + self.fg_art = UIArt(art_name, ui.app, art.charset, art.palette, self.swatch_width, 1) + self.fg_renderable = UIRenderable(ui.app, self.fg_art) + self.bg_art = UIArt(art_name, ui.app, art.charset, art.palette, self.swatch_width, 1) + self.bg_renderable = UIRenderable(ui.app, self.bg_art) + # "dimmed out" box + self.dim_art = UIArt(art_name, ui.app, ui.charset, ui.palette, self.swatch_width + self.char_swatch_x, 1) + self.dim_renderable = UIRenderable(ui.app, self.dim_art) + self.dim_renderable.alpha = 0.75 + # separate dimmed out box for xform, easier this way + xform_width = XformToggleButton.width + XformCycleButton.width + self.dim_xform_art = UIArt(art_name, ui.app, ui.charset, ui.palette, xform_width, 1) + self.dim_xform_renderable = UIRenderable(ui.app, self.dim_xform_art) + self.dim_xform_renderable.alpha = 0.75 + # create clickable buttons + self.buttons = [] + self.button_map = {} + for button_class, button_name in self.button_names.items(): + button = button_class(self) + setattr(self, button_name + '_button', button) + cb_name = '%s_button_pressed' % button_name + button.callback = getattr(self, cb_name) + self.buttons.append(button) + # keep a mapping of button names to buttons, for eg tooltip updates + self.button_map[button_name] = button + # some button captions, widths, locations will be set in reset_art + # determine total width of left-justified items + self.left_items_width = self.tool_cycle_button.x + self.tool_cycle_button.width + 15 + # set some properties in bulk + self.renderables = [] + for r in [self.char_renderable, self.fg_renderable, self.bg_renderable, + self.dim_renderable, self.dim_xform_renderable]: + r.ui = ui + r.grain_strength = 0 + # add to list of renderables to manage eg destroyed on quit + self.renderables.append(r) + # red X for transparent colors + self.x_renderable = UIRenderableX(ui.app, self.char_art) + # give it a special reference to this element + self.x_renderable.status_bar = self + self.renderables.append(self.x_renderable) + UIElement.__init__(self, ui) + + # button callbacks + + def char_toggle_button_pressed(self): + if self.ui.active_dialog: return + self.ui.selected_tool.toggle_affects_char() + + def char_cycle_button_pressed(self, mouse_button): + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.select_char(self.ui.selected_char + 1) + elif mouse_button == 3: + self.ui.select_char(self.ui.selected_char - 1) + + def fg_toggle_button_pressed(self): + if self.ui.active_dialog: return + self.ui.selected_tool.toggle_affects_fg() + + def fg_cycle_button_pressed(self, mouse_button): + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.select_fg(self.ui.selected_fg_color + 1) + elif mouse_button == 3: + self.ui.select_fg(self.ui.selected_fg_color - 1) + + def bg_toggle_button_pressed(self): + if self.ui.active_dialog: return + self.ui.selected_tool.toggle_affects_bg() + + def bg_cycle_button_pressed(self, mouse_button): + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.select_bg(self.ui.selected_bg_color + 1) + elif mouse_button == 3: + self.ui.select_bg(self.ui.selected_bg_color - 1) + + def xform_toggle_button_pressed(self): + if self.ui.active_dialog: return + self.ui.selected_tool.toggle_affects_xform() + + def xform_cycle_button_pressed(self, mouse_button): + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.cycle_selected_xform() + elif mouse_button == 3: + self.ui.cycle_selected_xform(True) + # update caption with new xform + self.xform_cycle_button.caption = uv_names[self.ui.selected_xform] + + def tool_cycle_button_pressed(self, mouse_button): + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.cycle_selected_tool() + elif mouse_button == 3: + self.ui.cycle_selected_tool(True) + self.tool_cycle_button.caption = self.ui.selected_tool.get_button_caption() + + def file_cycle_button_pressed(self, mouse_button): + if not self.ui.active_art: return + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.next_active_art() + elif mouse_button == 3: + self.ui.previous_active_art() + + def layer_cycle_button_pressed(self, mouse_button): + if not self.ui.active_art: return + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.set_active_layer(self.ui.active_art.active_layer + 1) + elif mouse_button == 3: + self.ui.set_active_layer(self.ui.active_art.active_layer - 1) + + def frame_cycle_button_pressed(self, mouse_button): + if not self.ui.active_art: return + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.set_active_frame(self.ui.active_art.active_frame + 1) + elif mouse_button == 3: + self.ui.set_active_frame(self.ui.active_art.active_frame - 1) + + def zoom_set_button_pressed(self, mouse_button): + if not self.ui.active_art: return + if self.ui.active_dialog: return + if mouse_button == 1: + self.ui.app.camera.zoom_proportional(1) + elif mouse_button == 3: + self.ui.app.camera.zoom_proportional(-1) + + def reset_art(self): + UIElement.reset_art(self) + self.tile_width = ceil(self.ui.width_tiles * self.ui.scale) + # must resize here, as window width will vary + self.art.resize(self.tile_width, self.tile_height) + # write chars/colors to the art + self.rewrite_art() + self.x_renderable.scale_x = self.char_art.width + self.x_renderable.scale_y = -self.char_art.height + # dim box + self.dim_art.clear_frame_layer(0, 0, self.ui.colors.white) + self.dim_art.update() + self.dim_xform_art.clear_frame_layer(0, 0, self.ui.colors.white) + self.dim_xform_art.update() + # rebuild geo, elements may be new dimensions + self.dim_art.geo_changed = True + self.dim_xform_art.geo_changed = True + self.char_art.geo_changed = True + self.fg_art.geo_changed = True + self.bg_art.geo_changed = True + + def rewrite_art(self): + bg = self.ui.colors.white + self.art.clear_frame_layer(0, 0, bg) + # if user is making window reeeeally skinny, bail + if self.tile_width < self.left_items_width: + return + # draw tool label + self.art.write_string(0, 0, self.tool_label_x, 0, self.tool_label, + self.ui.palette.darkest_index) + # only draw right side info if the window is wide enough + if self.art.width > self.left_items_width + self.right_items_width: + self.file_cycle_button.visible = True + self.layer_cycle_button.visible = True + self.frame_cycle_button.visible = True + self.zoom_set_button.visible = True + self.write_right_elements() + else: + self.file_cycle_button.visible = False + self.layer_cycle_button.visible = False + self.frame_cycle_button.visible = False + self.zoom_set_button.visible = False + + def set_active_charset(self, new_charset): + self.char_art.charset = self.fg_art.charset = self.bg_art.charset = new_charset + self.reset_art() + + def set_active_palette(self, new_palette): + self.char_art.palette = self.fg_art.palette = self.bg_art.palette = new_palette + self.reset_art() + + def get_tile_y(self): + "returns tile coordinate Y position of bar" + return int(self.ui.app.window_height / (self.ui.charset.char_height * self.ui.scale)) - 1 + + def update_button_captions(self): + "set captions for buttons that change from selections" + art = self.ui.active_art + self.xform_cycle_button.caption = uv_names[self.ui.selected_xform] + self.tool_cycle_button.caption = self.ui.selected_tool.get_button_caption() + self.tool_cycle_button.width = len(self.tool_cycle_button.caption) + 2 + # right edge elements + self.file_cycle_button.caption = os.path.basename(art.filename) if art else FileCycleButton.caption + self.file_cycle_button.width = len(self.file_cycle_button.caption) + 2 + # NOTE: button X offsets will be set in write_right_elements + null = '---' + layers = art.layers if art else 0 + layer = '%s/%s' % (art.active_layer + 1, layers) if art else null + self.layer_cycle_button.caption = layer + self.layer_cycle_button.width = len(self.layer_cycle_button.caption) + frames = art.frames if art else 0 + frame = '%s/%s' % (art.active_frame + 1, frames) if art else null + self.frame_cycle_button.caption = frame + self.frame_cycle_button.width = len(self.frame_cycle_button.caption) + # zoom % + zoom = '%.1f' % self.ui.app.camera.get_current_zoom_pct() if art else null + self.zoom_set_button.caption = zoom[:5] # maintain size + + def update(self): + if not self.ui.active_art: + return + # update buttons + UIElement.update(self) + # set color swatches + for i in range(self.swatch_width): + self.char_art.set_color_at(0, 0, i, 0, self.ui.selected_bg_color, False) + self.fg_art.set_color_at(0, 0, i, 0, self.ui.selected_fg_color, False) + self.bg_art.set_color_at(0, 0, i, 0, self.ui.selected_bg_color, False) + # set char w/ correct FG color and xform + self.char_art.set_char_index_at(0, 0, 1, 0, self.ui.selected_char) + self.char_art.set_color_at(0, 0, 1, 0, self.ui.selected_fg_color, True) + self.char_art.set_char_transform_at(0, 0, 1, 0, self.ui.selected_xform) + # position elements + self.position_swatch(self.char_renderable, self.char_swatch_x) + self.position_swatch(self.fg_renderable, self.fg_swatch_x) + self.position_swatch(self.bg_renderable, self.bg_swatch_x) + # update buttons before redrawing art (ie non-interactive bits) + self.update_button_captions() + for art in [self.char_art, self.fg_art, self.bg_art]: + art.update() + self.rewrite_art() + self.draw_buttons() + + def position_swatch(self, renderable, x_offset): + renderable.x = (self.char_art.quad_width * x_offset) - 1 + renderable.y = self.char_art.quad_height - 1 + + def reset_loc(self): + UIElement.reset_loc(self) + + def write_right_elements(self): + """ + fills in right-justified parts of status bar, eg current + frame/layer/tile labels (buttons positioned but drawn separately) + """ + dark = self.ui.colors.black + light = self.ui.colors.white + art = self.ui.active_art + padding = 2 + # position file button + x = self.tile_width - (self.file_cycle_button.width + 1) + self.file_cycle_button.x = x + x -= padding + # zoom + self.art.write_string(0, 0, x, 0, self.zoom_label, dark, light, True) + x -= len(self.zoom_label) + self.zoom_set_button.width + self.zoom_set_button.x = x + x -= padding + # tile + tile = 'X/Y' + color = light + if self.ui.app.cursor and art: + tile_x, tile_y = self.ui.app.cursor.get_tile() + tile_y = int(tile_y) + # user-facing coordinates are always base 1 + tile_x += 1 + tile_y += 1 + if tile_x <= 0 or tile_x > art.width: + color = self.dim_color + if tile_y <= 0 or tile_y > art.height: + color = self.dim_color + tile_x = str(tile_x).rjust(3) + tile_y = str(tile_y).rjust(3) + tile = '%s,%s' % (tile_x, tile_y) + self.art.write_string(0, 0, x, 0, tile, color, dark, True) + # tile label + x -= len(tile) + self.art.write_string(0, 0, x, 0, self.tile_label, dark, light, True) + # position layer button + x -= (padding + len(self.tile_label) + self.layer_cycle_button.width) + self.layer_cycle_button.x = x + # layer label + self.art.write_string(0, 0, x, 0, self.layer_label, dark, light, True) + # position frame button + x -= (padding + len(self.layer_label) + self.frame_cycle_button.width) + self.frame_cycle_button.x = x + # frame label + self.art.write_string(0, 0, x, 0, self.frame_label, dark, light, True) + + def render(self): + if not self.ui.active_art: + return + UIElement.render(self) + # draw wireframe red X /behind/ char if BG transparent + if self.ui.selected_bg_color == 0: + self.x_renderable.x = self.char_renderable.x + self.x_renderable.y = self.char_renderable.y + self.x_renderable.render() + self.char_renderable.render() + self.fg_renderable.render() + self.bg_renderable.render() + # draw red X for transparent FG or BG + if self.ui.selected_fg_color == 0: + self.x_renderable.x = self.fg_renderable.x + self.x_renderable.y = self.fg_renderable.y + self.x_renderable.render() + if self.ui.selected_bg_color == 0: + self.x_renderable.x = self.bg_renderable.x + self.x_renderable.y = self.bg_renderable.y + self.x_renderable.render() + # dim out items if brush is set to not affect them + self.dim_renderable.y = self.char_renderable.y + swatch_width = self.art.quad_width * StatusBarCycleButton.width + if not self.ui.selected_tool.affects_char: + self.dim_renderable.x = self.char_renderable.x - swatch_width + self.dim_renderable.render() + if not self.ui.selected_tool.affects_fg_color: + self.dim_renderable.x = self.fg_renderable.x - swatch_width + self.dim_renderable.render() + if not self.ui.selected_tool.affects_bg_color: + self.dim_renderable.x = self.bg_renderable.x - swatch_width + self.dim_renderable.render() + if not self.ui.selected_tool.affects_xform: + # separate dimmer renderable for xform's wider size + self.dim_xform_renderable.y = self.char_renderable.y + self.dim_xform_renderable.x = XformToggleButton.x * self.art.quad_width - 1 + self.dim_xform_renderable.render() diff --git a/ui_swatch.py b/ui_swatch.py new file mode 100644 index 0000000..1e65acb --- /dev/null +++ b/ui_swatch.py @@ -0,0 +1,408 @@ +import math, time +import numpy as np + +from ui_element import UIElement, UIArt, UIRenderable +from renderable_line import LineRenderable, SwatchSelectionBoxRenderable, UIRenderableX + +# min width for charset; if charset is tiny adjust to this +MIN_CHARSET_WIDTH = 16 + +class UISwatch(UIElement): + + def __init__(self, ui, popup): + self.ui = ui + self.popup = popup + self.reset() + + def reset(self): + self.tile_width, self.tile_height = self.get_size() + art = self.ui.active_art + # generate a unique name for debug purposes + art_name = '%s_%s' % (int(time.time()), self.__class__.__name__) + self.art = UIArt(art_name, self.ui.app, art.charset, art.palette, self.tile_width, self.tile_height) + # tear down existing renderables if any + if not self.renderables: + self.renderables = [] + else: + for r in self.renderables: + r.destroy() + self.renderables = [] + self.renderable = UIRenderable(self.ui.app, self.art) + self.renderable.ui = self.ui + self.renderable.grain_strength = 0 + self.renderables.append(self.renderable) + self.reset_art() + + def reset_art(self): + pass + + def get_size(self): + return 1, 1 + + def set_cursor_loc_from_mouse(self, cursor, mouse_x, mouse_y): + # get location within char map + w, h = self.art.quad_width, self.art.quad_height + tile_x = (mouse_x - self.x) / w + tile_y = (mouse_y - self.y) / h + self.set_cursor_loc(cursor, tile_x, tile_y) + + def set_cursor_loc(self, cursor, tile_x, tile_y): + """ + common, generalized code for both character and palette swatches: + set cursor's screen location, tile location, and quad size. + """ + w, h = self.art.quad_width, self.art.quad_height + # snap to tile (tile_x/y already set in move_cursor) + tile_x = int(tile_x) + tile_y = int(tile_y) + # back to screen coords + x = tile_x * w + self.x + y = tile_y * h + self.y + tile_index = (abs(tile_y) * self.art.width) + tile_x + # if a valid character isn't hovered, bail + if not self.is_selection_index_valid(tile_index): + self.set_cursor_selection_index(-1) + return + # cool, set cursor location & size + self.set_cursor_selection_index(tile_index) + cursor.quad_size_ref = self.art + cursor.tile_x, cursor.tile_y = tile_x, tile_y + cursor.x, cursor.y = x, y + + def is_selection_index_valid(self, index): + "returns True if given index is valid for choices this swatch offers" + return False + + def set_cursor_selection_index(self, index): + "another set_cursor_loc support method, overriden by subclasses" + self.popup.blah = index + + def render(self): + self.renderable.render() + + +class CharacterSetSwatch(UISwatch): + + # scale the character set will be drawn at + char_scale = 2 + min_scale = 1 + max_scale = 5 + scale_increment = 0.25 + + def increase_scale(self): + if self.char_scale <= self.max_scale - self.scale_increment: + self.char_scale += self.scale_increment + + def decrease_scale(self): + if self.char_scale >= self.min_scale + self.scale_increment: + self.char_scale -= self.scale_increment + + def reset(self): + UISwatch.reset(self) + self.selection_box = SwatchSelectionBoxRenderable(self.ui.app, self.art) + self.grid = CharacterGridRenderable(self.ui.app, self.art) + self.create_shade() + self.renderables = [self.renderable, self.selection_box, self.grid, + self.shade] + + def create_shade(self): + # shaded box neath chars in case selected colors make em hard to see + self.shade_art = UIArt('charset_shade', self.ui.app, + self.ui.active_art.charset, self.ui.palette, + self.tile_width, self.tile_height) + self.shade_art.clear_frame_layer(0, 0, self.ui.colors.black) + self.shade = UIRenderable(self.ui.app, self.shade_art) + self.shade.ui = self.ui + self.shade.alpha = 0.2 + + def get_size(self): + art = self.ui.active_art + return art.charset.map_width, art.charset.map_height + + def reset_art(self): + # MAYBE-TODO: using screen resolution, try to set quad size to an even + # multiple of screen so the sampling doesn't get chunky + aspect = self.ui.app.window_width / self.ui.app.window_height + charset = self.art.charset + self.art.quad_width = UIArt.quad_width * self.char_scale + self.art.quad_height = self.art.quad_width * (charset.char_height / charset.char_width) * aspect + # only need to populate characters on reset_art, but update + # colors every update() + self.art.clear_frame_layer(0, 0, 0) + i = 0 + for y in range(charset.map_height): + for x in range(charset.map_width): + self.art.set_char_index_at(0, 0, x, y, i) + i += 1 + self.art.geo_changed = True + + def reset_loc(self): + self.x = self.popup.x + self.popup.swatch_margin + self.y = self.popup.y + self.y -= self.popup.art.quad_height * (self.popup.tab_height + 4) + self.renderable.x, self.renderable.y = self.x, self.y + self.grid.x, self.grid.y = self.x, self.y + self.grid.y -= self.art.quad_height + self.shade.x, self.shade.y = self.x, self.y + + def set_xform(self, new_xform): + for y in range(self.art.height): + for x in range(self.art.width): + self.art.set_char_transform_at(0, 0, x, y, new_xform) + + def is_selection_index_valid(self, index): + return index < self.art.charset.last_index + + def set_cursor_selection_index(self, index): + self.popup.cursor_char = index + self.popup.cursor_color = -1 + + def move_cursor(self, cursor, dx, dy): + "moves cursor by specified amount in selection grid" + # determine new cursor tile X/Y + tile_x = cursor.tile_x + dx + tile_y = cursor.tile_y + dy + tile_index = (abs(tile_y) * self.art.width) + tile_x + if tile_x < 0 or tile_x >= self.art.width: + return + elif tile_y > 0: + return + elif tile_y <= -self.art.height: + # TODO: handle "jump" to palette swatch, and back + #cursor.tile_y = 0 + #self.popup.palette_swatch.move_cursor(cursor, 0, 0) + return + elif tile_index >= self.art.charset.last_index: + return + self.set_cursor_loc(cursor, tile_x, tile_y) + + def update(self): + charset = self.ui.active_art.charset + fg, bg = self.ui.selected_fg_color, self.ui.selected_bg_color + xform = self.ui.selected_xform + # repopulate colors every update + for y in range(charset.map_height): + for x in range(charset.map_width): + self.art.set_tile_at(0, 0, x, y, None, fg, bg, xform) + self.art.update() + if self.shade_art.quad_width != self.art.quad_width or self.shade_art.quad_height != self.art.quad_height: + self.shade_art.quad_width = self.art.quad_width + self.shade_art.quad_height = self.art.quad_height + self.shade_art.geo_changed = True + self.shade_art.update() + # selection box color + elapsed_time = self.ui.app.get_elapsed_time() + color = 0.75 + (math.sin(elapsed_time / 100) / 2) + self.selection_box.color = (color, color) * 2 + # set cursor color here rather than doin sin(time) again in popup update + self.popup.cursor_box.color = (color, color) * 2 + # position + self.selection_box.x = self.renderable.x + selection_x = self.ui.selected_char % charset.map_width + self.selection_box.x += selection_x * self.art.quad_width + self.selection_box.y = self.renderable.y + selection_y = (self.ui.selected_char - selection_x) / charset.map_width + self.selection_box.y -= selection_y * self.art.quad_height + + def render_bg(self): + # draw shaded box beneath swatch if selected color(s) too similar to BG + def is_hard_to_see(other_color_index): + return self.ui.palette.are_colors_similar(self.popup.bg_color, + self.art.palette, + other_color_index) + fg, bg = self.ui.selected_fg_color, self.ui.selected_bg_color + if is_hard_to_see(fg) or is_hard_to_see(bg): + self.shade.render() + + def render(self): + if not self.popup.visible: + return + self.render_bg() + UISwatch.render(self) + self.grid.render() + self.selection_box.render() + + +class PaletteSwatch(UISwatch): + + def reset(self): + UISwatch.reset(self) + self.transparent_x = UIRenderableX(self.ui.app, self.art) + self.fg_selection_box = SwatchSelectionBoxRenderable(self.ui.app, self.art) + self.bg_selection_box = SwatchSelectionBoxRenderable(self.ui.app, self.art) + # F label for FG color selection + self.f_art = ColorSelectionLabelArt(self.ui, 'F') + # make character dark + self.f_art.set_color_at(0, 0, 0, 0, self.f_art.palette.darkest_index, True) + self.f_renderable = ColorSelectionLabelRenderable(self.ui.app, self.f_art) + self.f_renderable.ui = self.ui + # B label for BG color seletion + self.b_art = ColorSelectionLabelArt(self.ui, 'B') + self.b_renderable = ColorSelectionLabelRenderable(self.ui.app, self.b_art) + self.b_renderable.ui = self.ui + self.renderables += self.transparent_x, self.fg_selection_box, self.bg_selection_box, self.f_renderable, self.b_renderable + + def get_size(self): + # balance rows/columns according to character set swatch width + charmap_width = max(self.popup.charset_swatch.art.charset.map_width, MIN_CHARSET_WIDTH) + colors = len(self.popup.charset_swatch.art.palette.colors) + rows = math.ceil(colors / charmap_width) + columns = math.ceil(colors / rows) + # !special case hack! for atari palette + if colors == 129 and columns == 15: + columns = 16 + return columns, rows + + def reset_art(self): + # base our quad size on charset's + cqw, cqh = self.popup.charset_swatch.art.quad_width, self.popup.charset_swatch.art.quad_height + # maximize item size based on row/column determined in get_size() + charmap_width = max(self.art.charset.map_width, MIN_CHARSET_WIDTH) + self.art.quad_width = (charmap_width / self.art.width) * cqw + self.art.quad_height = (charmap_width / self.art.width) * cqh + self.art.clear_frame_layer(0, 0, 0) + palette = self.ui.active_art.palette + # clear color is index 0, start after that + i = 1 + for y in range(self.tile_height): + for x in range(self.tile_width): + if i >= len(palette.colors): + break + self.art.set_color_at(0, 0, x, y, i, False) + i += 1 + self.art.geo_changed = True + + def reset_loc(self): + self.x = self.popup.x + self.popup.swatch_margin + self.y = self.popup.charset_swatch.renderable.y + # adjust Y for charset + self.y -= self.popup.charset_swatch.art.quad_height * self.ui.active_art.charset.map_height + # adjust Y for palette caption and character scale + self.y -= self.popup.art.quad_height * 2 + self.renderable.x, self.renderable.y = self.x, self.y + # color 0 is always transparent, but draw it at the end + w, h = self.get_size() + colors = len(self.art.palette.colors) + if colors % w == 0: + transparent_x_tile = w - 1 + elif h == 1: + transparent_x_tile = colors - 1 + else: + transparent_x_tile = colors % w - 1 + self.transparent_x.x = self.renderable.x + self.transparent_x.x += transparent_x_tile * self.art.quad_width + self.transparent_x.y = self.renderable.y - self.art.quad_height + self.transparent_x.y -= (h - 1) * self.art.quad_height + # set f/b_art's quad size + self.f_art.quad_width, self.f_art.quad_height = self.b_art.quad_width, self.b_art.quad_height = self.popup.art.quad_width, self.popup.art.quad_height + self.f_art.geo_changed = True + self.b_art.geo_changed = True + + def is_selection_index_valid(self, index): + return index < len(self.art.palette.colors) + + def set_cursor_selection_index(self, index): + # modulo wrap if selecting last color + self.popup.cursor_color = (index + 1) % len(self.art.palette.colors) + self.popup.cursor_char = -1 + + def move_cursor(self, cursor, dx, dy): + # similar enough to charset swatch's move_cursor, different enough to + # merit this small bit of duplicate code + pass + + def update(self): + self.art.update() + self.f_art.update() + self.b_art.update() + # color selection boxes + elapsed_time = self.ui.app.get_elapsed_time() + color = 0.75 + (math.sin(elapsed_time / 100) / 2) + self.fg_selection_box.color = (color, color) * 2 + self.bg_selection_box.color = (color, color) * 2 + # fg selection box position + self.fg_selection_box.x = self.renderable.x + # draw transparent color last (even tho it's first in color list) + fg_x = (self.ui.selected_fg_color - 1) % self.art.width + # uneven # of palette columns, handle box specially + odd_colors = len(self.art.palette.colors) % 2 == 1 + if self.ui.selected_fg_color == 0 and odd_colors: + fg_x -= 1 + self.fg_selection_box.x += fg_x * self.art.quad_width + self.fg_selection_box.y = self.renderable.y + fg_y = math.floor((self.ui.selected_fg_color - 1) / self.art.width) + fg_y %= self.art.height + self.fg_selection_box.y -= fg_y * self.art.quad_height + # bg box position + self.bg_selection_box.x = self.renderable.x + bg_x = (self.ui.selected_bg_color - 1) % self.art.width + if self.ui.selected_bg_color == 0 and odd_colors: + bg_x -= 1 + self.bg_selection_box.x += bg_x * self.art.quad_width + self.bg_selection_box.y = self.renderable.y + bg_y = math.floor((self.ui.selected_bg_color - 1) / self.art.width) + bg_y %= self.art.height + self.bg_selection_box.y -= bg_y * self.art.quad_height + # FG label position + self.f_renderable.alpha = 1 - color + self.f_renderable.x = self.fg_selection_box.x + self.f_renderable.y = self.fg_selection_box.y + # center F in box + x_offset = (self.art.quad_width - self.popup.art.quad_width) / 2 + y_offset = (self.art.quad_height - self.popup.art.quad_height) / 2 + self.f_renderable.x += x_offset + self.f_renderable.y -= y_offset + # BG label position + self.b_renderable.alpha = 1 - color + self.b_renderable.x = self.bg_selection_box.x + self.b_renderable.y = self.bg_selection_box.y + self.b_renderable.x += x_offset + self.b_renderable.y -= y_offset + + def render(self): + if not self.popup.visible: + return + UISwatch.render(self) + self.transparent_x.render() + self.fg_selection_box.render() + self.bg_selection_box.render() + self.f_renderable.render() + self.b_renderable.render() + + +class ColorSelectionLabelArt(UIArt): + def __init__(self, ui, letter): + letter_index = ui.charset.get_char_index(letter) + art_name = '%s_%s' % (int(time.time()), self.__class__.__name__) + UIArt.__init__(self, art_name, ui.app, ui.charset, ui.palette, 1, 1) + label_color = ui.colors.white + label_bg_color = 0 + self.set_tile_at(0, 0, 0, 0, letter_index, label_color, label_bg_color) + + +class ColorSelectionLabelRenderable(UIRenderable): + # transparent background so we can see the swatch color behind it + bg_alpha = 0 + + +class CharacterGridRenderable(LineRenderable): + + color = (0.5, 0.5, 0.5, 0.25) + + def build_geo(self): + w, h = self.quad_size_ref.width, self.quad_size_ref.height + v = [] + e = [] + c = self.color * 4 * w * h + index = 0 + for x in range(1, w): + v += [(x, -h+1), (x, 1)] + e += [index, index+1] + index += 2 + for y in range(h-1): + v += [(w, -y), (0, -y)] + e += [index, index+1] + index += 2 + self.vert_array = np.array(v, dtype=np.float32) + self.elem_array = np.array(e, dtype=np.uint32) + self.color_array = np.array(c, dtype=np.float32) diff --git a/ui_tool.py b/ui_tool.py new file mode 100644 index 0000000..5f84eb6 --- /dev/null +++ b/ui_tool.py @@ -0,0 +1,549 @@ +import math +import sdl2 +from PIL import Image + +from texture import Texture +from edit_command import EditCommandTile +from art import UV_NORMAL, UV_ROTATE90, UV_ROTATE180, UV_ROTATE270, UV_FLIPX, UV_FLIPY, UV_FLIP90, UV_FLIP270 +from key_shifts import SHIFT_MAP +from selection import SelectionRenderable + +class UITool: + + name = 'DEBUGTESTTOOL' + # name visible in popup's tool tab + button_caption = 'Debug Tool' + # paint continuously, ie every time mouse enters a new tile + paint_while_dragging = True + # show preview of paint result under cursor + show_preview = True + # if True, refresh paint preview immediately after Cursor.finish_paint + # set this for anything that produces a different change each paint + update_preview_after_paint = False + brush_size = 1 + # affects char/fg/bg/xform masks are relevant to how this tool works + # (false for eg Selection tool) + affects_masks = True + # filename of icon in UI_ASSET_DIR, shown on cursor + icon_filename = 'icon.png' + + def __init__(self, ui): + self.ui = ui + self.affects_char = True + self.affects_fg_color = True + self.affects_bg_color = True + self.affects_xform = True + # load icon, cursor's sprite renderable will reference this texture + icon_filename = self.ui.asset_dir + self.icon_filename + self.icon_texture = self.load_icon_texture(icon_filename) + + def load_icon_texture(self, img_filename): + img = Image.open(img_filename) + img = img.convert('RGBA') + img = img.transpose(Image.FLIP_TOP_BOTTOM) + return Texture(img.tobytes(), *img.size) + + def get_icon_texture(self): + """ + Returns icon texture that should display for tool's current state. + (override to eg choose from multiples for mod keys) + """ + return self.icon_texture + + def get_button_caption(self): + # normally just returns button_caption, but can be overridden to + # provide custom behavior (eg fill tool) + return self.button_caption + + def toggle_affects_char(self): + if not self.affects_masks or self.ui.app.game_mode: + return + self.affects_char = not self.affects_char + self.ui.tool_settings_changed = True + line = self.button_caption + ' ' + line = '%s %s' % (self.button_caption, [self.ui.affects_char_off_log, self.ui.affects_char_on_log][self.affects_char]) + self.ui.message_line.post_line(line) + + def toggle_affects_fg(self): + if not self.affects_masks or self.ui.app.game_mode: + return + self.affects_fg_color = not self.affects_fg_color + self.ui.tool_settings_changed = True + line = '%s %s' % (self.button_caption, [self.ui.affects_fg_off_log, self.ui.affects_fg_on_log][self.affects_fg_color]) + self.ui.message_line.post_line(line) + + def toggle_affects_bg(self): + if not self.affects_masks or self.ui.app.game_mode: + return + self.affects_bg_color = not self.affects_bg_color + self.ui.tool_settings_changed = True + line = '%s %s' % (self.button_caption, [self.ui.affects_bg_off_log, self.ui.affects_bg_on_log][self.affects_bg_color]) + self.ui.message_line.post_line(line) + + def toggle_affects_xform(self): + if not self.affects_masks or self.ui.app.game_mode: + return + self.affects_xform = not self.affects_xform + self.ui.tool_settings_changed = True + line = '%s %s' % (self.button_caption, [self.ui.affects_xform_off_log, self.ui.affects_xform_on_log][self.affects_xform]) + self.ui.message_line.post_line(line) + + def get_paint_commands(self): + "returns a list of EditCommandTiles for a given paint operation" + return [] + + def increase_brush_size(self): + if not self.brush_size: + return + self.brush_size += 1 + self.ui.app.cursor.set_scale(self.brush_size) + self.ui.tool_settings_changed = True + + def decrease_brush_size(self): + if not self.brush_size: + return + if self.brush_size > 1: + self.brush_size -= 1 + self.ui.app.cursor.set_scale(self.brush_size) + self.ui.tool_settings_changed = True + + +class PencilTool(UITool): + + name = 'pencil' + # "Paint" not Pencil so the A mnemonic works :/ + button_caption = 'Paint' + icon_filename = 'tool_paint.png' + + def get_tile_change(self, b_char, b_fg, b_bg, b_xform): + """ + return the tile value changes this tool would perform on a tile - + lets Pencil and Erase tools use same paint() + """ + a_char = self.ui.selected_char if self.affects_char else None + # don't paint fg color for blank characters + # (disabled, see BB issue #86) + #a_fg = self.ui.selected_fg_color if self.affects_fg_color and a_char != 0 else None + a_fg = self.ui.selected_fg_color if self.affects_fg_color else None + a_bg = self.ui.selected_bg_color if self.affects_bg_color else None + a_xform = self.ui.selected_xform if self.affects_xform else None + return a_char, a_fg, a_bg, a_xform + + def get_paint_commands(self): + commands = [] + art = self.ui.active_art + frame = art.active_frame + layer = art.active_layer + cur = self.ui.app.cursor + # handle dragging while painting (cursor does the heavy lifting here) + # !!TODO!! finish this, work in progress + if cur.moved_this_frame() and cur.current_command and False: #DEBUG + #print('%s: cursor moved' % self.ui.app.get_elapsed_time()) #DEBUG + tiles = cur.get_tiles_under_drag() + else: + tiles = cur.get_tiles_under_brush() + for tile in tiles: + # don't allow painting out of bounds + if not art.is_tile_inside(*tile): + continue + # if a selection is active, only paint inside it + if len(self.ui.select_tool.selected_tiles) > 0: + if not self.ui.select_tool.selected_tiles.get(tile, False): + continue + new_tc = EditCommandTile(art) + new_tc.set_tile(frame, layer, *tile) + b_char, b_fg, b_bg, b_xform = art.get_tile_at(frame, layer, *tile) + new_tc.set_before(b_char, b_fg, b_bg, b_xform) + a_char, a_fg, a_bg, a_xform = self.get_tile_change(b_char, b_fg, b_bg, b_xform) + new_tc.set_after(a_char, a_fg, a_bg, a_xform) + # Note: even if command has same result as another in command_tiles, + # add it anyway as it may be a tool for which subsequent edits to + # the same tile have different effects, eg rotate + if not new_tc.is_null(): + commands.append(new_tc) + return commands + + +class EraseTool(PencilTool): + + name = 'erase' + button_caption = 'Erase' + icon_filename = 'tool_erase.png' + + def get_tile_change(self, b_char, b_fg, b_bg, b_xform): + char = 0 if self.affects_char else None + fg = 0 if self.affects_fg_color else None + # erase to BG color, not transparent + bg = self.ui.selected_bg_color if self.affects_bg_color else None + xform = UV_NORMAL if self.affects_xform else None + return char, fg, bg, xform + + +class RotateTool(PencilTool): + + name = 'rotate' + button_caption = 'Rotate' + update_preview_after_paint = True + rotation_shifts = { + UV_NORMAL: UV_ROTATE90, + UV_ROTATE90: UV_ROTATE180, + UV_ROTATE180: UV_ROTATE270, + UV_ROTATE270: UV_NORMAL, + # support flipped characters! counter-intuitive results though? + UV_FLIPX: UV_FLIP270, + UV_FLIP270: UV_FLIPY, + UV_FLIPY: UV_ROTATE270, + UV_FLIP90: UV_FLIPX + } + icon_filename = 'tool_rotate.png' + + def get_tile_change(self, b_char, b_fg, b_bg, b_xform): + return b_char, b_fg, b_bg, self.rotation_shifts[b_xform] + + +class GrabTool(UITool): + + name = 'grab' + button_caption = 'Grab' + brush_size = None + show_preview = False + icon_filename = 'tool_grab.png' + + def grab(self): + x, y = self.ui.app.cursor.get_tile() + art = self.ui.active_art + if not art.is_tile_inside(x, y): + return + # in order to get the actual tile under the cursor, we must undo the + # cursor preview edits, grab, then redo them + for edit in self.ui.app.cursor.preview_edits: + edit.undo() + frame, layer = art.active_frame, art.active_layer + if self.affects_char: + self.ui.selected_char = art.get_char_index_at(frame, layer, x, y) + if self.affects_fg_color: + self.ui.selected_fg_color = art.get_fg_color_index_at(frame, layer, x, y) + if self.affects_bg_color: + self.ui.selected_bg_color = art.get_bg_color_index_at(frame, layer, x, y) + if self.affects_xform: + # tells popup etc xform has changed + self.ui.set_selected_xform(art.get_char_transform_at(frame, layer, x, y)) + for edit in self.ui.app.cursor.preview_edits: + edit.apply() + + +class TextTool(UITool): + + name = 'text' + button_caption = 'Text' + brush_size = None + show_preview = False + icon_filename = 'tool_text.png' + + def __init__(self, ui): + UITool.__init__(self, ui) + self.input_active = False + self.cursor = None + + def start_entry(self): + self.cursor = self.ui.app.cursor + # popup gobbles keyboard input, so always dismiss it if it's up + if self.ui.popup.visible: + self.ui.popup.hide() + if self.cursor.x < 0 or self.cursor.x > self.ui.active_art.width or \ + -self.cursor.y < 0 or -self.cursor.y > self.ui.active_art.height: + return + self.input_active = True + self.reset_cursor_start(self.cursor.x, -self.cursor.y) + self.cursor.start_paint() + #self.ui.message_line.post_line('Started text entry at %s, %s' % (self.start_x + 1, self.start_y + 1)) + self.ui.message_line.post_line('Started text entry, press Escape to stop entering text.', 5) + + def finish_entry(self): + self.input_active = False + self.ui.tool_settings_changed = True + if self.cursor: + x, y = int(self.cursor.x) + 1, int(-self.cursor.y) + 1 + self.cursor.finish_paint() + #self.ui.message_line.post_line('Finished text entry at %s, %s' % (x, y)) + self.ui.message_line.post_line('Finished text entry.') + + def reset_cursor_start(self, new_x, new_y): + self.start_x, self.start_y = int(new_x), int(new_y) + + def handle_keyboard_input(self, key, shift_pressed, ctrl_pressed, alt_pressed): + # for now, do nothing on ctrl/alt + if ctrl_pressed or alt_pressed: + return + # popup should get input if it's up + if self.ui.popup.visible: + return + keystr = sdl2.SDL_GetKeyName(key).decode() + art = self.ui.active_art + frame, layer = art.active_frame, art.active_layer + x, y = int(self.cursor.x), int(-self.cursor.y) + char_w, char_h = art.quad_width, art.quad_height + # TODO: if cursor isn't inside selection, bail early + if keystr == 'Return': + if self.cursor.y < art.width: + self.cursor.x = self.start_x + self.cursor.y -= 1 + elif keystr == 'Backspace': + if self.cursor.x > self.start_x: + self.cursor.x -= char_w + # undo command on previous tile + self.cursor.current_command.undo_commands_for_tile(frame, layer, x-1, y) + elif keystr == 'Space': + keystr = ' ' + elif keystr == 'Up': + if -self.cursor.y > 0: + self.cursor.y += 1 + elif keystr == 'Down': + if -self.cursor.y < art.height - 1: + self.cursor.y -= 1 + elif keystr == 'Left': + if self.cursor.x > 0: + self.cursor.x -= char_w + elif keystr == 'Right': + if self.cursor.x < art.width - 1: + self.cursor.x += char_w + elif keystr == 'Escape': + self.finish_entry() + return + # ignore any other non-character keys + if len(keystr) > 1: + return + # respect capslock + # NOTE: if user has their OS rebind capslock to something else, SDL2 + # will still track its state as a toggle. which means sometimes these + # users will try to do text entry here and be surprised to see all caps. + # if this becomes an issue, maybe offer a cfg setting to always ignore + # capslock? since it's kind of a power user thing anyway. + if keystr.isalpha() and not shift_pressed and not self.ui.app.il.capslock_on: + keystr = keystr.lower() + elif not keystr.isalpha() and shift_pressed: + keystr = SHIFT_MAP.get(keystr, ' ') + # if cursor got out of bounds, don't input + if 0 > x or x >= art.width or 0 > y or y >= art.height: + return + # create tile command + new_tc = EditCommandTile(art) + new_tc.set_tile(frame, layer, x, y) + b_char, b_fg, b_bg, b_xform = art.get_tile_at(frame, layer, x, y) + new_tc.set_before(b_char, b_fg, b_bg, b_xform) + a_char = art.charset.get_char_index(keystr) + a_fg = self.ui.selected_fg_color if self.affects_fg_color else None + a_bg = self.ui.selected_bg_color if self.affects_bg_color else None + a_xform = self.ui.selected_xform if self.affects_xform else None + new_tc.set_after(a_char, a_fg, a_bg, a_xform) + # add command, apply immediately, and move cursor + if self.cursor.current_command: + self.cursor.current_command.add_command_tiles([new_tc]) + else: + self.ui.app.log('DEV WARNING: Cursor current command was expected') + new_tc.apply() + self.cursor.x += char_w + if self.cursor.x >= self.ui.active_art.width: + self.cursor.x = self.start_x + self.cursor.y -= char_h + if -self.cursor.y >= self.ui.active_art.height: + self.finish_entry() + + +class SelectTool(UITool): + + name = 'select' + button_caption = 'Select' + brush_size = None + affects_masks = False + show_preview = False + icon_filename = 'tool_select_add.png' # used only for toolbar + icon_filename_normal = 'tool_select.png' + icon_filename_add = 'tool_select_add.png' + icon_filename_sub = 'tool_select_sub.png' + + def __init__(self, ui): + UITool.__init__(self, ui) + self.selection_in_progress = False + # dict of all tiles (x, y) that have been selected + # (dict for fast random access in SelectionRenderable.get_adjacet_tile) + self.selected_tiles, self.last_selection = {}, {} + # dict of tiles being selected in a drag that's active right now + self.current_drag, self.last_drag = {}, {} + self.drag_start_x, self.drag_start_y = -1, -1 + # create selected tiles and current drag LineRenderables + self.select_renderable = SelectionRenderable(self.ui.app, self.ui.active_art) + self.drag_renderable = SelectionRenderable(self.ui.app, self.ui.active_art) + icon = self.ui.asset_dir + self.icon_filename_normal + self.icon_texture = self.load_icon_texture(icon) + icon = self.ui.asset_dir + self.icon_filename_add + self.icon_texture_add = self.load_icon_texture(icon) + icon = self.ui.asset_dir + self.icon_filename_sub + self.icon_texture_sub = self.load_icon_texture(icon) + + def get_icon_texture(self): + # show different icons based on mod key status + if self.ui.app.il.shift_pressed: + return self.icon_texture_add + elif self.ui.app.il.ctrl_pressed: + return self.icon_texture_sub + else: + return self.icon_texture + + def start_select(self): + self.selection_in_progress = True + self.current_drag = {} + x, y = self.ui.app.cursor.x, int(-self.ui.app.cursor.y) + self.drag_start_x, self.drag_start_y = x, y + #print('started select drag at %s,%s' % (x, y)) + + def finish_select(self, add_to_selection, subtract_from_selection): + self.selection_in_progress = False + # selection boolean operations: + # shift = add, ctrl = subtract, neither = replace + if not add_to_selection and not subtract_from_selection: + self.selected_tiles = self.current_drag.copy() + elif add_to_selection: + for tile in self.current_drag: + self.selected_tiles[tile] = True + elif subtract_from_selection: + for tile in self.current_drag: + self.selected_tiles.pop(tile, None) + self.current_drag = {} + #x, y = self.ui.app.cursor.x, int(-self.ui.app.cursor.y) + #print('finished select drag at %s,%s' % (x, y)) + + def update(self): + if not self.ui.active_art: + return + # update drag based on cursor + # context: cursor has already updated, UI.update calls this + if self.selection_in_progress: + self.current_drag = {} + start_x, start_y = int(self.drag_start_x), int(self.drag_start_y) + end_x, end_y = int(self.ui.app.cursor.x), int(-self.ui.app.cursor.y) + if start_x > end_x: + start_x, end_x, = end_x, start_x + if start_y > end_y: + start_y, end_y, = end_y, start_y + # always grow to include cursor's tile + end_x += 1 + end_y += 1 + w, h = self.ui.active_art.width, self.ui.active_art.height + for y in range(start_y, end_y): + for x in range(start_x, end_x): + # never allow out-of-bounds tiles to be selected + if 0 <= x < w and 0 <= y < h: + self.current_drag[(x, y)] = True + # if selection or drag tiles have updated since last update, + # tell our renderables to update + if self.selected_tiles != self.last_selection: + self.select_renderable.rebuild_geo(self.selected_tiles) + self.select_renderable.rebind_buffers() + if self.current_drag != self.last_drag: + self.drag_renderable.rebuild_geo(self.current_drag) + self.drag_renderable.rebind_buffers() + self.last_selection = self.selected_tiles.copy() + self.last_drag = self.current_drag.copy() + + def render_selections(self): + if len(self.selected_tiles) > 0: + self.select_renderable.render() + if len(self.current_drag) > 0: + self.drag_renderable.render() + + +class PasteTool(UITool): + + name = 'paste' + button_caption = 'Paste' + brush_size = None + icon_filename = 'tool_paste.png' + + # TODO!: dragging large pastes around seems heck of slow, investigate + # why this function might be to blame and see if there's a fix! + def get_paint_commands(self): + # for each command in UI.clipboard, update edit command tile with + # set_before so we can hover/undo/redo properly + commands = [] + # similar to PencilTool's get_paint_commands, but "tiles under brush" + # isn't as straightforward here + art = self.ui.active_art + for tc in self.ui.clipboard: + # deep copy of each clipboard command + new_tc = tc.copy() + # not much depends on EditCommand.art at the moment, set it just + # to be safe + # TODO: determine whether it makes sense to remove it entirely + new_tc.art = art + frame, layer, x, y = new_tc.frame, new_tc.layer, new_tc.x, new_tc.y + frame = art.active_frame + layer = art.active_layer + # offset cursor position, center paste on cursor + x += int(self.ui.app.cursor.x) - int(self.ui.clipboard_width / 2) + y -= int(self.ui.app.cursor.y) + int(self.ui.clipboard_height / 2) + if not (0 <= x < art.width and 0 <= y < art.height): + continue + # if a selection is active, only paint inside it + if len(self.ui.select_tool.selected_tiles) > 0: + if not self.ui.select_tool.selected_tiles.get((x, y), False): + continue + b_char, b_fg, b_bg, b_xform = self.ui.active_art.get_tile_at(frame, layer, x, y) + new_tc.set_before(b_char, b_fg, b_bg, b_xform) + new_tc.set_tile(frame, layer, x, y) + # respect affects masks like other tools + a_char = new_tc.a_char if self.affects_char else b_char + a_fg = new_tc.a_fg if self.affects_fg_color else b_fg + a_bg = new_tc.a_bg if self.affects_bg_color else b_bg + a_xform = new_tc.a_xform if self.affects_xform else b_xform + new_tc.set_after(a_char, a_fg, a_bg, a_xform) + # see comment at end of PencilTool.get_paint_commands + if not new_tc.is_null(): + commands.append(new_tc) + return commands + +# "fill boundary" modes: character, fg color, bg color +FILL_BOUND_CHAR = 0 +FILL_BOUND_FG_COLOR = 1 +FILL_BOUND_BG_COLOR = 2 + +class FillTool(UITool): + + name = 'fill' + button_caption = 'Fill' + brush_size = None + icon_filename = 'tool_fill_char.png' # used only for toolbar + # icons and strings for different boundary modes + icon_filename_char = 'tool_fill_char.png' + icon_filename_fg = 'tool_fill_fg.png' + icon_filename_bg = 'tool_fill_bg.png' + boundary_mode = FILL_BOUND_CHAR + # user-facing names for the boundary modes + boundary_mode_names = { + FILL_BOUND_CHAR : 'character', + FILL_BOUND_FG_COLOR : 'fg color', + FILL_BOUND_BG_COLOR : 'bg color' + } + # determine cycling order + next_boundary_modes = { + FILL_BOUND_CHAR : FILL_BOUND_FG_COLOR, + FILL_BOUND_FG_COLOR : FILL_BOUND_BG_COLOR, + FILL_BOUND_BG_COLOR : FILL_BOUND_CHAR + } + + def __init__(self, ui): + UITool.__init__(self, ui) + icon = self.ui.asset_dir + self.icon_filename_char + self.icon_texture_char = self.load_icon_texture(icon) + icon = self.ui.asset_dir + self.icon_filename_fg + self.icon_texture_fg = self.load_icon_texture(icon) + icon = self.ui.asset_dir + self.icon_filename_bg + self.icon_texture_bg = self.load_icon_texture(icon) + + def get_icon_texture(self): + # show different icon based on boundary type + return [self.icon_texture_char, self.icon_texture_fg, + self.icon_texture_bg][self.boundary_mode] + + def get_button_caption(self): + return '%s (%s bounded)' % (self.button_caption, self.boundary_mode_names[self.boundary_mode]) diff --git a/ui_toolbar.py b/ui_toolbar.py new file mode 100644 index 0000000..e986eb6 --- /dev/null +++ b/ui_toolbar.py @@ -0,0 +1,120 @@ + +from ui_element import UIElement +from ui_button import UIButton + +from renderable_sprite import UISpriteRenderable +from renderable_line import ToolSelectionBoxRenderable + + +class ToolBar(UIElement): + + tile_width, tile_height = 4, 1 # real size will be set based on buttons + icon_scale_factor = 4 + snap_left = True + + def __init__(self, ui): + self.ui = ui + self.icon_renderables = [] + self.create_toolbar_buttons() + UIElement.__init__(self, ui) + self.selection_box = ToolSelectionBoxRenderable(ui.app, self.art) + + def reset_art(self): + # by default, a 1D vertical bar + self.tile_width = ToolBarButton.width + # dynamically set height based on # of buttons + self.tile_height = ToolBarButton.height * len(self.buttons) + self.art.resize(self.tile_width, self.tile_height) + UIElement.reset_art(self) + + def reset_loc(self): + UIElement.reset_loc(self) + # by default, a vertical bar centered along left edge of the screen + height = self.art.quad_height * len(self.buttons) * self.buttons[0].height + self.y = height / 2 + # (x is set by snap_left property in UIElement.reset_loc) + self.renderable.x, self.renderable.y = self.x, self.y + # scale and position button icons only now that we're positioned + self.reset_button_icons() + + def create_toolbar_buttons(self): + # (override in subclass) + pass + + def update_selection_box(self): + # (override in subclass) + pass + + def update(self): + UIElement.update(self) + self.update_selection_box() + + def render(self): + UIElement.render(self) + for r in self.icon_renderables: + r.render() + self.selection_box.render() + + +class ToolBarButton(UIButton): + width, height = 4, 2 + caption = '' + tooltip_on_hover = True + + def get_tooltip_text(self): + return self.cb_arg.button_caption + + def get_tooltip_location(self): + x = self.width + window_height_chars = self.element.ui.app.window_height / (self.element.ui.charset.char_height * self.element.ui.scale) + cursor_y = self.element.ui.app.mouse_y / self.element.ui.app.window_height + y = int(cursor_y * window_height_chars) + return x, y + + +class ArtToolBar(ToolBar): + + def create_toolbar_buttons(self): + for i,tool in enumerate(self.ui.tools): + button = ToolBarButton(self) + # button.caption = tool.button_caption # DEBUG + button.x = 0 + button.y = i * button.height + # alternate colors + button.normal_bg_color = self.ui.colors.white if i % 2 == 0 else self.ui.colors.lightgrey + button.hovered_bg_color = self.ui.colors.medgrey + # callback: tell ui to set this tool as selected + button.callback = self.ui.set_selected_tool + button.cb_arg = tool + self.buttons.append(button) + # create button icon + sprite = UISpriteRenderable(self.ui.app, self.ui.asset_dir + tool.icon_filename) + self.icon_renderables.append(sprite) + + def reset_button_icons(self): + button_height = self.art.quad_height * ToolBarButton.height + for i,icon in enumerate(self.icon_renderables): + # scale: same screen size as cursor icon + scale_x = icon.texture.width / self.ui.app.window_width + scale_x *= self.icon_scale_factor * self.ui.scale + icon.scale_x = scale_x + scale_y = icon.texture.height / self.ui.app.window_height + scale_y *= self.icon_scale_factor * self.ui.scale + icon.scale_y = scale_y + # position + # remember that in renderable space, (0, 0) = center of screen + icon.x = self.x + icon.x += (icon.scale_x / 8) + icon.y = self.y + icon.y -= button_height * i + icon.y -= icon.scale_y + icon.y -= (icon.scale_y / 8) + + def update_selection_box(self): + # scale and position box around currently selected tool + self.selection_box.scale_x = ToolBarButton.width + self.selection_box.scale_y = ToolBarButton.height + self.selection_box.x = self.x + self.selection_box.y = self.y + sel_index = self.ui.tools.index(self.ui.selected_tool) + self.selection_box.y -= sel_index * self.art.quad_height * ToolBarButton.height diff --git a/vector.py b/vector.py new file mode 100644 index 0000000..1179991 --- /dev/null +++ b/vector.py @@ -0,0 +1,208 @@ +import math +import numpy as np + +from OpenGL import GL, GLU + +class Vec3: + + "Basic 3D vector class. Not used very much currently." + + def __init__(self, x=0, y=0, z=0): + self.x, self.y, self.z = x, y, z + + def __str__(self): + return 'Vec3 %.4f, %.4f, %.4f' % (self.x, self.y, self.z) + + def __sub__(self, b): + "Return a new vector subtracted from given other vector." + return Vec3(self.x - b.x, self.y - b.y, self.z - b.z) + + def length(self): + "Return this vector's scalar length." + return math.sqrt(self.x ** 2 + self.y ** 2 + self.z ** 2) + + def normalize(self): + "Return a unit length version of this vector." + n = Vec3() + l = self.length() + if l != 0: + ilength = 1.0 / l + n.x = self.x * ilength + n.y = self.y * ilength + n.z = self.z * ilength + return n + + def cross(self, b): + "Return a new vector of cross product with given other vector." + x = self.y * b.z - self.z * b.y + y = self.z * b.x - self.x * b.z + z = self.x * b.y - self.y * b.x + return Vec3(x, y, z) + + def dot(self, b): + "Return scalar dot product with given other vector." + return self.x * b.x + self.y * b.y + self.z * b.z + + def inverse(self): + "Return a new vector that is inverse of this vector." + return Vec3(-self.x, -self.y, -self.z) + + def copy(self): + "Return a copy of this vector." + return Vec3(self.x, self.y, self.z) + +def get_tiles_along_line(x0, y0, x1, y1): + """ + Return list of (x,y) tuples for all tiles crossing given worldspace + line points. + from http://playtechs.blogspot.com/2007/03/raytracing-on-grid.html + NOTE: this implementation assumes square tiles! + """ + dx, dy = abs(x1 - x0), abs(y1 - y0) + x, y = math.floor(x0), math.floor(y0) + n = 1 + if dx == 0: + x_inc = 0 + error = float('inf') + elif x1 > x0: + x_inc = 1 + n += math.floor(x1) - x + error = (math.floor(x0) + 1 - x0) * dy + else: + x_inc = -1 + n += x - math.floor(x1) + error = (x0 - math.floor(x0)) * dy + if dy == 0: + y_inc = 0 + error -= float('inf') + elif y1 > y0: + y_inc = 1 + n += math.floor(y1) - y + error -= (math.floor(y0) + 1 - y0) * dx + else: + y_inc = -1 + n += y - math.floor(y1) + error -= (y0 - math.floor(y0)) * dx + tiles = [] + while n > 0: + tiles.append((x, y)) + if error > 0: + y += y_inc + error -= dx + else: + x += x_inc + error += dy + n -= 1 + return tiles + +def get_tiles_along_integer_line(x0, y0, x1, y1, cut_corners=True): + """ + simplified version of get_tiles_along_line using only integer math, + also from http://playtechs.blogspot.com/2007/03/raytracing-on-grid.html + + cut_corners=True: when a 45 degree line is only intersecting the corners + of two tiles, don't count them as overlapped. + """ + dx, dy = abs(x1 - x0), abs(y1 - y0) + x, y = x0, y0 + n = 1 + dx + dy + x_inc = 1 if x1 > x0 else -1 + y_inc = 1 if y1 > y0 else -1 + error = dx - dy + dx *= 2 + dy *= 2 + tiles = [] + while n > 0: + tiles.append((x, y)) + if error == 0 and cut_corners: + x += x_inc + y += y_inc + # count this iteration as two + n -= 1 + elif error > 0: + x += x_inc + error -= dy + else: + y += y_inc + error += dx + n -= 1 + return tiles + +def cut_xyz(x, y, z, threshold): + """ + Return input x,y,z with each axis clamped to 0 if it's close enough to + given threshold + """ + x = x if abs(x) > threshold else 0 + y = y if abs(y) > threshold else 0 + z = z if abs(z) > threshold else 0 + return x, y, z + +def ray_plane_intersection(plane_x, plane_y, plane_z, + plane_dir_x, plane_dir_y, plane_dir_z, + ray_x, ray_y, ray_z, + ray_dir_x, ray_dir_y, ray_dir_z): + # from http://stackoverflow.com/a/39424162 + plane = np.array([plane_x, plane_y, plane_z]) + plane_dir = np.array([plane_dir_x, plane_dir_y, plane_dir_z]) + ray = np.array([ray_x, ray_y, ray_z]) + ray_dir = np.array([ray_dir_x, ray_dir_y, ray_dir_z]) + ndotu = plane_dir.dot(ray_dir) + if abs(ndotu) < 0.000001: + #print ("no intersection or line is within plane") + return 0, 0, 0 + w = ray - plane + si = -plane_dir.dot(w) / ndotu + psi = w + si * ray_dir + plane + return psi[0], psi[1], psi[2] + +def screen_to_world(app, screen_x, screen_y): + """ + Return 3D (float) world space coordinates for given 2D (int) screen space + coordinates. + """ + # thanks http://www.bfilipek.com/2012/06/select-mouse-opengl.html + # get world space ray from view space mouse loc + screen_y = app.window_height - screen_y + z1, z2 = 0, 0.99999 + pjm = np.matrix(app.camera.projection_matrix, dtype=np.float64) + vm = np.matrix(app.camera.view_matrix, dtype=np.float64) + start_x, start_y, start_z = GLU.gluUnProject(screen_x, screen_y, z1, vm, pjm) + end_x, end_y, end_z = GLU.gluUnProject(screen_x, screen_y, z2, vm, pjm) + dir_x, dir_y, dir_z = end_x - start_x, end_y - start_y, end_z - start_z + # define Z of plane to test against + # TODO: what Z is appropriate for game mode picking? test multiple planes? + art = app.ui.active_art + plane_z = art.layers_z[art.active_layer] if art and not app.game_mode else 0 + x, y, z = ray_plane_intersection(0, 0, plane_z, # plane loc + 0, 0, 1, # plane dir + end_x, end_y, end_z, # ray origin + dir_x, dir_y, dir_z) # ray dir + return x, y, z + +def world_to_screen(app, world_x, world_y, world_z): + """ + Return 2D screen pixel space coordinates for given 3D (float) world space + coordinates. + """ + pjm = np.matrix(app.camera.projection_matrix, dtype=np.float64) + vm = np.matrix(app.camera.view_matrix, dtype=np.float64) + # viewport tuple order should be same as glGetFloatv(GL_VIEWPORT) + viewport = (0, 0, app.window_width, app.window_height) + try: + x, y, z = GLU.gluProject(world_x, world_y, world_z, vm, pjm, viewport) + except: + x, y, z = 0, 0, 0 + app.log('GLU.gluProject failed!') + # does Z mean anything here? + return x, y + +def world_to_screen_normalized(app, world_x, world_y, world_z): + """ + Return normalized (-1 to 1) 2D screen space coordinates for given 3D + world space coordinates. + """ + x, y = world_to_screen(app, world_x, world_y, world_z) + x = (2 * x) / app.window_width - 1 + y = (-2 * y) / app.window_height + 1 + return x, -y diff --git a/version b/version new file mode 100644 index 0000000..128edb0 --- /dev/null +++ b/version @@ -0,0 +1 @@ +9.18 diff --git a/win_copy_include b/win_copy_include new file mode 100644 index 0000000..e8f44dd --- /dev/null +++ b/win_copy_include @@ -0,0 +1,6 @@ +version +*.default +README.md +license.txt +code_of_conduct.txt +*.dll diff --git a/win_xcopy_exclude b/win_xcopy_exclude new file mode 100644 index 0000000..0041fb8 --- /dev/null +++ b/win_xcopy_exclude @@ -0,0 +1 @@ +__pycache__ diff --git a/win_xcopy_include b/win_xcopy_include new file mode 100644 index 0000000..3cce6ee --- /dev/null +++ b/win_xcopy_include @@ -0,0 +1,10 @@ +art\*.* +charsets\*.* +palettes\*.* +games\*.* +artscripts\*.arsc +formats\*.* +shaders\*.glsl +ui\*.png +docs\html\*.* +docs\html\generated\*.* diff --git a/zip_build.bat b/zip_build.bat new file mode 100644 index 0000000..481f574 --- /dev/null +++ b/zip_build.bat @@ -0,0 +1,10 @@ +@echo off +set ZIP_EXE="c:\Program Files\7-Zip\7z.exe" +REM get version number from file +set /p PLAYSCII_VERSION=