diff --git a/README.md b/README.md index 2c1ed27..0c2bc89 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -# LudemDare46 \ No newline at end of file +# LudumDare46 + +entry for ludum dare 46 \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..09bb064 --- /dev/null +++ b/index.html @@ -0,0 +1,25 @@ + + + + + title + + + + + + + + \ No newline at end of file diff --git a/pixelmix.ttf b/pixelmix.ttf new file mode 100644 index 0000000..03e1a25 Binary files /dev/null and b/pixelmix.ttf differ diff --git a/scripts/game.js b/scripts/game.js new file mode 100644 index 0000000..e9c1394 --- /dev/null +++ b/scripts/game.js @@ -0,0 +1,1063 @@ +function createCanvas(id) { + var tempCanvas = document.createElement("canvas"); + tempCanvas.id = id; + tempCanvas.width = canvases.cvs.width; + tempCanvas.height = canvases.cvs.height; + tempCanvas.style = "image-rendering:pixelated;image-rendering: crisp-edges;display:none";//display:none; + + document.body.appendChild(tempCanvas); + + canvases[`${id}cvs`] = document.getElementById(id); + canvases[`${id}ctx`] = canvases[`${id}cvs`].getContext("2d"); +} + +function startLoops() { + try {draw} catch (err){console.warn(bug+" no draw function found");return null;} + try {update} catch (err){console.warn(bug+" no update function found");return null;} + try {input} catch (err){seperateInputLoop=false;} + onAssetsLoaded(); + + requestAnimationFrame(drawLoop); + setInterval(updateLoop,1000/updateFPS); + + if(seperateInputLoop) { + setInterval(inputLoop,4); + } +} + +function mousePosition() { + if(drawMode===0) { + return {x:(mousePos.x)-camera.x,y:(mousePos.y)-camera.y}; + } else if(drawMode===1) { + var xoff = canvases.cvs.width/2; + var yoff = canvases.cvs.height/2; + return {x:((mousePos.x-xoff)/camera.zoom+xoff)-camera.x,y:((mousePos.y-yoff)/camera.zoom+yoff)-camera.y}; + } else { + var xoff = canvases.cvs.width/2; + var yoff = canvases.cvs.height/2; + var tempPos = {x:((mousePos.x-xoff)/camera.zoom+xoff)-camera.x,y:((mousePos.y-yoff)/camera.zoom+yoff)-camera.y}; + + var center = {x:-camera.x + cw/2, y:-camera.y + ch/2}; + var tempAngle = pointTo(center,tempPos) - camera.angle; + var tempDist = dist(center,tempPos); + + return {x:center.x + (Math.cos(tempAngle) * tempDist),y:center.y + (Math.sin(tempAngle) * tempDist)} + } +} + +function addStyle() { + var tempStyle = document.createElement("style"); + tempStyle.id="gamejsstyle"; + document.head.appendChild(tempStyle); + var tempMeta = document.createElement("meta"); + tempMeta.setAttribute("charset","utf-8"); + document.head.appendChild(tempMeta); +} + +function rand(min,max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function radToDeg(rad) {return rad / Math.PI * 180;} +function degToRad(deg) {return deg * Math.PI / 180;} + +function velocity(angle) { + return {x:Math.sin(angle),y:Math.cos(angle)}; +} + +function pointTo(point,targetPoint) { + var adjacent = (targetPoint.x - point.x); + var opposite = (targetPoint.y - point.y); + var h = Math.atan2(opposite, adjacent); + return h; +} + +function loadImagesAndSounds() { + var curpath=""; + context = new AudioContext(); + sfxVolumeNode = context.createGain(); + sfxVolumeNode.connect(context.destination); + bmgVolumeNode = context.createGain(); + bmgVolumeNode.connect(context.destination); + deeper(images,"image"); + deeper(audio,"sound"); + function deeper(curpos,type) { + let addedPath=""; + for(let j=0;jcw-32&&mousePos.y<32) { + if(mousePress[0]&&ImTierdMakemenuwork) { + clickSound.play(); + paused=true; + optionsMenu=!optionsMenu; + } + optionsHover = 25; + } else { + optionsHover = 0; + } + if(mousePos.xcw-64&&mousePos.y<32) { + pauseHover = 25; + if(mousePress[0]) { + clickSound.play(); + paused=!paused; + } + } else { + pauseHover = 0; + } + +} +function addFont() { + var tempStyle = document.createElement("style"); + tempStyle.innerHTML = ` + @font-face { + font-family: 'PixelArial11'; + src: url("./pixelmix.ttf") format('truetype'); + font-weight: 900; + font-style: normal; + + } + html {font-family: 'PixelArial11' !important; font-size: 16px;} + `; + document.head.appendChild(tempStyle); + canvases.ctx.textBaseline = "hanging"; + canvases.ctx.textAlign = "left"; +} +var scaleDefault = 1; +function img(img,x,y,angle=0,sx=scaleDefault,sy=scaleDefault) { + var half = img.drawLimitSize; + if((x+half>drawLimitLeft&&x-halfdrawLimitTop&&y-halfmaxWidth) { //if the string is too big, divide up into smaller strings + var tempTxt = txtList[i].split(" "); //split into individual words + var tempStr=""; //string for measuring size + var addAmount=0; //track where in the txtList we are + txtList.splice(i,1); //remove the too long string + for(let j=0;j= rect2.x - rect2.w/2 && + rect1.x - rect1.w/2 <= rect2.x + rect2.w/2 && + rect1.y + rect1.h/2 >= rect2.y - rect2.h/2 && + rect1.y - rect1.h/2 <= rect2.y + rect2.h/2) { + return true; + } else { + return false; + } +} + +function rectpoint(rect,point) { + if(rect.x + rect.w/2 >= point.x && + rect.x - rect.w/2 <= point.x && + rect.y + rect.h/2 >= point.y && + rect.y - rect.h/2 <= point.y ) { + return true; + } else { + return false; + } +} + +function circlerect(circle,rect) { //credit: https://yal.cc/rectangle-circle-intersection-test/ + let rectHalfWidth = rect.w/2; + let rectHalfHeight = rect.h/2; + let deltaX = circle.x - Math.max(rect.x - rectHalfWidth, Math.min(circle.x, rect.x + rectHalfWidth)); + let deltaY = circle.y - Math.max(rect.y - rectHalfHeight, Math.min(circle.y, rect.y + rectHalfHeight)); + return (deltaX * deltaX + deltaY * deltaY) < (circle.r * circle.r); +} + +function circleOnSideRect(circle,rect) { + let rectHalfWidth = rect.w/2; + let rectHalfHeight = rect.h/2; + let left = rect.x - rectHalfWidth; + let right = rect.x + rectHalfWidth; + let top = rect.y - rectHalfHeight; + let bottom = rect.y + rectHalfHeight; + let cx = circle.x; + let cy = circle.y; + if(cy < top && cx > left && cx < right) { // top side + return 0; + } else if(cy > bottom && cx > left && cx < right) { // bottom side + return 2; + } else if (cx < left && cy > top && cy < bottom) { // left side + return 3; + } else if (cx > right && cy > top && cy < bottom) { // right side + return 1; + } else { + let returnValue=0; // 0 = top, 1 = right, 2 = bottom, 3 = left + let topleft = dist (circle,{x:left,y:top}); + let topright = dist (circle,{x:right,y:top}); + let bottomleft = dist (circle,{x:left,y:bottom}); + let bottomright = dist (circle,{x:right,y:bottom}); + switch(Math.min(topleft,topright,bottomleft,bottomright)) { // find what corner the cricle is closer to, then determine what side it is closer to + case topleft: + var m = slope(rect,{x:left,y:top}); + var mperp = -(1/m); + var b = yIntercept(rect,m); + var bperp = yIntercept(circle,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx left2 && cx < right2) { // top side + return 0; + } else if(cy > bottom2 && cx > left2 && cx < right2) { // bottom side + return 2; + } else if (cx < left2 && cy > top2 && cy < bottom2) { // left side + return 3; + } else if (cx > right2 && cy > top2 && cy < bottom2) { // right side + return 1; + } else { + let returnValue=0; // 0 = top, 1 = right, 2 = bottom, 3 = left + let determiningPoint = {x:cx,y:cy}; + let topleft = dist (determiningPoint,{x:left2,y:top2}); + let topright = dist (determiningPoint,{x:right2,y:top2}); + let bottomleft = dist (determiningPoint,{x:left2,y:bottom2}); + let bottomright = dist (determiningPoint,{x:right2,y:bottom2}); + switch(Math.min(topleft,topright,bottomleft,bottomright)) { // find what corner the point is closer to, then determine what side it is closer to + case topleft: + var m = slope(rect2,{x:left2,y:top2}); + var mperp = -(1/m); + var b = yIntercept(rect2,m); + var bperp = yIntercept(determiningPoint,mperp); + var mid = POI(m,b,mperp,bperp); + if(cxedge.right) { + rect.v.x *= -1; + rect.x = edge.right-rw; + } + if(rx-rwedge.bottom) { + rect.v.y *= -1; + rect.y = edge.bottom-rh; + } + if(ry-rhedge.right) { + circle.v.x *= -1; + circle.x = edge.right-cr; + } + if(cx-credge.bottom) { + circle.v.y *= -1; + circle.y = edge.bottom-cr; + } + if(cy-cr