-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.min.html
2 lines (2 loc) · 10.8 KB
/
index.min.html
1
2
<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>Lunar Lander</title><meta name="viewport" content="width=device-width, initial-scale=1" /><style type="text/css">body{margin:0;overflow:hidden;}#c{background:black;}</style></head><body><canvas id="c"></canvas><script type="text/javascript">'use strict';const iH=1080,cv=document.getElementById('c'),cx=cv.getContext('2d'),cP=1,rD=1e3,g=1.62,iM=25,iS=125,sD=3e-4,mD=0.02,iMW=200,iMH=35,iSP=1040,nLH=135,nLW=160,iLS=0.5,iLH=nLH*iLS,iLW=nLW*iLS,sLA=900,sLV=12,sLF=100,lTP=320,lFBR=3.5,lFUM=2550/sLF,lMD=2150,lI=new Image,eI=new Image;let sF=1,pd=!0,rRF=new Date().getTime()+500,lPT=0,sP=iSP*sF,lA=sLA,lV=sLV,lEO=!1,lF=sLF,lM=lMD+lF*lFUM,rW,rL;lI.src='data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjE1OS45OSIgaGVpZ2h0PSIxMzQuOTkiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgOTEwIDU1MCAxMDAgMTAwIiBmaWxsPSIjMDAwMDAwIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjkxMCA1NTAgNzkuOTk3MDA5IDY3LjQ5NjAwMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PG1ldGFkYXRhPjxyZGY6UkRGPjxjYzpXb3JrIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+PGRjOnRpdGxlLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0ibTk4OS4xOSA2MTEuODJoLTMuNzY1bC04LjUwNS0yMC43MjdjLTAuMDgtMC4xOTUtMC4yMzQtMC4zNTItMC40MjgtMC40MzZsLTYuNjUtMi44Njh2LTAuMTY5YzAtMC40NDYtMC4zNjItMC44MDgtMC44MDktMC44MDhoLTUuMjg3bC0wLjQxMy0xLjc0M2gwLjE3MmMwLjI2OCAwIDAuNTE4LTAuMTMzIDAuNjY4LTAuMzU0IDAuMTUtMC4yMjIgMC4xODItMC41MDIgMC4wODQtMC43NTFsLTMuMTQ5LTcuOTc5Yy0wLjEyMi0wLjMwOS0wLjQyLTAuNTExLTAuNzUyLTAuNTExaC0xLjA1M2MyLjI0NS0yLjM3IDMuNTQtNS41NDggMy41NC04Ljg1IDAtMi4yNjYtMC41OTktNC40OTMtMS43My02LjQ0M2wtMi40NjgtNC44N2MtMS42Ni0zLjI3Ny00Ljk3NC01LjMxMi04LjY0Ny01LjMxMnMtNi45ODcgMi4wMzYtOC42NDcgNS4zMTJsLTIuNDY4IDQuODdjLTEuMTMyIDEuOTUtMS43MyA0LjE3Ny0xLjczIDYuNDQzIDAgMC45NiAwLjExMyAxLjkwOSAwLjMyMyAyLjgzMWgtNC42OTNjLTAuNDQ2IDAtMC44MDggMC4zNjItMC44MDggMC44MDh2MS42M2MtMS41MTcgMS4zNzMtMi4zOCAzLjMwOC0yLjM4IDUuMzY5czAuODYzIDMuOTk2IDIuMzggNS4zNjl2MS42MjljMCAwLjQ0NiAwLjM2MiAwLjgwOSAwLjgwOCAwLjgwOWgzLjg4MWwtMC40MTMgMS43NDJoLTUuMjg4Yy0wLjQ0NiAwLTAuODA4IDAuMzYyLTAuODA4IDAuODA5djAuMTY4bC02LjY1IDIuODY5Yy0wLjE5NCAwLjA4NC0wLjM0OCAwLjI0LTAuNDI4IDAuNDM2bC04LjUwNSAyMC43MjdoLTMuNzY1Yy0wLjQ0NiAwLTAuODA4IDAuMzYxLTAuODA4IDAuODA4IDAgMi42ODUgMi4xODQgNC44NjcgNC44NjcgNC44NjdoMC40MmMyLjY4NCAwIDQuODY3LTIuMTgzIDQuODY3LTQuODY3IDAtMC40NDYtMC4zNjItMC44MDgtMC44MDgtMC44MDhoLTMuMDI3bDEuODEyLTQuNDE2IDYuNTE3LTIuMDM4aDE5Ljg4bC0wLjQzOCAyLjk5NGMtMC4wMzQgMC4yMzEgMC4wMzUgMC40NjggMC4xODggMC42NDUgMC4xNTMgMC4xNzggMC4zNzYgMC4yOCAwLjYxMSAwLjI4aDQuMzAxdjIuNTM1aC0zLjUzMWMtMC40NDYgMC0wLjgwOCAwLjM2MS0wLjgwOCAwLjgwOCAwIDIuNjg1IDIuMTg0IDQuODY3IDQuODY3IDQuODY3aDAuNDJjMi42ODQgMCA0Ljg2OC0yLjE4MyA0Ljg2OC00Ljg2NyAwLTAuNDQ2LTAuMzYyLTAuODA4LTAuODA5LTAuODA4aC0zLjM5MXYtMi41MzVoNC4zMDFjMC4yMzQgMCAwLjQ1OC0wLjEwMyAwLjYxMS0wLjI4czAuMjIyLTAuNDEzIDAuMTg4LTAuNjQ1bC0wLjQzOC0yLjk5NGgxOS44OGw2LjUxNyAyLjAzOCAxLjgxMiA0LjQxNmgtMy4wMjZjLTAuNDQ2IDAtMC44MDkgMC4zNjEtMC44MDkgMC44MDggMCAyLjY4NSAyLjE4NCA0Ljg2NyA0Ljg2NyA0Ljg2N2gwLjQyYzIuNjg1IDAgNC44NjgtMi4xODMgNC44NjgtNC44NjcgMmUtMyAtMC40NDYtMC4zNTktMC44MDgtMC44MDYtMC44MDh6bS03My45MDQgNC4wNTloLTAuNDJjLTEuNTE0IDAtMi43OS0xLjA0LTMuMTQ5LTIuNDQyaDYuNzE5Yy0wLjM2MSAxLjQwMi0xLjYzNyAyLjQ0Mi0zLjE1IDIuNDQyem0zNC44NTIgMGgtMC40MmMtMS41MTQgMC0yLjc4OS0xLjA0LTMuMTQ5LTIuNDQyaDYuNzE5Yy0wLjM2IDEuNDAyLTEuNjM2IDIuNDQyLTMuMTUgMi40NDJ6bTI0Ljc0NC0yNC4xNTUtNS4wMzkgNi4zMjR2LTguNDk4em0tMjQuODg0LTEuNDQ5LTMuNDgtMS44NDZoNi45NnptLTYuOTI3LTEuODQ1IDUuODEyIDMuMDg0LTYuOTkyIDEyLjIzNmgtNi40MTJ2LTE1LjMyem02LjExOSA1LjgwM3Y5LjUxNmgtNS40Mzh6bTEuNjE3IDAgNS40MzggOS41MTZoLTUuNDM4em0wLjMwNy0yLjcxOSA1LjgxMi0zLjA4NWg3LjU5MXYxNS4zMmgtNi40MTJ6bTExLjIwMy04LjA2aC0xLjUwNmwtMS4yNDUtNi4zNjJoMC4yNHptLTI0LjYzOCAwIDIuNTExLTYuMzYyaDAuMjRsLTEuMjQ1IDYuMzYyem0xLjU5Mi0xMy40ODYgNi4wOTcgNS41MDdoLTIuMjc3Yy0xLjg0LTEuNDM2LTMuMTUzLTMuMzQ5LTMuODItNS41MDd6bS0wLjUwMi0zLjM0M2MwLTEuNjEgMC4zNDYtMy4xOTggMS4wMDYtNC42NTFoNi4yNjZ2MS42MDJsLTcuMjY5IDMuMTY2YzAtMC4wMzktM2UtMyAtMC4wNzctM2UtMyAtMC4xMTd6bTEwLjQyMS0xMS45Mjl2NS42NjJoLTQuMjcxbDIuMDM5LTUuNjYyem0zLjg0OSAwIDIuMDM4IDUuNjYyaC00LjI3MXYtNS42NjJ6bTguMTg4IDExLjkyOWMwIDAuMDM5LTNlLTMgMC4wNzgtM2UtMyAwLjExN2wtNy4yNjktMy4xNjZ2LTEuNjAyaDYuMjY2YzAuNjYxIDEuNDU0IDEuMDA2IDMuMDQxIDEuMDA2IDQuNjUxem0tMTUuMTg2IDcuMjgtNi4zOTgtNS43NzkgNi4zOTgtMi43ODd6bTEuNjE2IDEuNTcxdi0xMy41MDFoNC42ODN2MTMuNTAxem02LjI5OS0xMC4xMzcgNi4zOTggMi43ODctNi4zOTggNS43Nzl6bS0xMS44NzkgMTEuNzUzaDQuMjU1bC0wLjUzNCA2LjM2MmgtNC45NjZ6bTUuODc3IDBoNC4wODlsMC41MzQgNi4zNjJoLTUuMTU3em02LjI0NCA2LjM2Mi0wLjUzMy02LjM2Mmg0LjI1NWwxLjI0NSA2LjM2MnptMC40My03Ljk3OCA2LjA5OC01LjUwN2MtMC42NjcgMi4xNTgtMS45OCA0LjA3LTMuODIgNS41MDd6bTIuNTc2LTE5LjQzMyAyLjE4NyA0LjMxNWgtMi41OTZsLTIuMDM4LTUuNjYyaDEuNTg3YzAuMzI1IDAuNDE1IDAuNjE1IDAuODY0IDAuODYgMS4zNDd6bS0yLjU2MS0yLjk2M2gtOS4yOWMxLjMzMi0wLjkzNyAyLjk0MS0xLjQ2MyA0LjY0NS0xLjQ2M3MzLjMxMyAwLjUyNyA0LjY0NSAxLjQ2M3ptLTExLjg1IDIuOTYzYzAuMjQ1LTAuNDgzIDAuNTM1LTAuOTMyIDAuODYtMS4zNDdoMS41ODdsLTIuMDM4IDUuNjYyaC0yLjU5NnptLTExLjU4MyAyMS4yMmMwLTEuMDEyIDAuMjctMS45ODMgMC43NjQtMi44MzJ2NS42NjNjLTAuNDk0LTAuODQ3LTAuNzY0LTEuODE5LTAuNzY0LTIuODMxem0yLjM4LTYuMTloNC4zNjVjMC42MDQgMS42MyAxLjUzNSAzLjEzMiAyLjczOCA0LjQwM2gtMS4wNTNjLTAuMzMyIDAtMC42MyAwLjIwMy0wLjc1MSAwLjUxMWwtMi45NDggNy40NjdoLTIuMzUxem00LjczNCAxMy45OTdoMjMuMzQ5bDAuNDEzIDEuNzQzaC0yNC4xNzV6bS04LjE3IDEyLjk3OC01LjA0LTYuMzI0IDUuMDQtMi4xNzR6bS01LjYzIDUuNzAyYy0wLjA4MiAwLTAuMTY0IDAuMDEyLTAuMjQxIDAuMDM2bC01LjM1NSAxLjY3NiA1LjEyMi0xMi40ODEgNi4xMDUgNy42NjF2My4xMDh6bTcuMjQ2LTE1LjMyaDIuMDkzdjE1LjMyaC0yLjA5M3ptMTQuMDU0IDE5LjIzOSAwLjMzNi0yLjMwM2gzLjAzdjIuMzAzem04LjM0OSAwaC0zLjM2NnYtMi4zMDNoMy4wMjl6bTE0LjA1My0zLjkxOWgtMi4wOTN2LTE1LjMyaDIuMDkzem03LjQ4OCAwLjAzNmMtMC4wNzgtMC4wMjQtMC4xNTktMC4wMzctMC4yNDEtMC4wMzdoLTUuNjN2LTMuMTA3bDYuMTA0LTcuNjYyIDUuMTIyIDEyLjQ4MnptOS40MTcgMTIuMDkzaC0wLjQyYy0xLjUxNCAwLTIuNzg5LTEuMDQtMy4xNDktMi40NDJoNi43MTljLTAuMzYxIDEuNDAyLTEuNjM3IDIuNDQyLTMuMTUgMi40NDJ6Ii8+PHBhdGggZD0ibTk0MC4xNyA1OTcuNDNjMS43ODIgMCAzLjIzMi0xLjQ1IDMuMjMyLTMuMjMycy0xLjQ1LTMuMjMxLTMuMjMyLTMuMjMxLTMuMjMyIDEuNDQ5LTMuMjMyIDMuMjMxIDEuNDUgMy4yMzIgMy4yMzIgMy4yMzJ6bTAtNC44NDljMC44OTEgMCAxLjYxNiAwLjcyNiAxLjYxNiAxLjYxNiAwIDAuODkyLTAuNzI1IDEuNjE2LTEuNjE2IDEuNjE2LTAuODkyIDAtMS42MTYtMC43MjUtMS42MTYtMS42MTYgMC0wLjg5IDAuNzI0LTEuNjE2IDEuNjE2LTEuNjE2eiIvPjxwYXRoIGQ9Im05NjAuMSA1OTAuOTZjLTEuNzgyIDAtMy4yMzIgMS40NDktMy4yMzIgMy4yMzFzMS40NSAzLjIzMiAzLjIzMiAzLjIzMiAzLjIzMi0xLjQ1IDMuMjMyLTMuMjMyLTEuNDUtMy4yMzEtMy4yMzItMy4yMzF6bTAgNC44NDdjLTAuODkyIDAtMS42MTYtMC43MjUtMS42MTYtMS42MTZzMC43MjUtMS42MTYgMS42MTYtMS42MTYgMS42MTYgMC43MjYgMS42MTYgMS42MTZjMCAwLjg5Mi0wLjcyNiAxLjYxNi0xLjYxNiAxLjYxNnoiLz48L2c+PC9zdmc+';eI.src='data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjE1OS45OSIgaGVpZ2h0PSIxMzQuOTkiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgOTEwIDU1MCAxMDAgMTAwIiBmaWxsPSIjMDAwMDAwIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjkxMCA1NTAgNzkuOTk3MDA5IDY3LjQ5NjAwMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PG1ldGFkYXRhPjxyZGY6UkRGPjxjYzpXb3JrIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+PGRjOnRpdGxlLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMSkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmNzQ3NCIgc3Ryb2tlLXdpZHRoPSIuNXB4Ij48cGF0aCBkPSJtOTI1IDYwNy4yMSAyLjIwNDMgOC4yMjY1IDIuMTM0OS03Ljk2NzUiLz48cGF0aCBkPSJtOTI5LjM0IDYwNy40NyAyLjIwNDMgOC4yMjY1IDIuMTM0OS03Ljk2NzUiLz48cGF0aCBkPSJtOTMzLjY4IDYwNy43MyAyLjIwNDMgOC4yMjY1IDIuMTM0OS03Ljk2NzUiLz48L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTkwMCAtMSkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmNzQ3NCIgc3Ryb2tlLXdpZHRoPSIuNXB4Ij48cGF0aCBkPSJtOTI1IDYwNy4yMSAyLjIwNDMgOC4yMjY1IDIuMTM0OS03Ljk2NzUiLz48cGF0aCBkPSJtOTI5LjM0IDYwNy40NyAyLjIwNDMgOC4yMjY1IDIuMTM0OS03Ljk2NzUiLz48cGF0aCBkPSJtOTMzLjY4IDYwNy43MyAyLjIwNDMgOC4yMjY1IDIuMTM0OS03Ljk2NzUiLz48L2c+PC9zdmc+',window.addEventListener('resize',hR),hR(),window.addEventListener('keydown',()=>{lEO=!0}),window.addEventListener('keyup',()=>{pd&&rRF&&rRF<new Date().getTime()&&start(),lEO=!1}),window.addEventListener('mousedown',()=>{lEO=!0}),window.addEventListener('mouseup',()=>{pd&&rRF&&rRF<new Date().getTime()&&start(),lEO=!1}),window.addEventListener('touchstart',()=>{lEO=!0}),window.addEventListener('touchend',()=>{pd&&rRF&&rRF<new Date().getTime()&&start(),lEO=!1});function start(){hR(),lPT=0,lA=sLA,lV=sLV,lF=sLF,lEO=!1,rW=rL=rRF=!1,pd=!1}function hR(){cv.width=window.innerWidth,cv.height=window.innerHeight,sF=cv.height/iH,sP=iSP*sF,cx.strokeStyle='white',cx.clearRect(0,0,cv.width,cv.height),cx.lineWidth=2;const a=Math.round(sD*cv.width*cv.height);cx.fillStyle='white';for(let f=0;f<a;f++){const g=Math.random()*cv.width,h=Math.random()*(iSP*sF);cx.fillRect(g,h,1,1)}cx.beginPath(),cx.moveTo(0,sP),cx.lineTo(cv.width,sP),cx.stroke();const b=Math.floor(0.5*cv.width*mD);cx.fillStyle='black';const c=(cv.width-iLW*sF)/2,d=c+iLW*sF;let e=[];for(let f=0;f<b;f++){const g=Math.random()*(cv.width+iMW)-iMW,h=g+Math.random()*iMW/2+iMW/4,j=h+Math.random()*iMW/2+iMW/4,k=Math.random()*(3*(iMH/2))+iMH/3;g<c&&j>=c||g<=d&&j>d||(cx.beginPath(),cx.moveTo(g,sP+1),cx.lineTo(h,sP-k*sF),cx.lineTo(j,sP+1),cx.stroke(),e.push([g,h,j,k]))}for(let f=0;f<e.length;f++)cx.beginPath(),cx.moveTo(e[f][0],sP+2),cx.lineTo(e[f][1],sP-e[f][3]*sF),cx.lineTo(e[f][2],sP+2),cx.fill()}function physics(a){if(!pd){0==lPT&&(lPT=a);const b=(a-lPT)/1e3;lPT=a,(pd||0>=lF)&&(lEO=!1),lEO&&(lF-=lFBR*b),lM=lMD+lF*lFUM;const d=lEO?lTP/lM:0;lV+=g*b-d,lA-=lV*b,0>=lA&&(4.5>lV?rW=!0:rL=!0,lA=0,pd=!0),rRF=new Date().getTime()+rD}}function an(a){const b=iSP*sF,c=iLW*sF,d=(cv.width-c)/2,e=iLH*sF,f=b-(lA+iLH)*sF,g=pd;if(g||(cx.clearRect(d-cP,0,c+2*cP,b-2),cx.clearRect(0,b+1,cv.width,cv.height-b-2)),physics(a),!g){cx.drawImage(lI,d,f,c,e),lEO&&cx.drawImage(eI,d,f,c,e);const j=Math.round(0.75*(cv.height-b));cx.font=`${j}px sans-serif`;let k=0;const l=[[`${Math.round(lV)}m/s`,4.5>lV?'white':'red'],[`${Math.round(lA)}m`,'white'],[`${Math.ceil(100*(lF/sLF))}%`,0.2>=lF/sLF?'red':'white'],[`${Math.ceil(lM)}kg`,'white'],[lEO?'BURN':'','white']];l.forEach(m=>{cx.fillStyle=m[1],cx.fillText(m[0],iM+iS*k*sF,j+b),k+=1})}const h=Math.round(48*sF);cx.font=`${h}px sans-serif`,cx.fillStyle='white',rW?cx.fillText('You win!',cv.width/2-95*sF,cv.height/2):rL&&cx.fillText('You lose!',cv.width/2-95*sF,cv.height/2),cx.font=`${0.75*h}px sans-serif`,pd&&rRF&&rRF<new Date().getTime()&&cx.fillText('Press to play',cv.width/2-105*sF,cv.height/2+100*sF),requestAnimationFrame(an)}requestAnimationFrame(an);</script></body></html>