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.
270 lines
7.3 KiB
270 lines
7.3 KiB
2 months ago
|
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]
|