picotron cartridge // www.picotron.net version 2 :: gfx/ :: map/ :: sfx/ :: drawing_stuff.lua --[[pod_format="raw",created="2024-07-30 00:32:19",modified="2024-07-30 20:17:30",revision=366]] include "matrix_math.lua" palette_greens = {5, 3, 27, 11, 26} palette_greens_flip = {5, 3, 27, 11, 26, 11, 27, 3} function spr_point(sprite, x) local p = uncamera(x) draw_scaled_sprite(sprite, p[1], p[2], p[3]) if debug then print("z is " .. x[3],p[1], p[2]+8, 8) print("s is " .. p[3],p[1], p[2], 8) end end function spr_skewed(s, x, y, z, sx, sy) local result = skew(x,y,z, sx, sy) spr3d(s, result[1], result[2], result[3]) end function draw_scaled_sprite(sprite, x, y, scale) sspr(sprite, 0,0, 16,16, x-8*scale, y-8*scale, 16*scale, 16*scale) end function draw_percent_of_a_line(x1, y1, x2, y2, percent) local start_x = (x2-x1)*percent + x1 local start_y = (y2-y1)*percent + y1 local end_x = (x1-x2)*percent + x2 local end_y = (y1-y2)*percent + y2 line(start_x, start_y, end_x, end_y) end function draw_shorter_line(x1, y1, x2, y2, beginning_cut, end_cut) local length = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) if beginning_cut + end_cut > length then return end local start_x = x1 + (x2-x1)*beginning_cut/length local start_y = y1 + (y2-y1)*beginning_cut/length local end_x = x2 + (x1-x2)*end_cut/length local end_y = y2 + (y1-y2)*end_cut/length line(start_x, start_y, end_x, end_y) end :: gfx/0.gfx b64$LS1bW3BvZCxjcmVhdGVkPSIyMDI0LTA3LTMwIDAwOjI4OjU2Iixtb2RpZmllZD0iMjAyNC0w Ny0zMCAyMDoxNzozMCIscmV2aXNpb249Mjk0XV1sejQAQwEAABsyAADzFHtbMF09e2JtcD1weHUA QyAQEATw8CxmbGFncz0wLHBhbl94CADLeT0wLHpvb209OH0sMQD5BBo3wCdgNwA3UHcAB0AXMBdg F1ACAK9gFzAXgFegN-AXWgAcECA-AI8nMCdgd4BXgFkACJ_Qd3B3oBfQF2C6AB2RBBfAR6BHsBfQ AgDxAgAnkGeAJxAXgBcQJ4AXEBeQCACPIBeAFyAn8ARcAB1-AhcgFyAXMAYAC5Q3ABcAN0CXcFeE AE-QF-AHagAdawOXUJdQFwIAz5dQl5AX0BewV5BXsFYAIkAFV4B3cQFyQBdwFyAXkBABRRcwFzAG AAIUAFAgF3AXQI0BX3eAV-AFZgAdH-AxAP------------------------------------------ --------------------sFBtPTh9fQ== :: gfx/.info.pod b64$LS1bW3BvZCxjcmVhdGVkPSIyMDI0LTA3LTMwIDAwOjI4OjU1IixzdG9yZWQ9IjIwMjQtMDct MzAgMDA6Mjg6NTUiXV1sejQABAAAAAMAAAAwbmls :: main.lua --[[pod_format="raw",created="2024-07-30 00:28:56",modified="2024-07-30 20:17:30",revision=528]] include "drawing_stuff.lua" include "matrix_math.lua" debug = false symbols = {} for i=0,8 do add(symbols, {1+(i % 5), {rnd(400)-200, rnd(200)-100, rnd(50)-25}, {0,0,0}}) end for a=-1,1,2 do for b=-1,1,2 do for c=-1,1,2 do add(symbols, {1, {a*20, b*20, c*20}, {0,0,0}}) end end end links = {} for i=0,8 do add(links, {flr(rnd(#symbols))+1, flr(rnd(#symbols-1))+1}) end circles = {} function _draw() cls() for c in all(circles) do circfill(c[2], c[3], c[1], c[4]) end color() local skew_orientation = -0.1*t() local skew_amount = 0.05+0.025*(sin(0.3*t())+1) for thing in all(symbols) do local sprite = thing[1] local rotated = thing[2] rotated = transform(rot_z(-skew_orientation), rotated) rotated = transform(rot_y(skew_amount), rotated) rotated = transform(rot_z(skew_orientation), rotated) local ssc = uncamera(rotated) thing[3] = ssc spr_point(sprite, rotated) circ(ssc[1], ssc[2], ssc[3]*12, 12) end for link in all(links) do local startpoint = symbols[link[1]][3] local endpoint = symbols[link[2]][3] draw_shorter_line( startpoint[1], startpoint[2], endpoint[1], endpoint[2], startpoint[3]*12, endpoint[3]*12) end --print("time is " .. time_since_last_symbol, 40, 40, 7) end last_t = t() time_since_last_symbol = 0 delta = 0 function _update() local new_circles = {} for c in all(circles) do if c[1] > 0 then add(new_circles, c) end end circles = new_circles local x = cos(0.1*t())*200 + rnd(100)-50 + 240 local y = sin(0.1*t())*100 + rnd(100)-50 + 135 add(circles, { 10+rnd(2), -- size x,y, palette_greens_flip[flr((t()%3/3)*#palette_greens_flip)+1]--color }) for c in all(circles) do c[1] = c[1] - 0.05 end delta = t() - last_t last_t = t() time_since_last_symbol += delta if time_since_last_symbol > 3 then time_since_last_symbol = 0 deli(symbols, 1) local new_links = {} for link in all(links) do if link[1] != 1 and link[2] != 1 then add(new_links, {link[1]-1, link[2]-1}) end end links = new_links add(symbols, {flr(rnd(5))+1, {rnd(440)-220, rnd(200)-100, rnd(50)-25}, {0,0,0}}) --links = {} for i=0,8 do --add(links, {flr(rnd(#symbols))+1, flr(rnd(#symbols-1))+1}) end add(links, {flr(rnd(#symbols))+1, #symbols}) add(links, {flr(rnd(#symbols))+1, #symbols}) end end :: map/0.map b64$LS1bW3BvZCxjcmVhdGVkPSIyMDI0LTA3LTMwIDAwOjI4OjU2Iixtb2RpZmllZD0iMjAyNC0w Ny0zMCAyMDoxNzozMCIscmV2aXNpb249MjgwXV1sejQAaAAAAFgQAADwCHt7Ym1wPXVzZXJkYXRh KCJpMTYiLDMyAwAvIjABAP--------------------vxCCIpLGhpZGRlbj1mYWxzZSxwYW5feD0w CADSeT0wLHRpbGVfaD0xNgoAEHcKAIB6b29tPTF9fQ== :: map/.info.pod b64$LS1bW3BvZCxjcmVhdGVkPSIyMDI0LTA3LTMwIDAwOjI4OjU1IixzdG9yZWQ9IjIwMjQtMDct MzAgMDA6Mjg6NTUiXV1sejQABAAAAAMAAAAwbmls :: matrix_math.lua --[[pod_format="raw",created="2024-07-30 00:58:28",modified="2024-07-30 20:17:30",revision=350]] function skew(x, y, z, strength_x, strength_y) local dot = x*strength_x + y*strength_y return {x + strength_x*(z+10), y+strength_y*(z+10), z-(dot/600)} end function p(x,y,z) return {x, y, z} end -- this camera trransform will put our camera looking ttowards -z, i think -- looking from 200 unitsts away on the z axis function uncamera(x) if x[3]+25 == 0 then return {30, 30, 1} end x = translate(x, p(0,0,200)) return { (150*x[1]/x[3]) + 240, (150*x[2]/x[3]) + 135, 150/x[3]} end function transform(m, x) return { x[1]*m[1][1] + x[2]*m[2][1] + x[3]*m[3][1], x[1]*m[1][2] + x[2]*m[2][2] + x[3]*m[3][2], x[1]*m[1][3] + x[2]*m[2][3] + x[3]*m[3][3] } end function translate(a, b) return {a[1]+b[1], a[2]+b[2], a[3]+b[3]} end function transpose(m) return { {m[1][1], m[2][1], m[3][1]}, {m[1][2], m[2][2], m[3][2]}, {m[1][3], m[2][3], m[3][3]} } end function rot_x(angle) return { {1, 0, 0}, {0, cos(angle), -sin(angle)}, {0, sin(angle), cos(angle)} } end function rot_y(angle) return { {cos(angle), 0, sin(angle)}, {0, 1, 0}, {-sin(angle), 0, cos(angle)} } end function rot_z(angle) return { {cos(angle), -sin(angle), 0}, {sin(angle), cos(angle), 0}, {0, 0, 1} } end :: sfx/0.sfx b64$LS1bW3BvZCxjcmVhdGVkPSIyMDI0LTA3LTMwIDAwOjI4OjU2Iixtb2RpZmllZD0iMjAyNC0w Ny0zMCAyMDoxNzozMCIscmV2aXNpb249Mjc3XV1sejQAEQEAAMEIAADwJ3B4dQADKAAAAwAED0AQ Ag4AAaABIAKgDgAPEAAN8MoBAgMEBQYHAA--kAgJCgsPDA8NDw4PDxAA8AANDxEPEg8TDxQPFQ8W DxcTAPEBDxgPGQ8aDxsPHA8dDx4PHxQA8QAgDyEPIg8jDyQPJQ8mDycUAPEAKA8pDyoPKw8sDy0P Lg8vFADxADAPMQ8yDzMPNA81DzYPNxQA-wU4DzkPOg87DzwPPQ8_Dz8AD--w-wEA6-8nWgEQBg8g EAEgASAB8AACEAIMEAEgDyEgATAPQPDDDygP--DGD-gKD-8PgA-3Dw0B8AkBEAYMMAD--7of-wEA zL-oD0AADUD--7DwcAoA--9kH-8BAJdQ-----x8= :: sfx/.info.pod b64$LS1bW3BvZCxjcmVhdGVkPSIyMDI0LTA3LTMwIDAwOjI4OjU1IixzdG9yZWQ9IjIwMjQtMDct MzAgMDA6Mjg6NTUiXV1sejQABAAAAAMAAAAwbmls :: .info.pod b64$LS1bW3BvZCxydW50aW1lPTUsc3RvcmVkPSIyMDI0LTA3LTMwIDIwOjE3OjMwIix3b3Jrc3Bh Y2VzPXt7bG9jYXRpb249Im1haW4ubHVhIzMxIix3b3Jrc3BhY2VfaW5kZXg9MX0se2xvY2F0aW9u PSJkcmF3aW5nX3N0dWZmLmx1YSM0Iix3b3Jrc3BhY2VfaW5kZXg9MX0se2xvY2F0aW9uPSJtYXRy aXhfbWF0aC5sdWEjMTEiLHdvcmtzcGFjZV9pbmRleD0xfSx7bG9jYXRpb249ImdmeC8wLmdmeCIs d29ya3NwYWNlX2luZGV4PTJ9LHtsb2NhdGlvbj0ibWFwLzAubWFwIix3b3Jrc3BhY2VfaW5kZXg9 M30se2xvY2F0aW9uPSJzZngvMC5zZngiLHdvcmtzcGFjZV9pbmRleD00fX1dXWx6NAAEAAAAAwAA ADBuaWw= :: [eoc]