0?(z""]:h'h&(o}̂ǵ 2TvͫgE#2Tv2TvͫgE#!CegE#$Bh$BΊF!dh$B """"""/""""""""""/"""""/"""""/""""ww~~w "/"/ // ""/""""""""""""/////"//"/""""""""""""""/"/"//"""""""""""""////"//"/"""""""""~~ w~fpnf. 3>35.343㙙^UʮΪΪ̪ʪʪʪʬʪʪ̬ʬ̬ʬ̬̬yw~~~ww^U          " """/"/B$""" "$"@.@UE/TUE"UURUE/U/DUPUUUUUPUUPUPPPPPPUUUUUPUUUUPPPPPD%"TU"TUT@UUD@UEDTUD@TEDD.BUDUEUUDTUE@TU@DPPPPPPP̙̙̙̙̜̙̜̜̙̜̜ə̙̙əDID$DID$̙̜̜̙DBBDB$DD̙DDIDB$DDID$$DBDDDDDDDBBDDDBIDDDD̜̙DDIDBB$DDBD$$DBDDDDDDI$IDDDBBDDD̙DDDBBDDB$$DDDDDBDDDDDI$IDDDBBDDD̙DDDBBDDB$$DDDDDBDDDDDDBDDBDDDęDILDDOBDD$D$DDDDBDDDDLBDDDO$DDDD$ILLDDBIBDDD$D$$DDDDDDDDDDDOD$DDD$ODDDILLDDBDBDDD$D$DDDDDDDDDIDIBD$D$D$DDDDLLDBDDDDD$DDDDD$DDDDIDIBD$D$D$DDDDLLDBDDDDD$DDDDD$DDDDD$DDODDDDDD/_/%U%RURR"%"%UU"%"%"%UU"%"%"%UU"%"%"%UU"%"%"%UU"%"%"%UU"%  !#$&') *, .///////, ) (( )  , ./////  469;=?579;==================== ACEGHIJLMNOOOOOOOOOOOOOOOOOOOO@ABCDEFGHIJKLMNOOOOOOOOOOOOOOO   *0JPjp c Cc C CC   ih 0Ye`e Be c` e Be e(bec Cc Cc Cc C  eBee c b` e e eeB b` e e b eh  h  TCBC C CC C CC C C EE EE E E Ei <'  i0'   i i i i i0' i i i i i0' i i i i   03Pq q $$q q $$CASACAcAp 9 tic=0 lahja={ {x={0,0,128}, y={0,0,0}, z={0,128,128},c=2,f=2}, {x={0,128,128}, y={0,0,0}, z={0,128,0},c=2,f=2}, {x={128,128,128}, y={128,0,0}, z={0,0,128},c=2,f=2}, {x={128,128,128}, y={128,0,128}, z={0,128,128},c=2,f=2}, {x={0,0,0}, y={128,0,0}, z={128,128,0},c=2,f=2}, {x={0,0,0}, y={128,0,128}, z={128,0,0},c=2,f=2}, {x={128,128,0}, y={128,0,0}, z={128,128,128},c=2,f=2}, {x={128,0,0}, y={128,0,128}, z={128,128,128},c=2,f=2}, {x={0,0,128}, y={128,0,0}, z={0,0,0},c=2,f=2}, {x={0,128,128}, y={128,0,128}, z={0,0,0},c=2,f=2}, {x={52,52,76}, y={128,0,0}, z={-1,-1,-1},c=5,f=2}, {x={76,52,76}, y={128,128,0}, z={-1,-1,-1},c=5,f=2}, {x={-1,-1,-1}, y={129,0,129}, z={52,52,76},c=5,f=3}, {x={-1,-1,-1}, y={129,0,0}, z={76,52,76},c=5,f=3}, {x={128,128,128}, y={0,128,129}, z={76,52,76},c=5,f=3}, {x={128,128,128}, y={0,0,129}, z={76,52,52},c=5,f=3}, {x={52,76,52}, y={0,0,129}, z={128,128,128},c=5,f=3}, {x={52,76,76}, y={128,0,128}, z={128,128,128},c=5,f=3}, } kansi1={ {x={64,64,128}, y={0,0,0}, z={128,0,0},c=2,f=2}, {x={64,128,128}, y={0,0,0}, z={128,0,128},c=2,f=2}, } kansi2={ {x={64,0,64}, y={0,0,0}, z={128,0,0},c=2,f=2}, {x={64,0,0}, y={0,0,0}, z={128,128,0},c=2,f=2}, } ps5={ {x={0,0,60}, y={0,110,110}, z={64,64,64},c=1,uv={u1=0,v1=32,u2=0,v2=0,u3=16,v3=0}}, {x={0,60,60}, y={0,0,110}, z={64,64,64},c=1,uv={u1=0,v1=32,u2=16,v2=32,u3=16,v3=0}}, init={x=26,y=-64,z=0}, text="Its PS5!" } amiga={ {x={0,0,120}, y={0,80,80}, z={64,64,64},c=1,uv={u1=16,v1=24,u2=16,v2=0,u3=48,v3=0}}, {x={0,120,120}, y={0,0,80}, z={64,64,64},c=1,uv={u1=16,v1=24,u2=48,v2=24,u3=48,v3=0}}, init={x=26,y=-64,z=0}, text="Its an Amiga!" } farjan={ {x={0,0,120}, y={0,80,80}, z={64,64,64},c=1,uv={u1=48,v1=16,u2=48,v2=0,u3=96,v3=0}}, {x={0,120,120}, y={0,0,80}, z={64,64,64},c=1,uv={u1=48,v1=16,u2=96,v2=16,u3=96,v3=0}}, init={x=26,y=-64,z=0}, text="\nIts some weird looking boat!" } joker={ {x={0,0,120}, y={0,60,60}, z={64,64,64},c=1,uv={u1=0,v1=40,u2=0,v2=32,u3=32,v3=32}}, {x={0,120,120}, y={0,0,60}, z={64,64,64},c=1,uv={u1=0,v1=40,u2=32,v2=40,u3=32,v3=32}}, init={x=26,y=-64,z=0}, text="\n\nIts a bus sign!\nAlso greetings to yksnis" } hiili={ {x={0,0,120}, y={0,80,80}, z={64,64,64},c=1,uv={u1=96,v1=16,u2=96,v2=0,u3=112,v3=0}}, {x={0,120,120}, y={0,0,80}, z={64,64,64},c=1,uv={u1=96,v1=16,u2=112,v2=16,u3=112,v3=0}}, init={x=26,y=-64,z=0}, text="Its coal!\nYou haven't been nice!" } magnet={ {x={0,0,120}, y={0,80,80}, z={64,64,64},c=1,uv={u1=96,v1=40,u2=96,v2=16,u3=128,v3=16}}, {x={0,120,120}, y={0,0,80}, z={64,64,64},c=1,uv={u1=96,v1=40,u2=128,v2=40,u3=128,v3=16}}, init={x=26,y=-64,z=0}, text="\n\nOh no, its Magnetisms PC Club!" } spritemap={ {id=0,w=2,h=4}, -- ps5 {id=2,w=4,h=3}, -- amiga {id=12,w=2,h=2}, -- coal {id=6,w=6,h=2}, -- färjan {id=64,w=4,h=1}, -- joker {id=44,w=4,h=3}, -- magnetismi } tunnel={} cube={} elementToCreate = 1 outerOrInner = 4 projMatrix={ {1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1} } camMatrix={ {1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1} } camVec={ eye = {80,180,300}, target = {80,180,0}, up = {0,1,0} } sin=math.sin cos=math.cos tan=math.tan rnd=math.random rad=math.rad PI=math.pi abs=math.abs sqrt=math.sqrt function addLine(x,y,z,x1,y1,z1,col) local v={x,y,z,x1,y1,z1,col} table.insert(cube,v) end function addSquare(x,y,z,x1,y1,z1,x2,y2,z2,x3,y3,z3,i,col,pos) local v={x,y,z,x1,y1,z1,x2,y2,z2,x3,y3,z3, outer = i > 1 and true or false, color = col, pos = pos} table.insert(tunnel,v) end function camLookAt(eye, target, up) local z = normalizeVec({eye[1] - target[1], eye[2] - target[2], eye[3] - target[3]}) local x = normalizeVec(crossProd(up, z)) local y = crossProd(z, x) camMatrix[1] = {x[1], y[1], z[1], 0} camMatrix[2] = {x[2], y[2], z[2], 0} camMatrix[3] = {x[3], y[3], z[3], 0} camMatrix[4] = {-dot_product(x, eye), -dot_product(y, eye), -dot_product(z, eye), 1} end function initProjMatrix(fov, near, far) local m = projMatrix m[1][1] = 1 / (240 / 136 * tan(fov * 0.5 * PI / 180)); m[2][2] = 1 / tan(fov * 0.5 * PI / 180); m[3][3] = -far / (far - near) m[4][3] = -far * near / (far - near) m[3][4] = -1 m[4][4] = 0 end function mulMatrix3x3(m1, m2) local out = {} table.insert(out,m1[1] * m2[1][1] + m1[2] * m2[1][2] + m1[3] * m2[1][3]) table.insert(out,m1[1] * m2[2][1] + m1[2] * m2[2][2] + m1[3] * m2[2][3]) table.insert(out,m1[1] * m2[3][1] + m1[2] * m2[3][2] + m1[3] * m2[3][3]) return out end function mulMatrix(pnt, m) local out = {} table.insert(out,pnt[1] * m[1][1] + pnt[2] * m[2][1] + pnt[3] * m[3][1] + m[4][1]) table.insert(out,pnt[1] * m[1][2] + pnt[2] * m[2][2] + pnt[3] * m[3][2] + m[4][2]) table.insert(out,pnt[1] * m[1][3] + pnt[2] * m[2][3] + pnt[3] * m[3][3] + m[4][3]) local w = pnt[1] * m[1][4] + pnt[2] * m[2][4] + pnt[3] * m[3][4] + m[4][4] if w ~= 1 then out[1] = out[1] / w out[2] = out[2] / w out[3] = out[3] / w end return out end function dot_product(v1, v2) sum = 0 for i = 1, #v1 do sum = sum + v1[i] * v2[i] end return sum end function crossProd(v1,v2) local x = v1[2] * v2[3] - v1[3] * v2[2] local y = v1[3] * v2[1] - v1[1] * v2[3] local z = v1[1] * v2[2] - v1[2] * v2[1] return {x, y, z} end function normalizeVec(vec) local length = sqrt((vec[1] * vec[1]) + (vec[2] * vec[2]) + (vec[3] * vec[3])) return {vec[1]/length,vec[2]/length,vec[3]/length} end function vecLength(k1,k2) local dx1 = k1[1] - k2[1] local dy1 = k1[2] - k2[2] return sqrt(dx1 * dx1 + dy1 * dy1) end function triSorter(k1, k2) sort_a1=k1.z[1]+k1.z[2]+k1.z[3]-(k1.c/1500) sort_b1=k2.z[1]+k2.z[2]+k2.z[3]-(k2.c/1500) return sort_a1 > sort_b1 end function init() initProjMatrix(55, 2, 100) camLookAt(camVec.eye,camVec.target,camVec.up) --traceMatrix(projMatrix) music(0,0,0,false) --movePoints(farjan,26,128,0) end function isTime(last, target, tic) return (tic < target and tic > last) end -- function manualCamera() -- local mx,my,cl1,cl2,cl3=mouse() -- if cl1 then mt1=mt1+1 else mt1=0 end -- if cl2 then mt2=mt2+1 else mt2=0 end -- if cl3 then mt3=mt3+1 else mt3=0 end -- clp1=(mt1==1) -- clp2=(mt2==1) -- clp3=(mt3==1) -- if key(04) then --d -- camVec.target[1]=camVec.target[1]-1 -- trace(camVec.target[3]) -- camLookAt(camVec.eye,camVec.target,camVec.up) -- elseif key(01) then --a -- camVec.target[1]=camVec.target[1]+1 -- trace(camVec.target[1]) -- camLookAt(camVec.eye,camVec.target,camVec.up) -- elseif key(23) then --w -- camVec.target[2]=camVec.target[2]+2 -- trace(camVec.target[1]) -- camLookAt(camVec.eye,camVec.target,camVec.up) -- elseif key(19) then --s -- camVec.target[2]=camVec.target[2]-1 -- trace(camVec.target[1]) -- camLookAt(camVec.eye,camVec.target,camVec.up) -- elseif key(64) then --shift -- camVec.eye[2]=camVec.eye[2]+1 -- trace(camVec.eye[2]) -- camLookAt(camVec.eye,camVec.target,camVec.up) -- elseif key(63) then --ctr -- camVec.eye[2]=camVec.eye[2]-1 -- trace(camVec.eye[2]) -- camLookAt(camVec.eye,camVec.target,camVec.up) -- end -- if clp1 and not texture then -- mx1,my1=mx,my tx1,ty1=camVec.eye[1],camVec.eye[2] -- end -- if cl1 and not clp3 and my<100 and tx3==0 and not texture then -- camVec.eye[1]=tx1+(my-my1)/20 camVec.eye[2]=ty1+(mx-mx1)/20 -- end -- end function movePoints(pts, x, y, z) for i=1,#pts do for j=1,3 do pts[i].x[j]=pts[i].x[j]+x pts[i].y[j]=pts[i].y[j]+y pts[i].z[j]=pts[i].z[j]+z end end return pts end function rotatePoints(pts, angle) rot = { {cos(angle),-sin(angle),0,0,0}, {sin(angle),cos(angle),0,0}, {0,0,1,0}, {0,0,0,1}, } local k1={} for i=1,#pts do local r1 = mulMatrix3x3({pts[i].x[1], pts[i].y[1], pts[i].z[1]}, rot) local r2 = mulMatrix3x3({pts[i].x[2], pts[i].y[2], pts[i].z[2]}, rot) local r3 = mulMatrix3x3({pts[i].x[3], pts[i].y[3], pts[i].z[3]}, rot) table.insert(k1,{x={r1[1],r2[1],r3[1]}, y={r1[2],r2[2],r3[2]}, z={r1[3],r2[3],r3[3]},c=pts[i].c}) end return k1 end function concat(t1,t2) for i=1,#t2 do t1[#t1+1] = t2[i] end return t1 end function sisalto(t,item) local pol = calculatePolys(item) drawTri(pol) end function drawLahja(t, sisalto) cls(4) -- tausta for i=0,240,16 do spr(130,i,15,0,1,0,0,2,4) spr(160,i,0,0,1,0,0,2,2) spr(130,i,70,0,1,0,0,2,4) spr(160,i,55,0,1,0,0,2,2) spr(160,i,120,0,1,0,0,2,2) end -- kameraliike (ei se kauppa) if t > 50 and t < 400 then camVec.eye[1]=camVec.eye[1]-1.3 if t > 200 then camVec.target[2]=camVec.target[2]+1 camVec.eye[2]=camVec.eye[2]+1 end camLookAt(camVec.eye,camVec.target,camVec.up) end if t > 350 and t < 490 then movePoints(sisalto,0,2,0) end if t > 460 then print(sisalto.text,20,70) end sisaltop = calculatePolys(sisalto) -- KANSI local ang = 0 if t > 300 then ang = (t-300)*1.2 if ang > 120 then ang = 120 end end local k1 = rotatePoints(kansi2, rad(ang)) k1 = movePoints(k1,0,128,0) local k2 = rotatePoints(kansi2, rad(180-ang)) k2 = movePoints(k2,128,128,0) k1 = calculatePolys(k1) k2 = calculatePolys(k2) -- LAHJAPAKETTI local plahja = calculatePolys(lahja) plahja = concat(plahja,sisaltop) table.sort(plahja, triSorter) drawTri(plahja) drawTri(k1) drawTri(k2) end function init_lahja() camVec={ eye = {500,100,350}, target = {80,100,0}, up = {0,1,0} } camLookAt(camVec.eye,camVec.target,camVec.up) end init() metsa_sprites={} function metsa(t) cls(9) rect(0,70,240,100,15) t=t+1 spr(192,-t%240,30,-1,3,0,0,10,4) spr(192,(-t%240)-240,30,-1,3,0,0,10,4) for i=1,#metsa_sprites do metsa_sprites[i].x = metsa_sprites[i].x - metsa_sprites[i].vel spr(metsa_sprites[i].id, metsa_sprites[i].x, metsa_sprites[i].y, 0,2,0,0,metsa_sprites[i].w,metsa_sprites[i].h) end end times_in_metsa = 0 function metsa_init() metsa_sprites={} if times_in_metsa ~= 0 then for i=1,20 do local sp = spritemap[rnd(1,times_in_metsa)] table.insert(metsa_sprites,{id=sp.id, w=sp.w,h=sp.h, x=rnd(240,1000), y=rnd(10,70), vel=rnd(1,3)}) end end times_in_metsa=times_in_metsa+1 end function no_init() cls(9) end function shutdown(t) exit() end scenes={ {start=0, stop=700, init=metsa_init, run=metsa}, {start=701, stop=1400, init=init_lahja, extraparam=ps5, run=drawLahja}, {start=1401, stop=1900, init=metsa_init, run=metsa}, {start=1901, stop=2600, init=init_lahja, extraparam=amiga, run=drawLahja}, {start=2601, stop=2950, init=metsa_init, run=metsa}, {start=2951, stop=3600, init=init_lahja, extraparam=hiili, run=drawLahja}, {start=3601, stop=4000, init=metsa_init, run=metsa}, {start=4001, stop=4700, init=init_lahja, extraparam=farjan, run=drawLahja}, {start=4701, stop=5000, init=metsa_init, run=metsa}, {start=5001, stop=5600, init=init_lahja, extraparam=joker, run=drawLahja}, {start=5601, stop=5900, init=metsa_init, run=metsa}, {start=5901, stop=6600, init=init_lahja, extraparam=magnet, run=drawLahja}, {start=6601, stop=10000, init=no_init, run=shutdown}, } function TIC() poke(16379,2) for i=1,#scenes do if scenes[i].start <= tic and scenes[i].stop >= tic then if scenes[i].start == tic then scenes[i].init() end if scenes[i].extraparam ~= nil then scenes[i].run(tic - scenes[i].start, scenes[i].extraparam) else scenes[i].run(tic - scenes[i].start) end goto continue end end ::continue:: tic=tic+1 end function squa(x1,y1,x2,y2,x3,y3,x4,y4,col) tri(x1,y1,x2,y2,x4,y4,col) tri(x1,y1,x3,y3,x4,y4,col) end function scalVec(vec) return {(vec[1] + 1) * 0.5 * 240, (1 - (vec[2] + 1) * 0.5) * 136} end function map(out_min,out_max,in_min,in_max,val) return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; end function getColDist(dist) return math.floor(map(0,7,0,540,dist)) end function calculatePolys(data) local outPol={} for i=1, #data do --outPol[i]={x=data[i].x,y=data[i].y,z=data[i].z} local p1 = mulMatrix({data[i].x[1], data[i].y[1], data[i].z[1]}, camMatrix) local p2 = mulMatrix({data[i].x[2], data[i].y[2], data[i].z[2]}, camMatrix) local p3 = mulMatrix({data[i].x[3], data[i].y[3], data[i].z[3]}, camMatrix) p1 = mulMatrix(p1, projMatrix) p2 = mulMatrix(p2, projMatrix) p3 = mulMatrix(p3, projMatrix) outPol[i]={ x={p1[1],p2[1],p3[1]}, y={p1[2],p2[2],p3[2]}, z={p1[3],p2[3],p3[3]}, c=data[i].c, uv=data[i].uv } end return outPol end function drawTri(data) for i, val in ipairs(data) do local p1 = scalVec({val.x[1],val.y[1],val.z[1]}) local p2 = scalVec({val.x[2],val.y[2],val.z[2]}) local p3 = scalVec({val.x[3],val.y[3],val.z[3]}) if val.uv == nil then tri(p1[1],p1[2],p2[1],p2[2],p3[1],p3[2],val.c) else ttri(p1[1],p1[2],p2[1],p2[2],p3[1],p3[2],val.uv.u1,val.uv.v1,val.uv.u2,val.uv.v2,val.uv.u3,val.uv.v3,0,0) end end end