-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRACE.MIN.JS
More file actions
1 lines (1 loc) · 8.44 KB
/
Copy pathRACE.MIN.JS
File metadata and controls
1 lines (1 loc) · 8.44 KB
1
(function(app,params){const drawLineCached=h.drawLine.bind(h),fillRectCached=h.fillRect.bind(h),drawImageCached=h.drawImage.bind(h),drawCircleCached=h.drawCircle.bind(h),drawRectCached=h.drawRect.bind(h),drawPolyCached=h.drawPoly.bind(h),SFX={FLAP:"HOLO/RADROACH_RACES/FLAP.WAV",WINNER:"HOLO/RADROACH_RACES/WINNER.WAV"},dirty=new Int16Array(20);let mainLoopInterval=null,countdownTimer=null;const ROACH_SPEED=4,ROACH_WALL_SPEED=4;let gameState="COUNTDOWN",winnerId=-1,countdownValue=5,currentMapId=0,trackWalls=new Int16Array(0),goalPos={x:0,y:0,w:18,h:18,hitW:16,hitH:16},radroaches=[],trackDirty=1,lastFlapTime=0,roachImage=null;const rotOpts={rotate:0},ROACH_NAMES={1:"CIRCLE",2:"TRIANGLE",3:"DELTA",4:"SQUARE",5:"DIAMOND"},ROACH_HIT_R=11.4,ROACH_R_SUM=2*ROACH_HIT_R,JITTER_COS=new Float32Array(21),JITTER_SIN=new Float32Array(21);for(let t=-10;t<=10;t++){const a=.017453292519943295*t;JITTER_COS[t+10]=Math.cos(a),JITTER_SIN[t+10]=Math.sin(a)}function loadTrack(){let MAP_DATA=eval(fs.readFileSync("HOLO/RADROACH_RACES/MAPS.JS"));currentMapId=params&¶ms.mapId>0?params.mapId-1:Math.randInt(16);let base=0;for(let t=0;t<currentMapId;t++)base+=5+4*MAP_DATA[base+4];const wallCount=MAP_DATA[base+4];trackWalls=new Int16Array(4*wallCount);for(let t=0;t<wallCount;t++){const a=base+5+4*t,o=4*t;trackWalls[o]=MAP_DATA[a],trackWalls[o+1]=MAP_DATA[a+1],trackWalls[o+2]=MAP_DATA[a+2],trackWalls[o+3]=MAP_DATA[a+3]}goalPos.x=MAP_DATA[base],goalPos.y=MAP_DATA[base+1];const startX=MAP_DATA[base+2],startYBase=MAP_DATA[base+3];MAP_DATA=null,app.gc();const horizSpawn=2===currentMapId||3===currentMapId||5===currentMapId||7===currentMapId||11===currentMapId||12===currentMapId,slots=horizSpawn?[0,21,42,63,84]:[0,23,44,65,86];for(let t=4;t>0;t--){const a=Math.randInt(t+1),o=slots[t];slots[t]=slots[a],slots[a]=o}radroaches=[];for(let t=0;t<5;t++)radroaches.push({id:t+1,cx:startX+7+(horizSpawn?slots[t]:0),cy:startYBase+7+(horizSpawn?0:slots[t]),vx:0,vy:0}),setRandomVelocity(radroaches[t],ROACH_SPEED)}function tickCountdown(){"COUNTDOWN"===gameState&&(h.setColor(0).fillRect(0,0,480,320),drawTrack(),drawAllRoaches(),countdownValue>0?(h.setFont("Monofonto96").setFontAlign(0,0).setColor(3).drawString(countdownValue.toString(),240,160),h.setColor(0).fillRect(67,226,407,275).setColor(3).drawRect(69,228,405,273),h.setFont("Monofonto36").setFontAlign(0,-1).setColor(3).drawString("PLACE YOUR BETS!!!",240,230),countdownValue--):(clearInterval(countdownTimer),countdownTimer=null,gameState="RACING",trackDirty=1))}function drawRoachShape(t){"ram";const a=t.cx,o=t.cy;if(1===t.id)return drawCircleCached(a,o,ROACH_HIT_R),void 0;if(4===t.id){const t=.7071067811865476*ROACH_HIT_R;return drawRectCached(a-t,o-t,a+t,o+t),void 0}if(5===t.id)return drawPolyCached([a,o-ROACH_HIT_R,a+ROACH_HIT_R,o,a,o+ROACH_HIT_R,a-ROACH_HIT_R,o],!0),void 0;const r=3===t.id?1.5707963267948966:-1.5707963267948966;drawPolyCached([a+ROACH_HIT_R*Math.cos(r),o+ROACH_HIT_R*Math.sin(r),a+ROACH_HIT_R*Math.cos(r+2.0943951023931953),o+ROACH_HIT_R*Math.sin(r+2.0943951023931953),a+ROACH_HIT_R*Math.cos(r-2.0943951023931953),o+ROACH_HIT_R*Math.sin(r-2.0943951023931953)],!0)}function drawAllRoaches(){"ram";if(roachImage){for(let t=0;t<radroaches.length;t++){const a=radroaches[t];h.setColor(2),drawRoachShape(a),rotOpts.rotate=Math.atan2(a.vy,a.vx)+1.5707963267948966,h.setColor(3),drawImageCached(roachImage,a.cx,a.cy,rotOpts)}h.setColor(3)}else{h.setColor(3);for(let t=0;t<radroaches.length;t++)drawRoachShape(radroaches[t])}}function drawTrack(t,a,o,r){"ram";void 0===t&&(t=0,a=0,o=480,r=320),t<=465&&o>=18&&a<=298&&r>=18&&h.setColor(3).drawRect(18,18,465,298);for(let e=0;e<trackWalls.length;e+=4){const l=trackWalls[e],n=trackWalls[e+1],c=trackWalls[e+2],s=trackWalls[e+3],i=void 0,d=void 0,y=void 0,A=void 0;(l<c?c:l)<t||(l<c?l:c)>o||(n<s?s:n)<a||(n<s?n:s)>r||drawLineCached(l,n,c,s)}o>=225&&t<=320&&r>=302&&a<=316&&h.setFont("Monofonto14").setFontAlign(0,-1).setColor(3).drawString("Radroach Races ~ Map "+(currentMapId+1),240,302);const e=goalPos.x-6,l=goalPos.y-8,n=goalPos.x+goalPos.w+6,c=goalPos.y+goalPos.h+11;o>=e&&t<=n&&r>=l&&a<=c&&h.setColor(3).fillRect(goalPos.x,goalPos.y,goalPos.x+goalPos.w,goalPos.y+goalPos.h).setColor(2).fillRect(goalPos.x+6,goalPos.y-8,goalPos.x+11,goalPos.y).fillRect(goalPos.x-6,goalPos.y+6,goalPos.x,goalPos.y+11)}function setRandomVelocity(t,a){const o=void 0,r=.017453292519943295*Math.randInt(400);t.vx=Math.cos(r)*a,t.vy=Math.sin(r)*a}function jitterVelocity(t){"ram";const a=Math.randInt(21),o=JITTER_COS[a],r=JITTER_SIN[a],e=t.vx,l=t.vy;t.vx=e*o-l*r,t.vy=e*r+l*o}function checkWallCollision(t){"ram";let a=!1;const o=ROACH_HIT_R;t.cx-o<=18?(t.cx=18+o,t.vx=t.vx<0?-t.vx:t.vx,a=!0):t.cx+o>=465&&(t.cx=465-o,t.vx=t.vx>0?-t.vx:t.vx,a=!0),t.cy-o<=18?(t.cy=18+o,t.vy=t.vy<0?-t.vy:t.vy,a=!0):t.cy+o>=298&&(t.cy=298-o,t.vy=t.vy>0?-t.vy:t.vy,a=!0);for(let r=0;r<trackWalls.length;r+=4){const e=trackWalls[r],l=trackWalls[r+1],n=void 0,c=void 0,s=trackWalls[r+2]-e,i=trackWalls[r+3]-l,d=s*s+i*i;let y=d>0?((t.cx-e)*s+(t.cy-l)*i)/d:0;y<0?y=0:y>1&&(y=1);const A=e+y*s,v=l+y*i,R=t.cx-A,C=t.cy-v,x=R*R+C*C;if(x<o*o&&x>0){const r=Math.sqrt(x),e=R/r,l=C/r,n=o-r;t.cx+=e*n,t.cy+=l*n;const c=t.vx*e+t.vy*l;if(c<0){t.vx-=2*c*e,t.vy-=2*c*l;const o=Math.sqrt(t.vx*t.vx+t.vy*t.vy);o>0&&(t.vx=t.vx/o*ROACH_WALL_SPEED,t.vy=t.vy/o*ROACH_WALL_SPEED),jitterVelocity(t),a=!0}}}if(a){getTime()-lastFlapTime>=.2&&(lastFlapTime=getTime(),Pip.audioStart(SFX.FLAP));const a=t.vx<0?-t.vx:t.vx,r=t.vy<0?-t.vy:t.vy;let e=0;if(t.cx-o<=19?a<1.5&&(t.vx=1.5,e=1):t.cx+o>=464&&a<1.5&&(t.vx=-1.5,e=1),t.cy-o<=19?r<1.5&&(t.vy=1.5,e=1):t.cy+o>=297&&r<1.5&&(t.vy=-1.5,e=1),e){const a=Math.sqrt(t.vx*t.vx+t.vy*t.vy);a>0&&(t.vx=t.vx/a*ROACH_WALL_SPEED,t.vy=t.vy/a*ROACH_WALL_SPEED)}}}function checkRoachCollisions(){"ram";for(let t=0;t<radroaches.length;t++)for(let a=t+1;a<radroaches.length;a++){const o=radroaches[t],r=radroaches[a],e=ROACH_R_SUM,l=o.cx-r.cx,n=o.cy-r.cy,c=l*l+n*n;if(c<e*e&&c>0){const t=Math.sqrt(c),a=l/t,s=n/t,i=e-t;o.cx+=a*i*.5,o.cy+=s*i*.5,r.cx-=a*i*.5,r.cy-=s*i*.5;const d=void 0;if((o.vx-r.vx)*a+(o.vy-r.vy)*s>=0)continue;const y=o.vx*a+o.vy*s,A=r.vx*a+r.vy*s;o.vx+=(A-y)*a,o.vy+=(A-y)*s,r.vx+=(y-A)*a,r.vy+=(y-A)*s;let v=Math.sqrt(o.vx*o.vx+o.vy*o.vy);v>0&&(o.vx=o.vx/v*ROACH_SPEED,o.vy=o.vy/v*ROACH_SPEED),v=Math.sqrt(r.vx*r.vx+r.vy*r.vy),v>0&&(r.vx=r.vx/v*ROACH_SPEED,r.vy=r.vy/v*ROACH_SPEED),jitterVelocity(o),jitterVelocity(r),getTime()-lastFlapTime>=.2&&(lastFlapTime=getTime(),Pip.audioStart(SFX.FLAP))}}}function updatePhysics(){"ram";if("RACING"!==gameState)return;if(trackDirty)return trackDirty=0,h.setColor(0).fillRect(0,0,480,320),drawTrack(),drawAllRoaches(),h.flip(),Pip.lastFlip=getTime(),void 0;let t=0;h.setColor(0);const a=ROACH_HIT_R;for(let o=0;o<radroaches.length;o++){const r=radroaches[o],e=r.cx-a-4,l=r.cy-a-4,n=r.cx+a+4,c=r.cy+a+4;fillRectCached(e,l,n,c),dirty[t++]=e,dirty[t++]=l,dirty[t++]=n,dirty[t++]=c}for(let t=0;t<radroaches.length;t++){const a=radroaches[t];a.cx+=a.vx,a.cy+=a.vy,checkWallCollision(a)}checkRoachCollisions();let o=dirty[0],r=dirty[1],e=dirty[2],l=dirty[3];for(let t=4;t<20;t+=4)dirty[t]<o&&(o=dirty[t]),dirty[t+1]<r&&(r=dirty[t+1]),dirty[t+2]>e&&(e=dirty[t+2]),dirty[t+3]>l&&(l=dirty[t+3]);h.setClipRect(o,r,e,l),drawTrack(o,r,e,l),h.setClipRect(0,0,480,320);const n=goalPos.x-a,c=goalPos.x+goalPos.hitW+a,s=goalPos.y-a,i=goalPos.y+goalPos.hitH+a;for(let t=0;t<radroaches.length;t++){const a=radroaches[t];if(a.cx>=n&&a.cx<=c&&a.cy>=s&&a.cy<=i){gameState="GAMEOVER",winnerId=a.id,Pip.audioStart(SFX.WINNER);break}}drawAllRoaches(),"GAMEOVER"===gameState&&displayWinner(),h.flip(),Pip.lastFlip=getTime()}function displayWinner(){h.setColor(0).fillRect(120,130,360,190).setColor(3).drawRect(122,132,358,188),h.setFont("Monofonto16").setFontAlign(0,-1).setColor(3).drawString('"'+ROACH_NAMES[winnerId]+'" ROACH WINS!!!',240,140).setFont("Monofonto14").drawString("Press left wheel to race again!",240,167)}function mainLoop(){"ram";"RACING"===gameState&&updatePhysics()}function onKnob1(t){0===t&&"GAMEOVER"===gameState&&app.go(app.scenes.TITLE)}loadTrack();try{const t=JSON.parse(fs.readFileSync("HOLO/RADROACH_RACES/ROACH.JSON"));roachImage={bpp:t.bpp,buffer:atob(t.buffer),height:t.height,transparent:t.transparent,width:t.width}}catch(t){roachImage=null}return Pip.onExclusive("knob1",onKnob1),countdownTimer=setInterval(tickCountdown,1e3),tickCountdown(),mainLoopInterval=setInterval(mainLoop,33),{remove:function(){mainLoopInterval&&(clearInterval(mainLoopInterval),mainLoopInterval=null),countdownTimer&&(clearInterval(countdownTimer),countdownTimer=null),Pip.removeListener("knob1",onKnob1)}}});