Log In  


Pilgrimage

An entry to the 2025 PICO-8 1K Jam

You are traveling back to your origin.
It is a journey of 200 steps.
Steps which grow longer, wider, taller, and deeper.
Some may even shift before your eyes.

But take a deep breath. Be patient.
Pay close attention to your surroundings.
You will grow stronger with every step you take.
Your capacity for flight (X) will extend.

It may not be possible to complete all journeys.
But there will be a new pilgrimage every day.

Cart #koz_pilgrimage-0 | 2025-10-01 | Code ▽ | Embed ▽ | No License
22

Press X to fly. Collect orbs to extend your flight time. Watch out for moving platforms!
The trial is different daily, but there are always 200 steps.

The Code

1024-byte version

q,v,z,b,l,i,u,c,e,n=0,0,0,0,5,0,0,0,0,0g=.0125𝘢=2j=2f=2𝘣=0𝘤={}𝘥=stat(80)..stat(81).."."..stat(82)srand(tonum(𝘥))𝘦=rnd()pal{4,9,3,1,5,2,[15]=6}for n=1,200do q+=8v+=8*sin(𝘦+n/64)+rnd()*.8*n-.4*n z=n/2*cos(𝘦+n/64)add(𝘤,{e=q,d=v,f=z,i=14-n%6,o=n/2})if(n==1)k,m=q,v
end function _update60()if(e<-1and not r)if(btn(5))run()else print("❎",61,118,0)return
cls(7)𝘧=k-8*cos(i)𝘨=m-8*sin(i)𝘩=l+1.3u*=.92c*=.92n*=.96if(btn(2))u+=g*cos(i)c+=g*sin(i)
if(btn(3))u-=g*cos(i)c-=g*sin(i)
if(btn(0))n+=𝘢
if(btn(1))n-=𝘢
if(p)e=0f=j else e-=.003
w={}for n=1,1024do add(w,{})end r=nil for n in all(𝘤)do x(n.e-k,n.d-m)if d<2.17do if l>=n.f do r=n if l+e<n.f do if(not p and not n.t)n.t=1n.o=t()+.1𝘣+=1j+=.05
p=1l=r.f e=0end else u*=-1c*=-1end end x(n.e-𝘧,n.d-𝘨)add(w[1+d\.5],n)end if(not r)p=nil
k+=u m+=c i+=n>>14l+=e for n=1024,8,-1do if(n>800or n<10)fillp(░)
for n in all(w[n])do 𝘪(n.e,n.d,n.f)a,s=320/d,(𝘩-n.f)*260/d/d y=t()<n.o and 7or n.i rectfill(h-a,o,h+a,o+(1024+8*n.e)/d,y-8)ovalfill(h-a,o-s,h+a,o+s,s>0and y or y-8)if(not n.t)circfill(h,o-180/d,44/d,9+(d+32*i)%6)if(n.e%64==8)n.d+=n.e/6000*cos(n.e/6000*t())oval(h-a,o-s,h+a,o+s,7)
end if n==13do if(r)𝘪(k,m,r.f)ovalfill(60,o-2,68,o,r.i-8)
rrectfill(61,78,7,11,1,15)if(btn(5)and f>0)fillp(▥)rectfill(61,88,67,89,rnd{0,7})f-=.04e+=.005p=nil
fillp(▒)rectfill(63,86,65,80,13)rectfill(63,86,65,86-6*f/j,f>0and 7)end fillp()end rrectfill(3,4,3+j\.4*2,5,1,0)if(f>0)fillp(▒)rectfill(4,5,4+f\.4*2,7,7)fillp()
?𝘣,3,12,0
?𝘥,3,120
end function x(n,e)b=atan2(n,e)d=n*cos(b)+e*sin(b)end function 𝘪(n,e,f)x(n-𝘧,e-𝘨)𝘫=(.5+i-b)%1-.5h=64+1024*𝘫+.5o=64-64/d*2.5*(f-𝘩)+.5end

Non-Minified Version

pico-8 cartridge // http://www.pico-8.com
version 43
__lua__
--pilgrimage
--by koz
x,y,z,a,pz,pa,pdx,pdy,pdz,pda=0,0,0,0,5,0,0,0,0,0
pspd=.0125
ptrn=2
ptank=2
pfuel=2
score=0

objs={}

date=stat(80)..stat(81).."."..stat(82)
srand(tonum(date))
r=rnd()

--poke4(0x5f00,0x309.041,0x702.0501)
pal{4,9,3,1,5,2,[15]=6}
--pal(15,6)
--pat=~rnd(0x8000)\1+0b.111
for i=1,200 do
 x+=8
 y+=8*sin(r+i/64)+rnd()*.8*i-.4*i
 z=i/2*cos(r+i/64)
 add(objs,{
  --x=5*i*cos(i/30.2),y=5*i*sin(i/30.2),z=i*sin(i/128),
  --x=i%15*10,y=i\15*10,z=10*sin(i/27),
  --x=5*i*(1+i/128),y=8*sin(i/32)+64*sin(i/64)-i*sin(i/17)-4*sin(i/1.7),z=i/2*sin(i/64),--+i/12*sin(i/12)
  x=x,y=y,z=z,
  c=14-i%6,ptil=i/2
 })
 if (i==1) px,py=x,y
end

function _update60()
 if (pdz<-1 and not plat) if (btn(5)) run() else print("❎",61,118,0) return
 cls(7)
 cx=px-8*cos(pa)
 cy=py-8*sin(pa)
 cz=pz+1.3
 pdx*=.92
 pdy*=.92
 pda*=.96
 if btn(2) then
  pdx+=pspd*cos(pa)
  pdy+=pspd*sin(pa)
 end
 if btn(3) then
  pdx-=pspd*cos(pa)
  pdy-=pspd*sin(pa)
 end
 if (btn(0)) pda+=ptrn
 if (btn(1)) pda-=ptrn
 --if (btnp(4)) _p=_p and _p+1 or 1 pstand=false px,py,pz=objs[_p].x,objs[_p].y,objs[_p].z+.01
 if pstand then
  pdz=0
  pfuel=ptank
 else
  pdz-=.003
 end

 objstax={}
 for i=1,1024 do add(objstax,{}) end

 plat=nil

 for o in all(objs) do
  dista(o.x-px,o.y-py)
  if d<2.17 then
   if pz>=o.z then
    plat=o
    if pz+pdz<o.z then
     if (not pstand and not o.pt) o.pt=1 o.ptil=t()+.1 score+=1 ptank+=.05 --pat=~rnd(0x8000)\1+0b.111
     pstand=1
     pz=plat.z
     pdz=0
    end
   else
    pdx*=-1
    pdy*=-1
   end
  end
  dista(o.x-cx,o.y-cy)
  add(objstax[1+d\.5],o)
 end
 if (not plat) pstand=nil
 px+=pdx
 py+=pdy
 pa+=pda>>14
 pz+=pdz

 for i=1024,8,-1 do
  --if (i>800 or i<10) fillp(▒)
  if (i>800 or i<10) fillp(░)
  for o in all(objstax[i]) do
   screenmap(o.x,o.y,o.z)
   wr,hr=320/d,(cz-o.z)*260/d/d
   c=t()<o.ptil and 7 or o.c
   rectfill(sx-wr,sy,sx+wr,sy+(1024+8*o.x)/d,c-8)
   --if (i<800 and i>10) fillp(▒) rectfill(sx-wr,sy+h+3,sx+wr,sy) fillp()
   ovalfill(sx-wr,sy-hr,sx+wr,sy+hr,hr>0 and c or c-8)
   if not o.pt then
    circfill(sx,sy-180/d,44/d,9+(d+32*pa)%6)
    if (o.x%64==8) o.y+=o.x/6000*cos(o.x/6000*t()) oval(sx-wr,sy-hr,sx+wr,sy+hr,7)
   end
  end
  --if (i>48 and i<96) screenmap(px-(px+128*sin(i/32))%32+16,py-(py+132*sin(i/27))%32+16,pz-(i+pz)%32+16) pset(sx,sy,score<50 and i or 8+(i+4*t()+rnd())%7)
  --if (i>2 and i<64) screenmap(px-(px+128*sin(i/32))%6+3,py-(py+132*sin(i/27))%6+3,pz-(i+pz+t())%9.1+8) pset(sx,sy,9+(i+6*t()+rnd(1.4))%6)
  if i==13 then
   --player shadow
   if plat then
    screenmap(px,py,plat.z)
    ovalfill(60,sy-2,68,sy,plat.c-8)
   end
   --player
   rrectfill(61,78,7,11,1,15)
   if (btn(5) and pfuel>0) fillp(▥) rectfill(61,88,67,89,rnd{0,7}) pfuel-=.04 pdz+=.005 pstand=nil
   --if btn(❎) and pfuel>0 then
    --for i=0,128 do screenmap(px-(px+128*sin(i/32))%32+16,py-(py+132*sin(i/27))%32+16,pz-(i+pz)%32+16) circfill(sx,sy,48/d,7) end
    --for i=0,1,.2 do line(61+64*i*pa%7,84+3*sin(i+t()),9+5*i) end
    --for i=0,2,.4 do line(64.5-4*cos(i+t()),88+sin(i+t())+128*pdz+i,9+(7*t()+rnd())%6) end
    --pat=pat or ~-rnd(0x8000)\1+0b.111
    --fillp(32765.875)
    --rectfill(62,72,66,75,15)
    --ovalfill(63,87,65,90,9+(7*t()+rnd())%6)
    --if (score>100) ovalfill(60,77,68,79)
   --else
    --pat=nil
   --end
   fillp(▒)
   rectfill(63,86,65,86-6,13)
   rectfill(63,86,65,86-6*pfuel/ptank,pfuel>0 and 7)
  end
  fillp()
 end
 rrectfill(3,4,3+ptank\.4*2,5,1,0)
 if (pfuel>0) fillp(▒) rectfill(4,5,4+pfuel\.4*2,7,7) fillp()
 ?score,3,12,0
 ?date,3,120
end

function dista(dx,dy)
 a=atan2(dx,dy)
 d=dx*cos(a)+dy*sin(a)
end

function screenmap(x,y,z)
 dista(x-cx,y-cy)
 sa=(.5+pa-a)%1-.5
 sx=64+1024*sa+.5
 sy=64-64/d*2.5*(z-cz)+.5
end

This was obviously intended to be an entry into this year's 1K Jam, but I left too many things to the last second and didn't realize the jam ended at 1PM (my fault, the time was clearly posted). Edit: My submission was accepted as a late entry! Thanks, @Liquidream! In any case, I put a lot of time this month into tooling around with this, much of which had to be ripped right back out, but hopefully I kept the best bits for the space.

Hope you enjoy. Let me know what you think and what your scores are!

22


2

Nice!


1

Ingenious graphics system, though I wouldn't complain if the camera interpolated between the player and the ground to give more chance to see where our shadow is.

I got a third of the way before I miscalculated. How far have others gone?


Very nice @Cowirrie, 72 was an especially tricky one today. I'll be honest, each day's journey should be mostly possible, but I was obviously not able to test all potential iterations. I was able to complete 200 once, but that was before the addition of moving platforms. However, I tested moving platforms extensively after adding them and I'm pretty confident 200 should be possible for skilled players on most days' challenges. But it won't be easy!


1

Amazing job! ingenious graphics and fun concept. keep up the work!


1

I know it's minified, but 1k seems insane for this. Congrats on this impressive cart!!



[Please log in to post a comment]