From e064e963bb1c686dd04163e252e33785e1bd2b3f Mon Sep 17 00:00:00 2001 From: clmaisonha Date: Wed, 29 Jul 2020 20:04:12 +0200 Subject: [PATCH] =?UTF-8?q?Correction=20:=20Les=20robots=20se=20sauvegarde?= =?UTF-8?q?nt=20maintenant=20au=20changement=20de=20langue=20ou=20=C3=A0?= =?UTF-8?q?=20l'ouverture=20de=20la=20page=20description=20Bonus,=20le=20r?= =?UTF-8?q?obot=20s=C3=A9lectionn=C3=A9=20reste=20le=20m=C3=AAme=20au=20ch?= =?UTF-8?q?angement=20de=20langue=20-=20Meilleure=20gestion=20de=20la=20vi?= =?UTF-8?q?tesse=20du=20jeu=20(avec=20la=20vitesse=20du=20jeu=20qui=20s'ap?= =?UTF-8?q?plique=20aux=20sons)=20-=20D=C3=A9but=20de=20la=20mise=20en=20p?= =?UTF-8?q?lace=20des=20constantes=20du=20jeux=20de=20mani=C3=A8re=20dynam?= =?UTF-8?q?ique=20pour=20permettre=20une=20meilleure=20adaptation=20sur=20?= =?UTF-8?q?les=20diff=C3=A9rents=20types=20d'=C3=A9cran=20(t=C3=A9l=C3=A9p?= =?UTF-8?q?hone,=20=C3=A9cran=20un=20peu=20plus=20carr=C3=A9=20...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/public/js/level2.min.js | 2 +- Code/public/json/level30.json | 2 +- Code/public/json/level31.json | 2 +- Code/src/js/level2/Bar.js | 1 - Code/src/js/level2/Game.js | 75 ++++++++++++++++++------------ Code/src/js/level2/GamingBoard.js | 12 ++--- Code/src/js/level2/Robot.js | 33 +++++++++---- Code/src/js/level2/Team.js | 4 +- Code/src/js/level2/Variable.js | 19 ++++++-- Code/src/json/level30.json | 4 +- Code/src/json/level31.json | 4 +- Image/myBot.png | Bin 0 -> 51924 bytes 12 files changed, 101 insertions(+), 57 deletions(-) create mode 100644 Image/myBot.png diff --git a/Code/public/js/level2.min.js b/Code/public/js/level2.min.js index f84cb88..f7d922b 100644 --- a/Code/public/js/level2.min.js +++ b/Code/public/js/level2.min.js @@ -1 +1 @@ -class AddAttack extends AddNode{constructor(e,t,s,i=!0){i?super(e,t,s):super(e,t,s,!1,s.node.percentRange)}create(){console.log("ATTACK"),super.create(),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/16,selectWord("ADD NODE : ATTACK","AJOUTER ACTION : ATTAQUE")),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/3),selectWord("WHO ?","QUI ?")),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/7),selectWord("TARGET FILTERS","FILTRES CIBLES")),super.addButton(WIDTH_WINDOW/2,HEIGHT_WINDOW/3.2,"enemyBot",super.newCategory("target",!0,!0),!1);let e=super.newCategory("range",!0,!0);super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/(16/9),"shortRange",e,1/3),super.addButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/(16/9),"mediumRange",e,2/3),super.addButton(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/12),"longRange",e,1)}addNode(){super.verifyCategory()&&(this.selected.addRect(new RectangleNode(this.selected.getX(),this.selected.getY()+200,this.gameR,"attack",[this.lCategory[1].getValue()])),super.cancel())}modifyNode(){super.verifyCategory()&&(this.selected.node.percentRange=this.lCategory[1].getValue(),this.selected.rect.setFrame(this.selected.node.getFrame()),super.cancel())}}class AddCondition extends AddNode{constructor(e,t,s,i=!0){i?super(e,t,s):s.node.shieldFilter?super(e,t,s,s.node.myself,[s.node.shield,"shield"]):super(e,t,s,s.node.myself,[s.node.range,"range"])}create(){super.create(),console.log("CONDITION"),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/16,selectWord("ADD NODE : CONDITION","AJOUTER ACTION : CONDITION")),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/3),selectWord("WHO ?","QUI ?")),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/7),selectWord("TARGET FILTERS","FILTRES CIBLES"));let e=super.newCategory("target",!0,!0);super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/3.2,"enemyBot",e,!1),super.addButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/3.2,"myself",e,!0);let t=super.newCategory("shield",!0,!0);super.addButton(WIDTH_WINDOW/8,HEIGHT_WINDOW/(16/9),"shortRange",t,[1/3,"range"]),super.addButton(WIDTH_WINDOW/4*1.5,HEIGHT_WINDOW/(16/9),"mediumRange",t,[2/3,"range"]),super.addButton(WIDTH_WINDOW/4,HEIGHT_WINDOW/(16/12),"longRange",t,[1,"range"]);let s=this.add.graphics();s.lineStyle(10,16777215,1),s.lineBetween(WIDTH_WINDOW/2,HEIGHT_WINDOW/2,WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/13)),super.addButton(WIDTH_WINDOW/8*5,HEIGHT_WINDOW/(16/9),"shield0",t,[0,"shield"]),super.addButton(WIDTH_WINDOW/8*7,HEIGHT_WINDOW/(16/9),"shield33",t,[1/3,"shield"]),super.addButton(WIDTH_WINDOW/8*5,HEIGHT_WINDOW/(16/12),"shield66",t,[2/3,"shield"]),super.addButton(WIDTH_WINDOW/8*7,HEIGHT_WINDOW/(16/12),"shield100",t,[1,"shield"])}addNode(){super.verifyCategory()&&("range"===this.lCategory[1].getValue()[1]?this.selected.addRect(new RectangleNode(this.selected.getX(),this.selected.getY()+200,this.gameR,"condition",[this.lCategory[0].getValue(),!1,!0,0,this.lCategory[1].getValue()[0]])):this.selected.addRect(new RectangleNode(this.selected.getX(),this.selected.getY()+200,this.gameR,"condition",[this.lCategory[0].getValue(),!0,!1,this.lCategory[1].getValue()[0],0])),super.cancel())}modifyNode(){super.verifyCategory()&&(this.selected.node.shieldFilter=!1,this.selected.node.rangeFilter=!1,"range"===this.lCategory[1].getValue()[1]?(this.selected.node.rangeFilter=!0,this.selected.node.range=this.lCategory[1].getValue()[0]):(this.selected.node.shieldFilter=!0,this.selected.node.shield=this.lCategory[1].getValue()[0]),this.selected.node.myself=this.lCategory[0].getValue(),this.selected.rect.setFrame(this.selected.node.getFrame()),super.cancel())}}class AddMove extends AddNode{constructor(e,t,s,i=!0){i?super(e,t,s):super(e,t,s,s.node.toward,s.node.enemyBot,s.node.typeBonus)}create(){console.log("MOVE"),super.create(),super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/16,selectWord("ADD NODE : MOVE","AJOUTER ACTION : DEPLACEMENT")),super.addTitle(WIDTH_WINDOW/4,HEIGHT_WINDOW/(16/3),selectWord("FLEE OR MOVE ?","RECULER OU AVANCER ?"));let e=super.newCategory("direction",!0,!0);super.addButton(WIDTH_WINDOW/6,HEIGHT_WINDOW/3.2,"fleeFrom",e,!1),super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/3.2,"moveToward",e,!0),super.addTitle(WIDTH_WINDOW/4*3,HEIGHT_WINDOW/(16/3),selectWord("WHO ?","QUI ?"));let t=super.newCategory("target",!0,!0);super.addButton(WIDTH_WINDOW/6*4,HEIGHT_WINDOW/3.2,"enemyBot",t,!0);let s=super.addButton(WIDTH_WINDOW/6*5,HEIGHT_WINDOW/3.2,"bonus",t,!1),i=super.addTitle(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/7),selectWord("WHAT BONUS ? (OPTIONAL)","QUEL BONUS ? (FACULTATIF)")),h=super.newCategory("target",!0,!1),o=super.addButton(WIDTH_WINDOW/3,HEIGHT_WINDOW/(16/9),"bonusSpeed",h,"speed"),a=super.addButton(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/(16/9),"bonusAttack",h,"attack"),n=super.addButton(WIDTH_WINDOW/2,HEIGHT_WINDOW/(16/12),"bonusShield",h,"shield");t.addEvent(()=>this.clickBonus(s,i,o,a,n)),this.clickBonus(s,i,o,a,n)}clickBonus(e,...t){e.isTinted?t.forEach(e=>e.setVisible(!0)):t.forEach(e=>e.setVisible(!1))}addNode(){super.verifyCategory()&&(this.selected.addRect(new RectangleNode(this.selected.getX(),this.selected.getY()+200,this.gameR,"move",[this.lCategory[0].getValue(),this.lCategory[1].getValue(),this.lCategory[2].getValue()])),super.cancel())}modifyNode(){super.verifyCategory()&&(this.selected.node.toward=this.lCategory[0].getValue(),this.selected.node.enemyBot=this.lCategory[1].getValue(),this.selected.node.typeBonus=this.lCategory[2].getValue(),this.selected.rect.setFrame(this.selected.node.getFrame()),super.cancel())}}class Attack extends Node{constructor(e=1){super("attack"),e>1/3?e>2/3?(e=1,this.percentBonus=1):(e=2/3,this.percentBonus=1.5):(e=1/3,this.percentBonus=2),this.percentRange=e}do(e){return!(!e.haveTarget()||!e.isTargetInRange(this.percentRange))&&e.attackTarget(this.percentBonus)}getFrame(){return 3*this.percentRange-1}getTreeJson(){return super.getTreeJson(this.getOptionJson())}getOptionJson(){return this.percentRange}}class Bar extends HealthBar{constructor(e,t="",s,i,h,o,a,n=new CategoryBar,r=1,l){super(e,t,s,i,h,o,void 0!==l?l:n.valueMax,a,a,!1),console.log(r),this.name=t,this.scene=e,this.scene.input.on("pointerdown",this.doDrag,this);let d={font:i.toString()+"px stencil",fill:"#e2e2e2"};this.text=this.scene.add.text(this.bar.x+this.width+10,this.bar.y,this.value.toString(),d).setOrigin(0,0),this.categoryBar=n,this.setValue(0),this.categoryBar.setValueOf(this,r)}addEvent(e,t){this.event=e,this.context=t,this.doEvent()}doDrag(){let e=this.scene.input;e.x>=this.bar.x-10&&e.x<=this.bar.x+this.width+10&&e.y>=this.bar.y&&e.y<=this.bar.y+this.height&&(this.scene.pauseScene(),this.clickOn())}clickOn(){this.onMove(),this.scene.input.on("pointermove",()=>this.onMove()),this.scene.input.on("pointerup",()=>this.stopClick())}stopClick(){this.scene.input.off("pointermove"),this.scene.input.off("pointerup")}onMove(){this.setValWithX(this.scene.input.x)}doEvent(){void 0!==this.event&&void 0!==this.context&&this.event.call(this.context,this.value)}setValWithX(e){let t=this.value;this.categoryBar.setValueOf(this,Math.round((e-this.bar.x)/this.width*this.valueMax)),t!==this.value&&this.doEvent()}draw(){super.draw();let e=this.value/this.valueMax*this.width-5;this.bar.fillStyle(9868950),this.bar.fillRect(e,0,10,this.height),void 0!==this.text&&this.text.setText(this.value+1)}getJson(e=[]){let t=super.getJson();return t=t.substr(0,t.length-1)+",",t+='"lText":[',e.forEach(e=>{t+='"'+e+'",'}),t=endLineJson(t),t+="]",t+="}"}destroy(){super.destroy(),this.text.destroy(),this.scene.input.off("pointerdown",this.doDrag,this)}}class BonusAttack extends Bonus{constructor(e,t,s){super(e,t,s,"attack")}useOn(e){super.useOn(e),e.setAttackBonus(this.value)}}class BonusHealth{constructor(e,t){this.value=e,this.color=t}decrease(e){this.value-=e;let t=0;return this.value<0&&(t=-this.value,this.value=0),t}}class BonusShield extends Bonus{constructor(e,t,s,i,h){super(e,t,s,"shield"),this.time=i,this.color=h}useOn(e,t){super.useOn(e);let s=new BonusHealth(this.value,this.color);e.shield.addBonus(s),t.time.addEvent({delay:this.time,callback:()=>e.shield.removeBonus(s)})}}class BonusSpeed extends Bonus{constructor(e="",t,s,i){super(e,t,s,"speed"),this.time=i}useOn(e,t){super.useOn(e),e.increaseSpeedBonus(this.value-1),t.time.addEvent({delay:this.time,callback:()=>e.decreaseSpeedBonus(this.value-1)})}}class BonusView extends Phaser.GameObjects.Image{constructor(e,t,s,i){super(e,t,s,i.texture),this.setOrigin(.5,.5),this.displayHeight=HEIGHT_BONUS,this.scaleX=this.scaleY,e.add.existing(this),this.bonus=i}useOn(e){this.bonus.useOn(e,this.scene),this.destroy()}}class Boot extends ManageLang{constructor(e){super("Boot",e)}create(){super.create();this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/3,"WARIA",{font:"200px stencil",fill:"#e2e2e2"}).setOrigin(.5,.5);let e=this.add.sprite(WIDTH_WINDOW/2,HEIGHT_WINDOW/3*2,"playLetter").setInteractive();e.on("pointerout",()=>e.setFrame(0)),e.on("pointerover",()=>e.setFrame(1)),e.on("pointerdown",()=>this.clickPlay(e))}clickPlay(e){console.log("Play"),this.father.scene.add("Type",new Type(this.father)),this.scene.start("Type")}}class Button extends Phaser.GameObjects.Sprite{constructor(e,t,s,i,h,o,a,n=0,r=!0){super(e,t,s,o),this.name=o,this.setInteractive().setVisible(r),this.displayHeight=h,this.displayWidth=i,this.line=n,this.on("pointerout",()=>this.changeFrame(0)),this.on("pointerover",()=>this.changeFrame(1)),this.on("pointerdown",a),this.changeFrame(0),e.add.existing(this)}changeFrame(e=0){this.setFrame(e+2*this.line)}}class Category{constructor(e="undefined",t=!0,s=!0){this.name=e,this.single=t,this.lBtn=[],this.lValue=[],this.obligatory=s}getValue(){return this.single?this.lValue[0]:this.lValue}validate(){return!(0===this.lBtn.length&&this.obligatory)}addEvent(e){this.event=e}add(e,t){0!==this.lBtn.length&&this.single&&(this.lBtn[0].clearTint(),this.lValue=[],this.lBtn=[]),this.lValue.push(t),this.lBtn.push(e),e.tint=COLOR_SELECTED,this.oneChange()}remove(e){let t=this.lBtn.indexOf(e);-1!==t&&(this.lBtn.splice(t,1),this.lValue.splice(t,1)),e.clearTint(),this.oneChange()}oneChange(){void 0!==this.event&&this.event()}}class CategoryBar{constructor(e=VALUE_MAX_BAR,t=1){this.startValue=t,this.valueMax=e,this.point=this.valueMax}addPoint(e){if(this.point+=e,this.point<0){let e=this.point;return this.point=0,e}return this.point>this.valueMax&&(this.point=this.valueMax),0}setValueOf(e,t){let s=t-e.value,i=e.value;this.point>=s?e.setValue(t):e.setValue(e.value+this.point),this.addPoint(i-e.value),this.draw()}addText(e,t,s,i,h){this.text=t;let o={font:h.toString()+"px stencil",fill:"#e2e2e2"};this.textScene=e.add.text(s,i,this.text,o).setOrigin(0,0),this.draw()}setTextPos(e,t){this.textScene.setX(e),this.textScene.setY(t)}setText(e){this.text=e,this.draw()}draw(){this.textScene.setText(this.text+this.point)}destroy(){this.textScene.destroy()}}class Condition extends Node{constructor(e,t=!1,s=!1,i,h){super("condition"),this.shieldFilter=t,this.rangeFilter=s,this.shield=i,this.range=h,this.myself=e,this.lNode=[]}addNode(e){this.lNode.push(e)}do(e){if(this.doCondition(e))for(let t=0;te+=t.getTreeJson()+","),e=endLineJson(e),e+="]}"}getOptionJson(){return this.myself+","+this.shieldFilter+","+this.rangeFilter+","+this.shield+","+this.range}}class Description extends ManageLang{constructor(e){super("Description",e)}create(){super.create();let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW-100,s=this.add.image(e,t,"cancel").setOrigin(.5,.5).setInteractive();s.on("pointerover",()=>s.setFrame(1)),s.on("pointerout",()=>s.setFrame(0)),s.on("pointerdown",()=>this.return()),s.displayHeight=HEIGHT_WINDOW/10,s.scaleX=s.scaleY,this.loadBonus()}loadBonus(){this.width=WIDTH_WINDOW/3-20,this.height=HEIGHT_WINDOW/4;let e=0;this.createList(lShieldBonus,e,!0),e=WIDTH_WINDOW/3,this.createList(lSpeedBonus,e,!1),e=WIDTH_WINDOW/1.5,this.createList(lAttackBonus,e,!1)}createList(e,t,s=!0){let i=50;this.createCategoryBonus(t,i,this.width,this.height*e.length),e.forEach(e=>{let h="";void 0!==e.time&&(h=" - "+selectWord("TIME","TEMPS")+" : "+e.time/1e3);let o="";if(void 0!==e.value){let t="x";s&&(t="+"),o="BONUS : "+t+e.value}this.createBonusDescription(t,i,this.width,this.height,e.texture,e.name,o+h),i+=this.height})}createCategoryBonus(e,t,s,i){e+=10,t+=10,this.add.rectangle(e,t,s,i,8816262).setOrigin(0,0)}createBonusDescription(e,t,s,i,h,o,a){e+=20,t+=20,s-=20,i-=20,this.add.rectangle(e,t,s,i,16777215).setOrigin(0,0);let n=this.add.image(e+5,t+5,h).setOrigin(0,0);n.displayHeight=100,n.scaleX=n.scaleY;let r={font:n.displayHeight/2-o.length+"px stencil",fill:"#000000"};this.add.text(e+n.displayWidth+10,t+5+n.displayHeight/2,o.toString(),r).setOrigin(0,.5),r.font=i/6+"px stencil",this.add.text(e+5,t+n.displayHeight+(i-n.displayHeight)/2,a.toString(),r).setOrigin(0,.5)}return(){this.father.scene.start("Game"),this.father.scene.remove("Description")}}function selectWord(e,t){switch(LANG){case"fr":return t;default:return e}}function newGame(e,t,s=new Game(e,t)){-1!==e.scene.getIndex("Game")&&e.scene.remove("Game"),e.scene.add("Game",s)}function chooseTarget(e,t){let s=2*WIDTH_MAP,i=[];return t.forEach(function(t){if(t!==e){let h=Math.hypot(t.x-e.x,t.y-e.y);s>=h&&(s>h&&(s=h,i=[]),i.push(t))}}),i.length>1?i[Math.floor(Math.random()*(i.length+1))]:i[0]}function toJson(e,t,s=!1){let i;switch(typeof t){case"string":i='"'+e.toString()+'":"'+t+'"';break;default:i='"'+e.toString()+'":'+t}return s||(i+=","),i}function endLineJson(e){return e.length>0&&","===e[e.length-1]&&(e=e.substr(0,e.length-1)),e}function getNextLevel(e=""){let t=e;return t=t.slice(0,-1)+(parseInt(e[e.length-1])+1).toString(),console.log(e[e.length-1]),t[t.length-1]>=NUMBER_LEVEL?e:t}class Game extends ManageLang{constructor(e,t="level1"){super("Game",e),super.addOtherScenes("GamingBoard"),SPEED_GAME=1,this.level=t,this.listPositionRobotInit=[],this.scoreText=0}preload(){let e,t={font:"100px stencil",fill:"#e2e2e2"};this.load.on("start",()=>{(e=this.add.text(.5*WIDTH_WINDOW,.5*HEIGHT_WINDOW,selectWord("LEVEL LOADING ...","CHARGEMENT DU NIVEAU ..."),t).setOrigin(.5,.5)).alpha=.5}),this.load.on("complete",()=>{e.destroy()}),this.cache.json.exists("level")&&this.cache.json.remove("level"),this.load.json("level","public/json/"+this.level+".json"),console.log("PRELOAD"),this.createGamingBoard()}create(){super.create();let e=this.cache.json.get("level");if(void 0!==e)console.log(e),this.loadSave(e),this.gm.setEnemyRobotVisible(e.enemyVisible),this.gm.setBonusVisible(e.bonusVisible),this.doLine=!1,this.createButtons(),this.input.keyboard.on("keydown-DELETE",()=>{this.clickBin()}),this.input.keyboard.on("keydown-E",()=>{this.clickPencil()}),this.input.keyboard.on("keydown-ENTER",()=>{this.clickPlus()}),this.scene.setVisible(!0,"GamingBoard"),this.gm.getMyTeam().drawRange(),this.setScore(0),this.gm.getMyTeam().addEventScore(this.setScore,this);else{console.log("ERROR : LEVEL UNDEFINED"),new Button(this,10,10,WIDTH_BUTTON,WIDTH_BUTTON,"back",()=>this.clickBack()).setOrigin(0,0);let e={font:"50px stencil",fill:"#e2e2e2"};this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/2,selectWord("LEVEL UNDEFINED","NIVEAU INDEFINI"),e).setOrigin(.5,.5)}}update(e,t){super.update(e,t),this.doLine&&this.tree.updateLine()}createGamingBoard(){this.gm=new GamingBoard(this),-1!==this.father.scene.getIndex("GamingBoard")&&this.father.scene.remove("GamingBoard"),this.father.scene.add("GamingBoard",this.gm),this.scene.launch("GamingBoard"),this.gm.pause()}loadSave(e){this.loadBonus(e.lBonus),this.loadTeam(e),this.setRobotSelected(this.gm.getMyTeam().listRobot[0],e)}setRobotSelected(e,t){let s,i;void 0!==this.robotSelected&&this.robotSelected!==e&&void 0!==this.tree&&void 0!==this.initStat?(this.robotSelected.clearTint(),this.tree.sort(),this.robotSelected.setNodes(this.tree.getNode()),i=JSON.parse(this.initStat.getJson()),this.tree.destroy(),this.initStat.destroy(),s=JSON.parse(e.getTreeJson())):(void 0!==this.initStat?(i=JSON.parse(this.initStat.getJson()),e.setDamage(this.initStat.lBar[0].value),e.setSpeedReload(this.initStat.lBar[1].value),e.setSpeed(this.initStat.lBar[2].value),e.setRange(this.initStat.lBar[3].value),this.initStat.destroy()):i=t.initStat,void 0!==this.tree?(s=JSON.parse(this.tree.getJson(!0)),this.tree.destroy()):s=JSON.parse(e.getTreeJson())),this.tree=this.loadTree(s),this.initStat=this.loadInitSave(i,e,e.damage-DAMAGE_BASE,e.speedReload-SPEED_RELOAD_BASE,e.speed-SPEED_BASE,e.range-RANGE_BASE),this.robotSelected=e,this.robotSelected.team.listRobot.length>1&&this.robotSelected.setTint(COLOR_SELECTED)}loadTree(e,t=CENTERX_TREE,s=OFFY_TREE/2){let i;if(void 0!==e.x&&void 0!==e.y)i=new RectangleNode(e.x,e.y,this,e.type,e.option),void 0!==e.lNode&&e.lNode.length>0&&e.lNode.forEach(e=>i.addRect(this.loadTree(e)));else if(i=new RectangleNode(t,s,this,e.type,e.option),void 0!==e.lNode&&e.lNode.length>0){let h=e.lNode.length,o=t-OFFX_TREE/2*(h-1),a=s+OFFY_TREE;e.lNode.forEach(e=>{i.addRect(this.loadTree(e,o,a)),o+=OFFX_TREE})}return i}loadInitSave(e,t,...s){let i=new InitStat(this,OFFX_MAP+WIDTH_MAP+5,OFFY_MAP,200,30,e.valueMax);for(let t=0;t{t+=this.loadT(s.name,s.freeForAll,s.robots,e.robotRandomPosition,t,s.color)}),this.gm.addEventMyTeam(this.setRobotSelected,this)}}loadT(e=MY_TEAM,t,s,i,h=0,o){let a=new Team(e,t);return this.loadRobot(s,i,h).forEach(e=>a.addRobot(e)),void 0!==o&&a.getRobots().forEach(e=>e.setTint(o)),this.gm.addTeam(a),a.listRobot.length}loadRobot(e=[],t=!1,s=0){let i=s,h=[];return e.forEach(e=>{let s=[];e.lNode.forEach(e=>{s.push(this.loadNode(e))}),t&&(void 0===this.listPositionRobotInit[i]?(e.x=Math.random()*(1-e.width/2-e.width/2)+e.width/2,e.y=Math.random()*(1-e.height/2-e.height/2)+e.height/2,this.listPositionRobotInit[i]=new Position(e.x,e.y)):(e.x=this.listPositionRobotInit[i].x,e.y=this.listPositionRobotInit[i].y)),h.push(new Robot(WIDTH_MAP*e.height,WIDTH_MAP*e.width,WIDTH_MAP*e.x,WIDTH_MAP*e.y,this.gm,e.name,e.speed,e.speedReload,e.range,e.damage,s)),i+=1}),console.log(h),h}loadNode(e){let t;switch(e.type){case"condition":t=new Condition(e.option[0],e.option[1],e.option[2],e.option[3],e.option[4]);break;case"move":t=new Move(e.option[0],e.option[1]);break;case"attack":t=new Attack(e.option[0]);break;default:return}return void 0!==e.lNode&&e.lNode.forEach(e=>t.addNode(this.loadNode(e))),t}loadBonus(e=[]){e.forEach(e=>{this.gm.addBonus(this.loadB(e))})}loadB(e){let t;switch(e.style){case"speed":t=lSpeedBonus[e.number];break;case"attack":t=lAttackBonus[e.number];break;case"shield":t=lShieldBonus[e.number];break;default:return null}return new BonusView(this.gm,e.x*WIDTH_MAP,e.y*WIDTH_MAP,t)}finish(){let e;console.log("FINISH"),e=this.gm.winner()?new Winner(this.father,this,this.score):new Looser(this.father,this,this.score),this.father.scene.add("Finish",e),this.scene.pause("Game"),this.scene.launch("Finish"),this.robotSelected=void 0}clickNode(){this.tryClick(),this.selected=this.tree.getSelected(),void 0!==this.selected&&(this.selected!==this.tree&&(this.pencilBtn.setVisible(!0),this.binBtn.setVisible(!0)),this.selected.canAddNode&&this.plusBtn.setVisible(!0))}doDrag(e,t,s,i){t.setX(s),t.setY(i)}dragStart(){console.log("START DRAG"),this.doLine=!0,this.pauseScene()}dragEnd(){console.log("END DRAG"),this.doLine=!1}pauseScene(){this.playBtn.line=0,this.playBtn.changeFrame(0),this.gm.pause()}resume(){this.playBtn.line=1,this.playBtn.changeFrame(0),this.tree.sort(),this.robotSelected.setNodes(this.tree.getNode()),this.gm.resume()}createButtons(){let e=WIDTH_MAP+OFFX_MAP,t=WIDTH_MAP+OFFY_MAP+5,s=WIDTH_BUTTON,i=1.1*s,h=0;new Button(this,10,10,s,s,"back",()=>this.clickBack()).setOrigin(0,0),new Button(this,WIDTH_WINDOW-i,t,s,s,"bonusBtn",()=>this.clickBonus()).setOrigin(1,0),new Button(this,WIDTH_WINDOW,t,s,s,"save",()=>this.clickSave()).setOrigin(1,0),this.playBtn=new Button(this,e,t,s,s,"play",()=>this.clickPlay()).setOrigin(1,0),h=1===SPEED_GAME?0:1,this.speedBtn=new Button(this,e-i,t,s,s,"speed",()=>this.clickSpeed(),h).setOrigin(1,0),this.pencilBtn=new Button(this,e-2*i,t,s,s,"pencil",()=>this.clickPencil(),0,!1).setOrigin(1,0),this.binBtn=new Button(this,e-3*i,t,s,s,"bin",()=>this.clickBin(),0,!1).setOrigin(1,0),this.plusBtn=new Button(this,e-4*i,t,s,s,"plus",()=>this.clickPlus(),0,!1).setOrigin(1,0),h=this.father.sound.mute?1:0,this.muteBtn=new Button(this,e-5*i,t,s,s,"mute",()=>this.clickMute(),h).setOrigin(1,0);let o={font:(s/2).toString()+"px stencil",fill:"#e2e2e2"};this.scoreText=this.add.text(OFFX_MAP,t,"SCORE : "+this.scoreText,o).setOrigin(0,0),this.input.on("pointerdown",()=>this.clickNode()),this.input.on("drag",this.doDrag),this.input.on("dragstart",()=>this.dragStart()),this.input.on("dragend",()=>this.dragEnd())}setScore(e){this.score=e,this.scoreText.setText("SCORE : "+this.score)}clickBonus(){this.father.scene.stop("GamingBoard"),this.father.scene.remove("GamingBoard"),this.father.scene.add("Description",new Description(this.father,this)),this.scene.start("Description")}clickSave(){this.tree.sort((e,t)=>e.getX()-t.getX());let e='{"tree":'+this.tree.getJson()+',"initStat":'+this.initStat.getJson()+"}";console.log(e)}clickPlay(){this.gm.paused?this.resume():this.pauseScene(),this.playBtn.changeFrame(1)}clickSpeed(){1===SPEED_GAME?(SPEED_GAME=2,this.speedBtn.line=1):(SPEED_GAME=1,this.speedBtn.line=0),this.speedBtn.changeFrame(1)}clickPencil(){if(void 0!==this.selected){switch(console.log("PENCIL"),this.selected.type){case"attack":this.father.scene.add("AddNode",new AddAttack(this.father,this,this.selected,!1));break;case"move":this.father.scene.add("AddNode",new AddMove(this.father,this,this.selected,!1));break;case"condition":this.father.scene.add("AddNode",new AddCondition(this.father,this,this.selected,!1));break;default:return}this.scene.pause("Game"),this.scene.launch("AddNode")}}clickBin(){void 0!==this.selected&&(console.log("BIN"),this.tree.delete(this.selected),this.binBtn.changeFrame(0),this.tryClick())}clickPlus(){void 0!==this.selected&&this.selected.canAddNode&&(console.log("PLUS"),this.father.scene.add("PlusNode",new PlusNode(this.father,this,this.selected)),this.scene.launch("PlusNode"),this.plusBtn.changeFrame(0),this.scene.pause("Game"))}clickBack(){console.log("BACK"),this.father.scene.stop("GamingBoard"),this.father.scene.remove("GamingBoard"),this.father.scene.stop("Game"),this.father.scene.start("Type")}clickMute(){console.log("MUTE"),this.father.sound.mute?(this.father.sound.mute=!1,this.muteBtn.line=0):(this.father.sound.mute=!0,this.muteBtn.line=1),this.muteBtn.changeFrame(1)}tryClick(){this.pencilBtn.setVisible(!1),this.binBtn.setVisible(!1),this.plusBtn.setVisible(!1),void 0!=this.selected&&(this.selected.deselect(),this.selected=void 0)}setLevel(e){this.level!==e&&(this.level=e,this.listPositionRobotInit=[],this.robotSelected=void 0),console.log(this.level)}}class GamingBoard extends Phaser.Scene{constructor(e){super("GamingBoard"),this.listTeam=[],listBonus=[],this.father=e,this.end=!1,this.paused=!1}preload(){this.cameras.main.setViewport(OFFX_MAP,OFFY_MAP,WIDTH_MAP,WIDTH_MAP),this.sound.add("shot"),this.sound.add("hit"),this.scene.setVisible(!1,"GamingBoard")}create(){let e=this.add.image(0,0,"background").setOrigin(0,0);e.alpha=.3,e.displayWidth=WIDTH_MAP,e.displayHeight=WIDTH_MAP,this.time.addEvent({delay:2e3,callback:this.upShield,callbackScope:this})}update(e,t){this.end||this.paused||(super.update(e,t),this.listTeam.forEach(e=>{e.actualise(this.getEnemyRobotTeam(e))||this.listTeam.splice(this.listTeam.indexOf(e),1)}),this.listTeam.forEach(e=>e.readAll()),(void 0===this.getMyTeam()||this.listTeam.length<=1)&&(this.end=!0,this.finish()))}addEventMyTeam(e,t){this.getMyTeam().addEvent(e,t)}getEnemyRobotTeam(e){let t=[];return this.listTeam.forEach(s=>{(e.freeForAll||s!==e)&&(t=t.concat(s.getRobots()))}),t}setRobotVisible(e=!0){this.listTeam.forEach(t=>t.setRobotVisible(e))}setEnemyRobotVisible(e=!0){let t=this.getMyTeam();this.listTeam.forEach(s=>{t!==s&&s.setRobotVisible(e)})}setBonusVisible(e=!0){listBonus.forEach(t=>t.setVisible(e))}finish(){this.pause(),this.father.finish()}winner(){return void 0!==this.getMyTeam()}pause(){this.sound.pauseAll(),this.paused=!0}resume(){this.sound.resumeAll(),this.setRobotVisible(!0),this.setBonusVisible(!0),this.paused=!1}addTeam(e){this.listTeam.push(e)}addBonus(e){listBonus.push(e)}modifyNodes(e){let t=this.getMyTeam();return void 0!==t&&(t.modifyNodes(e),!0)}modifyValue(e,t,s,i){let h=this.getMyTeam();return void 0!==h&&(h.modifyValue(e,t,s,i),!0)}getMyTeam(){for(let e=0;ee.listRobot.forEach(e=>{e.addShield(SHIELD_PER_SECOND)})),this.time.addEvent({delay:1e3/SPEED_GAME,callback:this.upShield,callbackScope:this})}}class InitStat{constructor(e,t,s,i,h,o=10){this.scene=e,this.posX=t,this.posY=s,this.width=i,this.height=h,this.category=new CategoryBar(o),this.lBar=[],this.lText=[],this.category.addText(this.scene,selectWord("TOKENS : ","JETONS : "),this.posX,this.posY,this.height)}addBar(e,t,s,i=[]){this.lText.push(i),this.lBar.push(new Bar(this.scene,selectWord(i[0],i[1]),this.width,this.height,this.posX,this.posY,s,this.category,e,t)),this.posY+=1.5*this.height,this.category.setTextPos(this.posX,this.posY)}getJson(){let e="{";e+=toJson("valueMax",this.category.valueMax),e+='"lBar":[';for(let t=0;te.destroy())}}class LevelSelect extends ManageLang{constructor(e,t=""){super("LevelSelect"),this.father=e,this.level=t}create(){super.create();let e={font:(HEIGHT_WINDOW/5).toString()+"px stencil",fill:"#e2e2e2"};this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/6,"WARIA",e).setOrigin(.5,.5);this.createLevel(WIDTH_WINDOW/3,HEIGHT_WINDOW/2,1),this.createLevel(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/2,2)}createLevel(e,t,s=0){let i=WIDTH_WINDOW/8,h=this.add.image(e,t,"rectangle").setOrigin(.5,.5).setInteractive();h.displayHeight=h.displayWidth=i;let o={font:(i/2).toString()+"px stencil",fill:"#000000"},a=this.add.text(e,t,s.toString(),o).setOrigin(.5,.5);h.on("pointerover",()=>this.over(h,a)),h.on("pointerout",()=>this.out(h,a)),h.on("pointerdown",()=>this.click(s)),new Button(this,10,10,WIDTH_BUTTON,WIDTH_BUTTON,"back",()=>this.clickBack()).setOrigin(0,0)}over(e,t){e.setFrame(1),t.setColor("white")}out(e,t){e.setFrame(0),t.setColor("black")}click(e){e-=1,this.level+=e.toString(),newGame(this.father,this.level),this.scene.start("Game")}clickBack(){this.scene.start("Type")}}class LoadFile extends Phaser.Scene{constructor(e,t,s){super("LoadFile"),this.father=e,this.son=s,this.nameSon=t,this.father.scene.pause(this.nameSon),this.father.scene.stop(this.nameSon),this.father.scene.remove("LoadFile")}preload(){let e=this.add.graphics(),t=this.add.graphics(),s=WIDTH_WINDOW/2-160,i=HEIGHT_WINDOW/2-25;t.fillStyle(2236962,.8),t.fillRect(s,i,320,50),this.load.on("progress",function(t){e.clear(),e.fillStyle(16777215,1),e.fillRect(s+10,i+10,300*t,30)}),this.load.on("complete",()=>{e.destroy(),t.destroy()}),this.load.audio("shot","assets/sounds/shot.ogg"),this.load.audio("hit","assets/sounds/hit.ogg"),this.loadImage("en","flags/",!0),this.loadImage("fr","flags/",!0),this.loadImage("bonusSpeed0","bonus/",!0),this.loadImage("bonusSpeed1","bonus/",!0),this.loadImage("bonusSpeed2","bonus/",!0),this.loadImage("bonusAttack0","bonus/",!0),this.loadImage("bonusAttack1","bonus/",!0),this.loadImage("bonusAttack2","bonus/",!0),this.loadImage("bonusShield0","bonus/",!0),this.loadImage("bonusShield1","bonus/",!0),this.loadImage("bonusShield2","bonus/",!0),this.loadImage("enemy","robots/"),this.loadImage("myBot","robots/"),this.loadSprite("playLetter",550,150,"buttons/"),this.loadSprite("cancel",550,150,"buttons/"),this.loadSprite("add",550,150,"buttons/"),this.loadSprite("modify",550,150,"buttons/"),this.loadSprite("home",550,150,"buttons/"),this.loadSprite("next",550,150,"buttons/"),this.loadSprite("retry",550,150,"buttons/"),this.loadSprite("duel",269,262,"buttons/"),this.loadSprite("last",269,262,"buttons/"),this.loadSprite("team",269,262,"buttons/"),this.loadSprite("flag",269,262,"buttons/"),this.loadSprite("map",269,262,"buttons/"),this.loadSprite("play",100,100,"buttons/",!0),this.loadSprite("bin",100,100,"buttons/",!0),this.loadSprite("plus",100,100,"buttons/",!0),this.loadSprite("pencil",100,100,"buttons/",!0),this.loadSprite("speed",100,100,"buttons/",!0),this.loadSprite("mute",100,100,"buttons/",!0),this.loadSprite("save",100,100,"buttons/",!0),this.loadSprite("bonusBtn",100,100,"buttons/",!0),this.loadSprite("back",200,200,"buttons/",!0),this.loadSprite("shortRange",300,150,"buttons/"),this.loadSprite("mediumRange",300,150,"buttons/"),this.loadSprite("longRange",300,150,"buttons/"),this.loadSprite("shield0",300,150,"buttons/"),this.loadSprite("shield33",300,150,"buttons/"),this.loadSprite("shield66",300,150,"buttons/"),this.loadSprite("shield100",300,150,"buttons/"),this.loadSprite("bonusShield",300,150,"buttons/"),this.loadSprite("bonusSpeed",300,150,"buttons/"),this.loadSprite("bonusAttack",300,150,"buttons/"),this.loadSprite("myself",300,150,"buttons/"),this.loadSprite("enemyBot",300,150,"buttons/"),this.loadSprite("bonus",300,150,"buttons/"),this.loadSprite("moveToward",300,150,"buttons/"),this.loadSprite("fleeFrom",300,150,"buttons/"),this.loadSprite("attackNode",180,190,"nodes/",!0),this.loadSprite("moveNode",180,190,"nodes/",!0),this.loadSprite("conditionNode",180,190,"nodes/",!0),this.loadSprite("rectangle",400,400,"buttons/",!0),this.loadImage("background","others/",!0),this.loadImage("bullet","others/",!0),this.loadImage("logoWaria","others/",!0),this.loadImage("attack","nodes/",!0),this.loadImage("move","nodes/",!0),this.loadImage("condition","nodes/",!0),this.cache.json.exists("listBonus")&&(this.cache.json.remove("listBonus"),lSpeedBonus=[],lShieldBonus=[],lAttackBonus=[]),this.load.json("listBonus","public/json/listBonus.json")}create(){this.loadBonus(),-1===this.father.scene.getIndex(this.nameSon)&&this.father.scene.add(this.nameSon,this.son),this.father.scene.start(this.nameSon)}loadBonus(){let e=this.cache.json.get("listBonus");void 0!==e&&(e.lSpeedBonus.forEach(e=>lSpeedBonus.push(new BonusSpeed(selectWord(e.name.en,e.name.fr),e.texture,e.value,e.time))),e.lShieldBonus.forEach(e=>lShieldBonus.push(new BonusShield(selectWord(e.name.en,e.name.fr),e.texture,e.value,e.time,e.color))),e.lAttackBonus.forEach(e=>lAttackBonus.push(new BonusAttack(selectWord(e.name.en,e.name.fr),e.texture,e.value))))}loadSprite(e,t,s,i="",h=!1){this.textures.exists(e)&&h||(this.deleteLoad(e),h?this.load.spritesheet(e,"assets/"+i+e+".png",{frameWidth:t,frameHeight:s}):this.load.spritesheet(e,"assets/lang/"+LANG+"/"+i+e+".png",{frameWidth:t,frameHeight:s}))}loadImage(e,t="",s=!1){this.textures.exists(e)&&s||(this.deleteLoad(e),s?this.load.image(e,"assets/"+t+e+".png"):this.load.image(e,"assets/lang/"+LANG+"/"+t+e+".png"))}deleteLoad(e){this.textures.exists(e)&&this.textures.remove(e)}}class Looser extends Finish{constructor(e,t,s){super(e,t,s)}create(){super.create(),super.addTitle(selectWord("GAME OVER","PARTIE PERDUE")),super.btnRetry(super.createButton(WIDTH_WINDOW/3,"retry")),super.btnHome(super.createButton(WIDTH_WINDOW/1.5,"home"))}}class Missile extends Phaser.GameObjects.Image{constructor(e,t,s,i){super(e,0,0,t),this.visible=!1,this.setOrigin(.5,.5),this.setScale(.02)}}class Move extends Node{constructor(e,t=!0,s){super("move"),this.toward=e,this.enemyBot=t,this.typeBonus=s}do(e){if(this.enemyBot){if(e.verifyTarget())return!0===this.toward?this.moveToward(e):this.fleeFrom(e)}else{let t=chooseTarget(e,this.getListBonus());if(void 0!==t){let s;return(s=!0===this.toward?this.moveToward(e,t):this.fleeFrom(e,t))||(t.useOn(e),listBonus.splice(listBonus.indexOf(t),1),e.target=null),!0}}return!1}getListBonus(){if(void 0!==this.typeBonus){let e=[];return listBonus.forEach(t=>{t.bonus.type===this.typeBonus&&e.push(t)}),e}return listBonus}moveToward(e,t=e.target){return e.advanceTo(t)}fleeFrom(e,t=e.target){return e.fleeFrom(t)}getFrame(){let e;if(e=this.toward?0:5,!this.enemyBot)switch(this.typeBonus){case"speed":e+=2;break;case"attack":e+=3;break;case"shield":e+=4;break;default:e+=1}return e}getTreeJson(){return super.getTreeJson(this.getOptionJson())}getOptionJson(){let e=this.toward+","+this.enemyBot;return void 0!==this.typeBonus&&(e+=',"'+this.typeBonus+'"'),e}}class PlusNode extends Phaser.Scene{constructor(e,t,s){super("PlusNode"),this.father=e,this.gameR=t,this.selected=s}create(){this.add.rectangle(0,0,WIDTH_WINDOW,HEIGHT_WINDOW,0).setOrigin(0,0).setAlpha(.5),this.add.rectangle(0,HEIGHT_WINDOW/2,WIDTH_WINDOW,HEIGHT_WINDOW/2,3487290).setOrigin(0,.5),this.createNode(),this.createButton()}createNode(){let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW/2,s=WIDTH_WINDOW/3,i=HEIGHT_WINDOW/10,h={font:(i/1.5).toString()+"px stencil",fill:"#e2e2e2"};this.add.text(e-s,t-i,selectWord("ATTACK","ATTAQUE"),h).setOrigin(.5,.5),this.add.text(e,t-i,selectWord("MOVE","DEPLACEMENT"),h).setOrigin(.5,.5),this.add.text(e+s,t-i,selectWord("CONDITION","CONDITION"),h).setOrigin(.5,.5);let o=this.add.sprite(e-s,t+i,"attack").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("attack"));o.displayHeight=2*i,o.scaleX=o.scaleY,(o=this.add.sprite(e,t+i,"move").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("move"))).displayHeight=2*i,o.scaleX=o.scaleY,(o=this.add.sprite(e+s,t+i,"condition").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("condition"))).displayHeight=2*i,o.scaleX=o.scaleY}click(e){switch(e.toString()){case"attack":this.father.scene.add("AddNode",new AddAttack(this.father,this.gameR,this.selected));break;case"move":this.father.scene.add("AddNode",new AddMove(this.father,this.gameR,this.selected));break;case"condition":this.father.scene.add("AddNode",new AddCondition(this.father,this.gameR,this.selected))}this.scene.launch("AddNode"),this.scene.stop("PlusNode"),this.father.scene.remove("PlusNode")}createButton(){let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW-100,s=this.add.image(e,t,"cancel").setOrigin(.5,.5).setInteractive();s.on("pointerover",()=>s.setFrame(1)),s.on("pointerout",()=>s.setFrame(0)),s.on("pointerdown",()=>this.cancel()),s.displayHeight=HEIGHT_WINDOW/10,s.scaleX=s.scaleY}cancel(){this.scene.resume("Game"),this.scene.stop("PlusNode"),this.father.scene.remove("PlusNode")}}class Position{constructor(e,t){this.x=e,this.y=t}}class RectangleNode{constructor(e,t,s,i,h=[]){switch(i.toString().toLowerCase()){case"attack":this.rect=new Phaser.GameObjects.Image(s,e,t,"attackNode"),this.node=new Attack(h[0]),this.canAddNode=!1,this.line=s.add.graphics();break;case"move":this.rect=new Phaser.GameObjects.Image(s,e,t,"moveNode"),this.node=new Move(h[0],h[1],h[2]),this.canAddNode=!1,this.line=s.add.graphics();break;case"condition":this.rect=new Phaser.GameObjects.Image(s,e,t,"conditionNode"),this.node=new Condition(h[0],h[1],h[2],h[3],h[4]),this.canAddNode=!0,this.lRect=[],this.scene=s,this.line=s.add.graphics();break;case"waria":this.rect=new Phaser.GameObjects.Image(s,e,t,"logoWaria").setInteractive(),this.canAddNode=!0,this.lRect=[],this.scene=s,this.scene.add.existing(this.rect),this.scene.input.setDraggable(this.rect);break;default:return void console.log("Création d'un node echoué")}"waria"!==i.toString().toLowerCase()&&this.rect.setFrame(this.node.getFrame()),this.type=i,this.rect.on("pointerdown",()=>this.click()),this.rect.setOrigin(.5,0),this.rect.displayHeight=HEIGHT_NODE,this.rect.scaleX=this.rect.scaleY}getSelected(){if(this.rect.isTinted)return this;if(this.canAddNode)for(let e=0;ethis.addLine(e))}addLine(e){e.setLine(this.rect.x,this.rect.y+.9*this.rect.displayHeight)}getNode(){if(void 0===this.node){let e=[];return this.lRect.forEach(function(t){e.push(t.getNode())}),e}return this.canAddNode&&(this.node.clearNodes(),this.lRect.forEach(e=>this.node.addNode(e.getNode()))),this.node}sort(e=((e,t)=>e.getX()-t.getX())){this.canAddNode&&(this.lRect.sort(e),this.lRect.forEach(function(t){t.canAddNode&&t.sort(e)}))}destroy(){this.line.destroy(),this.rect.destroy(),void 0!==this.lRect&&this.lRect.forEach(e=>e.destroy())}delete(e){let t=this.lRect.indexOf(e);if(-1!==t)return this.lRect.splice(t,1),e.destroy(),!0;for(let t=0;tt+=s.getJson(e)+","),t=endLineJson(t)+"]"),t=endLineJson(t),t+="}"}destroy(){this.rect.destroy(),void 0!==this.line&&this.line.destroy(),void 0!==this.lRect&&this.lRect.forEach(e=>e.destroy())}}class Robot{constructor(e,t,s,i,h,o="enemy",a=SPEED_BEGIN,n=SPEED_RELOAD_BEGIN,r=RANGE_BEGIN,l=DAMAGE_BEGIN,d=[]){this.speedBonus=1,this.attackBonus=1,this.name=o,this.height=e,this.width=t,this.x=s,this.y=i,this.life=new HealthBar(h,selectWord("LIFE","VIE"),2*this.width,this.width/3,this.x,this.y-this.width,LIFE,32768),this.shield=new HealthBar(h,selectWord("SHIELD","BOUCLIER"),2*this.width,this.width/3,this.x,this.y-1.5*this.width,SHIELD,255),this.canAttack=!0,this.missile=new Missile(h,"bullet",this.width/5,this.width/4),h.add.existing(this.missile),this.addScene(h),this.lNode=d,this.setSpeed(a),this.setSpeedReload(n),this.setRange(r),this.setDamage(l),this.setX(this.x),this.setY(this.y),this.team=void 0}addScene(e){this.scene=e,"enemy"===this.name?this.circle=this.scene.add.image(this.x,this.y,"enemy").setOrigin(.5,.5).setInteractive():this.circle=this.scene.add.image(this.x,this.y,"myBot").setOrigin(.5,.5).setInteractive(),this.circle.displayWidth=this.width,this.circle.displayHeight=this.height,this.circle.on("pointerdown",()=>this.click())}click(){void 0===this.circleRange?this.drawRange():this.eraseRange(),this.doEvent()}addEvent(e,t){this.eventClick=e,this.contextClick=t}doEvent(){void 0!==this.eventClick&&void 0!==this.contextClick&&this.eventClick.call(this.contextClick,this)}addShield(e){this.shield.increase(e)}setX(e){this.x=e,this.life.setX(this.x),this.shield.setX(this.x),this.circle.setX(this.x),this.drawCircleRange()}setY(e){this.y=e;let t=this.y-this.width,s=this.y-1.5*this.width;t<0?(s=this.y+this.width-this.shield.height,t=this.y+1.5*this.width-this.shield.height):s<0&&(s=t,t=this.y+this.width-this.shield.height),this.life.setY(t),this.shield.setY(s),this.circle.setY(this.y),this.drawCircleRange()}setTint(e){this.circle.setTint(e)}clearTint(){this.circle.clearTint()}setTarget(e){this.target=e}updateTarget(){this.verifyTarget()&&this.setTargetPos(this.target.x,this.target.y)}setTargetPos(e,t){}setDamage(e=this.damage){this.damage=e+DAMAGE_BASE}setRange(e=this.range){this.range=e+RANGE_BASE,this.drawCircleRange()}setSpeed(e=this.speed){this.speed=e+SPEED_BASE}setSpeedReload(e=this.speedReload){this.speedReload=e+SPEED_RELOAD_BASE}setAttackBonus(e){this.attackBonus=e}increaseSpeedBonus(e){this.speedBonus+=e}decreaseSpeedBonus(e){this.speedBonus-=e,console.log(this.speed)}advanceToTarget(){return this.verifyTarget()&&this.advanceTo(this.target),!1}advanceTo(e){if(e.x!==this.x||e.y!==this.y){let t=!1,s=!1,i=this.getVelocity(e),h=i[0]+this.x,o=i[1]+this.y;return i[0]>=0&&h>=e.x||i[0]<=0&&h<=e.x?(this.setX(e.x),t=!0):this.setX(this.x+i[0]),i[1]>=0&&o>=e.y||i[1]<=0&&o<=e.y?(this.setY(e.y),s=!0):this.setY(this.y+i[1]),!(t&&s)}return!1}fleeFromTarget(){return!!this.verifyTarget()&&this.fleeFrom(this.target)}fleeFrom(e){if(this.target.x!==this.x||this.target.y!==this.y){let t=this.getVelocity(e,!0);return t[0]>=0&&this.x-this.width/2<=0?this.setX(this.width/2):t[0]<=0&&this.x+this.width/2>=WIDTH_MAP?this.setX(WIDTH_MAP-this.width/2):this.setX(this.x-t[0]),t[1]>=0&&this.y-this.width/2<=0?this.setY(this.height/2):t[1]<=0&&this.y+this.width/2>=WIDTH_MAP?this.setY(WIDTH_MAP-this.height/2):this.setY(this.y-t[1]),!0}return!1}getVelocity(e,t=!1){let s=[],i=e.x-this.x,h=e.y-this.y,o=Math.hypot(i,h);return s[0]=i/o*SPEED*this.speed*this.speedBonus*SPEED_GAME,s[1]=h/o*SPEED*this.speed*this.speedBonus*SPEED_GAME,t&&(this.x+this.width/2+s[0]>WIDTH_MAP||this.x-this.width/2-s[0]<0?(s[1]+=s[0]*Math.sign(s[1]),s[0]=0):(this.y+this.width/2-s[1]>WIDTH_MAP||this.y-this.width/2+s[1]<0)&&(s[0]+=s[1]*Math.sign(-s[0]),s[1]=0)),s}attackTarget(e=0){return!!this.verifyTarget()&&(this.canAttack&&this.attack(this.target,e),!0)}verifyTarget(){return!!this.haveTarget()&&(!!this.target.isAlive()||(this.setTarget(null),!1))}attack(e,t){this.canAttack=!1,this.missile.setPosition(this.x,this.y).setVisible(!0),this.missile.setRotation(Math.atan2(this.y-this.target.y,this.x-this.target.x)-1.57),this.scene.sound.play("shot");let s=this.calcDistance(this.target)*WIDTH_MAP/1e3/SPEED_GAME;this.scene.tweens.add({targets:this.missile,x:e.x,y:e.y,ease:"Linear",duration:s,onComplete:()=>this.finishAttack(e,t)}),this.scene.time.addEvent({delay:SPEED_RELOAD/this.speedReload/SPEED_GAME,callback:this.reload,callbackScope:this})}finishAttack(e,t){e.beAttack(this.damage*this.attackBonus*DAMAGE*t,this.team)&&this.setTarget(null),this.missile.setVisible(!1),1!==this.attackBonus&&this.setAttackBonus(1)}reload(){this.canAttack=!0}beAttack(e,t){let s=this.shield.decrease(e),i={font:HEIGHT_DAMAGE.toString()+"px stencil",fill:"#ffff00"},h=this.scene.add.text(this.x,this.y,e.toString(),i).setOrigin(0,1);return this.scene.tweens.add({targets:h,x:this.x+30,y:this.y-50,alpha:0,duration:DURATION_DAMAGE,ease:"Sine.easeOut",onComplete:()=>h.destroy()}),this.scene.sound.play("hit"),console.log("HIT"),s>0&&(console.log("Shield Broken"),this.life.decrease(s)),this.addScore(t),this.die()}addScore(e){void 0!==e&&(e.addScore(SCORE_HIT),0===this.life.value&&e.addScore(SCORE_KILL))}isTargetInRange(e=1){return!!this.haveTarget()&&this.calcDistance(this.target)<=this.range*RANGE*e}calcDistance(e){return Math.hypot(e.x-this.x,e.y-this.y)}isAlive(){return this.life.value>0}die(){return 0===this.life.value&&(void 0!==this.circleRange&&this.circleRange.destroy(),this.circle.destroy(),this.shield.destroy(),this.life.destroy(),!0)}haveTarget(){return null!=this.target}read(){this.verifyTarget();for(let e=0;ethis.addNode(e))}setVisible(e){this.circle.setVisible(e),this.life.setVisible(e),this.shield.setVisible(e),void 0!==this.circleRange&&this.circleRange.setVisible(e)}getTreeJson(){let e="{"+toJson("type","waria");return e+='"lNode":[',this.lNode.forEach(t=>e+=t.getTreeJson()+","),e=endLineJson(e),e+="]}"}}class Team{constructor(e="enemy",t=!1){this.freeForAll=t,this.listRobot=[],this.name=e,this.score=0}addEventScore(e,t){this.eventScore=e,this.context=t}addScore(e){this.score+=e,void 0!==this.eventScore&&void 0!==this.context&&this.eventScore.call(this.context,this.score)}addRobot(e){this.listRobot.push(e),e.team=this}readAll(){this.listRobot.forEach(e=>e.read())}getRobots(){return this.listRobot}actualise(e=[]){for(let t=0;t{s.addEvent(e,t)})}modifyValue(e,t,s,i){this.setSpeed(s),this.setRange(i),this.setSpeedReload(t),this.setDamage(e)}setRange(e){this.listRobot.forEach(t=>{t.setRange(e)})}setSpeed(e){this.listRobot.forEach(t=>{t.setSpeed(e)})}setSpeedReload(e){this.listRobot.forEach(t=>{t.setSpeedReload(e)})}setDamage(e){this.listRobot.forEach(t=>{t.setDamage(e)})}drawRange(){this.listRobot.forEach(e=>{e.drawRange()})}modifyNodes(e){this.listRobot.forEach(t=>{t.setNodes(e)})}setRobotVisible(e){this.listRobot.forEach(t=>t.setVisible(e))}}class Type extends ManageLang{constructor(e){super("Type",e)}preload(){}create(){super.create();let e={font:(HEIGHT_WINDOW/5).toString()+"px stencil",fill:"#e2e2e2"};this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/6,"WARIA",e).setOrigin(.5,.5);let t=this.add.sprite(WIDTH_WINDOW/8*3,HEIGHT_WINDOW/4*2,"duel").setInteractive();this.createbutton(t,"level1");let s=this.add.sprite(WIDTH_WINDOW/8*5,HEIGHT_WINDOW/4*2,"last").setInteractive();this.createbutton(s,"level2");let i=this.add.sprite(WIDTH_WINDOW/2,HEIGHT_WINDOW/4*3,"team").setInteractive();this.createbutton(i,"level3")}createbutton(e,t){e.displayHeight=HEIGHT_WINDOW/4,e.scaleX=e.scaleY,e.on("pointerout",()=>e.setFrame(0)),e.on("pointerover",()=>e.setFrame(1)),e.on("pointerdown",()=>this.clickPlay(t))}clickPlay(e){-1!==father.scene.getIndex("LevelSelect")&&this.father.scene.remove("LevelSelect"),this.father.scene.add("LevelSelect",new LevelSelect(this.father,e)),this.scene.start("LevelSelect")}}var listBonus=[],LANG=navigator.language.substr(0,2).toLowerCase(),SPEED_GAME=1,lSpeedBonus=[],lShieldBonus=[],lAttackBonus=[];const MYSELF="myself",MY_TEAM="myTeam",SHIELD_PER_SECOND=5,COLOR_ATTACK=16711680,COLOR_MOVE=255,COLOR_CONDITION=921102,COLOR_RED=16711680,COLOR_ORANGE=16744192,COLOR_GREEN=32768,COLOR_RANGE=32768,COLOR_SPEED_RELOAD=8323327,NUMBER_LEVEL=2,COLOR_SELECTED=15718407,COLOR_MYSELF=6711039,WIDTH_WINDOW=$(document).width()-20,HEIGHT_WINDOW=$(document).height()-20,WIDTH_MAP=WIDTH_WINDOWthis.clickBonus(s,i,o,a,n)),this.clickBonus(s,i,o,a,n)}clickBonus(e,...t){e.isTinted?t.forEach(e=>e.setVisible(!0)):t.forEach(e=>e.setVisible(!1))}addNode(){super.verifyCategory()&&(this.selected.addRect(new RectangleNode(this.selected.getX(),this.selected.getY()+200,this.gameR,"move",[this.lCategory[0].getValue(),this.lCategory[1].getValue(),this.lCategory[2].getValue()])),super.cancel())}modifyNode(){super.verifyCategory()&&(this.selected.node.toward=this.lCategory[0].getValue(),this.selected.node.enemyBot=this.lCategory[1].getValue(),this.selected.node.typeBonus=this.lCategory[2].getValue(),this.selected.rect.setFrame(this.selected.node.getFrame()),super.cancel())}}class Attack extends Node{constructor(e=1){super("attack"),e>1/3?e>2/3?(e=1,this.percentBonus=1):(e=2/3,this.percentBonus=1.5):(e=1/3,this.percentBonus=2),this.percentRange=e}do(e){return!(!e.haveTarget()||!e.isTargetInRange(this.percentRange))&&e.attackTarget(this.percentBonus)}getFrame(){return 3*this.percentRange-1}getTreeJson(){return super.getTreeJson(this.getOptionJson())}getOptionJson(){return this.percentRange}}class Bar extends HealthBar{constructor(e,t="",s,i,h,o,a,n=new CategoryBar,r=1,l){super(e,t,s,i,h,o,void 0!==l?l:n.valueMax,a,a,!1),this.name=t,this.scene=e,this.scene.input.on("pointerdown",this.doDrag,this);let d={font:i.toString()+"px stencil",fill:"#e2e2e2"};this.text=this.scene.add.text(this.bar.x+this.width+10,this.bar.y,this.value.toString(),d).setOrigin(0,0),this.categoryBar=n,this.setValue(0),this.categoryBar.setValueOf(this,r)}addEvent(e,t){this.event=e,this.context=t,this.doEvent()}doDrag(){let e=this.scene.input;e.x>=this.bar.x-10&&e.x<=this.bar.x+this.width+10&&e.y>=this.bar.y&&e.y<=this.bar.y+this.height&&(this.scene.pauseScene(),this.clickOn())}clickOn(){this.onMove(),this.scene.input.on("pointermove",()=>this.onMove()),this.scene.input.on("pointerup",()=>this.stopClick())}stopClick(){this.scene.input.off("pointermove"),this.scene.input.off("pointerup")}onMove(){this.setValWithX(this.scene.input.x)}doEvent(){void 0!==this.event&&void 0!==this.context&&this.event.call(this.context,this.value)}setValWithX(e){let t=this.value;this.categoryBar.setValueOf(this,Math.round((e-this.bar.x)/this.width*this.valueMax)),t!==this.value&&this.doEvent()}draw(){super.draw();let e=this.value/this.valueMax*this.width-5;this.bar.fillStyle(9868950),this.bar.fillRect(e,0,10,this.height),void 0!==this.text&&this.text.setText(this.value+1)}getJson(e=[]){let t=super.getJson();return t=t.substr(0,t.length-1)+",",t+='"lText":[',e.forEach(e=>{t+='"'+e+'",'}),t=endLineJson(t),t+="]",t+="}"}destroy(){super.destroy(),this.text.destroy(),this.scene.input.off("pointerdown",this.doDrag,this)}}class BonusAttack extends Bonus{constructor(e,t,s){super(e,t,s,"attack")}useOn(e){super.useOn(e),e.setAttackBonus(this.value)}}class BonusHealth{constructor(e,t){this.value=e,this.color=t}decrease(e){this.value-=e;let t=0;return this.value<0&&(t=-this.value,this.value=0),t}}class BonusShield extends Bonus{constructor(e,t,s,i,h){super(e,t,s,"shield"),this.time=i,this.color=h}useOn(e,t){super.useOn(e);let s=new BonusHealth(this.value,this.color);e.shield.addBonus(s),t.time.addEvent({delay:this.time,callback:()=>e.shield.removeBonus(s)})}}class BonusSpeed extends Bonus{constructor(e="",t,s,i){super(e,t,s,"speed"),this.time=i}useOn(e,t){super.useOn(e),e.increaseSpeedBonus(this.value-1),t.time.addEvent({delay:this.time,callback:()=>e.decreaseSpeedBonus(this.value-1)})}}class BonusView extends Phaser.GameObjects.Image{constructor(e,t,s,i){super(e,t,s,i.texture),this.setOrigin(.5,.5),this.displayHeight=HEIGHT_BONUS,this.scaleX=this.scaleY,e.add.existing(this),this.bonus=i}useOn(e){this.bonus.useOn(e,this.scene),this.destroy()}}class Boot extends ManageLang{constructor(e){super("Boot",e)}create(){super.create();this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/3,"WARIA",{font:"200px stencil",fill:"#e2e2e2"}).setOrigin(.5,.5);let e=this.add.sprite(WIDTH_WINDOW/2,HEIGHT_WINDOW/3*2,"playLetter").setInteractive();e.on("pointerout",()=>e.setFrame(0)),e.on("pointerover",()=>e.setFrame(1)),e.on("pointerdown",()=>this.clickPlay(e))}clickPlay(e){console.log("Play"),this.father.scene.add("Type",new Type(this.father)),this.scene.start("Type")}}class Button extends Phaser.GameObjects.Sprite{constructor(e,t,s,i,h,o,a,n=0,r=!0){super(e,t,s,o),this.name=o,this.setInteractive().setVisible(r),this.displayHeight=h,this.displayWidth=i,this.line=n,this.on("pointerout",()=>this.changeFrame(0)),this.on("pointerover",()=>this.changeFrame(1)),this.on("pointerdown",a),this.changeFrame(0),e.add.existing(this)}changeFrame(e=0){this.setFrame(e+2*this.line)}}class Category{constructor(e="undefined",t=!0,s=!0){this.name=e,this.single=t,this.lBtn=[],this.lValue=[],this.obligatory=s}getValue(){return this.single?this.lValue[0]:this.lValue}validate(){return!(0===this.lBtn.length&&this.obligatory)}addEvent(e){this.event=e}add(e,t){0!==this.lBtn.length&&this.single&&(this.lBtn[0].clearTint(),this.lValue=[],this.lBtn=[]),this.lValue.push(t),this.lBtn.push(e),e.tint=COLOR_SELECTED,this.oneChange()}remove(e){let t=this.lBtn.indexOf(e);-1!==t&&(this.lBtn.splice(t,1),this.lValue.splice(t,1)),e.clearTint(),this.oneChange()}oneChange(){void 0!==this.event&&this.event()}}class CategoryBar{constructor(e=VALUE_MAX_BAR,t=1){this.startValue=t,this.valueMax=e,this.point=this.valueMax}addPoint(e){if(this.point+=e,this.point<0){let e=this.point;return this.point=0,e}return this.point>this.valueMax&&(this.point=this.valueMax),0}setValueOf(e,t){let s=t-e.value,i=e.value;this.point>=s?e.setValue(t):e.setValue(e.value+this.point),this.addPoint(i-e.value),this.draw()}addText(e,t,s,i,h){this.text=t;let o={font:h.toString()+"px stencil",fill:"#e2e2e2"};this.textScene=e.add.text(s,i,this.text,o).setOrigin(0,0),this.draw()}setTextPos(e,t){this.textScene.setX(e),this.textScene.setY(t)}setText(e){this.text=e,this.draw()}draw(){this.textScene.setText(this.text+this.point)}destroy(){this.textScene.destroy()}}class Condition extends Node{constructor(e,t=!1,s=!1,i,h){super("condition"),this.shieldFilter=t,this.rangeFilter=s,this.shield=i,this.range=h,this.myself=e,this.lNode=[]}addNode(e){this.lNode.push(e)}do(e){if(this.doCondition(e))for(let t=0;te+=t.getTreeJson()+","),e=endLineJson(e),e+="]}"}getOptionJson(){return this.myself+","+this.shieldFilter+","+this.rangeFilter+","+this.shield+","+this.range}}class Description extends ManageLang{constructor(e){super("Description",e)}create(){super.create();let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW-100,s=this.add.image(e,t,"cancel").setOrigin(.5,.5).setInteractive();s.on("pointerover",()=>s.setFrame(1)),s.on("pointerout",()=>s.setFrame(0)),s.on("pointerdown",()=>this.return()),s.displayHeight=HEIGHT_WINDOW/10,s.scaleX=s.scaleY,this.loadBonus()}loadBonus(){this.width=WIDTH_WINDOW/3-20,this.height=HEIGHT_WINDOW/4;let e=0;this.createList(lShieldBonus,e,!0),e=WIDTH_WINDOW/3,this.createList(lSpeedBonus,e,!1),e=WIDTH_WINDOW/1.5,this.createList(lAttackBonus,e,!1)}createList(e,t,s=!0){let i=50;this.createCategoryBonus(t,i,this.width,this.height*e.length),e.forEach(e=>{let h="";void 0!==e.time&&(h=" - "+selectWord("TIME","TEMPS")+" : "+e.time/1e3);let o="";if(void 0!==e.value){let t="x";s&&(t="+"),o="BONUS : "+t+e.value}this.createBonusDescription(t,i,this.width,this.height,e.texture,e.name,o+h),i+=this.height})}createCategoryBonus(e,t,s,i){e+=10,t+=10,this.add.rectangle(e,t,s,i,8816262).setOrigin(0,0)}createBonusDescription(e,t,s,i,h,o,a){e+=20,t+=20,s-=20,i-=20,this.add.rectangle(e,t,s,i,16777215).setOrigin(0,0);let n=this.add.image(e+5,t+5,h).setOrigin(0,0);n.displayHeight=100,n.scaleX=n.scaleY;let r={font:n.displayHeight/2-o.length+"px stencil",fill:"#000000"};this.add.text(e+n.displayWidth+10,t+5+n.displayHeight/2,o.toString(),r).setOrigin(0,.5),r.font=i/6+"px stencil",this.add.text(e+5,t+n.displayHeight+(i-n.displayHeight)/2,a.toString(),r).setOrigin(0,.5)}return(){this.father.scene.start("Game"),this.father.scene.remove("Description")}}function selectWord(e,t){switch(LANG){case"fr":return t;default:return e}}function newGame(e,t,s=new Game(e,t)){-1!==e.scene.getIndex("Game")&&e.scene.remove("Game"),e.scene.add("Game",s)}function chooseTarget(e,t){let s=2*WIDTH_MAP,i=[];return t.forEach(function(t){if(t!==e){let h=Math.hypot(t.x-e.x,t.y-e.y);s>=h&&(s>h&&(s=h,i=[]),i.push(t))}}),i.length>1?i[Math.floor(Math.random()*(i.length+1))]:i[0]}function toJson(e,t,s=!1){let i;switch(typeof t){case"string":i='"'+e.toString()+'":"'+t+'"';break;default:i='"'+e.toString()+'":'+t}return s||(i+=","),i}function endLineJson(e){return e.length>0&&","===e[e.length-1]&&(e=e.substr(0,e.length-1)),e}function getNextLevel(e=""){let t=e;return t=t.slice(0,-1)+(parseInt(e[e.length-1])+1).toString(),console.log(e[e.length-1]),t[t.length-1]>=NUMBER_LEVEL?e:t}class Game extends ManageLang{constructor(e,t="level1"){super("Game",e),super.addOtherScenes("GamingBoard"),SPEED_GAME=1,this.level=t,this.listPositionRobotInit=[],this.scoreText=0}preload(){let e,t={font:"100px stencil",fill:"#e2e2e2"};this.load.on("start",()=>{(e=this.add.text(.5*WIDTH_WINDOW,.5*HEIGHT_WINDOW,selectWord("LEVEL LOADING ...","CHARGEMENT DU NIVEAU ..."),t).setOrigin(.5,.5)).alpha=.5}),this.load.on("complete",()=>{e.destroy()}),this.cache.json.exists("level")&&this.cache.json.remove("level"),this.load.json("level","public/json/"+this.level+".json"),console.log("PRELOAD"),this.createGamingBoard()}create(){super.create();let e=this.cache.json.get("level");if(void 0!==e)this.loadSave(e),this.doLine=!1,this.createButtons(),this.input.keyboard.on("keydown-DELETE",()=>{this.clickBin()}),this.input.keyboard.on("keydown-E",()=>{this.clickPencil()}),this.input.keyboard.on("keydown-ENTER",()=>{this.clickPlus()}),this.scene.setVisible(!0,"GamingBoard"),this.setScore(0),this.gm.getMyTeam().addEventScore(this.setScore,this);else{console.log("ERROR : LEVEL UNDEFINED"),new Button(this,10,10,WIDTH_BUTTON,WIDTH_BUTTON,"back",()=>this.clickBack()).setOrigin(0,0);let e={font:"50px stencil",fill:"#e2e2e2"};this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/2,selectWord("LEVEL UNDEFINED","NIVEAU INDEFINI"),e).setOrigin(.5,.5)}}update(e,t){super.update(e,t),this.doLine&&this.tree.updateLine()}createGamingBoard(){this.gm=new GamingBoard(this),-1!==this.father.scene.getIndex("GamingBoard")&&this.father.scene.remove("GamingBoard"),this.father.scene.add("GamingBoard",this.gm),this.scene.launch("GamingBoard"),this.gm.pause()}loadSave(e){this.loadBonus(e.lBonus),this.loadTeam(e);let t=[];if(this.gm.getMyTeam().listRobot.forEach(e=>t.push(e)),void 0!==this.listRobot)for(let e=0;e1&&this.robotSelected.setTint(COLOR_SELECTED)}applyTree(){void 0!==this.tree&&void 0!==this.robotSelected&&(this.tree.sort(),this.robotSelected.setNodes(this.tree.getNode()))}loadTree(e,t=CENTERX_TREE,s=OFFY_TREE_BEGIN){let i;if(void 0!==e.x&&void 0!==e.y)i=new RectangleNode(e.x,e.y,this,e.type,e.option),void 0!==e.lNode&&e.lNode.length>0&&e.lNode.forEach(e=>i.addRect(this.loadTree(e)));else if(i=new RectangleNode(t,s,this,e.type,e.option),void 0!==e.lNode&&e.lNode.length>0){let h=e.lNode.length,o=t-OFFX_TREE/2*(h-1),a=s+OFFY_TREE;e.lNode.forEach(e=>{i.addRect(this.loadTree(e,o,a)),o+=OFFX_TREE})}return i}loadInitSave(e,t,...s){let i=new InitStat(this,OFFX_MAP+WIDTH_MAP+5,OFFY_MAP,7*HEIGHT_BAR,HEIGHT_BAR,e.valueMax);for(let t=0;t{t+=this.loadT(s.name,s.freeForAll,s.robots,e.robotRandomPosition,t,s.color)}),this.gm.addEventMyTeam(this.setRobotSelected,this)}}loadT(e=MY_TEAM,t,s,i,h=0,o){let a=new Team(e,t);return this.loadRobot(s,i,h).forEach(e=>a.addRobot(e)),void 0!==o&&a.getRobots().forEach(e=>e.setTint(o)),this.gm.addTeam(a),a.listRobot.length}loadRobot(e=[],t=!1,s=0){let i=s,h=[];return e.forEach(e=>{let s=[];e.lNode.forEach(e=>{s.push(this.loadNode(e))}),t&&(void 0===this.listPositionRobotInit[i]?(e.x=Math.random()*(1-e.width/2-e.width/2)+e.width/2,e.y=Math.random()*(1-e.height/2-e.height/2)+e.height/2,this.listPositionRobotInit[i]=new Position(e.x,e.y)):(e.x=this.listPositionRobotInit[i].x,e.y=this.listPositionRobotInit[i].y)),h.push(new Robot(WIDTH_MAP*e.height,WIDTH_MAP*e.width,WIDTH_MAP*e.x,WIDTH_MAP*e.y,this.gm,e.name,e.speed,e.speedReload,e.range,e.damage,s)),i+=1}),h}loadNode(e){let t;switch(e.type){case"condition":t=new Condition(e.option[0],e.option[1],e.option[2],e.option[3],e.option[4]);break;case"move":t=new Move(e.option[0],e.option[1]);break;case"attack":t=new Attack(e.option[0]);break;default:return}return void 0!==e.lNode&&e.lNode.forEach(e=>t.addNode(this.loadNode(e))),t}loadBonus(e=[]){e.forEach(e=>{this.gm.addBonus(this.loadB(e))})}loadB(e){let t;switch(e.style){case"speed":t=lSpeedBonus[e.number];break;case"attack":t=lAttackBonus[e.number];break;case"shield":t=lShieldBonus[e.number];break;default:return null}return new BonusView(this.gm,e.x*WIDTH_MAP,e.y*WIDTH_MAP,t)}finish(){let e;console.log("FINISH"),e=this.gm.winner()?new Winner(this.father,this,this.score):new Looser(this.father,this,this.score),this.father.scene.add("Finish",e),this.scene.pause("Game"),this.scene.launch("Finish"),this.robotSelected=void 0}clickNode(){this.tryClick(),this.selected=this.tree.getSelected(),void 0!==this.selected&&(this.selected!==this.tree&&(this.pencilBtn.setVisible(!0),this.binBtn.setVisible(!0)),this.selected.canAddNode&&this.plusBtn.setVisible(!0))}doDrag(e,t,s,i){t.setX(s),t.setY(i)}dragStart(){console.log("START DRAG"),this.doLine=!0,this.pauseScene()}dragEnd(){console.log("END DRAG"),this.applyTree(),this.doLine=!1}pauseScene(){this.playBtn.line=0,this.playBtn.changeFrame(0),this.gm.pause()}resume(){this.playBtn.line=1,this.playBtn.changeFrame(0),this.gm.resume()}createButtons(){let e=WIDTH_MAP+OFFX_MAP,t=WIDTH_MAP+OFFY_MAP+5,s=WIDTH_BUTTON,i=1.1*s,h=0;new Button(this,10,10,s,s,"back",()=>this.clickBack()).setOrigin(0,0),new Button(this,WIDTH_WINDOW-i,t,s,s,"bonusBtn",()=>this.clickBonus()).setOrigin(1,0),new Button(this,WIDTH_WINDOW,t,s,s,"save",()=>this.clickSave()).setOrigin(1,0),this.playBtn=new Button(this,e,t,s,s,"play",()=>this.clickPlay()).setOrigin(1,0),h=1===SPEED_GAME?0:1,this.speedBtn=new Button(this,e-i,t,s,s,"speed",()=>this.clickSpeed(),h).setOrigin(1,0),this.pencilBtn=new Button(this,e-2*i,t,s,s,"pencil",()=>this.clickPencil(),0,!1).setOrigin(1,0),this.binBtn=new Button(this,e-3*i,t,s,s,"bin",()=>this.clickBin(),0,!1).setOrigin(1,0),this.plusBtn=new Button(this,e-4*i,t,s,s,"plus",()=>this.clickPlus(),0,!1).setOrigin(1,0),h=this.father.sound.mute?1:0,this.muteBtn=new Button(this,e-5*i,t,s,s,"mute",()=>this.clickMute(),h).setOrigin(1,0);let o={font:(s/2).toString()+"px stencil",fill:"#e2e2e2"};this.scoreText=this.add.text(OFFX_MAP,t,"SCORE : "+this.scoreText,o).setOrigin(0,0),this.input.on("pointerdown",()=>this.clickNode()),this.input.on("drag",this.doDrag),this.input.on("dragstart",()=>this.dragStart()),this.input.on("dragend",()=>this.dragEnd())}setScore(e){this.score=e,this.scoreText.setText("SCORE : "+this.score)}clickBonus(){this.father.scene.stop("GamingBoard"),this.father.scene.remove("GamingBoard"),this.father.scene.add("Description",new Description(this.father,this)),this.scene.start("Description")}clickSave(){let e='{"tree":'+this.tree.getJson()+',"initStat":'+this.initStat.getJson()+"}";console.log(e)}clickPlay(){this.gm.paused?this.resume():this.pauseScene(),this.playBtn.changeFrame(1)}clickSpeed(){1===SPEED_GAME?(SPEED_GAME=2,this.speedBtn.line=1):(SPEED_GAME=1,this.speedBtn.line=0),this.gm.time.timeScale=SPEED_GAME,this.speedBtn.changeFrame(1)}clickPencil(){if(void 0!==this.selected){switch(console.log("PENCIL"),this.selected.type){case"attack":this.father.scene.add("AddNode",new AddAttack(this.father,this,this.selected,!1));break;case"move":this.father.scene.add("AddNode",new AddMove(this.father,this,this.selected,!1));break;case"condition":this.father.scene.add("AddNode",new AddCondition(this.father,this,this.selected,!1));break;default:return}this.scene.pause("Game"),this.scene.launch("AddNode")}}clickBin(){void 0!==this.selected&&(console.log("BIN"),this.tree.delete(this.selected),this.binBtn.changeFrame(0),this.tryClick())}clickPlus(){void 0!==this.selected&&this.selected.canAddNode&&(console.log("PLUS"),this.father.scene.add("PlusNode",new PlusNode(this.father,this,this.selected)),this.scene.launch("PlusNode"),this.plusBtn.changeFrame(0),this.scene.pause("Game"))}clickBack(){console.log("BACK"),this.father.scene.stop("GamingBoard"),this.father.scene.remove("GamingBoard"),this.father.scene.stop("Game"),this.father.scene.start("Type")}clickMute(){console.log("MUTE"),this.father.sound.mute?(this.father.sound.mute=!1,this.muteBtn.line=0):(this.father.sound.mute=!0,this.muteBtn.line=1),this.muteBtn.changeFrame(1)}tryClick(){this.pencilBtn.setVisible(!1),this.binBtn.setVisible(!1),this.plusBtn.setVisible(!1),void 0!=this.selected&&(this.selected.deselect(),this.selected=void 0)}setLevel(e){this.level!==e&&(this.level=e,this.listPositionRobotInit=[],this.robotSelected=void 0),console.log(this.level)}}class GamingBoard extends Phaser.Scene{constructor(e){super("GamingBoard"),this.listTeam=[],listBonus=[],this.father=e,this.end=!1,this.paused=!1}preload(){this.cameras.main.setViewport(OFFX_MAP,OFFY_MAP,WIDTH_MAP,WIDTH_MAP),this.sound.add("shot"),this.sound.add("hit"),this.scene.setVisible(!1,"GamingBoard")}create(){let e=this.add.image(0,0,"background").setOrigin(0,0);e.alpha=.3,e.displayWidth=WIDTH_MAP,e.displayHeight=WIDTH_MAP,this.time.addEvent({delay:2e3,callback:this.upShield,callbackScope:this})}update(e,t){this.end||this.paused||(this.listTeam.forEach(e=>{e.actualise(this.getEnemyRobotTeam(e))||this.listTeam.splice(this.listTeam.indexOf(e),1)}),this.listTeam.forEach(e=>e.readAll()),(void 0===this.getMyTeam()||this.listTeam.length<=1)&&(this.end=!0,this.finish()))}addEventMyTeam(e,t){this.getMyTeam().addEvent(e,t)}getEnemyRobotTeam(e){let t=[];return this.listTeam.forEach(s=>{(e.freeForAll||s!==e)&&(t=t.concat(s.getRobots()))}),t}setRobotVisible(e=!0){this.listTeam.forEach(t=>t.setRobotVisible(e))}setEnemyRobotVisible(e=!0){let t=this.getMyTeam();this.listTeam.forEach(s=>{t!==s&&s.setRobotVisible(e)})}setBonusVisible(e=!0){listBonus.forEach(t=>t.setVisible(e))}finish(){this.pause(),this.father.finish()}winner(){return void 0!==this.getMyTeam()}pause(){this.sound.pauseAll(),this.paused=!0,this.time.timeScale=0}resume(){this.sound.resumeAll(),this.setRobotVisible(!0),this.setBonusVisible(!0),this.paused=!1,this.time.timeScale=SPEED_GAME}addTeam(e){this.listTeam.push(e)}addBonus(e){listBonus.push(e)}modifyNodes(e){let t=this.getMyTeam();return void 0!==t&&(t.modifyNodes(e),!0)}modifyValue(e,t,s,i){let h=this.getMyTeam();return void 0!==h&&(h.modifyValue(e,t,s,i),!0)}getMyTeam(){for(let e=0;ee.listRobot.forEach(e=>{e.addShield(SHIELD_PER_SECOND)})),this.time.addEvent({delay:1e3,callback:this.upShield,callbackScope:this})}}class InitStat{constructor(e,t,s,i,h,o=10){this.scene=e,this.posX=t,this.posY=s,this.width=i,this.height=h,this.category=new CategoryBar(o),this.lBar=[],this.lText=[],this.category.addText(this.scene,selectWord("TOKENS : ","JETONS : "),this.posX,this.posY,this.height)}addBar(e,t,s,i=[]){this.lText.push(i),this.lBar.push(new Bar(this.scene,selectWord(i[0],i[1]),this.width,this.height,this.posX,this.posY,s,this.category,e,t)),this.posY+=1.5*this.height,this.category.setTextPos(this.posX,this.posY)}getJson(){let e="{";e+=toJson("valueMax",this.category.valueMax),e+='"lBar":[';for(let t=0;te.destroy())}}class LevelSelect extends ManageLang{constructor(e,t=""){super("LevelSelect"),this.father=e,this.level=t}create(){super.create();let e={font:(HEIGHT_WINDOW/5).toString()+"px stencil",fill:"#e2e2e2"};this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/6,"WARIA",e).setOrigin(.5,.5);this.createLevel(WIDTH_WINDOW/3,HEIGHT_WINDOW/2,1),this.createLevel(WIDTH_WINDOW/1.5,HEIGHT_WINDOW/2,2)}createLevel(e,t,s=0){let i=WIDTH_WINDOW/8,h=this.add.image(e,t,"rectangle").setOrigin(.5,.5).setInteractive();h.displayHeight=h.displayWidth=i;let o={font:(i/2).toString()+"px stencil",fill:"#000000"},a=this.add.text(e,t,s.toString(),o).setOrigin(.5,.5);h.on("pointerover",()=>this.over(h,a)),h.on("pointerout",()=>this.out(h,a)),h.on("pointerdown",()=>this.click(s)),new Button(this,10,10,WIDTH_BUTTON,WIDTH_BUTTON,"back",()=>this.clickBack()).setOrigin(0,0)}over(e,t){e.setFrame(1),t.setColor("white")}out(e,t){e.setFrame(0),t.setColor("black")}click(e){e-=1,this.level+=e.toString(),newGame(this.father,this.level),this.scene.start("Game")}clickBack(){this.scene.start("Type")}}class LoadFile extends Phaser.Scene{constructor(e,t,s){super("LoadFile"),this.father=e,this.son=s,this.nameSon=t,this.father.scene.pause(this.nameSon),this.father.scene.stop(this.nameSon),this.father.scene.remove("LoadFile")}preload(){let e=this.add.graphics(),t=this.add.graphics(),s=WIDTH_WINDOW/2-160,i=HEIGHT_WINDOW/2-25;t.fillStyle(2236962,.8),t.fillRect(s,i,320,50),this.load.on("progress",function(t){e.clear(),e.fillStyle(16777215,1),e.fillRect(s+10,i+10,300*t,30)}),this.load.on("complete",()=>{e.destroy(),t.destroy()}),this.load.audio("shot","assets/sounds/shot.ogg"),this.load.audio("hit","assets/sounds/hit.ogg"),this.loadImage("en","flags/",!0),this.loadImage("fr","flags/",!0),this.loadImage("bonusSpeed0","bonus/",!0),this.loadImage("bonusSpeed1","bonus/",!0),this.loadImage("bonusSpeed2","bonus/",!0),this.loadImage("bonusAttack0","bonus/",!0),this.loadImage("bonusAttack1","bonus/",!0),this.loadImage("bonusAttack2","bonus/",!0),this.loadImage("bonusShield0","bonus/",!0),this.loadImage("bonusShield1","bonus/",!0),this.loadImage("bonusShield2","bonus/",!0),this.loadImage("enemy","robots/"),this.loadImage("myBot","robots/"),this.loadSprite("playLetter",550,150,"buttons/"),this.loadSprite("cancel",550,150,"buttons/"),this.loadSprite("add",550,150,"buttons/"),this.loadSprite("modify",550,150,"buttons/"),this.loadSprite("home",550,150,"buttons/"),this.loadSprite("next",550,150,"buttons/"),this.loadSprite("retry",550,150,"buttons/"),this.loadSprite("duel",269,262,"buttons/"),this.loadSprite("last",269,262,"buttons/"),this.loadSprite("team",269,262,"buttons/"),this.loadSprite("flag",269,262,"buttons/"),this.loadSprite("map",269,262,"buttons/"),this.loadSprite("play",100,100,"buttons/",!0),this.loadSprite("bin",100,100,"buttons/",!0),this.loadSprite("plus",100,100,"buttons/",!0),this.loadSprite("pencil",100,100,"buttons/",!0),this.loadSprite("speed",100,100,"buttons/",!0),this.loadSprite("mute",100,100,"buttons/",!0),this.loadSprite("save",100,100,"buttons/",!0),this.loadSprite("bonusBtn",100,100,"buttons/",!0),this.loadSprite("back",200,200,"buttons/",!0),this.loadSprite("shortRange",300,150,"buttons/"),this.loadSprite("mediumRange",300,150,"buttons/"),this.loadSprite("longRange",300,150,"buttons/"),this.loadSprite("shield0",300,150,"buttons/"),this.loadSprite("shield33",300,150,"buttons/"),this.loadSprite("shield66",300,150,"buttons/"),this.loadSprite("shield100",300,150,"buttons/"),this.loadSprite("bonusShield",300,150,"buttons/"),this.loadSprite("bonusSpeed",300,150,"buttons/"),this.loadSprite("bonusAttack",300,150,"buttons/"),this.loadSprite("myself",300,150,"buttons/"),this.loadSprite("enemyBot",300,150,"buttons/"),this.loadSprite("bonus",300,150,"buttons/"),this.loadSprite("moveToward",300,150,"buttons/"),this.loadSprite("fleeFrom",300,150,"buttons/"),this.loadSprite("attackNode",180,190,"nodes/",!0),this.loadSprite("moveNode",180,190,"nodes/",!0),this.loadSprite("conditionNode",180,190,"nodes/",!0),this.loadSprite("rectangle",400,400,"buttons/",!0),this.loadImage("background","others/",!0),this.loadImage("bullet","others/",!0),this.loadImage("logoWaria","others/",!0),this.loadImage("attack","nodes/",!0),this.loadImage("move","nodes/",!0),this.loadImage("condition","nodes/",!0),this.cache.json.exists("listBonus")&&(this.cache.json.remove("listBonus"),lSpeedBonus=[],lShieldBonus=[],lAttackBonus=[]),this.load.json("listBonus","public/json/listBonus.json")}create(){this.loadBonus(),-1===this.father.scene.getIndex(this.nameSon)&&this.father.scene.add(this.nameSon,this.son),this.father.scene.start(this.nameSon)}loadBonus(){let e=this.cache.json.get("listBonus");void 0!==e&&(e.lSpeedBonus.forEach(e=>lSpeedBonus.push(new BonusSpeed(selectWord(e.name.en,e.name.fr),e.texture,e.value,e.time))),e.lShieldBonus.forEach(e=>lShieldBonus.push(new BonusShield(selectWord(e.name.en,e.name.fr),e.texture,e.value,e.time,e.color))),e.lAttackBonus.forEach(e=>lAttackBonus.push(new BonusAttack(selectWord(e.name.en,e.name.fr),e.texture,e.value))))}loadSprite(e,t,s,i="",h=!1){this.textures.exists(e)&&h||(this.deleteLoad(e),h?this.load.spritesheet(e,"assets/"+i+e+".png",{frameWidth:t,frameHeight:s}):this.load.spritesheet(e,"assets/lang/"+LANG+"/"+i+e+".png",{frameWidth:t,frameHeight:s}))}loadImage(e,t="",s=!1){this.textures.exists(e)&&s||(this.deleteLoad(e),s?this.load.image(e,"assets/"+t+e+".png"):this.load.image(e,"assets/lang/"+LANG+"/"+t+e+".png"))}deleteLoad(e){this.textures.exists(e)&&this.textures.remove(e)}}class Looser extends Finish{constructor(e,t,s){super(e,t,s)}create(){super.create(),super.addTitle(selectWord("GAME OVER","PARTIE PERDUE")),super.btnRetry(super.createButton(WIDTH_WINDOW/3,"retry")),super.btnHome(super.createButton(WIDTH_WINDOW/1.5,"home"))}}class Missile extends Phaser.GameObjects.Image{constructor(e,t,s,i){super(e,0,0,t),this.visible=!1,this.setOrigin(.5,.5),this.setScale(.02)}}class Move extends Node{constructor(e,t=!0,s){super("move"),this.toward=e,this.enemyBot=t,this.typeBonus=s}do(e){if(this.enemyBot){if(e.verifyTarget())return!0===this.toward?this.moveToward(e):this.fleeFrom(e)}else{let t=chooseTarget(e,this.getListBonus());if(void 0!==t){let s;return(s=!0===this.toward?this.moveToward(e,t):this.fleeFrom(e,t))||(t.useOn(e),listBonus.splice(listBonus.indexOf(t),1),e.target=null),!0}}return!1}getListBonus(){if(void 0!==this.typeBonus){let e=[];return listBonus.forEach(t=>{t.bonus.type===this.typeBonus&&e.push(t)}),e}return listBonus}moveToward(e,t=e.target){return e.advanceTo(t)}fleeFrom(e,t=e.target){return e.fleeFrom(t)}getFrame(){let e;if(e=this.toward?0:5,!this.enemyBot)switch(this.typeBonus){case"speed":e+=2;break;case"attack":e+=3;break;case"shield":e+=4;break;default:e+=1}return e}getTreeJson(){return super.getTreeJson(this.getOptionJson())}getOptionJson(){let e=this.toward+","+this.enemyBot;return void 0!==this.typeBonus&&(e+=',"'+this.typeBonus+'"'),e}}class PlusNode extends Phaser.Scene{constructor(e,t,s){super("PlusNode"),this.father=e,this.gameR=t,this.selected=s}create(){this.add.rectangle(0,0,WIDTH_WINDOW,HEIGHT_WINDOW,0).setOrigin(0,0).setAlpha(.5),this.add.rectangle(0,HEIGHT_WINDOW/2,WIDTH_WINDOW,HEIGHT_WINDOW/2,3487290).setOrigin(0,.5),this.createNode(),this.createButton()}createNode(){let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW/2,s=WIDTH_WINDOW/3,i=HEIGHT_WINDOW/10,h={font:(i/1.5).toString()+"px stencil",fill:"#e2e2e2"};this.add.text(e-s,t-i,selectWord("ATTACK","ATTAQUE"),h).setOrigin(.5,.5),this.add.text(e,t-i,selectWord("MOVE","DEPLACEMENT"),h).setOrigin(.5,.5),this.add.text(e+s,t-i,selectWord("CONDITION","CONDITION"),h).setOrigin(.5,.5);let o=this.add.sprite(e-s,t+i,"attack").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("attack"));o.displayHeight=2*i,o.scaleX=o.scaleY,(o=this.add.sprite(e,t+i,"move").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("move"))).displayHeight=2*i,o.scaleX=o.scaleY,(o=this.add.sprite(e+s,t+i,"condition").setOrigin(.5,.5).setInteractive().on("pointerdown",()=>this.click("condition"))).displayHeight=2*i,o.scaleX=o.scaleY}click(e){switch(e.toString()){case"attack":this.father.scene.add("AddNode",new AddAttack(this.father,this.gameR,this.selected));break;case"move":this.father.scene.add("AddNode",new AddMove(this.father,this.gameR,this.selected));break;case"condition":this.father.scene.add("AddNode",new AddCondition(this.father,this.gameR,this.selected))}this.scene.launch("AddNode"),this.scene.stop("PlusNode"),this.father.scene.remove("PlusNode")}createButton(){let e=WIDTH_WINDOW/2,t=HEIGHT_WINDOW-100,s=this.add.image(e,t,"cancel").setOrigin(.5,.5).setInteractive();s.on("pointerover",()=>s.setFrame(1)),s.on("pointerout",()=>s.setFrame(0)),s.on("pointerdown",()=>this.cancel()),s.displayHeight=HEIGHT_WINDOW/10,s.scaleX=s.scaleY}cancel(){this.scene.resume("Game"),this.scene.stop("PlusNode"),this.father.scene.remove("PlusNode")}}class Position{constructor(e,t){this.x=e,this.y=t}}class RectangleNode{constructor(e,t,s,i,h=[]){switch(i.toString().toLowerCase()){case"attack":this.rect=new Phaser.GameObjects.Image(s,e,t,"attackNode"),this.node=new Attack(h[0]),this.canAddNode=!1,this.line=s.add.graphics();break;case"move":this.rect=new Phaser.GameObjects.Image(s,e,t,"moveNode"),this.node=new Move(h[0],h[1],h[2]),this.canAddNode=!1,this.line=s.add.graphics();break;case"condition":this.rect=new Phaser.GameObjects.Image(s,e,t,"conditionNode"),this.node=new Condition(h[0],h[1],h[2],h[3],h[4]),this.canAddNode=!0,this.lRect=[],this.scene=s,this.line=s.add.graphics();break;case"waria":this.rect=new Phaser.GameObjects.Image(s,e,t,"logoWaria").setInteractive(),this.canAddNode=!0,this.lRect=[],this.scene=s,this.scene.add.existing(this.rect),this.scene.input.setDraggable(this.rect);break;default:return void console.log("Création d'un node echoué")}"waria"!==i.toString().toLowerCase()&&this.rect.setFrame(this.node.getFrame()),this.type=i,this.rect.on("pointerdown",()=>this.click()),this.rect.setOrigin(.5,0),this.rect.displayHeight=HEIGHT_NODE,this.rect.scaleX=this.rect.scaleY}getSelected(){if(this.rect.isTinted)return this;if(this.canAddNode)for(let e=0;ethis.addLine(e))}addLine(e){e.setLine(this.rect.x,this.rect.y+.9*this.rect.displayHeight)}getNode(){if(void 0===this.node){let e=[];return this.lRect.forEach(function(t){e.push(t.getNode())}),e}return this.canAddNode&&(this.node.clearNodes(),this.lRect.forEach(e=>this.node.addNode(e.getNode()))),this.node}sort(e=((e,t)=>e.getX()-t.getX())){this.canAddNode&&(this.lRect.sort(e),this.lRect.forEach(function(t){t.canAddNode&&t.sort(e)}))}destroy(){this.line.destroy(),this.rect.destroy(),void 0!==this.lRect&&this.lRect.forEach(e=>e.destroy())}delete(e){let t=this.lRect.indexOf(e);if(-1!==t)return this.lRect.splice(t,1),e.destroy(),!0;for(let t=0;tt+=s.getJson(e)+","),t=endLineJson(t)+"]"),t=endLineJson(t),t+="}"}destroy(){this.rect.destroy(),void 0!==this.line&&this.line.destroy(),void 0!==this.lRect&&this.lRect.forEach(e=>e.destroy())}}class Robot{constructor(e,t,s,i,h,o="enemy",a=SPEED_BEGIN,n=SPEED_RELOAD_BEGIN,r=RANGE_BEGIN,l=DAMAGE_BEGIN,d=[]){this.speedBonus=1,this.attackBonus=1,this.name=o,this.height=e,this.width=t,this.x=s,this.y=i,this.life=new HealthBar(h,selectWord("LIFE","VIE"),2*this.width,this.width/3,this.x,this.y-this.width,LIFE,32768),this.shield=new HealthBar(h,selectWord("SHIELD","BOUCLIER"),2*this.width,this.width/3,this.x,this.y-1.5*this.width,SHIELD,255),this.canAttack=!0,this.missile=new Missile(h,"bullet",this.width/5,this.width/4),h.add.existing(this.missile),this.addScene(h),this.lNode=d,this.setSpeed(a),this.setSpeedReload(n),this.setRange(r),this.setDamage(l),this.setX(this.x),this.setY(this.y),this.team=void 0}addScene(e){this.scene=e,"enemy"===this.name?this.circle=this.scene.add.image(this.x,this.y,"enemy").setOrigin(.5,.5).setInteractive():this.circle=this.scene.add.image(this.x,this.y,"myBot").setOrigin(.5,.5).setInteractive(),this.circle.displayWidth=this.width,this.circle.displayHeight=this.height,this.circle.on("pointerdown",()=>this.click())}click(){void 0===this.circleRange?this.drawRange():this.eraseRange(),this.doEvent()}addEvent(e,t,s){this.eventClick=e,this.contextClick=t,this.valueClick=s}doEvent(){void 0!==this.eventClick&&void 0!==this.contextClick&&this.eventClick.call(this.contextClick,this,this.valueClick)}addShield(e){this.shield.increase(e)}setX(e){this.x=e,this.life.setX(this.x),this.shield.setX(this.x),this.circle.setX(this.x),this.drawCircleRange()}setY(e){this.y=e;let t=this.y-this.width,s=this.y-1.5*this.width;t<0?(s=this.y+this.width-this.shield.height,t=this.y+1.5*this.width-this.shield.height):s<0&&(s=t,t=this.y+this.width-this.shield.height),this.life.setY(t),this.shield.setY(s),this.circle.setY(this.y),this.drawCircleRange()}setTint(e){this.circle.setTint(e)}clearTint(){this.circle.clearTint()}setTarget(e){this.target=e}updateTarget(){this.verifyTarget()&&this.setTargetPos(this.target.x,this.target.y)}setTargetPos(e,t){}setDamage(e=this.damage){this.damage=e+DAMAGE_BASE}setRange(e=this.range){this.range=e+RANGE_BASE,this.drawCircleRange()}setSpeed(e=this.speed){this.speed=e+SPEED_BASE}setSpeedReload(e=this.speedReload){this.speedReload=e+SPEED_RELOAD_BASE}setAttackBonus(e){this.attackBonus=e}increaseSpeedBonus(e){this.speedBonus+=e}decreaseSpeedBonus(e){this.speedBonus-=e}advanceToTarget(){return this.verifyTarget()&&this.advanceTo(this.target),!1}advanceTo(e){if(e.x!==this.x||e.y!==this.y){let t=!1,s=!1,i=this.getVelocity(e),h=i[0]+this.x,o=i[1]+this.y;return i[0]>=0&&h>=e.x||i[0]<=0&&h<=e.x?(this.setX(e.x),t=!0):this.setX(this.x+i[0]),i[1]>=0&&o>=e.y||i[1]<=0&&o<=e.y?(this.setY(e.y),s=!0):this.setY(this.y+i[1]),!(t&&s)}return!1}fleeFromTarget(){return!!this.verifyTarget()&&this.fleeFrom(this.target)}fleeFrom(e){if(this.target.x!==this.x||this.target.y!==this.y){let t=this.getVelocity(e,!0);return t[0]>=0&&this.x-this.width/2<=0?this.setX(this.width/2):t[0]<=0&&this.x+this.width/2>=WIDTH_MAP?this.setX(WIDTH_MAP-this.width/2):this.setX(this.x-t[0]),t[1]>=0&&this.y-this.width/2<=0?this.setY(this.height/2):t[1]<=0&&this.y+this.width/2>=WIDTH_MAP?this.setY(WIDTH_MAP-this.height/2):this.setY(this.y-t[1]),!0}return!1}getVelocity(e,t=!1){let s=[],i=e.x-this.x,h=e.y-this.y,o=Math.hypot(i,h);return s[0]=i/o*SPEED*this.speed*this.speedBonus*SPEED_GAME,s[1]=h/o*SPEED*this.speed*this.speedBonus*SPEED_GAME,t&&(this.x+this.width/2+s[0]>WIDTH_MAP||this.x-this.width/2-s[0]<0?(s[1]+=s[0]*Math.sign(s[1]),s[0]=0):(this.y+this.width/2-s[1]>WIDTH_MAP||this.y-this.width/2+s[1]<0)&&(s[0]+=s[1]*Math.sign(-s[0]),s[1]=0)),s}attackTarget(e=0){return!!this.verifyTarget()&&(this.canAttack&&this.attack(this.target,e),!0)}verifyTarget(){return!!this.haveTarget()&&(!!this.target.isAlive()||(this.setTarget(null),!1))}attack(e,t){this.canAttack=!1,this.missile.setPosition(this.x,this.y).setVisible(!0),this.missile.setRotation(Math.atan2(this.y-this.target.y,this.x-this.target.x)-1.57),this.scene.sound.play("shot",{rate:SPEED_GAME});let s=this.calcDistance(this.target)*WIDTH_MAP/1e3;this.scene.tweens.add({targets:this.missile,x:e.x,y:e.y,ease:"Linear",duration:s,onComplete:()=>this.finishAttack(e,t)}),this.scene.time.addEvent({delay:SPEED_RELOAD/this.speedReload,callback:this.reload,callbackScope:this})}finishAttack(e,t){e.beAttack(this.damage*this.attackBonus*DAMAGE*t,this.team)&&this.setTarget(null),this.missile.setVisible(!1),1!==this.attackBonus&&this.setAttackBonus(1)}reload(){this.canAttack=!0}beAttack(e,t){let s=this.shield.decrease(e),i={font:HEIGHT_DAMAGE.toString()+"px stencil",fill:"#ffff00"},h=this.scene.add.text(this.x,this.y,e.toString(),i).setOrigin(0,1);return this.scene.tweens.add({targets:h,x:this.x+30,y:this.y-50,alpha:0,duration:DURATION_DAMAGE,ease:"Sine.easeOut",onComplete:()=>h.destroy()}),this.scene.sound.play("hit",{rate:SPEED_GAME}),console.log("HIT"),s>0&&(console.log("Shield Broken"),this.life.decrease(s)),this.addScore(t),this.die()}addScore(e){void 0!==e&&(e.addScore(SCORE_HIT),0===this.life.value&&e.addScore(SCORE_KILL))}isTargetInRange(e=1){return!!this.haveTarget()&&this.calcDistance(this.target)<=this.range*RANGE*e}calcDistance(e){return Math.hypot(e.x-this.x,e.y-this.y)}isAlive(){return this.life.value>0}die(){return 0===this.life.value&&(void 0!==this.circleRange&&this.circleRange.destroy(),this.circle.destroy(),this.shield.destroy(),this.life.destroy(),!0)}haveTarget(){return null!=this.target}read(){this.verifyTarget();for(let e=0;ethis.addNode(e))}setVisible(e){this.circle.setVisible(e),this.life.setVisible(e),this.shield.setVisible(e),void 0!==this.circleRange&&this.circleRange.setVisible(e)}getTreeJson(){let e="{"+toJson("type","waria");return e+='"lNode":[',this.lNode.forEach(t=>e+=t.getTreeJson()+","),e=endLineJson(e),e+="]}"}copy(e){e.lNode=this.lNode,e.damage=this.damage,e.speedReload=this.speedReload,e.speed=this.speed,e.range=this.range,void 0!==this.circleRange?e.drawRange():e.eraseRange()}}class Team{constructor(e="enemy",t=!1){this.freeForAll=t,this.listRobot=[],this.name=e,this.score=0}addEventScore(e,t){this.eventScore=e,this.context=t}addScore(e){this.score+=e,void 0!==this.eventScore&&void 0!==this.context&&this.eventScore.call(this.context,this.score)}addRobot(e){this.listRobot.push(e),e.team=this}readAll(){this.listRobot.forEach(e=>e.read())}getRobots(){return this.listRobot}actualise(e=[]){for(let t=0;t{i.addEvent(e,t,s),s++})}modifyValue(e,t,s,i){this.setSpeed(s),this.setRange(i),this.setSpeedReload(t),this.setDamage(e)}setRange(e){this.listRobot.forEach(t=>{t.setRange(e)})}setSpeed(e){this.listRobot.forEach(t=>{t.setSpeed(e)})}setSpeedReload(e){this.listRobot.forEach(t=>{t.setSpeedReload(e)})}setDamage(e){this.listRobot.forEach(t=>{t.setDamage(e)})}drawRange(){this.listRobot.forEach(e=>{e.drawRange()})}modifyNodes(e){this.listRobot.forEach(t=>{t.setNodes(e)})}setRobotVisible(e){this.listRobot.forEach(t=>t.setVisible(e))}}class Type extends ManageLang{constructor(e){super("Type",e)}preload(){}create(){super.create();let e={font:(HEIGHT_WINDOW/5).toString()+"px stencil",fill:"#e2e2e2"};this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/6,"WARIA",e).setOrigin(.5,.5);let t=this.add.sprite(WIDTH_WINDOW/8*3,HEIGHT_WINDOW/4*2,"duel").setInteractive();this.createbutton(t,"level1");let s=this.add.sprite(WIDTH_WINDOW/8*5,HEIGHT_WINDOW/4*2,"last").setInteractive();this.createbutton(s,"level2");let i=this.add.sprite(WIDTH_WINDOW/2,HEIGHT_WINDOW/4*3,"team").setInteractive();this.createbutton(i,"level3")}createbutton(e,t){e.displayHeight=HEIGHT_WINDOW/4,e.scaleX=e.scaleY,e.on("pointerout",()=>e.setFrame(0)),e.on("pointerover",()=>e.setFrame(1)),e.on("pointerdown",()=>this.clickPlay(t))}clickPlay(e){-1!==father.scene.getIndex("LevelSelect")&&this.father.scene.remove("LevelSelect"),this.father.scene.add("LevelSelect",new LevelSelect(this.father,e)),this.scene.start("LevelSelect")}}var listBonus=[],LANG=navigator.language.substr(0,2).toLowerCase(),SPEED_GAME=1,lSpeedBonus=[],lShieldBonus=[],lAttackBonus=[];const MYSELF="myself",MY_TEAM="myTeam",SHIELD_PER_SECOND=5,COLOR_ATTACK=16711680,COLOR_MOVE=255,COLOR_CONDITION=921102,COLOR_RED=16711680,COLOR_ORANGE=16744192,COLOR_GREEN=32768,COLOR_RANGE=32768,COLOR_SPEED_RELOAD=8323327,NUMBER_LEVEL=2,COLOR_SELECTED=15718407,COLOR_MYSELF=6711039,WIDTH_WINDOW=$(document).width()-20,HEIGHT_WINDOW=$(document).height()-20,OFFX_MAP=WIDTH_WINDOW/20;var OFFY_MAP,WIDTH_MAP,OFFY_TREE_BEGIN,CENTERX_TREE;WIDTH_WINDOW myself.push(robot)); + if (this.listRobot !== undefined) { + for (let i = 0; i < this.listRobot.length; i++) { + if (myself[i] !== undefined) { + this.listRobot[i].copy(myself[i]); + } + } + } else { + this.gm.getMyTeam().drawRange(); + } + this.listRobot = myself; + if (this.iRobot === undefined) { + this.iRobot = 0; + } + this.setRobotSelected(this.listRobot[this.iRobot], this.iRobot, level, true); + + this.gm.setEnemyRobotVisible(level.enemyVisible); + this.gm.setBonusVisible(level.bonusVisible); } - setRobotSelected(robot, level) { + setRobotSelected(robot, iRobot = 0, level, force = false) { + this.iRobot = iRobot; let tree; let initStat; - if (this.robotSelected !== undefined && this.robotSelected !== robot && this.tree !== undefined && this.initStat !== undefined) { + if (!force && this.robotSelected !== undefined && this.robotSelected !== robot && this.tree !== undefined && this.initStat !== undefined) { this.robotSelected.clearTint(); - this.tree.sort(); - this.robotSelected.setNodes(this.tree.getNode()); initStat = JSON.parse(this.initStat.getJson()); this.tree.destroy(); this.initStat.destroy(); @@ -107,10 +118,6 @@ class Game extends ManageLang { } else { if (this.initStat !== undefined) { initStat = JSON.parse(this.initStat.getJson()); - robot.setDamage(this.initStat.lBar[0].value); - robot.setSpeedReload(this.initStat.lBar[1].value); - robot.setSpeed(this.initStat.lBar[2].value); - robot.setRange(this.initStat.lBar[3].value); this.initStat.destroy(); } else { initStat = level.initStat; @@ -131,7 +138,14 @@ class Game extends ManageLang { } } - loadTree(element, posX = CENTERX_TREE, posY = OFFY_TREE / 2) { + applyTree() { + if (this.tree !== undefined && this.robotSelected !== undefined) { + this.tree.sort(); + this.robotSelected.setNodes(this.tree.getNode()); + } + } + + loadTree(element, posX = CENTERX_TREE, posY = OFFY_TREE_BEGIN) { let tree; if (element.x !== undefined && element.y !== undefined) { tree = new RectangleNode(element.x, element.y, this, element.type, element.option); @@ -154,8 +168,8 @@ class Game extends ManageLang { } loadInitSave(element, team, ...stat) { - let width = 200; - let height = 30; + let height = HEIGHT_BAR; + let width = height * 7; let initStat = new InitStat(this, OFFX_MAP + WIDTH_MAP + 5, OFFY_MAP, width, height, element.valueMax); for (let i = 0; i < element.lBar.length; i++) { @@ -212,7 +226,6 @@ class Game extends ManageLang { i += 1; } ) - console.log(listRobot); return listRobot; } @@ -309,7 +322,7 @@ class Game extends ManageLang { dragEnd() { console.log("END DRAG"); - + this.applyTree(); this.doLine = false; } @@ -324,13 +337,17 @@ class Game extends ManageLang { resume() { this.playBtn.line = 1; this.playBtn.changeFrame(0); - - this.tree.sort(); - this.robotSelected.setNodes(this.tree.getNode()); - //this.gm.modifyNodes(this.tree.getNode()); - //this.gm.modifyValue(this.initStat.lBar[0].value, this.initStat.lBar[1].value, this.initStat.lBar[2].value, this.initStat.lBar[3].value); - this.gm.resume(); + /* + this.tryClick(); + this.input.off('pointerdown'); + this.input.on('pointerdown', () => { + this.selected = this.tree.getSelected(); + this.tryClick(); + }); + this.input.off('drag'); + this.input.off('dragstart'); + this.input.off('dragend');*/ } createButtons() { @@ -383,8 +400,6 @@ class Game extends ManageLang { } clickSave() { - let sortDesc = (a, b) => a.getX() - b.getX(); - this.tree.sort(sortDesc); let tree = this.tree.getJson(); let initStat = this.initStat.getJson(); let json = '{' + '"tree":' + tree + ',"initStat":' + initStat + '}'; @@ -409,7 +424,7 @@ class Game extends ManageLang { SPEED_GAME = 1; this.speedBtn.line = 0; } - + this.gm.time.timeScale = SPEED_GAME; this.speedBtn.changeFrame(1); } diff --git a/Code/src/js/level2/GamingBoard.js b/Code/src/js/level2/GamingBoard.js index 49cc69a..dbac666 100644 --- a/Code/src/js/level2/GamingBoard.js +++ b/Code/src/js/level2/GamingBoard.js @@ -26,7 +26,6 @@ class GamingBoard extends Phaser.Scene { update(time, delta) { if (!this.end && !this.paused) { - super.update(time, delta); this.listTeam.forEach(team => { if (!team.actualise(this.getEnemyRobotTeam(team))) { this.listTeam.splice(this.listTeam.indexOf(team), 1); @@ -88,6 +87,7 @@ class GamingBoard extends Phaser.Scene { pause() { this.sound.pauseAll(); this.paused = true; + this.time.timeScale = 0; } resume() { @@ -95,6 +95,7 @@ class GamingBoard extends Phaser.Scene { this.setRobotVisible(true); this.setBonusVisible(true); this.paused = false; + this.time.timeScale = SPEED_GAME; } addTeam(team) { @@ -135,11 +136,10 @@ class GamingBoard extends Phaser.Scene { upShield() { - if (!this.paused) - this.listTeam.forEach(team => team.listRobot.forEach(robot => { - robot.addShield(SHIELD_PER_SECOND); - })); - this.time.addEvent({delay: 1000 / SPEED_GAME, callback: this.upShield, callbackScope: this}); + this.listTeam.forEach(team => team.listRobot.forEach(robot => { + robot.addShield(SHIELD_PER_SECOND); + })); + this.time.addEvent({delay: 1000, callback: this.upShield, callbackScope: this}); } } \ No newline at end of file diff --git a/Code/src/js/level2/Robot.js b/Code/src/js/level2/Robot.js index 67ddcac..69d58b8 100644 --- a/Code/src/js/level2/Robot.js +++ b/Code/src/js/level2/Robot.js @@ -52,14 +52,15 @@ class Robot { this.doEvent(); } - addEvent(eventClick, contextClick) { + addEvent(eventClick, contextClick, value) { this.eventClick = eventClick; this.contextClick = contextClick; + this.valueClick = value; } doEvent() { if (this.eventClick !== undefined && this.contextClick !== undefined) { - this.eventClick.call(this.contextClick, this); + this.eventClick.call(this.contextClick, this, this.valueClick); } } @@ -141,7 +142,6 @@ class Robot { decreaseSpeedBonus(amount) { this.speedBonus -= amount; - console.log(this.speed); } advanceToTarget() { @@ -255,9 +255,9 @@ class Robot { this.missile.setRotation(Math.atan2(this.y - this.target.y, this.x - this.target.x) - 3.14 / 2); - this.scene.sound.play('shot'); + this.scene.sound.play('shot', {rate: SPEED_GAME}); - let duration = this.calcDistance(this.target) * WIDTH_MAP / 1000 / SPEED_GAME; + let duration = this.calcDistance(this.target) * WIDTH_MAP / 1000; this.scene.tweens.add({ targets: this.missile, @@ -269,7 +269,7 @@ class Robot { }); this.scene.time.addEvent({ - delay: SPEED_RELOAD / this.speedReload / SPEED_GAME, + delay: SPEED_RELOAD / this.speedReload, callback: this.reload, callbackScope: this }); @@ -305,7 +305,7 @@ class Robot { onComplete: () => text.destroy() }) - this.scene.sound.play('hit'); + this.scene.sound.play('hit', {rate: SPEED_GAME}); console.log('HIT'); if (diff > 0) { @@ -376,8 +376,10 @@ class Robot { } eraseRange() { - this.circleRange.clear(); - this.circleRange = undefined; + if (this.circleRange !== undefined) { + this.circleRange.clear(); + this.circleRange = undefined; + } } drawCircleRange() { @@ -433,4 +435,17 @@ class Robot { json += ']}'; return json; } + + copy(robot) { + robot.lNode = this.lNode; + robot.damage = this.damage; + robot.speedReload = this.speedReload; + robot.speed = this.speed; + robot.range = this.range; + if (this.circleRange !== undefined) { + robot.drawRange(); + } else { + robot.eraseRange(); + } + } } diff --git a/Code/src/js/level2/Team.js b/Code/src/js/level2/Team.js index b19e53d..fe33df3 100644 --- a/Code/src/js/level2/Team.js +++ b/Code/src/js/level2/Team.js @@ -47,8 +47,10 @@ class Team { } addEvent(event, context) { + let value = 0; this.listRobot.forEach(robot => { - robot.addEvent(event, context); + robot.addEvent(event, context, value); + value++; }); } diff --git a/Code/src/js/level2/Variable.js b/Code/src/js/level2/Variable.js index 0c3d68d..a2e452b 100644 --- a/Code/src/js/level2/Variable.js +++ b/Code/src/js/level2/Variable.js @@ -21,10 +21,22 @@ const COLOR_SELECTED = 0xEFD807; const COLOR_MYSELF = 0x6666ff; const WIDTH_WINDOW = $(document).width() - 20; const HEIGHT_WINDOW = $(document).height() - 20; -const WIDTH_MAP = WIDTH_WINDOW < HEIGHT_WINDOW ? WIDTH_WINDOW * 0.8 : HEIGHT_WINDOW * 0.8; const OFFX_MAP = WIDTH_WINDOW / 20; -const OFFY_MAP = (HEIGHT_WINDOW - WIDTH_MAP) / 2; -const CENTERX_TREE = WIDTH_WINDOW / 4 * 3; +var OFFY_MAP; +var WIDTH_MAP; +var OFFY_TREE_BEGIN; +var CENTERX_TREE; +if (WIDTH_WINDOW < HEIGHT_WINDOW) { + WIDTH_MAP = WIDTH_WINDOW * 0.8; + OFFY_MAP = WIDTH_MAP / 10; + OFFY_TREE_BEGIN = WIDTH_MAP + OFFY_MAP * 2; + CENTERX_TREE = WIDTH_WINDOW / 2; +} else { + WIDTH_MAP = HEIGHT_WINDOW * 0.8; + OFFY_MAP = (HEIGHT_WINDOW - WIDTH_MAP) / 2; + OFFY_TREE_BEGIN = HEIGHT_WINDOW / 5; + CENTERX_TREE = (WIDTH_WINDOW - (WIDTH_MAP + OFFX_MAP)) / 2 + (WIDTH_MAP + OFFX_MAP); +} const OFFX_TREE = WIDTH_WINDOW / 10; const OFFY_TREE = HEIGHT_WINDOW / 6; const WIDTH_BUTTON = WIDTH_MAP / 10; @@ -32,6 +44,7 @@ const SCORE_HIT = 5; const SCORE_KILL = 15; const SCORE_BONUS = 4; +const HEIGHT_BAR = WIDTH_MAP / 20; const HEIGHT_NODE = HEIGHT_WINDOW / 6; const LIFE = 100; diff --git a/Code/src/json/level30.json b/Code/src/json/level30.json index c397317..2d86479 100644 --- a/Code/src/json/level30.json +++ b/Code/src/json/level30.json @@ -55,7 +55,7 @@ "name": "myself", "speed": 3, "speedReload": 1, - "range": 3, + "range": 1, "damage": 5, "lNode": [ { @@ -113,7 +113,7 @@ "name": "myself", "speed": 3, "speedReload": 1, - "range": 3, + "range": 1, "damage": 5, "lNode": [ { diff --git a/Code/src/json/level31.json b/Code/src/json/level31.json index f9105bf..abb85c2 100644 --- a/Code/src/json/level31.json +++ b/Code/src/json/level31.json @@ -55,7 +55,7 @@ "name": "myself", "speed": 3, "speedReload": 1, - "range": 3, + "range": 1, "damage": 5, "lNode": [ { @@ -113,7 +113,7 @@ "name": "myself", "speed": 3, "speedReload": 1, - "range": 3, + "range": 1, "damage": 5, "lNode": [ { diff --git a/Image/myBot.png b/Image/myBot.png new file mode 100644 index 0000000000000000000000000000000000000000..7c61fc46021cfc1160b713d78fb2f52bc1056641 GIT binary patch literal 51924 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

(bn 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