From 7bb790ad185e4406c0b6cdbeb8b5b54ed50e168d Mon Sep 17 00:00:00 2001 From: shoofle Date: Tue, 6 Jun 2023 21:00:35 -0400 Subject: [PATCH] This is the original project as designed a couple years ago. --- center_pane.lua | 120 +++++++++++++++++++++++++++ draw_logic.lua | 65 +++++++++++++++ help_functions.lua | 104 +++++++++++++++++++++++ listing_pane.lua | 201 +++++++++++++++++++++++++++++++++++++++++++++ render_pane.lua | 121 +++++++++++++++++++++++++++ update_logic.lua | 177 +++++++++++++++++++++++++++++++++++++++ vector_engine.lua | 102 +++++++++++++++++++++++ vectorator.p8 | 174 +++++++++++++++++++++++++++++++++++++++ vectorator.p8.png | Bin 0 -> 17159 bytes vram.lua | 32 ++++++++ 10 files changed, 1096 insertions(+) create mode 100755 center_pane.lua create mode 100755 draw_logic.lua create mode 100755 help_functions.lua create mode 100755 listing_pane.lua create mode 100755 render_pane.lua create mode 100755 update_logic.lua create mode 100755 vector_engine.lua create mode 100644 vectorator.p8 create mode 100644 vectorator.p8.png create mode 100755 vram.lua diff --git a/center_pane.lua b/center_pane.lua new file mode 100755 index 0000000..272b014 --- /dev/null +++ b/center_pane.lua @@ -0,0 +1,120 @@ +--center pane? + +toolkit_index = 1 + +unselected_color = 6 +selected_color = 10 +selected_secondary_color = 7 + +z_pressed = false +export_icon_up = false + +function toolkit_update() + if current_pane == 2 then + if btnp(2) and not btn(4) then + toolkit_index -= 1 + if (toolkit_index < 1) toolkit_index = 1 + elseif btnp(3) and not btn(4) then + toolkit_index += 1 + if (toolkit_index > 4) toolkit_index = 4 + end + + export_icon_up = false + if btnp(4) then + if (toolkit_index==1) then + do_export() + export_icon_up = true + end + if (toolkit_index==2) do_switch_handles() + if (toolkit_index==3) do_linked_edits() + end + if btn(4) and toolkit_index==4 then + if (btnp(2)) do_change_instruction(-1) + if (btnp(3)) do_change_instruction(1) + end + + if (not btn(4)) export_icon_up = false + end +end + + +function do_export() + local output = export_memory(m) + printh(output, '@clip') +end + +function do_switch_handles() + show_path_handles = not show_path_handles +end + +function do_linked_edits() + use_linked_editing = not use_linked_editing +end + + +function do_change_instruction(direction) + current_node = holding + if (current_node==nil) current_node = under + change_node(current_node, 1) +end + +function change_node(record, direction) + if (record==nil) return + + + idx=1 + for i, v in pairs(instructions) do + if v==record.operation[1] then + idx = i + break + end + end + + new_idx = idx + direction + if (new_idx>#instructions) new_idx = 1 + if (new_idx<1) new_idx = #instructions + m[record.address[1]][record.address[2]][1] = instructions[new_idx] +end + +tooltips = { +"export current vram to clipboard", +"show/hide node markers", +"isolate nodes while editing?", +"🅾️+⬆️/⬇️ to change node type" +} +function get_current_tooltip_text() + return tooltips[toolkit_index] +end + +function c_pane_draw() + rectfill(39, 14, 60, 116, frame_color) + + for i=1,4 do + local c=unselected_color + if i==toolkit_index then + c=selected_secondary_color + end + if i==toolkit_index and current_pane==2 then + c=selected_color + rect(40, 21*i-7, 59, 21*i+12, 7) + end + + rect(41, 21*i-6, 58, 21*i+11, c) + + spr_num = 2+2*i + + if i==1 and export_icon_up then + spr_num += 32 + end + + if i==2 and not show_path_handles then + spr_num += 32 + end + + if i==3 and not use_linked_editing then + spr_num += 32 + end + + spr(spr_num, 42, 21*i-5, 2, 2) + end +end \ No newline at end of file diff --git a/draw_logic.lua b/draw_logic.lua new file mode 100755 index 0000000..99c57bd --- /dev/null +++ b/draw_logic.lua @@ -0,0 +1,65 @@ +--draw logic + +frame_color = 5 + +function _draw() + cls() + + -- top + draw_top_ui() + + -- bottom + draw_bottom_ui() + + tab_x = 1 + if (current_pane==1) tab_x=10 + if (current_pane==2) tab_x=46 + if (current_pane==3) tab_x=86 + spr(48, tab_x, 7) + c_pane_draw() + r_pane_draw() + l_pane_draw() +end + +function draw_top_ui() + rectfill(0,0,128,14, frame_color) + + if current_pane == 2 then + color(6) + print(get_current_tooltip_text()) + else + if (holding == nil) then + color(6) + print("the empty hand is strong") + else + color(6) + print("change the world") + end + if holding ~= nil then + bank = holding.address[1] + line_no = holding.address[2] + color(10) + print(bank.."::"..line_no.." "..join(holding.operation, " ")) + elseif under ~= nil then + bank = under.address[1] + line_no = under.address[2] + color(6) + print(bank.."::"..line_no.." "..join(under.operation, " ")) + end + end + +end + +function draw_bottom_ui() + rectfill(0,116,128,128, frame_color) + + t="🅾️ to grab ❎+⬅️/➡️ for mode" + if current_pane == 2 then + t="🅾️ to use ❎+⬅️/➡️ for mode" + + elseif current_pane == 3 then + t="🅾️ to grab ❎+⬅️/➡️ for mode\n" + t=t.."❎+⬆️ to add ❎+⬇️ to delete" + end + print(t, 0, 117, 6) +end \ No newline at end of file diff --git a/help_functions.lua b/help_functions.lua new file mode 100755 index 0000000..1ef8f52 --- /dev/null +++ b/help_functions.lua @@ -0,0 +1,104 @@ +--help functions & output +function print_listing(lst) + for ins in all(lst) do + print(join(ins, " ")) + end +end + +function print_memory(mems) + for label, listing in pairs(mems) do + print("::"..label.."::") + print_listing(listing) + end +end + +function export_memory(mems) + out = "m = {}" + for label, listing in pairs(mems) do + out = out.."\n\nm[\""..label.."\"] = {\n" + for l in all(listing) do + out = out.."{" + if l[1] == "jump" then + out = out.."\""..l[1].."\", \""..l[2].."\"" + else + out = out.."\""..l[1].."\"" + if (#l > 1) out = out..", "..l[2] + if (#l > 2) out = out..", "..l[3] + end + out = out.."},\n" + end + out = out.."}" + end + + return out +end + +function join(strings, delimiter) + out = "" + first = true + for s in all(strings) do + if (not first) out = out..delimiter + first = false + out = out..tostr(s) + end + + return out +end + +function list_table(strings) + if type(strings) == "string" then + return "\""..strings.."\"" + elseif type(strings) ~= "table" then + return tostr(strings) + end + + out = "{" + first = true + for k,v in pairs(strings) do + if (not first) out = out..", " + first = false + out = out..tostr(k).."="..list_table(v) + end + + out = out.."}" + + return out +end + +function deep_eq(this, other) + if (tostr(this) ~= tostr(other)) return false + if tostr(this) == "[table]" then + if (#this ~= #other) return false + + for i, v in pairs(this) do + if (not deep_eq(v, other[i])) return false + end + end + return true +end + +function deep_copy(target) + if (type(target) ~= "table") return target + + local t = {} + for k, v in pairs(target) do + t[k] = deep_copy(v) + end + return t +end + +function get_banks(memory) + local output = {} + local main_idx = 1 + for bank, listing in pairs(memory) do + add(output,bank) + if bank=="main" then + main_idx = #output + end + end + + output[main_idx] = output[1] + output[1] = "main" + + return output +end \ No newline at end of file diff --git a/listing_pane.lua b/listing_pane.lua new file mode 100755 index 0000000..ab3264e --- /dev/null +++ b/listing_pane.lua @@ -0,0 +1,201 @@ +--listing pane + +//room for 14 lines in the listing + +selected_address = {"main", 1} + +function l_pane_update() + if current_pane == 1 then + if last_edit_pane == 3 then + handle = holding + if (handle==nil) handle=under + addr = get_address_from_handle(handle) + if (addr ~= nil) selected_address=addr + end + last_edit_pane = 1 + + if btn(4) then + dx = 0 + dy = 0 + + if (btn(0) and tx > 0) dx -= 1 + if (btn(1) and tx < 127) dx += 1 + if (btn(2) and ty > 0) dy -= 1 + if (btn(3) and ty < 127) dy += 1 + + local h = nil + for handle in all(record_list) do + if deep_eq(handle.address, selected_address) then + h = handle + end + end + if h ~= nil then + perform_edit(m, h, dx, dy, false) + end + else + if btnp(2) then + selected_address[2] -= 1 + if selected_address[2] < 1 then + selected_address[1] = get_previous_bank(selected_address[1]) + selected_address[2] = #m[selected_address[1]] + end + end + if btnp(3) then + selected_address[2] += 1 + if selected_address[2] > #m[selected_address[1]] then + selected_address[1] = get_next_bank(selected_address[1]) + selected_address[2] = 1 + end + end + end + end +end + +// this should get run when we +// switch from the render pane +// to the listing pane, to get +// a selection in the listing +// pane +function get_address_from_handle(handle) + if handle ~= nil then + return deep_copy(handle.address) + else + return nil + end +end + +function get_previous_bank(bank) + local i = #banks + for b in all(banks) do + if b == bank then + break + end + i += 1 + if i > #banks then + i = 1 + end + end + return banks[i] +end + +function get_next_bank(bank) + local i = 1 + for b in all(banks) do + i += 1 + if i > #banks then + i = 1 + end + if b == bank then + break + end + end + return banks[i] +end + +disp_start = 1 +window_size = 14 +margin = 2 +function l_pane_draw() + the_listing = make_listing() + + s_index = nil + + for idx, listing in pairs(the_listing) do + if deep_eq(listing[3], selected_address) then + s_index = idx + end + end + + // if the selected line is + // outside the bounds, then + // move the bounds. + + // if the selected line is + // less than start+margin + // then we need to move start + // up (decrease it) + while s_index < disp_start + margin do + disp_start = disp_start - 1 + end + + // if it's greater than + // start+window_size - margin + // then we need to move start + // down (increase it) + while s_index >= disp_start + window_size - margin do + disp_start = disp_start + 1 + end + + // if start + window_size is + // greater than the number of + // lines in the listing, then + // move back up (decrease) + if disp_start + window_size > #the_listing then + disp_start = #the_listing - window_size + 1 + end + + // if start is less than 1 + // then start should be 1 + if (disp_start < 1) disp_start = 1 + + for i, v in pairs(the_listing) do + if i>=disp_start and i < disp_start + window_size then + print(v[1], 0, 17+7*(i - disp_start), v[2]) + end + end +end + +function make_listing() + local output = {} + for bank in all(banks) do + contents = m[bank] + + str = ":"..bank..":" + col = 13 + addr = nil + + add(output, {str, col, addr}) + + for j,op in pairs(contents) do + str = op_pretty_print(op) + col = get_line_color(bank, j) + addr = {bank, j} + + add(output, {str, col, addr}) + end + end + + return output +end +function get_line_color(bank, idx) + if bank==selected_address[1] + and idx==selected_address[2] then + return 6 + end + return 13 +end + +function op_pretty_print(op) + opc = "n" + + if (op[1]=="return") opc="return" + if (op[1]=="jump") opc="j" + if (op[1]=="scale") opc="s" + if (op[1]=="rotate") opc="rot " + if (op[1]=="move") opc="m" + if (op[1]=="place") opc="p" + if (op[1]=="draw") opc="d" + if (op[1]=="draw_abs") opc="a" + if (op[1]=="color") opc="c" + + if #op == 2 then + opc = opc..op[2] + elseif #op == 3 then + arg1 = sub(tostr(op[2]), 1, 3) + arg2 = sub(tostr(op[3]), 1, 3) + opc = opc..arg1..","..arg2 + end + + return opc +end + diff --git a/render_pane.lua b/render_pane.lua new file mode 100755 index 0000000..09f89d7 --- /dev/null +++ b/render_pane.lua @@ -0,0 +1,121 @@ +--remder pane + +holding = nil +under = nil + +tx = 64 +ty = 64 + +function r_pane_update() + + if current_pane == 3 then + if last_edit_pane == 1 then + under = get_handle_from_address(selected_address) + if under ~= nil then + tx = under.handle.position[1] + ty = under.handle.position[2] + end + end + last_edit_pane = 3 + + dx = 0 + dy = 0 + + if (btn(0) and tx > 0) dx -= 1 + if (btn(1) and tx < 127) dx += 1 + if (btn(2) and ty > 0) dy -= 1 + if (btn(3) and ty < 127) dy += 1 + + tx += dx + ty += dy + + under = find_handle(record_list, tx, ty) + + if holding ~= nil then + perform_edit(m, holding, dx, dy, true) + end + + if not btn(4) then + holding = nil + elseif holding == nil then + holding = under + end + + end +end + +// this should get run when we +// switch from the listing pane +// to the render pane, to get +// a handle to be targeting in +// the render pane. +function get_handle_from_address(address) + if holding ~= nil and deep_eq(holding.address, address) then + return holding + elseif under ~=nil and deep_eq(under.address, address) then + return under + end + + for handle in all(record_list) do + if deep_eq(handle.address, address) then + return handle + end + end + + return nil +end + +function find_handle(record_list, x, y) + close_one = nil + dist = 8 + for h in all(record_list) do + if h.handle ~= nil then + nx = h.handle.position[1] + ny = h.handle.position[2] + + nd = abs(nx-x) + abs(ny-y) + if nd < dist then + close_one = h + dist = nd + end + end + end + return close_one +end + + +-- rendering +function r_pane_draw() + record_list = {} + + -- draw the path + vectorate(m, {pre=nil, post=add_to_record_list}) + + -- draw the path handles + if show_path_handles then + for rec in all(record_list) do + h = rec.handle + + if rec.operation[1] == "rotate" then + line(rec.state.position[1], + rec.state.position[2], + h.position[1], h.position[2], 13) + elseif rec.operation[1] == "scale" then + line(rec.state.position[1], + rec.state.position[2], + h.position[1], h.position[2], 13) + end + spr(h.sprite, h.position[1]-3, h.position[2]-3) + end + end + + if last_edit_pane == 3 then + spr(0, tx-4, ty-4) + else + for r in all(record_list) do + if deep_eq(r.address, selected_address) then + spr(0, r.handle.position[1]-4, r.handle.position[2]-4) + end + end + end +end \ No newline at end of file diff --git a/update_logic.lua b/update_logic.lua new file mode 100755 index 0000000..b7d89d6 --- /dev/null +++ b/update_logic.lua @@ -0,0 +1,177 @@ +--update logic + +function _init() + show_path_handles = true + use_linked_editing = false + + record_list = {} + + last_edit_pane = 3 + current_pane = 3 + + banks = get_banks(m) +end + +function _update() + if btn(5) then + if (btnp(0)) current_pane -= 1 + if (btnp(1)) current_pane += 1 + if (current_pane > 3) current_pane = 3 + if (current_pane < 1) current_pane = 1 + + if btnp(2) then + if holding ~= nil then + add_node(m, holding) + elseif under ~= nil and current_pane == 3 then + add_node(m, under) + end + end + + if btnp(3) then + if holding ~= nil then + remove_node(m, holding, not use_linked_editing) + elseif under ~= nil and current_pane == 3 then + remove_node(m, under, not use_linked_editing) + end + end + else + r_pane_update() + end + l_pane_update() + toolkit_update() +end + +--a function to make execution +--records +function add_to_record_list(state, operation) + local record = {} + if (#state.stack == 0) return + + record.step = #record_list + 1 + + record.address = {} + record.address[1] = state.stack[#state.stack][1] + record.address[2] = state.stack[#state.stack][2]-1 + record.operation = operation + + record.state = deep_copy(state) + + record.handle = handle_from_operation(operation, state) + + add(record_list, record) +end + +function handle_from_operation(operation, state) + local handle = {} + handle.position = {} + handle.position[1] = state.position[1] + handle.position[2] = state.position[2] + handle.sprite = 1 + + if operation[1] == "scale" then + handle.position[1] -= 8 + handle.position[2] -= 8 + + handle.sprite = 19 + elseif operation[1] == "rotate" then + dx = 10*cos(state.rotation) + dy = 10*sin(state.rotation) + handle.position[1] += dx + handle.position[2] += dy + + handle.sprite = 3 + elseif operation[1] == "place" then + handle.sprite = 2 + end + + return handle +end + +function perform_edit(m, record, dx, dy, transformed) + edit(m, record, dx, dy, transformed) + if not use_linked_editing then + next_step = record_list[record.step+1] + cur_op = record.operation[1] + next_op = next_step.operation[1] + if ((next_op == "draw" or next_op == "move") + and (cur_op == "draw" or cur_op == "move")) then + edit(m, next_step, -dx, -dy, transformed) + end + end +end + + +function edit(mem, record, cursor_x, cursor_y, transformed) + state = record.state + bank = record.address[1] + line_no = record.address[2] + + -- very important to transform + -- *back* into the space of the + -- instruction coordinates + dx = (1.0/state.scale) * ( + cursor_x*cos(-state.rotation) + - cursor_y*sin(-state.rotation)) + dy = (1.0/state.scale) * ( + cursor_x*sin(-state.rotation) + + cursor_y*cos(-state.rotation)) + + -- we need to allow for this. + if not transformed then + dx = cursor_x + dy = cursor_y + end + + if (record.operation[1] == "jump") return + if (record.operation[1] == "rotate") then + mem[bank][line_no][2] += 0.01*cursor_y + end + if (record.operation[1] == "scale") then + mem[bank][line_no][2] += 0.02*cursor_y + end + if (record.operation[1] == "return") return + if (record.operation[1] == "draw" + or record.operation[1] == "move" + or record.operation[1] == "place" + or record.operation[1] == "draw_abs") then + mem[bank][line_no][2] += dx + mem[bank][line_no][3] += dy + end +end + +function add_node(m, record) + address = record.address + + cur_op = record.operation + + next_op = m[address[1]][address[2]+1] + + if next_op[1] == "draw" then + new_op = {"draw", next_op[2]/2, next_op[3]/2} + next_op[2] = next_op[2]/2 + next_op[3] = next_op[3]/2 + add(m[address[1]], new_op, address[2]+1) + elseif next_op[1] == "return" or + next_op[1] == "jump" or + next_op[1] == "scale" or + next_op[1] == "rotate" then + new_op = {"draw", cur_op[2]/2, cur_op[3]/2} + add(m[address[1]], new_op, address[2]+1) + end +end + +function remove_node(m, record, linked_editing) + address = record.address + cur_op = record.operation + next_op = m[address[1]][address[2]+1] + + if next_op[1] == "draw" or + next_op[1] == "move" then + if linked_editing then + next_op[2] += cur_op[2] + next_op[3] += cur_op[3] + end + end + + deli(m[address[1]], address[2]) +end \ No newline at end of file diff --git a/vector_engine.lua b/vector_engine.lua new file mode 100755 index 0000000..9e22adb --- /dev/null +++ b/vector_engine.lua @@ -0,0 +1,102 @@ +--vectorator +printh("\n\n\n\n\n\n\n\n\n") + +instructions = { +"return", +"jump", +"scale", +"rotate", +"draw", +"draw_abs", +"move", +"place" +} + +function empty_state() + return { + stack={{"main", 1}}, + scale=1, + position={0,0}, + rotation=0 + } +end + +state = nil + +function vectorate(mem, callbacks) + state = empty_state() + + while true do + height = #state.stack + bank = state.stack[height][1] + index = state.stack[height][2] + + state.stack[height][2] += 1 + + instruction = mem[bank][index] + perform(state, instruction, callbacks) + + //printh(list_table(state)) + if (#state.stack == 0) break + end +end + +function perform(s, op, cb) + if cb == nil then + cb = {pre=nil, post=nil} + end + + if cb.pre ~= nil then + cb.pre(s, op) + end + + if op[1] == "return" then + s.stack[#s.stack] = nil + elseif op[1] == "jump" then + if m[op[2]] ~= nil then + add(s.stack, {op[2], 1}) + end + elseif op[1] == "scale" then + s.scale = s.scale * op[2] + elseif op[1] == "rotate" then + s.rotation += op[2] + else + x = s.scale * ( + op[2]*cos(s.rotation) + - op[3]*sin(s.rotation)) + y = s.scale * ( + op[2]*sin(s.rotation) + + op[3]*cos(s.rotation)) + + if op[1] == "move" then + s.position[1] = s.position[1] + x + s.position[2] = s.position[2] + y + end + + if op[1] == "place" then + s.position[1] = x + s.position[2] = y + end + + if op[1] == "draw" then + line(s.position[1], s.position[2], + s.position[1]+x, s.position[2]+y, + 10) + s.position[1] += x + s.position[2] += y + end + + if op[1] == "draw_abs" then + line(s.position[1], + s.position[2], + x, y, + 10) + s.position[1] = x + s.position[2] = y + end + end + + if cb.post ~= nil then + cb.post(s, op) + end +end \ No newline at end of file diff --git a/vectorator.p8 b/vectorator.p8 new file mode 100644 index 0000000..6491776 --- /dev/null +++ b/vectorator.p8 @@ -0,0 +1,174 @@ +pico-8 cartridge // http://www.pico-8.com +version 41 +__lua__ +#include help_functions.lua +#include vector_engine.lua +#include vram.lua +#include update_logic.lua +#include draw_logic.lua +#include listing_pane.lua +#include center_pane.lua +#include render_pane.lua +__gfx__ +00000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000 +07700770000000000000000000000c00111111111111111111111111111111111111199999999991111111188111111100000000000000000000000000000000 +0780087000099000000660000ccc0c00111111188111111111111111111111111111191111111191111111888811111100000000000000000000000000000000 +00000000009009000060060000077c00111111811811111111111118111111111111111118881191111111111111111100000000000000000000000000000000 +00000000009009000060060000c77000111118111181111111118118111111a1111199111818119111119911bb11111100000000000000000000000000000000 +07800870000990000006600000c0ccc01111888118881111111118111111aa1111191a918888819111191191b111111100000000000000000000000000000000 +07700770000000000000000000c0000011111181181111111111111991aa11111119a191888881911119119111b1111100000000000000000000000000000000 +00000000000000000000000000000000199991811819999111188191a91111111111991a88888191111199111111b11100000000000000000000000000000000 +0000000000000000000000000000000019111181181111911111119a19188111111a1111a1111191116611cc1c1bb11100000000000000000000000000000000 +0000000000000000000000000bbb000019111181181111911111111991111111111a111119911191161161177c11111100000000000000000000000000000000 +0000000000000000000000000bb000001911118118111191111111a11181111111a1111191a91991161161c77111111100000000000000000000000000000000 +0000000000000000000000000b0b00001911111111111191111111a18118111111a111119a191111116611c1cc11111100000000000000000000000000000000 +0000000000000000000000000000b0b0191111111111119111111a11811111111a111111a9911111111111111111111100000000000000000000000000000000 +00000000000000000000000000000bb0191111111111119111111a11111111111a11111a11111111111111888811111100000000000000000000000000000000 +0000000000000000000000000000bbb019999999999999911111a11111111111111111a111111111111111188111111100000000000000000000000000000000 +00000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000 +00000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000 +00000000000000000000000000000000111111188111111111111111111111111111991111111111000000000000000000000000000000000000000000000000 +00000000000000000000000000000000111111811811111111111111111111111111911111111111000000000000000000000000000000000000000000000000 +00000000000000000000000000000000111118111181111111111118111111111111111111111111000000000000000000000000000000000000000000000000 +00000000000000000000000000000000111188811888111111118118111111a11111991111111111000000000000000000000000000000000000000000000000 +000000000000000000000000000000001111118118111111111118111111aa1111191a9111111111000000000000000000000000000000000000000000000000 +0000000000000000000000000000000011111181181111111111111111aa11111119a19111111111000000000000000000000000000000000000000000000000 +00000000000000000000000000000000199991811819999111188111aa1111111111991a11111111000000000000000000000000000000000000000000000000 +0000000000000000000000000000000019111181181111911111111a11188111111a1111a1111111000000000000000000000000000000000000000000000000 +0000000000000000000000000000000019111181181111911111111a11111111111a111119911191000000000000000000000000000000000000000000000000 +000000000000000000000000000000001911111111111191111111a11181111111a1111191a91991000000000000000000000000000000000000000000000000 +000000000000000000000000000000001911111111111191111111a18118111111a111119a191111000000000000000000000000000000000000000000000000 +07777770000000000000000000000000191111111111119111111a11811111111a111111a9911111000000000000000000000000000000000000000000000000 +07888870000000000000000000000000191111111111119111111a11111111111a11111a11111111000000000000000000000000000000000000000000000000 +0078870000000000000000000000000019999999999999911111a11111111111111111a111111111000000000000000000000000000000000000000000000000 +00077000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000 +__label__ +66656565666555556665666566656665656555556565666566556655555566655665555556656665666556656655566555555555555555555555555555555555 +56556565655555556555666565655655656555556565656565656565555556556555555565555655656565656565655555555555555555555555555555555555 +56556665665555556655656566655655666555556665666565656565555556556665555566655655665565656565655555555555555555555555555555555555 +56556565655555556555656565555655556555556565656565656565555556555565555555655655656565656565656555555555555555555555555555555555 +56556565666555556665656565555655666555556565656565656665555566656655555566555655656566556565666555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555577777755555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555578888755555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555557887555555555555555555555555555555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555775555555555555555555555555555555555555 +00000000000000000000000000000000000000055777777777777777777550000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000055711111111111111117550000000000000000000000000000000000000000000000000000000000000000000 +0000ddd0ddd0ddd0dd00000000000000000000055711111111111111117550000000000000000000000000000000000000000000000000000000000000000000 +0d00ddd0d0d00d00d0d00d000000000000000005571111111881111111755000000000000bbb0000000000000000000000000000000000000000000000000000 +0000d0d0ddd00d00d0d000000000000000000005571111118118111111755000000000000bb00000000000000000000000000000000000000000000000000000 +0d00d0d0d0d00d00d0d00d000000000000000005571111181111811111755000000000000b0b0000000000000000000000000000000000000000000000000000 +0000d0d0d0d0ddd0d0d000000000000000000005571111888118881111755000000000000000b0b0000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000055711111181181111117550000000000000000bb0000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000005571999918118199991755000000000000000bbb0000000000000000000000000000000000000000000000000 +6660666066600000666066600000000000000005571911118118111191755000000000000000000d000000000000000000000000000000000000000000000000 +60606060006000000060606000000000000000055719111181181111917550000000000000000000d00000000000000000000000000000000000000000000000 +666066600660000066606660000000000000000557191111811811119175500000000000000000000d0000000000000000000000000000000000000000000000 +6000606000600600600060600000000000000005571911111111111191755000000000000000000000d660000000000000000000000000000000000000000000 +60006660666060006660666000000000000000055719111111111111917550000000000000000000006da6000000000000000000000000000000000000000000 +00000000000000000000000000000000000000055719111111111111917550000000000000000000006006aaa000000000000000000000000000000000000000 +00000000000000000000000000000000000000055719999999999999917550000000000000000000000660000aaa000000000000000000000000000000000000 +0dd0dd000000d000ddd0d0d0ddd00000000000055711111111111111117550000000000000000000000000000000aaa000000000000000000000000000000000 +d0000d000000d000d0d0d0d0d0d00000000000055777777777777777777550000000000000000000000000000000000aaaa09900000000000000000000000000 +ddd00d000000ddd0ddd0ddd0ddd0000000000005555555555555555555555000000000000000000000000000000000000009a090000000000000000000000000 +00d00d000000d0d0d0d000d0d0d0000000000005555555555555555555555000000000000000000000000000000000000009a090000000000000000000000000 +dd00ddd00d00ddd0ddd000d0ddd000000000000555555555555555555555500000000000000000000000000000000000000a9900000000000000000000000000 +000000000000000000000000000000000000000556666666666666666665500000000000000000000000000000000000000a0000000000000000000000000000 +00000000000000000000000000000000000000055611111111111111116550000000000000000000000000000000000000a00000000000000000000000000000 +dd00dd00ddd000000000ddd000000000000000055611111111111111116550000000000000000000000000000000000000a00000000000000000000000000000 +d0d00d00d0d00000000000d000000000000000055611111111111111116550000000000000000000000000000000000000a00000000000000000000000000000 +d0d00d00d0d0000000000dd00000000000000005561111111811111111655000000000000000000000000000000000000a000000000000000000000000000000 +d0d00d00d0d000000d0000d000000000000000055611118118111111a1655000000000000000000000000000000000000a000000000000000000000000000000 +ddd0ddd0ddd00d00d000ddd0000000000000000556111118111111aa11655000000000000000000000000000000000000a000000000000000000000000000000 +0000000000000000000000000000000000000005561111111991aa111165500000000000000000000000000000000000a0000000000000000000000000000000 +00000000000000000000000000000000000000055611188191a9111111655000000000000000000000bbb00000000000a0000000000000000000000000000000 +dd000000ddd00000dd00ddd00000000000000005561111119a19188111655000000000000000000000bb00000000000a00000000000000000000000000000000 +d0d00000d00000000d0000d00000000000000005561111111991111111655000000000000000000000b0b0000000000a00000000000000000000000000000000 +d0d0ddd0ddd000000d000dd0000000000000000556111111a111811111655000000000000000000000000b0b0000000a00000000000000000000000000000000 +d0d0000000d00d000d0000d0000000000000000556111111a1811811116550000000000000000000000000bb000000a000000000000000000000000000000000 +ddd00000ddd0d000ddd0ddd000000000000000055611111a1181111111655000000000000000000000000bbb000000a000000000000000000000000000000000 +00000000000000000000000000000000000000055611111a1111111111655000000000000000000000000000d00000a000000000000000000000000000000000 +0000000000000000000000000000000000000005561111a1111111111165500000000000c0000000000000000d000a0000000000000000000000000000000000 +0dd0ddd00000ddd0ddd0000000000000000000055611111111111111116550000000ccc0c00000000000000000d00a0000000000000000000000000000000000 +d000d0d0000000d0d0000000000000000000000556666666666666666665500000000077c000000000000000000d990000000000000000000000000000000000 +ddd0d0d0000000d0ddd00000000000000000000555555555555555555555500000000c7700000000000000000009d09000000000000000000000000000000000 +00d0d0d0000000d000d00000000000000000000555555555555555555555500000000c0ccc000000000000000aa9009000000000000000000000000000000000 +dd00ddd00d0000d0ddd00000000000000000000555555555555555555555500000000c0d000000000000000aa000990000000000000000000000000000000000 +00000000000000000000000000000000000000055666666666666666666550000000000d000000000000aaa00000000000000000000000000000000000000000 +000000000000000000000000000000000000000556111111111111111165500000000000d000000000aa00000000000000000000000000000000000000000000 +dd000000dd00ddd00000d000000000000000000556111199111111111165500000000000d000000aaa0000000000000000000000000000000000000000000000 +d0d000000d00d0000000d000000000000000000556111191111111111165500000000000d0000aa0000000000000000000000000000000000000000000000000 +d0d0ddd00d00ddd00000ddd00000000000000005561111111111111111655000000000000d9aa000000000000000000000000000000000000000000000000000 +d0d000000d0000d00d00d0d00000000000000005561111991111111111655000000000009da90000000000000000000000000000000000000000000000000000 +ddd00000ddd0ddd0d000ddd000000000000000055611191a9111111111655000000000009a090000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000005561119a1911111111165500000000000a9900000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000005561111991a1111111165500000000000a0000000000000000000000000000000000000000000000000000000 +ddd0ddd0ddd0dd000dd0d0d0000000000000000556111a1111a111111165500000000000a0000000000000000000000000000000000000000000000000000000 +0d00d000d0d0d0d0d000d0d0000000000000000556111a11111991119165500000000000a0000000000000000000000000000000000000000000000000000000 +0d00dd00ddd0d0d0d000ddd000000000000000055611a1111191a919916550000000000a00000000000000000000000000000000000000000000000000000000 +0d00d000d0d0d0d0d00000d000000000000000055611a111119a1911116550000000000a00000000000000000000000000000000000000000000000000000000 +dd00d000d0d0d0d00dd0ddd00000000000000005561a111111a99111116550000000000a00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000005561a11111a111111116550000000000a00000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000556111111a111111111655000000000a000000000000000000077007700000000000000000000000000000000 +ddd0ddd0ddd0dd000dd0d0d00000000000000005561111111111111111655000000000a000000000000000000078008700000000000000000000000000000000 +0d00d000d0d0d0d0d000d0d00000000000000005566666666666666666655000000000a000000000000000000000000000000000000000000000000000000000 +0d00dd00ddd0d0d0d000ddd0000000000000000555555555555555555555500000000a0000000000000000000000000000000000000000000000000000000000 +0d00d000d0d0d0d0d00000d0000000000000000555555555555555555555500000000a0000000000000000000078008700000000000000000000000000000000 +dd00d000d0d0d0d00dd0ddd0000000000000000555555555555555555555500000000a0000000000000000000077007700000000000000000000000000000000 +000000000000000000000000000000000000000556666666666666666665500000000a0000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000055611111111111111116550000000a00000000000000000000000000000000000000000000000000000000000 +ddd0ddd0ddd0d0d0ddd0dd0000000000000000055611111118811111116550000000a00000000000000000000000000000000000000000000000000000000000 +d0d0d0000d00d0d0d0d0d0d000000000000000055611111188881111116550000000a00000000000000000000000000000000000000000000000099000000000 +dd00dd000d00d0d0dd00d0d000000000000000055611111111111111116550000000a000000000000000000000000000000000000000000000009a0900000000 +d0d0d0000d00d0d0d0d0d0d000000000000000055611119911bb1111116550000009900000000000000000000000000000000000000000000000900900000000 +d0d0ddd00d000dd0d0d0d0d000000000000000055611191191b1111111655000009a090000000000000000000000000000000000000000000000a99000000000 +0000000000000000000000000000000000000005561119119111b111116550000090a9000000000000000000000000000000000000000000000a000000000000 +000000000000000000000000000000000000000556111199111111b11165500000099a00000000000000000000000000000000000000000000a0000000000000 +0000ddd0ddd0dd000dd0d0d0000000000000000556116611cc1c1bb11165500000000a00000000000000000000000000000000000000000000a0000000000000 +0d00d000d0d0d0d0d000d0d00d0000000000000556161161177c111111655000000000a000000000000000000000000000000000000000000a00000000000000 +0000dd00ddd0d0d0d000ddd0000000000000000556161161c7711111116550000000000a0000000000000000000000000000000000000000a000000000000000 +0d00d000d0d0d0d0d00000d00d0000000000000556116611c1cc11111165500000000000a000000000000000000000000000000000000000a000000000000000 +0000d000d0d0d0d00dd0ddd0000000000000000556111111111111111165500000000000a00000000000000000000000000000000000000a0000000000000000 +0000000000000000000000000000000000000005561111118888111111655000000000000a000000000000000000000000000000000000a00000000000000000 +00000000000000000000000000000000000000055611111118811111116550000000000000a0000000000000000000000000000000000a000000000000000000 +ddd00dd0ddd00000ddd00000ddd000000000000556111111111111111165500000000000000a000000000000000000000000000000000a000000000000000000 +d0d0d0d00d000000d0d0000000d0000000000005566666666666666666655000000000000000a0000000000000000000000000000000a0000000000000000000 +dd00d0d00d000000d0d000000dd0000000000005555555555555555555555000000000000000a000000000000000000000000000000a00000000000000000000 +d0d0d0d00d000000d0d0000000d00000000000055555555555555555555550000000000000000a00000000000000000000000000000a00000000000000000000 +d0d0dd000d000000ddd00d00ddd000000000000555555555555555555555500000000000000000a000000000000000000000000000a000000000000000000000 +0000000000000000000000000000000000000005555555555555555555555000000000000000000a0000000000000000000000000a0000000000000000000000 +0000000000000000000000000000000000000005555555555555555555555000000000000000000a000000000000000000000000990000000000000000000000 +dd000000dd00ddd000000000ddd00000000000055555555555555555555550000000000000000000a990000000000aaaaaaaaaa9a09000000000000000000000 +d0d000000d00d00000000000d0d000000000000555555555555555555555500000000000000000009da9aaaaaaaaa00000000009009000000000000000000000 +d0d0ddd00d00ddd00000ddd0ddd00000000000055555555555555555555550000000000000000000d00900000000000000000000990000000000000000000000 +d0d000000d0000d00d00000000d000000000000555555555555555555555500000000000000000dd099000000000000000000000000000000000000000000000 +ddd00000ddd0ddd0d000000000d00d00000000055555555555555555555550000000000000000d00000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000555555555555555555555500000000000000cd000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000055555555555555555555550000000000cccdc0000000000000000000000000000000000000000000000000000 +dd000000dd00ddd00000d0000000ddd00000000555555555555555555555500000000000077c0000000000000000000000000000000000000000000000000000 +d0d000000d0000d00000d0000000d0d00000000555555555555555555555500000000000c7700000000000000000000000000000000000000000000000000000 +d0d0ddd00d0000d00000ddd00000d0d00000000555555555555555555555500000000000c0ccc000000000000000000000000000000000000000000000000000 +d0d000000d0000d00d00d0d00000d0d00000000555555555555555555555500000000000c0000000000000000000000000000000000000000000000000000000 +ddd00000ddd000d0d000ddd00d00ddd0000000055555555555555555555550000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000055555555555555555555550000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000055555555555555555555550000000000000000000000000000000000000000000000000000000000000000000 +ddd0ddd0ddd0d0d0ddd0dd0000000000000000055555555555555555555550000000000000000000000000000000000000000000000000000000000000000000 +d5d5d5555d55d5d5d5d5d5d555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 +dd66dd555d55d6d5dd65d5d556656665666566655555555555555666665555555666665555655666665555556665566566655555666556656655666555555555 +d6d5d6655d55d6d5d5d5d5d565556565656565655555555555556656566556556665566556556655666555556555656565655555666565656565655555555555 +d6d6ddd55d555dd5d5d5d5d565556655666566555555555555556665666566656655566556556655566555556655656566555555656565656565665555555555 +66555665555556556565555565656565656565655555555555556656566556556665566556556655666555556555656565655555656565656565655555555555 +56666655555556556655555566656565656566655555555555555666665555555666665565555666665555556555665565655555656566556665666555555555 +55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 +56666655555556666655555566655665555566656655665555555666665555555666665555556665566555556655666565556665666566655555555555555555 +66565665565566656665555556556565555565656565656555556656566556556655566555555655656555556565655565556555565565555555555555555555 +66656665666566555665555556556565555566656565656555556665666566656655566555555655656555556565665565556655565566555555555555555555 +66565665565566555665555556556565555565656565656555556656566556556665666555555655656555556565655565556555565565555555555555555555 +56666655555556666655555556556655555565656665666555555666665555555666665555555655665555556665666566656665565566655555555555555555 + diff --git a/vectorator.p8.png b/vectorator.p8.png new file mode 100644 index 0000000000000000000000000000000000000000..315cd0b717dd0525f7b5dfc0ced36b47fec5d201 GIT binary patch literal 17159 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 literal 0 HcmV?d00001 diff --git a/vram.lua b/vram.lua new file mode 100755 index 0000000..84efd08 --- /dev/null +++ b/vram.lua @@ -0,0 +1,32 @@ +--vram +m = {} + +m = {} + +m["main"] = { +{"place", 83, 28}, +{"scale", 1.6848}, +{"draw", 10.5, 3}, +{"draw", -3.8129, 8.8452}, +{"scale", 1.2497}, +{"draw", -10.7256, 0.3008}, +{"jump", "fancy"}, +{"jump", "fancy"}, +{"return"}, +} + +m["fancy"] = { +{"rotate", 0.32}, +{"draw", -5.9592, -7.2068}, +{"draw", -7.5694, -2.1986}, +{"draw", 3.4559, 2.4058}, +{"draw", 0.9285, 3.3168}, +{"draw", -1.5299, 3.2654}, +{"draw", -4.6618, 0.9604}, +{"draw", -3.7027, -3.3118}, +{"draw", 0.147, -2.3546}, +{"draw", 2.0169, -4.0995}, +{"draw", -4.5193, -0.6135}, +{"draw", -4.2146, 3.2033}, +{"return"}, +}