#version 450 // The Legend of Zelda, by Henrique Lorenzi! layout(std140, set = 0, binding = 0) uniform UBO { mat4 MVP; vec4 OutputSize; vec4 OriginalSize; vec4 SourceSize; uint FrameCount; } global; #pragma stage vertex layout(location = 0) in vec4 Position; layout(location = 1) in vec2 TexCoord; layout(location = 0) out vec2 vTexCoord; const vec2 madd = vec2(0.5, 0.5); void main() { gl_Position = global.MVP * Position; vTexCoord = gl_Position.xy; } #pragma stage fragment layout(location = 0) in vec2 vTexCoord; layout(location = 0) out vec4 FragColor; float iGlobalTime = float(global.FrameCount)*0.025; vec2 iResolution = global.OutputSize.xy; #define RGB(r,g,b) vec4(r/255.,g/255.,b/255.,1) #define SPR(x,a,b,c,d,e,f,g,h, i,j,k,l,m,n,o,p) (x <= 7. ? SPR_H(a,b,c,d,e,f,g,h) : SPR_H(i,j,k,l,m,n,o,p)) #define SPR_H(a,b,c,d,e,f,g,h) (a+4.0*(b+4.0*(c+4.0*(d+4.0*(e+4.0*(f+4.0*(g+4.0*(h)))))))) #define SELECT(x,i) mod(floor(i/pow(4.0,float(mod(float(x),8.0)))),4.0) float hash(float x) { return fract(sin(x) * 43758.5453) * 2.0 - 1.0; } vec2 hashPos(float x) { return vec2( floor(hash(x) * 3.0) * 32.0 + 16.0, floor(hash(x * 1.1) * 2.0) * 32.0 + 16.0 ); } vec4 fragColor; void spr_rock(float x, float y) { float c = 0.; if (y == 0.) c = (x < 8. ? 592. : 0.); if (y == 1.) c = (x < 8. ? 2388. : 0.); if (y == 2.) c = (x < 8. ? 26948. : 165.); if (y == 3.) c = (x < 8. ? 18769. : 597.); if (y == 4.) c = (x < 8. ? 18769. : 2645.); if (y == 5.) c = (x < 8. ? 21073. : 2389.); if (y == 6.) c = (x < 8. ? 21077. : 10582.); if (y == 7.) c = (x < 8. ? 21077. : 10902.); if (y == 8.) c = (x < 8. ? 21076. : 10646.); if (y == 9.) c = (x < 8. ? 21076. : 10650.); if (y == 10.) c = (x < 8. ? 21076. : 10650.); if (y == 11.) c = (x < 8. ? 22101. : 10905.); if (y == 12.) c = (x < 8. ? 22101. : 9877.); if (y == 13.) c = (x < 8. ? 21845. : 1449.); if (y == 14.) c = (x < 8. ? 25940. : 43685.); if (y == 15.) c = (x < 8. ? 43690. : 2730.); float s = SELECT(x,c); if (s == 0.) fragColor = RGB(252.,216.,168.); if (s == 1.) fragColor = RGB(192.,56.,0.); if (s == 2.) fragColor = RGB(0.,0.,0.); } void spr_tree(float x, float y) { float c = 0.; if (y == 0.) c = 0.; if (y == 1.) c = (x < 8. ? 37120. : 10.); if (y == 2.) c = (x < 8. ? 21776. : 681.); if (y == 3.) c = (x < 8. ? 22096. : 2469.); if (y == 4.) c = (x < 8. ? 21844. : 2709.); if (y == 5.) c = (x < 8. ? 25940. : 10853.); if (y == 6.) c = (x < 8. ? 21845. : 2725.); if (y == 7.) c = (x < 8. ? 21861. : 10901.); if (y == 8.) c = (x < 8. ? 21844. : 9878.); if (y == 9.) c = (x < 8. ? 22101. : 10901.); if (y == 10.) c = (x < 8. ? 21845. : 2729.); if (y == 11.) c = (x < 8. ? 21861. : 2661.); if (y == 12.) c = (x < 8. ? 38228. : 682.); if (y == 13.) c = (x < 8. ? 4416. : 26.); if (y == 14.) c = (x < 8. ? 512. : 43680.); if (y == 15.) c = (x < 8. ? 43648. : 2730.); float s = SELECT(x,c); if (s == 0.) fragColor = RGB(252.,216.,168.); if (s == 1.) fragColor = RGB(0.,156.,0.); if (s == 2.) fragColor = RGB(0.,0.,0.); } void spr_player_down(float f, float x, float y) { float c = 0.; if (f == 0.) { if (y == 0.) c = (x < 8. ? 21504. : 21.); if (y == 1.) c = (x < 8. ? 21760. : 85.); if (y == 2.) c = (x < 8. ? 64800. : 2175.); if (y == 3.) c = (x < 8. ? 65312. : 2303.); if (y == 4.) c = (x < 8. ? 39840. : 2790.); if (y == 5.) c = (x < 8. ? 48032. : 2798.); if (y == 6.) c = (x < 8. ? 43648. : 3754.); if (y == 7.) c = (x < 8. ? 59712. : 3435.); if (y == 8.) c = (x < 8. ? 45052. : 16218.); if (y == 9.) c = (x < 8. ? 32751. : 15957.); if (y == 10.) c = (x < 8. ? 61355. : 14999.); if (y == 11.) c = (x < 8. ? 28655. : 11007.); if (y == 12.) c = (x < 8. ? 61423. : 2391.); if (y == 13.) c = (x < 8. ? 28671. : 85.); if (y == 14.) c = (x < 8. ? 15016. : 252.); if (y == 15.) c = (x < 8. ? 16128. : 0.); float s = SELECT(x,c); if (s == 1.) fragColor = RGB(128.,208.,16.); if (s == 2.) fragColor = RGB(255.,160.,68.); if (s == 3.) fragColor = RGB(228.,92.,16.); } if (f == 1.) { if (y == 0.) c = (x < 8. ? 21504. : 21.); if (y == 1.) c = (x < 8. ? 21760. : 85.); if (y == 2.) c = (x < 8. ? 64800. : 2175.); if (y == 3.) c = (x < 8. ? 65312. : 2303.); if (y == 4.) c = (x < 8. ? 39840. : 2790.); if (y == 5.) c = (x < 8. ? 48032. : 2798.); if (y == 6.) c = (x < 8. ? 43648. : 3754.); if (y == 7.) c = (x < 8. ? 59648. : 3947.); if (y == 8.) c = (x < 8. ? 49136. : 2394.); if (y == 9.) c = (x < 8. ? 65468. : 2389.); if (y == 10.) c = (x < 8. ? 48812. : 863.); if (y == 11.) c = (x < 8. ? 49084. : 509.); if (y == 12.) c = (x < 8. ? 49084. : 351.); if (y == 13.) c = (x < 8. ? 49148. : 213.); if (y == 14.) c = (x < 8. ? 10912. : 252.); if (y == 15.) c = (x < 8. ? 0. : 252.); float s = SELECT(x,c); if (s == 1.) fragColor = RGB(128.,208.,16.); if (s == 2.) fragColor = RGB(255.,160.,68.); if (s == 3.) fragColor = RGB(228.,92.,16.); } if (f == 2.) { if (y == 0.) c = 0.; if (y == 1.) c = (x < 8. ? 41280. : 42.); if (y == 2.) c = (x < 8. ? 43472. : 170.); if (y == 3.) c = (x < 8. ? 23252. : 677.); if (y == 4.) c = (x < 8. ? 22261. : 12949.); if (y == 5.) c = (x < 8. ? 60917. : 15963.); if (y == 6.) c = (x < 8. ? 56791. : 3703.); if (y == 7.) c = (x < 8. ? 32348. : 1021.); if (y == 8.) c = (x < 8. ? 31344. : 381.); if (y == 9.) c = (x < 8. ? 60096. : 1375.); if (y == 10.) c = (x < 8. ? 43264. : 1370.); if (y == 11.) c = (x < 8. ? 26112. : 2389.); if (y == 12.) c = (x < 8. ? 23040. : 2646.); if (y == 13.) c = (x < 8. ? 26944. : 6781.); if (y == 14.) c = (x < 8. ? 41296. : 22207.); if (y == 15.) c = (x < 8. ? 0. : 21823.); float s = SELECT(x,c); if (s == 1.) fragColor = RGB(228.,92.,16.); if (s == 2.) fragColor = RGB(128.,208.,16.); if (s == 3.) fragColor = RGB(255.,160.,68.); } } void spr_player_up(float f, float x, float y) { float c = 0.; if (f == 0. || f == 1.) { if (f == 1.) x = 15. - x; if (y == 0.) c = (x < 8. ? 21504. : 21.); if (y == 1.) c = (x < 8. ? 21760. : 85.); if (y == 2.) c = (x < 8. ? 21792. : 2133.); if (y == 3.) c = (x < 8. ? 21856. : 2389.); if (y == 4.) c = (x < 8. ? 21984. : 2901.); if (y == 5.) c = (x < 8. ? 24480. : 2805.); if (y == 6.) c = (x < 8. ? 32640. : 765.); if (y == 7.) c = (x < 8. ? 64960. : 895.); if (y == 8.) c = (x < 8. ? 22000. : 981.); if (y == 9.) c = (x < 8. ? 22000. : 3029.); if (y == 10.) c = (x < 8. ? 22464. : 3029.); if (y == 11.) c = (x < 8. ? 64832. : 2687.); if (y == 12.) c = (x < 8. ? 21824. : 341.); if (y == 13.) c = (x < 8. ? 24512. : 213.); if (y == 14.) c = (x < 8. ? 16320. : 60.); if (y == 15.) c = (x < 8. ? 3840. : 0.); float s = SELECT(x,c); if (s == 1.) fragColor = RGB(128.,208.,16.); if (s == 2.) fragColor = RGB(255.,160.,68.); if (s == 3.) fragColor = RGB(228.,92.,16.); } if (f == 2.) { if (y == 0.) c = (x < 8. ? 43584. : 2.); if (y == 1.) c = (x < 8. ? 43660. : 10.); if (y == 2.) c = (x < 8. ? 43676. : 42.); if (y == 3.) c = (x < 8. ? 43708. : 810.); if (y == 4.) c = (x < 8. ? 43636. : 986.); if (y == 5.) c = (x < 8. ? 43380. : 49365.); if (y == 6.) c = (x < 8. ? 26004. : 28901.); if (y == 7.) c = (x < 8. ? 22164. : 23897.); if (y == 8.) c = (x < 8. ? 43664. : 22362.); if (y == 9.) c = (x < 8. ? 43664. : 21978.); if (y == 10.) c = (x < 8. ? 43616. : 5498.); if (y == 11.) c = (x < 8. ? 21924. : 1493.); if (y == 12.) c = (x < 8. ? 43685. : 938.); if (y == 13.) c = (x < 8. ? 32789. : 362.); if (y == 14.) c = (x < 8. ? 0. : 1360.); if (y == 15.) c = (x < 8. ? 0. : 1360.); float s = SELECT(x,c); if (s == 1.) fragColor = RGB(228.,92.,16.); if (s == 2.) fragColor = RGB(128.,208.,16.); if (s == 3.) fragColor = RGB(255.,160.,68.); } } void spr_player_left(float f, float x, float y) { float c = 0.; if (f == 0.) { if (y == 0.) c = (x < 8. ? 16384. : 21.); if (y == 1.) c = (x < 8. ? 43520. : 341.); if (y == 2.) c = (x < 8. ? 43648. : 5590.); if (y == 3.) c = (x < 8. ? 43520. : 22010.); if (y == 4.) c = (x < 8. ? 63240. : 17918.); if (y == 5.) c = (x < 8. ? 64504. : 1726.); if (y == 6.) c = (x < 8. ? 65288. : 687.); if (y == 7.) c = (x < 8. ? 65288. : 85.); if (y == 8.) c = (x < 8. ? 23224. : 2389.); if (y == 9.) c = (x < 8. ? 22200. : 10879.); if (y == 10.) c = (x < 8. ? 22152. : 10943.); if (y == 11.) c = (x < 8. ? 22536. : 10941.); if (y == 12.) c = (x < 8. ? 43016. : 1686.); if (y == 13.) c = (x < 8. ? 21504. : 5461.); if (y == 14.) c = (x < 8. ? 0. : 170.); if (y == 15.) c = (x < 8. ? 32768. : 170.); } if (f == 1.) { if (y == 0.) c = 0.; if (y == 1.) c = (x < 8. ? 20480. : 5.); if (y == 2.) c = (x < 8. ? 27264. : 85.); if (y == 3.) c = (x < 8. ? 43680. : 1397.); if (y == 4.) c = (x < 8. ? 43648. : 5502.); if (y == 5.) c = (x < 8. ? 48576. : 4479.); if (y == 6.) c = (x < 8. ? 48892. : 431.); if (y == 7.) c = (x < 8. ? 65480. : 171.); if (y == 8.) c = (x < 8. ? 32712. : 21.); if (y == 9.) c = (x < 8. ? 65208. : 421.); if (y == 10.) c = (x < 8. ? 64952. : 682.); if (y == 11.) c = (x < 8. ? 62856. : 1706.); if (y == 12.) c = (x < 8. ? 22024. : 1450.); if (y == 13.) c = (x < 8. ? 43592. : 10581.); if (y == 14.) c = (x < 8. ? 21920. : 10837.); if (y == 15.) c = 2688.; } if (f == 2.) { if (y == 0.) c = 0.; if (y == 1.) c = (x < 8. ? 21504. : 1.); if (y == 2.) c = (x < 8. ? 23200. : 21.); if (y == 3.) c = (x < 8. ? 27304. : 93.); if (y == 4.) c = (x < 8. ? 43680. : 95.); if (y == 5.) c = (x < 8. ? 61296. : 351.); if (y == 6.) c = (x < 8. ? 61375. : 1387.); if (y == 7.) c = (x < 8. ? 65520. : 1066.); if (y == 8.) c = (x < 8. ? 24572. : 21.); if (y == 9.) c = (x < 8. ? 43772. : 90.); if (y == 10.) c = (x < 8. ? 43760. : 106.); if (y == 11.) c = (x < 8. ? 43584. : 362.); if (y == 12.) c = (x < 8. ? 38304. : 1370.); if (y == 13.) c = (x < 8. ? 27296. : 10581.); if (y == 14.) c = (x < 8. ? 21864. : 10837.); if (y == 15.) c = (x < 8. ? 170. : 2688.); } float s = SELECT(x,c); if (s == 1.) fragColor = RGB(128.,208.,16.); if (s == 2.) fragColor = RGB(228.,92.,16.); if (s == 3.) fragColor = RGB(255.,160.,68.); } void spr_player_right(float f, float x, float y) { spr_player_left(f, 15. - x, y); } void spr_sword(float f, float tDirX, float tDirY, float x, float y) { if (f < 4. || f > 32.) return; if (tDirX > 0.) {x = 15. - x;} if (tDirY > 0.) {float temp = y; y = x; x = temp;} if (tDirY < 0.) {float temp = y; y = x; x = 15. - temp;} if (f < 5. || f > 28.) {if (x < 10.) {x -= 4.;}} if (x < 0.) return; float c = 0.; if (y == 0.) c = 0.; if (y == 1.) c = 0.; if (y == 2.) c = 0.; if (y == 3.) c = 0.; if (y == 4.) c = 0.; if (y == 5.) c = (x < 8. ? 0. : 20480.); if (y == 6.) c = (x < 8. ? 0. : 4096.); if (y == 7.) c = (x < 8. ? 43520. : 39594.); if (y == 8.) c = (x < 8. ? 43648. : 39594.); if (y == 9.) c = (x < 8. ? 43520. : 39594.); if (y == 10.) c = (x < 8. ? 0. : 4096.); if (y == 11.) c = (x < 8. ? 0. : 20480.); if (y == 12.) c = 0.; if (y == 13.) c = 0.; if (y == 14.) c = 0.; if (y == 15.) c = 0.; float s = SELECT(x,c); if (s == 1.) fragColor = RGB(128.,208.,16.); if (s == 2.) fragColor = RGB(228.,92.,16.); } void spr_enemy(float f, float tDirX, float tDirY, float x, float y) { if (tDirX > 0.) {x = 15. - x;} if (tDirY > 0.) {float temp = y; y = x; x = 15. - temp;} if (tDirY < 0.) {float temp = y; y = x; x = temp;} if (y >= 8.) y = 15. - y; float c = 0.; if (f == 0.) { if (y == 0.) c = (x < 8. ? 16384. : 4160.); if (y == 1.) c = (x < 8. ? 16384. : 5201.); if (y == 2.) c = (x < 8. ? 16640. : 1365.); if (y == 3.) c = (x < 8. ? 21760. : 5466.); if (y == 4.) c = (x < 8. ? 42000. : 5610.); if (y == 5.) c = (x < 8. ? 25680. : 30053.); if (y == 6.) c = (x < 8. ? 22864. : 22361.); if (y == 7.) c = (x < 8. ? 43344. : 54618.); float s = SELECT(x,c); if (s == 1.) fragColor = RGB(224.,80.,0.); if (s == 2.) fragColor = RGB(255.,255.,255.); if (s == 3.) fragColor = RGB(255.,160.,0.); } if (f == 1.) { if (y == 0.) c = (x < 8. ? 0. : 1040.); if (y == 1.) c = (x < 8. ? 20480. : 1300.); if (y == 2.) c = (x < 8. ? 16384. : 1365.); if (y == 3.) c = (x < 8. ? 21760. : 5466.); if (y == 4.) c = (x < 8. ? 42241. : 5610.); if (y == 5.) c = (x < 8. ? 25601. : 30053.); if (y == 6.) c = (x < 8. ? 22869. : 22361.); if (y == 7.) c = (x < 8. ? 43349. : 54618.); float s = SELECT(x,c); if (s == 1.) fragColor = RGB(224.,80.,0.); if (s == 2.) fragColor = RGB(255.,255.,255.); if (s == 3.) fragColor = RGB(255.,160.,0.); } if (x >= 8.) x = 15. - x; if (y >= 8.) y = 15. - y; if (f == 2. || f == 5. || f == 7.) { if (y == 0.) c = 0.; if (y == 1.) c = 0.; if (y == 2.) c = 0.; if (y == 3.) c = (x < 8. ? 64. : 0.); if (y == 4.) c = (x < 8. ? 32768. : 0.); if (y == 5.) c = (x < 8. ? 17408. : 0.); if (y == 6.) c = (x < 8. ? 32768. : 0.); if (y == 7.) c = (x < 8. ? 26112. : 0.); float s = SELECT(x,c); if (mod(floor(iGlobalTime * 10.),2.) == 0.) { if (s == 2.) s = 1.; else if (s == 1.) s= 2.; } if (s == 1.) fragColor = RGB(255.,255.,255.); if (s == 2.) fragColor = RGB(104.,136.,255.); } if (f == 3. || f == 6.) { if (y == 0.) c = 0.; if (y == 1.) c = (x < 8. ? 4. : 0.); if (y == 2.) c = (x < 8. ? 32. : 0.); if (y == 3.) c = (x < 8. ? 32832. : 0.); if (y == 4.) c = (x < 8. ? 33024. : 0.); if (y == 5.) c = (x < 8. ? 17408. : 0.); if (y == 6.) c = (x < 8. ? 40960. : 0.); if (y == 7.) c = (x < 8. ? 26240. : 0.); float s = SELECT(x,c); if (mod(floor(iGlobalTime * 10.),2.) == 0.) { if (s == 2.) s = 1.; else if (s == 1.) s= 2.; } if (s == 1.) fragColor = RGB(255.,255.,255.); if (s == 2.) fragColor = RGB(104.,136.,255.); } } void background(vec2 p) { float tileX = floor((p.x - 8.0) / 16.0); float tileY = floor((p.y - 8.0) / 16.0); float pixelX = mod((p.x - 8.0), 16.0); float pixelY = 15.0 - mod((p.y - 8.0), 16.0); if ((tileX >= -4. && tileX <= 2. && tileY >= -2. && tileY <= 0.) || (tileX == -5. && tileY == 1.) || (tileX == -5. && tileY == -3.) || (tileX == 3. && tileY == 1.) || (tileX == 3. && tileY == -3.) || (tileX == 5. && tileY == -1.) || (tileX == -1. && tileY == -3.) || (tileX == -7. && tileY == -1.) || ((mod(tileX, 2.0) == 0. || mod(tileY, 2.0) == 0.) && ((tileX >= -6. && tileX <= 4.) || (tileY >= -4. && tileY <= 2.)))) { if (mod(pixelX * 5.5 + pixelY * 4.,21.) == 0.) fragColor = mix(RGB(252.,206.,168.),RGB(252.,196.,118.),length(p / 256.)); else fragColor = RGB(252.,216.,168.); } else { if (tileX >= -5. && tileX <= 3. && tileY >= -3. && tileY <= 2.) spr_tree(pixelX,pixelY); else spr_rock(pixelX,pixelY); } } void mainImage( out vec4 oFragColor, in vec2 fragCoord ) { float size = 2.; if (iResolution.y < 200.) size = 1.; if (iResolution.y > 600.) size = 4.; vec2 uv = floor((fragCoord.xy - iResolution.xy / 2.0) / size); background(uv); float time = floor(iGlobalTime * 60.0); const float walkTime = 60.0 * 5.0; float walkIndex = floor(time / walkTime); float walkFrame = mod(time, walkTime); vec2 lastPlayerPos = hashPos(walkIndex - 1.); vec2 curPlayerPos = hashPos(walkIndex); vec2 playerPos = lastPlayerPos; float dirX = 0., dirXRand = 0.; float dirY = 0., dirYRand = 0.; float dirRand = floor(abs(hash(floor(time / 50.0))) * 4.0); if (dirRand == 0.) dirXRand = 1.; else if (dirRand == 1.) dirXRand = -1.; else if (dirRand == 2.) dirYRand = 1.; else dirYRand = -1.; float frame = floor(mod(time / 6.0,2.0)); float swordFrame = 0.; if (hash(walkIndex * 3.84) < 0.) { float yDisp = abs(lastPlayerPos.y - curPlayerPos.y); float xDisp = abs(lastPlayerPos.x - curPlayerPos.x); float ySign = sign(curPlayerPos.y - lastPlayerPos.y); float xSign = sign(curPlayerPos.x - lastPlayerPos.x); if (walkFrame < yDisp) { playerPos = vec2(lastPlayerPos.x,lastPlayerPos.y + ySign * walkFrame); dirY = ySign; } else if (walkFrame < yDisp + xDisp - 16.0) { playerPos = vec2(lastPlayerPos.x + xSign * (walkFrame - yDisp),curPlayerPos.y); dirX = xSign; } else if (walkFrame < yDisp + xDisp - 16.0 + 40.0) { dirX = xSign; frame = 2.; swordFrame = walkFrame - (yDisp + xDisp - 16.0); playerPos = vec2(lastPlayerPos.x + xSign * (xDisp - 16.0),curPlayerPos.y); } else if (walkFrame < yDisp + xDisp - 16.0 + 56.0) { dirX = xSign; playerPos = vec2(lastPlayerPos.x + xSign * (walkFrame - (yDisp - 16.0 + 56.0)),curPlayerPos.y); } else { frame = 0.; if (walkFrame < yDisp + xDisp - 16.0 + 90.) dirX = xSign; playerPos = curPlayerPos; } } else { float yDisp = abs(lastPlayerPos.y - curPlayerPos.y); float xDisp = abs(lastPlayerPos.x - curPlayerPos.x); float ySign = sign(curPlayerPos.y - lastPlayerPos.y); float xSign = sign(curPlayerPos.x - lastPlayerPos.x); if (walkFrame < xDisp) { dirX = xSign; playerPos = vec2(lastPlayerPos.x + xSign * walkFrame,lastPlayerPos.y); } else if (walkFrame < yDisp + xDisp - 16.0) { dirY = ySign; playerPos = vec2(curPlayerPos.x,lastPlayerPos.y + ySign * (walkFrame - xDisp)); } else if (walkFrame < yDisp + xDisp - 16.0 + 40.0) { frame = 2.; swordFrame = walkFrame - (yDisp + xDisp - 16.0); dirY = ySign; playerPos = vec2(curPlayerPos.x,lastPlayerPos.y + ySign * (yDisp - 16.0)); } else if (walkFrame < yDisp + xDisp - 16.0 + 56.0) { dirY = ySign; playerPos = vec2(curPlayerPos.x,lastPlayerPos.y + ySign * (walkFrame - (xDisp - 16.0 + 56.0))); } else { frame = 0.; if (walkFrame < yDisp + xDisp - 16.0 + 90.) dirY = ySign; playerPos = curPlayerPos; } } if (dirX == 0. && dirY == 0.) { dirY = dirYRand; dirX = dirXRand; frame = 0.; } const int enemyNum = 3; for(int i = 0; i < enemyNum; i++) { float wi = walkIndex + float(i); vec2 eLastPos = hashPos(wi - 1.); vec2 eCurPos = hashPos(wi); vec2 ePos = vec2(0,0); float eDirX = 0.; float eDirY = 0.; float yDisp = abs(eCurPos.y - eLastPos.y); float xDisp = abs(eCurPos.x - eLastPos.x); float ySign = sign(eCurPos.y - eLastPos.y); float xSign = sign(eCurPos.x - eLastPos.x); float eFrame = floor(mod((time + 2.5) / 6.0,2.0)); if (hash(wi * 3.84) < 0.) { if (eLastPos.x != eCurPos.x) { float s = (hash(wi) < 0. ? 1. : -1.); float y = (xDisp + yDisp - (walkFrame - walkTime * float(i))); float yc = abs(hash(wi)) * 64. + 64.; if (y < 0.) { ePos = eCurPos; eDirY = s; eFrame = 2. + floor(abs(y / 5.)); } else if (y < yc) { ePos = vec2(eCurPos.x, eCurPos.y + s * yc + s * (y - yc)); eDirY = s; } else { ePos = vec2(eCurPos.x, eCurPos.y + s * yc - s * (y - yc)); eDirY = -s; } } } else { if (eLastPos.y != eCurPos.y) { float s = (hash(wi) < 0. ? 1. : -1.); float x = (xDisp + yDisp - (walkFrame - walkTime * float(i))); float xc = abs(hash(wi)) * 64. + 64.; if (x < 0.) { ePos = eCurPos; eDirX = s; eFrame = 2. + floor(abs(x / 5.)); } else if (x < xc) { ePos = vec2(eCurPos.x + s * xc + s * (x - xc), eCurPos.y); eDirX = -s; } else { ePos = vec2(eCurPos.x + s * xc - s * (x - xc), eCurPos.y); eDirX = s; } } } ePos = floor(ePos); if ((eDirX != 0. || eDirY != 0.) && uv.x >= ePos.x - 8. && uv.x <= ePos.x + 7. && uv.y >= ePos.y - 8. && uv.y <= ePos.y + 7.) { float epx = uv.x - ePos.x + 8.; float epy = ePos.y - uv.y + 7.; spr_enemy(eFrame, eDirX, eDirY, epx, epy); } } if (frame == 2.) { float spx = 0.; float spy = 0.; if (dirX > 0.) {spx = 15.; spy = -1.;} if (dirX < 0.) {spx = -15.; spy = -1.;} if (dirY > 0.) {spx = -3.; spy = 15.;} if (dirY < 0.) {spx = 1.; spy = -15.;} if (uv.x >= playerPos.x - 8. + spx && uv.x <= playerPos.x + 7. + spx && uv.y >= playerPos.y - 7. + spy && uv.y <= playerPos.y + 8. + spy) { float sx = uv.x - playerPos.x + 8. - spx; float sy = playerPos.y - uv.y + 8. + spy; spr_sword(swordFrame,dirX,dirY,sx,sy); } } if (uv.x >= playerPos.x - 8. && uv.x <= playerPos.x + 7. && uv.y >= playerPos.y - 7. && uv.y <= playerPos.y + 8.) { float px = uv.x - playerPos.x + 8.; float py = playerPos.y - uv.y + 8.; if (dirX > 0.) spr_player_right(frame,px,py); if (dirX < 0.) spr_player_left(frame,px,py); if (dirY > 0.) spr_player_up(frame,px,py); if (dirY < 0.) spr_player_down(frame,px,py); } oFragColor = fragColor; } void main(void) { //just some shit to wrap shadertoy's stuff vec2 FragCoord = vTexCoord.xy*global.OutputSize.xy; FragCoord.y = -FragCoord.y; mainImage(FragColor,FragCoord); }