my picotron drive, to be shared across my devices
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
picotron/demo01.p64

269 lines
7.3 KiB

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]