\ : :: ; { ~ } ( ) [ ] # $ ? _ + - * = < > & | ^ ! @ . putpixel redraw 123 "string" 'c' `javascript` \ \ controls: [mouse] \ :: over `s[p]=s[p-2];++p;` ; :: lshift `--p;s[p-1]<<=s[p];` ; :: rshift `--p;s[p-1]>>=s[p];` ; :: / `--p;s[p-1]/=s[p];` ; :: sin `s[p-1]=Math.sin(s[p-1]);` ; :: cos `s[p-1]=Math.cos(s[p-1]);` ; :: negate `s[p-1]=-s[p-1];` ; :: mod `--p;s[p-1]%=s[p];` ; :: min `--p;if(s[p-1]>s[p])s[p-1]=s[p];` ; :: round `s[p-1]=Math.floor(s[p-1]);` ; :: WIDTH 256 ; :: HEIGHT 176 ; :: BITS 7 ; :: STEP 1 BITS lshift ; :: MASK STEP 1 - ; :: [ 32 ] Map ; :: [ ] Swing ; :: [ ] LocX ; :: [ ] LocY ; :: [ ] Angle ; :: [ 360 ] SinTable ; :: [ 360 ] CosTable ; :: [ ] dist ; :: [ ] color ; :: [ ] x ; :: [ ] y ; :: [ ] h ; :: [ ] j1 ; :: [ ] j2 ; :: [ ] i0 ; :: [ ] j0 ; :: [ ] u0 ; :: [ ] v0 ; :: [ ] vx ; :: [ ] vy ; :: [ ] da ; :: [ ] db ; :: [ ] a ; :: [ ] b ; :: [ ] u ; :: [ ] v ; :: [ ] u1 ; :: [ ] v1 ; :: [ ] a1 ; :: [ ] b1 ; :: [ ] i ; :: [ ] j ; :: [ ] di ; :: [ ] dj ; :: [ ] wall ; :: span color ! dist ! x ! HEIGHT dist @ 64 > { 64 * dist @ / round } h ! HEIGHT h @ - 1 rshift j1 ! j1 @ h @ + j2 ! j1 @ [ x @ over 0 putpixel ] h @ [ x @ over j1 @ + # 1 rshift color @ min h @ 2 * min putpixel ] HEIGHT j2 @ - [ x @ over j2 @ + # 64 - 64 min putpixel ] ; :: scene LocX @ # BITS rshift i0 ! MASK & u0 ! LocY @ # BITS rshift j0 ! MASK & v0 ! CosTable Angle @ + @ vx ! SinTable Angle @ + @ vy ! vy @ 7 rshift Swing @ * WIDTH / da ! vx @ 7 rshift Swing @ * WIDTH / db ! vx @ Swing @ vy @ 8 rshift * - a ! vy @ Swing @ vx @ 8 rshift * + b ! WIDTH [ a @ 0 < { -1 u0 @ a @ negate ~ 1 STEP u0 @ - a @ } a1 ! u ! di ! b @ 0 < { -1 v0 @ b @ negate ~ 1 STEP v0 @ - b @ } b1 ! v ! dj ! u @ # STEP - x ! b1 @ # BITS lshift u1 ! * u ! v @ # STEP - y ! a1 @ # BITS lshift v1 ! * v ! i0 @ i ! j0 @ j ! 1 ( v @ u @ < # { y @ STEP + y ! u @ v @ - u ! v1 @ v ! j @ dj @ + j ! ~ x @ STEP + x ! v @ u @ - v ! u1 @ u ! i @ di @ + i ! } wall ! Map i @ + @ 1 j @ lshift & ) # wall @ { b1 y ~ a1 x } @ 18 lshift $ @ / i @ j @ + 3 & { 48 ~ 32 } span a @ da @ + a ! b @ db @ - b ! ] redraw ; :: init 0b000000000000000000000 0b011111111111111111110 0b010101010101010101010 0b011111111111111111110 0b011111100100111111110 0b011111101110111111110 0b011111111011111111110 0b011111101110111111110 0b011111100100111111110 0b011111111111111111110 0b010101010101010101010 0b011111111111111111110 0b000000000000000000000 13 [ $ over Map + ! ] 360 [ # 3.14 * 180.0 / sin 262144.0 * over SinTable + ! # 3.14 * 180.0 / cos 262144.0 * over CosTable + ! ] 15 Angle ! 166 LocX ! 166 LocY ! 147 Swing ! ; init :: clientX `s[p++]=event.clientX;` ; : "onmousemove" clientX 360 mod Angle ! ; :: [ ] forward ; : "onmousedown" 1 forward ! ; : "onmouseup" 0 forward ! ; :: run forward @ { LocX @ CosTable Angle @ + @ 14 rshift + # x ! BITS rshift i ! LocY @ SinTable Angle @ + @ 14 rshift + # y ! BITS rshift j ! Map i @ + @ 1 j @ lshift & { x @ LocX ! y @ LocY ! } } ; :: [ ] frame ; 0 frame ! :: fps `v="fps:";` frame @ . 0 frame ! ; :: render scene frame @ 1 + frame ! ; : 0 render ; : 20 run ; : 1000 fps ;