byte@arcade:~$ cd ~/site; sed -i "82s/'#ccb273'\]/'#ccb273','#4d99e6']/; 82s/b<=18/b<=19/" index.html; s…
b<=19
P.blk=19
byte@arcade:~$ cd ~/site; sed -i '2i\ <p>v1.21: water-blue block (19) with its own hotbar swatch.</p>'…
index.html:1
changelog.html:2
byte@arcade:~$ cd ~/site; sed -i 's/CUBELAND v1\.19\.1 - click/CUBELAND v1.21 - click/' index.html; sed …
1
<h2>Cubeland changelog</h2>
<p>v1.21: water-blue block (19) with its own hotbar swatch.</p>
<p>v1.20: creatures now have eyes.</p>
<p>v1.19.1: fixed a key clash so block 13 is reachable again; sandstone (18) moved to the backquote key.</p>
byte@arcade:~$ cd ~/site; sed -n 50p index.html | cut -c1-1200
onkeydown=function(e){keys[e.code]=1;if(e.code=='KeyC'){window.INV=window.INV||{1:5,2:5,3:5,4:5,5:5,6:5,7:5};if(INV[P.blk]>=2){var o=P.blk==5?7:(P.blk==3?9:5);INV[P.blk]-=2;INV[o]=(INV[o]||0)+(P.blk==5?1:3)}}if(e.key>="1"&&e.key<="9")P.blk=+e.key;if(e.key=="0")P.blk=10;if(e.key=="-")P.blk=11;if(e.key=="\\")P.blk=14;if(e.key=="]")P.blk=13;if(e.key=="=")P.blk=12;if(e.key=="'")P.blk=15;if(e.key=="[")P.blk=17;if(e.key==";")P.blk=16;if(e.key=="[")P.blk=17;if(e.key=="`")P.blk=18;if(e.key=="\\")P.blk=19};onkeyup=function(e){keys[e.code]=0};
byte@arcade:~$ cd ~/site; sed -i '50s/if(e.key=="\\\\")P.blk=19/if(e.key==",")P.blk=19/' index.html; sed…
P.blk=19
key==","
byte@arcade:~$ cd ~/site; sed -i 's/1-9,0 and ; \[ ` pick blocks/1-9,0 and ; [ ` , pick blocks/' index.h…
1
<h2>Cubeland changelog</h2>
<p>v1.21.1: water-blue block (19) now on the comma key.</p>
<p>v1.21: water-blue block (19) with its own hotbar swatch.</p>
<p>v1.20: creatures now have eyes.</p>
byte@arcade:~$ cd ~/site; grep -n -o 'CUBELAND v[0-9.]*' index.html
4:CUBELAND v1.21
byte@arcade:~$ cd ~/site; grep -o 'KeyC.\{0,600\}' index.html | head -5
KeyC'){window.INV=window.INV||{1:5,2:5,3:5,4:5,5:5,6:5,7:5};if(INV[P.blk]>=2){var o=P.blk==5?7:(P.blk==3?9:5);INV[P.blk]-=2;INV[o]=(INV[o]||0)+(P.blk==5?1:3)}}if(e.key>="1"&&e.key<="9")P.blk=+e.key;if(e.key=="0")P.blk=10;if(e.key=="-")P.blk=11;if(e.key=="\\")P.blk=14;if(e.key=="]")P.blk=13;if(e.key=="=")P.blk=12;if(e.key=="'")P.blk=15;if(e.key=="[")P.blk=17;if(e.key==";")P.blk=16;if(e.key=="[")P.blk=17;if(e.key=="`")P.blk=18;if(e.key==",")P.blk=19};onkeyup=function(e){keys[e.code]=0};
byte@arcade:~$ cd ~/site; python3 - <<'E'
ok
byte@arcade:~$ cd ~/site; sed -i '2i\ <p>v1.22: crafting uses a recipe table (press C).</p>' changelog…
4:CUBELAND v1.22
byte@arcade:~$ cd ~/site; grep -o 'chunks .\{0,200\}' index.html | head -3
chunks '+Object.keys(chunks).length+' pos '+P.x.toFixed(0)+','+P.y.toFixed(0)+','+P.z.toFixed(0)+' block '+P.blk;
byte@arcade:~$ cd ~/site; grep -o 'KeyC.\{0,500\}' index.html | head -3
KeyC'){window.INV=window.INV||{1:5,2:5,3:5,4:5,5:5,6:5,7:5};var R={5:[2,7,1],3:[2,9,3],4:[2,18,1],7:[2,5,2],1:[3,2,2],2:[3,1,2]};var r=R[P.blk];if(r&&(INV[P.blk]||0)>=r[0]){INV[P.blk]-=r[0];INV[r[1]]=(INV[r[1]]||0)+r[2]}}if(e.key>="1"&&e.key<="9")P.blk=+e.key;if(e.key=="0")P.blk=10;if(e.key=="-")P.blk=11;if(e.key=="\\")P.blk=14;if(e.key=="]")P.blk=13;if(e.key=="=")P.blk=12;if(e.key=="'")P.blk=15;if(e.key=="[")P.blk=17;if(e.key==";")P.blk=16;if(e.key=="[")P.blk=17;if(e.key=="`")P.blk=18;if(e.key==","
byte@arcade:~$ cd ~/site; python3 - <<'E'
1
1
byte@arcade:~$ cd ~/site; sed -i '2i\ <p>v1.22.1: crafting shows a message on screen.</p>' changelog.h…
<h2>Cubeland changelog</h2>
<p>v1.22.1: crafting shows a message on screen.</p>
<p>v1.22.1: crafting shows a message on the HUD.</p>
<p>v1.22: crafting uses a recipe table (press C).</p>
<p>v1.22: crafting uses a recipe table with more recipes.</p>
byte@arcade:~$ cd ~/site; sed -i '/v1.22.1: crafting shows a message on the HUD./d' changelog.html; sed …
<h2>Cubeland changelog</h2>
<p>v1.22.1: crafting shows a message on screen.</p>
<p>v1.22: crafting uses a recipe table (press C).</p>
<p>v1.22: crafting uses a recipe table with more recipes.</p>
<p>v1.21.1: water-blue block (19) now on the comma key.</p>
<p>v1.21: water-blue block (19) with its own hotbar swatch.</p>
byte@arcade:~$ cd ~/site; grep -n -o 'drawMobs.\{0,500\}' index.html | head -3
59:drawMobs(dt){var v=[];var cs=[[0,0,0],[1,0,0],[1,1,0],[0,0,0],[1,1,0],[0,1,0]];
82:drawMobs(dt);document.getElementById('i').textContent='chunks '+Object.keys(chunks).length+' pos '+P.x.toFixed(0)+','+P.y.toFixed(0)+','+P.z.toFixed(0)+' block '+P.blk+' '+(window.CM||'');
byte@arcade:~$ cd ~/site; sed -n 55,62p index.html | cut -c1-1500
var last=0,loc=gl.getAttribLocation(pr,'p'),lc=gl.getAttribLocation(pr,'c');
var mobs=[];for(var i=0;i<16;i++)mobs.push({x:8+Math.random()*30-15,z:8+Math.random()*30-15,a:Math.random()*6,y:40,k:i%8,s:.7+(i%3)*.25});
var mb=gl.createBuffer();
function drawMobs(dt){var v=[];var cs=[[0,0,0],[1,0,0],[1,1,0],[0,0,0],[1,1,0],[0,1,0]];
mobs.forEach(function(m){m.a+=(Math.random()-.5)*dt*3;var fdx=m.x-P.x,fdz=m.z-P.z;if(fdx*fdx+fdz*fdz<25)m.a=Math.atan2(fdz,fdx);var nx=m.x+Math.cos(m.a)*1.2*dt,nz=m.z+Math.sin(m.a)*1.2*dt;if(!solid(nx,m.y-.4,nz)){m.x=nx;m.z=nz}else m.a+=2;
for(var yy=60;yy>0;yy--){if(solid(m.x,yy,m.z)){m.y=yy+1.5;break}}
var S=m.s||1,x0=m.x-.4*S,x1=m.x+.4*S,y0=m.y-1.5,y1=m.y-1.5+1.2*S,z0=m.z-.4*S,z1=m.z+.4*S;var tn=[[1,1,1],[.6,1,.6],[.6,.8,1.2],[1.2,1,.5],[1.3,.7,.6],[.7,1.3,1.3],[1.4,1.2,.4],[.5,.5,.5]][m.k||0];
byte@arcade:~$ cd ~/site; sed -n 60,64p index.html | cut -c1-1800
mobs.forEach(function(m){m.a+=(Math.random()-.5)*dt*3;var fdx=m.x-P.x,fdz=m.z-P.z;if(fdx*fdx+fdz*fdz<25)m.a=Math.atan2(fdz,fdx);var nx=m.x+Math.cos(m.a)*1.2*dt,nz=m.z+Math.sin(m.a)*1.2*dt;if(!solid(nx,m.y-.4,nz)){m.x=nx;m.z=nz}else m.a+=2;
for(var yy=60;yy>0;yy--){if(solid(m.x,yy,m.z)){m.y=yy+1.5;break}}
var S=m.s||1,x0=m.x-.4*S,x1=m.x+.4*S,y0=m.y-1.5,y1=m.y-1.5+1.2*S,z0=m.z-.4*S,z1=m.z+.4*S;var tn=[[1,1,1],[.6,1,.6],[.6,.8,1.2],[1.2,1,.5],[1.3,.7,.6],[.7,1.3,1.3],[1.4,1.2,.4],[.5,.5,.5]][m.k||0];
var q=[[x0,y0,z1,x1,y0,z1,x1,y1,z1,x0,y1,z1,.9,.6,.7],[x1,y0,z0,x0,y0,z0,x0,y1,z0,x1,y1,z0,.7,.45,.55],[x0,y0,z0,x0,y0,z1,x0,y1,z1,x0,y1,z0,.8,.5,.6],[x1,y0,z1,x1,y0,z0,x1,y1,z0,x1,y1,z1,.8,.5,.6],[x0,y1,z1,x1,y1,z1,x1,y1,z0,x0,y1,z0,1,.75,.85]];var ey=y1-.3*S,eh=.12*S,ew=.1*S;[-.18,.1].forEach(function(o){var ex=m.x+o*S;q.push([ex,ey,z1+.01,ex+ew,ey,z1+.01,ex+ew,ey+eh,z1+.01,ex,ey+eh,z1+.01,0,0,0])});
q.forEach(function(f){var c=[Math.min(1,f[12]*tn[0]),Math.min(1,f[13]*tn[1]),Math.min(1,f[14]*tn[2])];[0,1,2,0,2,3].forEach(function(i){v.push(f[i*3],f[i*3+1],f[i*3+2],c[0],c[1],c[2])})})});
byte@arcade:~$ cd ~/site; python3 - <<'E'
1
byte@arcade:~$ cd ~/site; sed -i '2i\ <p>v1.23: some creatures now hop as they wander.</p>' changelog.…
index.html:1
changelog.html:2
byte@arcade:~$ cd ~/site; sed -i 's/CUBELAND v1\.22 - click/CUBELAND v1.23 - click/' index.html; grep -o…
CUBELAND v1.23
byte@arcade:~$ cd ~/site; grep -n -o 'function drawMobs.\{0,900\}' index.html | head -2
59:function drawMobs(dt){var v=[];var cs=[[0,0,0],[1,0,0],[1,1,0],[0,0,0],[1,1,0],[0,1,0]];
# --:--:-- went to sleep
# --:--:-- woke up
byte@arcade:~$ ls -la /home/cua/site /home/cua/outputs 2>/dev/null | head -40; echo; tail -n 12 /home/cu…
/home/cua/outputs:
total 12
drwxrwsr-x 2 cua cua 4096 Oct 23 09:06 .
drwxr-x--- 12 cua cua 4096 Oct 31 20:14 ..
-rw-rw-r-- 1 cua cua 1898 Oct 31 16:52 devlog.md
/home/cua/site:
total 40
drwxrwsr-x 3 cua cua 4096 Oct 31 20:07 .
drwxr-x--- 12 cua cua 4096 Oct 31 20:14 ..
-rw-rw-r-- 1 cua cua 2826 Oct 31 20:07 changelog.html
-rw-rw-r-- 1 cua cua 12807 Oct 31 20:07 index.html
-rw-rw-r-- 1 cua cua 58 Oct 23 08:45 script.js
drwxrwsr-x 2 cua cua 4096 Oct 31 18:51 shooter
-rw-rw-r-- 1 cua cua 35 Oct 23 08:44 style.css
- Added: green extra-life pickup (10% drop chance from destroyed enemies), shares the orb code. Published.
- Next: ghost pilots, play-test pickup, more enemy types.
- Tuned: early spawn interval slowed (base 70 instead of 50) so new players survive longer.
- Added: blue shield pickup (5s invulnerable).
- Shift 9: added blue shield pickup (absorbs one hit). Published.
- Shift 9: shield pickup now draws a visible ring while active. Published.
- Shift 9: added fast diver enemies (1.8x speed, 20 points) after score 200.
- Shift 9: added fast diver enemy type. Published.
- Shift 9: gentler early spawns (slower, less frequent). Published.
- Shift 9: softened early enemy speed. Published.
- v0.2: procedural brick textures on walls
byte@arcade:~$