const playerSize = 50.; const carSize = 40.; const playerSpeed=.2; const PNJSpeed=.02; const bulletSpeed=playerSpeed*2; const halfSqrtTwo=0.70710678118; const defaulthealth=10; const portalSize=40; const affPortal = true; class Player { constructor (id,x,y,z,name,dir) { this.name=name; this.x=x; this.y=y; this.z=z;//correspond to the map. Ex: 0=>main; 1=>arena this.id=id; this.visibleDir=1; this.dir=dir;//0=stand Still //1=North //2=North-East //3=East //4=South-East //5=South //6=South-West //7=West //8=North-West this.ammo=10; this.health=defaulthealth; this.kill=0; this.death=0; } takeDamage(amount,killerId) { this.health-=amount; if(this.health<=0) { this.death++; this.health=defaulthealth; net.died(this.id,killerId); } } changeDirection(newDirection){ this.dir = newDirection; if(this.dir!=0){ this.visibleDir = newDirection; } } update(squares,circles, dt)//update position { if(this.dir==0) return; let dx,dy; switch(this.dir) { case 1: dx=0.;dy=-playerSpeed;break; case 2: dx=halfSqrtTwo*playerSpeed;dy=-halfSqrtTwo*playerSpeed;break; case 3: dx=playerSpeed;dy=0.;break; case 4: dx=halfSqrtTwo*playerSpeed;dy=halfSqrtTwo*playerSpeed;break; case 5: dx=0.;dy=playerSpeed;break; case 6: dx=-halfSqrtTwo*playerSpeed;dy=halfSqrtTwo*playerSpeed;break; case 7: dx=-playerSpeed;dy=0.;break; case 8: dx=-halfSqrtTwo*playerSpeed;dy=-halfSqrtTwo*playerSpeed;break; default: } this.x += dx*dt; this.y += dy*dt; squares.forEach(square => { if(square.collide(this.x,this.y,this.z)) { this.x-=dx*dt; this.y-=dy*dt; this.dir=0; return; } }); circles.forEach(circle => { if(circle.collide(this.x,this.y,this.z)) { this.x-=dx*dt; this.y-=dy*dt; this.dir=0; return; } }); } get angle() { return (this.visibleDir-3)*3.1415926535/4.; } } class Bullet { constructor (x,y,z,dx,dy,id) { if(z==player.z) bulletSound.play(); this.x=x; this.y=y; this.z=z; this.dx=dx; this.dy=dy; this.deleted=false; this.shooterId=id; } update(dt) { if(!this.deleted) { this.x+=this.dx*dt*bulletSpeed; this.y+=this.dy*dt*bulletSpeed; } } checkCollisions(squares,circles)//only the client's player /!\ { if(this.deleted) return; if(player!=null && player.z==this.z && player.id!=this.shooterId && Math.sqrt((player.x-this.x)**2+(player.y-this.y)**2) { if(square.collide(this.x,this.y,this.z)) { this.deleted=true; return; } }); circles.forEach((circle) => { if(circle.collide(this.x,this.y,this.z)) { this.deleted=true; return; } }); } } class Square { constructor(x,y,z,width,heigth) { this.x=x; this.y=y; this.z=z; this.w=width; this.h=heigth; } collide(x,y,z) { return this.z==z && this.x<=x && x<=this.x+this.w && this.y<=y && y<=this.y+this.h; } } class Circle { constructor(x,y,z,radius) { this.x=x; this.y=y; this.z=z; this.r=radius; } collide(x,y,z) { return this.z==z && (x-this.x)**2+(y-this.y)**2 <= this.r**2; } } class Car { constructor(type, spawn) { this.type=type; // 0 circule vers le haut // 1 circule vers le bas this.z=0; if(this.type == 1) { //vers le bas this.x=1247; this.y=-40; this.dir=4; this.angle=Math.PI/2; } else { //vers le haut this.x=947; this.y=1000; this.dir=2; this.angle=-Math.PI/2; } this.drift=0; this.spawn=spawn; this.tick=0; } collide(x,y,z) { if(this.z!=z) { return false; } let cx=this.x-carSize/2; let cy=this.y-carSize/2; let collide = (cx<=x && x<=cx+carSize && cy<=y && y<=cy+carSize); if(collide) { driftSound.play() this.drift=1000; } return collide; } Update(dt) { if(this.tick==0 && (new Date()).getSeconds()%60==this.spawn) { this.tick=1; } if(this.tick>0) { this.ChangeDirection(); switch (this.dir) { case 1: this.x=this.x+this.tick break; case 2: this.y=this.y-this.tick break; case 3: this.x=this.x-this.tick break; case 4: this.y=this.y+this.tick break; } if(this.drift > 0) { this.drift-=dt; }else{ this.drift = 0; } } } pseudoaleatoire() { return Math.floor(Date.now()/1000)%10 } ChangeDirection() { if(this.type == 1) { if(this.x==1247 && this.y==36) { this.dir=3 this.angle=-Math.PI } else if(this.x==430 && this.y==36) { this.dir=4 this.angle=Math.PI/2 } else if(this.x==430 && this.y==330) { //tourner à droite this.dir=1 this.angle=0 } else if(this.x==607 && this.y==330) { if(this.pseudoaleatoire()>5) { //vers le bas this.dir=4 this.angle=Math.PI/2 } } else if(this.x==1247 && this.y==330) { //vers le bas this.dir=4 this.angle=Math.PI/2 } else if(this.x==607 && this.y==551) { //vers la gauche this.dir=3 this.angle=Math.PI } else if(this.x==190 && this.y==551) { //vers le bas this.dir=4 this.angle=Math.PI/2 } else if(this.x==190 && this.y==877) { //vers la droite this.dir=1 this.angle=0 } else if(this.x==907 && this.y==877) { //vers la droite this.dir=4 this.angle=Math.PI/2 } else if(this.x==1247 && this.y==550) { if(this.pseudoaleatoire()>5) { //vers la gauche this.dir=3 this.angle=Math.PI } } else if(this.x==910 && this.y==550) { //vers le bas this.dir=4 this.angle=Math.PI/2 } else if(this.x==1247 && this.y==840) { //vers la gauche this.dir=3 this.angle=Math.PI } else if(this.x==907 && this.y==840) { //vers le bas this.dir=4 this.angle=Math.PI/2 } else if(this.y>1000) { if(this.drift > 0) { this.drift-- } //tp this.x=1247 this.y=-40 this.tick=0; } } else { if(this.x == 1280 && this.y==75) { this.dir=2 this.y=60 this.angle=-Math.PI/2 } else if(this.y<-40) { this.dir=2 this.x=947 this.y=1000 this.tick=0; } else if(this.x==947 && this.y==875 ) { if(this.pseudoaleatoire()>7) { //tourner à droite this.dir=1 this.angle=0 } } else if(this.x==947 && this.y==839 ) { if(this.pseudoaleatoire()>4) { //tourner à gauche this.dir=3 this.angle=-Math.PI } } else if(this.x==947 && this.y==587) { this.dir=1 this.angle=0 } else if(this.x==1280 && this.y>400) { this.dir=2 this.angle=-Math.PI/2 } else if(this.x==228 && this.y==839) { this.y==823 this.dir=2 this.angle=-Math.PI/2 } else if(this.x==228 && this.y==587) { this.dir=1 this.angle=0 } else if(this.x==644 && this.y==587) { this.dir=2 this.angle=-Math.PI/2 } else if(this.dir==2 && this.y==295) { this.dir=3 this.angle=-Math.PI } else if(this.x==468 && this.y==295) { this.dir=2 this.angle=-Math.PI/2 } else if(this.x==468 && this.y==75) { this.dir=1 this.angle=0 } } } } class PNJ{ constructor(x, y, z){ this.x=x; this.y=y; this.z=z; this.dir=1; } checkCollisions(){ squares.forEach((square) => { if(square.collide(this.x,this.y,this.z)) { return true; } }); circles.forEach((circle) => { if(circle.collide(this.x,this.y,this.z)) { return true; } }); return false; } changeDirection(){ let newDir = Math.floor(Math.random()*8); if(newDir == this.dir){ newDir = (this.dir+3)%4+1; } this.dir = newDir; } update(dt) { if(this.z!=player.z){ return; } let dx,dy; switch(this.dir) { case 1: dx=0.;dy=-PNJSpeed;break; case 2: dx=halfSqrtTwo*PNJSpeed;dy=-halfSqrtTwo*PNJSpeed;break; case 3: dx=PNJSpeed;dy=0.;break; case 4: dx=halfSqrtTwo*PNJSpeed;dy=halfSqrtTwo*PNJSpeed;break; case 5: dx=0.;dy=PNJSpeed;break; case 6: dx=-halfSqrtTwo*PNJSpeed;dy=halfSqrtTwo*PNJSpeed;break; case 7: dx=-PNJSpeed;dy=0.;break; case 8: dx=-halfSqrtTwo*PNJSpeed;dy=-halfSqrtTwo*PNJSpeed;break; default: dx=0;dy=0;break; } this.x+=dx*dt; this.y+=dy*dt; if(this.checkCollisions()){ this.x -= dx*dt; this.y -= dy*dt; this.changeDirection(); } if(Math.random()<=0.001){ this.changeDirection(); } } } class Portal { constructor(xIn,yIn,zIn,xOut,yOut,zOut) { this.in={x:xIn,y:yIn,z:zIn}; this.out={x:xOut,y:yOut,z:zOut}; } update() { if(player.z==this.in.z && player.x>this.in.x && player.xthis.in.y && player.y {if(p.in.z!=z){console.log("WRONG PORTAL DEFINITION FOR MAP",z,", portal :",p);}}); this.z=z; } update() { this.portalsOut.forEach((p)=>p.update()); } }