public override void OnUpdate() { Order.TYPE_POSITION typePosition = o.target.Team.PositionInMap(o.target); switch (typePosition) { case Order.TYPE_POSITION.EXTRA_LEFT: { PositionExtraLeftSide(); break; } case Order.TYPE_POSITION.LEFT: { PositionLeftSide(); break; } case Order.TYPE_POSITION.RIGHT: { PositionRightSide(); break; } case Order.TYPE_POSITION.EXTRA_RIGHT: { PositionExtraRightSide(); break; } case Order.TYPE_POSITION.MIDDLE_LEFT: case Order.TYPE_POSITION.MIDDLE_RIGHT: case Order.TYPE_POSITION.MIDDLE: { PositionMiddleSide(); break; } default: break; } }
/* * Cette fonction me retourne le nombre de zone d'écart entre deux positions d'objets. * Si le retour est négatif, alors "other" est à gauche de "referent" * Si le retour est positif, alors "other" est à droite de "referent" **/ public int compareZoneInMap(Order.TYPE_POSITION referent, Order.TYPE_POSITION other) { return((int)referent - (int)other); }
void UpdateOffensivePlacement() { if (this == this.team.Player.Controlled || this.game.Ball.NextOwner || replacement) { return; } //Variables Vector3 pos = this.transform.position; Vector3 oldPos = pos; float distZ = Mathf.Abs(this.team.Player.Controlled.transform.position.z - this.transform.position.z); //distance entre moi et le controllé float distX = 0f; int offsetZ = Mathf.RoundToInt(this.oTS.dMaxControlledOffensive - this.oTS.dMinControlledOffensive); int offsetX = Mathf.RoundToInt(this.oTS.dMaxOffensivePlayer - this.oTS.dMinOffensivePlayer); Order.TYPE_POSITION typePosControlled = this.Team.Player.Controlled.PositionInMap(); Order.TYPE_POSITION typePosThis = this.PositionInMap(); //int diffPos = Mathf.Abs(this.game.compareZoneInMap(typePosControlled, typePosThis)); //si je suis dans la même zone que le controllé et que je ne suis pas en train de changer de coté if (this.game.compareZoneInMap(typePosControlled, typePosThis) == 0 && !invariantMove) { //si un joueur est déjà à gauche du controllé je vais à droite foreach (Unit u in this.team) { // alors u est à gauche du controllé if (u != this && u != this.team.Player.Controlled && u.typeOfPlayer == TYPEOFPLAYER.OFFENSIVE && u.transform.position.x < this.team.Player.Controlled.transform.position.x) { //je bouge à droite pos.x = this.team.Player.Controlled.transform.position.x + (this.oTS.dMinOffensivePlayer + this.game.rand.Next(offsetX)); break; } } //personne à gauche, donc je go à gauche if (oldPos.x == pos.x) { pos.x = this.team.Player.Controlled.transform.position.x - (this.oTS.dMinOffensivePlayer + this.game.rand.Next(offsetX)); } //Debug.Log("SAME COL THAN CONTROLLED"); this.Order = Order.OrderMove(pos); oldPos = pos; } //si le controlé est sur mon coté de terrain else if ((typePosThis == Order.TYPE_POSITION.EXTRA_LEFT && typePosControlled <= Order.TYPE_POSITION.LEFT) || (typePosThis == Order.TYPE_POSITION.EXTRA_RIGHT && typePosControlled >= Order.TYPE_POSITION.RIGHT)) { //alors je bouge de l'autre coté if (typePosThis == Order.TYPE_POSITION.EXTRA_LEFT || typePosThis == Order.TYPE_POSITION.LEFT || typePosThis == Order.TYPE_POSITION.MIDDLE_LEFT) { pos.x = this.team.Player.Controlled.transform.position.x + (this.oTS.dMinOffensivePlayer + this.game.rand.Next(offsetX)); } else { pos.x = this.team.Player.Controlled.transform.position.x - (this.oTS.dMinOffensivePlayer + this.game.rand.Next(offsetX)); } //je deviens l'attaquant le plus proche du controllé invariantMove = true; if (oldPos.x != pos.x) { this.Order = Order.OrderMove(pos); //Debug.Log("CHANGE FORMATION"); oldPos = pos; } } else if (typePosControlled >= Order.TYPE_POSITION.MIDDLE_LEFT && typePosControlled <= Order.TYPE_POSITION.MIDDLE_RIGHT) { if (invariantMove) { invariantMove = false; } } //Contrainte sur X if (!invariantMove) { foreach (Unit u in this.team) { //que les attaquants if (u != this && u.typeOfPlayer == TYPEOFPLAYER.OFFENSIVE && u != this.team.Player.Controlled) { //si u est invariant utiliser sa position comme repère et non le controllé if (u.transform.position.x < this.team.Player.Controlled.transform.position.x) { pos.x = (u.invariantMove ? u.transform.position.x - (this.oTS.dMinOffensivePlayer + this.game.rand.Next(offsetX)) : this.team.Player.Controlled.transform.position.x + (this.oTS.dMinOffensivePlayer + this.game.rand.Next(offsetX))); } else { pos.x = (u.invariantMove ? u.transform.position.x + (this.oTS.dMinOffensivePlayer + this.game.rand.Next(offsetX)) : this.team.Player.Controlled.transform.position.x - (this.oTS.dMinOffensivePlayer + this.game.rand.Next(offsetX))); } oldPos = pos; distX = Mathf.Abs((u.invariantMove ? u.transform.position.x : this.team.Player.Controlled.transform.position.x) - pos.x); if (distX > this.oTS.dMaxOffensivePlayer) { //Debug.Log("CONSTRAINT ON X > dMAX"); if ((u.invariantMove ? u.transform.position.x : this.team.Player.Controlled.transform.position.x) > this.transform.position.x) { pos.x = (u.invariantMove ? u.transform.position.x : this.team.Player.Controlled.transform.position.x) - (this.game.settings.Global.Team.dMaxOffensivePlayer + this.game.rand.Next(offsetX)); } else { pos.x = (u.invariantMove ? u.transform.position.x : this.team.Player.Controlled.transform.position.x) + (this.game.settings.Global.Team.dMaxOffensivePlayer + this.game.rand.Next(offsetX)); } } else if (distX < this.oTS.dMinOffensivePlayer) { //Debug.Log("CONSTRAINT ON X < dMIN"); if ((u.invariantMove ? u.transform.position.x : this.team.Player.Controlled.transform.position.x) > this.transform.position.x) { pos.x = (u.invariantMove ? u.transform.position.x : this.team.Player.Controlled.transform.position.x) - (this.game.settings.Global.Team.dMinOffensivePlayer + this.game.rand.Next(offsetX)); } else { pos.x = (u.invariantMove ? u.transform.position.x : this.team.Player.Controlled.transform.position.x) + (this.game.settings.Global.Team.dMinOffensivePlayer + this.game.rand.Next(offsetX)); } } //Comportement normal else { } } } if (pos.x != oldPos.x) { //je bouge ////Debug.Log("second orderMove " + this + " bouge a la position : " + pos + " ancienne position : " + oldPos); //Debug.Log("CONSTRAINT ON X"); this.Order = Order.OrderMove(pos); oldPos = pos; } } //Contrainte sur Z ave le controllé if (distZ > this.oTS.dMaxControlledOffensive) { ////Debug.Log("too far : pos controllé : " + this.Team.Player.Controlled.transform.position.z + " autre pos : " + this.transform.position.z); if (this.team == this.game.southTeam) { pos.z = this.team.Player.Controlled.transform.position.z - (this.oTS.dMinControlledOffensive + this.game.rand.Next(offsetZ)); } else { pos.z = this.team.Player.Controlled.transform.position.z + (this.oTS.dMinControlledOffensive + this.game.rand.Next(offsetZ)); } } else if (distZ < this.oTS.dMinControlledOffensive) { ////Debug.Log("too near : " + this); if (this.team == this.game.southTeam) { pos.z = this.team.Player.Controlled.transform.position.z - (this.oTS.dMaxControlledOffensive - this.game.rand.Next(offsetZ)); } else { pos.z = this.team.Player.Controlled.transform.position.z + (this.oTS.dMaxControlledOffensive - this.game.rand.Next(offsetZ)); } } if (pos.z != oldPos.z) { //Debug.Log("CONSTRAINT ON Z"); this.Order = Order.OrderMove(pos); } }
void UpdateDefensePlacement() { //Check si je suis le destinataire d'une passe ou si je me replace if (this.game.Ball.NextOwner || replacement) { return; } //Variables Vector3 pos = this.transform.position; Vector3 oldPos = pos; float distZ = Mathf.Abs(this.Team.Player.Controlled.transform.position.z - this.transform.position.z); //distance entre moi et le controllé float distX = 0f; int offsetZ = Mathf.RoundToInt(this.oTS.dMaxControlledDefense - this.oTS.dMinControlledDefense); int offsetX = Mathf.RoundToInt(this.oTS.dMaxDefensePlayer - this.oTS.dMinDefensePlayer); //Check si je suis dans le même couloir que la balle if (this.game.compareZoneInMap(this.game.Ball.gameObject, this.gameObject) == 0) { //je suis dans la même zone que la balle et donc je ne bouge pas sur X sauf si un autre joueur est déjà dans le couloir foreach (Unit u in this.Team) { if (u != this && u.typeOfPlayer == TYPEOFPLAYER.DEFENSE) { if (u.ballZone) { this.ballZone = false; break; } else { this.ballZone = true; } } } } else // Check si un autre défenseur est dans le couloir de la balle { //Si personne alors je décide d'y aller bool otherDefenseGo = false; foreach (Unit u in this.Team) { if (u != this && u.typeOfPlayer == TYPEOFPLAYER.DEFENSE) { if (u.ballZone) { otherDefenseGo = true; break; } } } if (!otherDefenseGo) { this.ballZone = true; //Déplacement sur X pos.x += this.game.Ball.transform.position.x - this.transform.position.x; if (pos.x != oldPos.x) { //je bouge this.Order = Order.OrderMove(pos); oldPos = pos; } } } if (!this.ballZone) { //Contrainte sur X foreach (Unit u in this.Team) { //Seuls les défenseurs m'intéressent if (u != this && u.typeOfPlayer == TYPEOFPLAYER.DEFENSE) { distX = Mathf.Abs(u.transform.position.x - this.transform.position.x); if (distX > this.oTS.dMaxDefensePlayer) { if (u.transform.position.x > this.transform.position.x) { pos.x = u.transform.position.x - (this.oTS.dMaxDefensePlayer + this.game.rand.Next(offsetX)); } else { pos.x = u.transform.position.x + (this.oTS.dMaxDefensePlayer + this.game.rand.Next(offsetX)); } } else if (distX < this.oTS.dMinDefensePlayer) { if (u.transform.position.x > this.transform.position.x) { pos.x = u.transform.position.x - (this.oTS.dMinDefensePlayer + this.game.rand.Next(offsetX)); } else { pos.x = u.transform.position.x + (this.oTS.dMinDefensePlayer + this.game.rand.Next(offsetX)); } } /* * else // cas normal * { * if (this.game.rand.Next(100) > 50) * pos.x += this.game.rand.Next(5); * else * pos.x -= this.game.rand.Next(5); * } */ } if (pos.x != oldPos.x) { //je bouge ////Debug.Log("second orderMove " + this + " bouge a la position : " + pos + " ancienne position : " + oldPos); this.Order = Order.OrderMove(pos); oldPos = pos; } } } else { foreach (Unit u in this.team) { //seuls les défenseurs différent de moi m'intéresse if (u != this && u.typeOfPlayer == TYPEOFPLAYER.DEFENSE) { // le joueur est à ma droite Order.TYPE_POSITION posThis = this.PositionInMap(); Order.TYPE_POSITION posBall = game.PositionInMap(game.Ball.gameObject); ////Debug.Log(posThis + " et " + posBall + "donne" + (posThis > posBall)); //l'autre défenseur est à ma droite if (u.PositionInMap() > posThis) { //si la balle est > milieu alors il devient le défenseur de la balle if (posBall > Order.TYPE_POSITION.MIDDLE) { this.ballZone = false; u.ballZone = true; } } else { //si la balle est < milieu alors il devient le défenseur de la balle if (posBall < Order.TYPE_POSITION.MIDDLE) { this.ballZone = false; u.ballZone = true; } } } } } //Contrainte sur Z if (distZ > this.oTS.dMaxControlledDefense) { ////Debug.Log("too far : pos controllé : " + this.Team.Player.Controlled.transform.position.z + " autre pos : " + this.transform.position.z); if (this.team == this.game.southTeam) { pos.z = this.team.Player.Controlled.transform.position.z - (this.oTS.dMinControlledDefense + this.game.rand.Next(offsetZ)); } else { pos.z = this.team.Player.Controlled.transform.position.z + (this.oTS.dMinControlledDefense + this.game.rand.Next(offsetZ)); } } else if (distZ < this.oTS.dMinControlledDefense) { ////Debug.Log("too near : " + this); if (this.team == this.game.southTeam) { pos.z = this.team.Player.Controlled.transform.position.z - (this.oTS.dMaxControlledDefense - this.game.rand.Next(offsetZ)); } else { pos.z = this.team.Player.Controlled.transform.position.z + (this.oTS.dMaxControlledDefense - this.game.rand.Next(offsetZ)); } } if (pos.z != oldPos.z) { this.Order = Order.OrderMove(pos); } }
void UpdatePLAYER() { bool change = false; if (this.Controlled == null) { change = true; } //else if (this.Controlled.isTackled) //{ // change = true; //} else if (this.Controlled != this.game.Ball.Owner && (Input.GetKeyDown(Inputs.changePlayer.keyboard(this.Team)) || XboxController.GetButtonDown(Inputs.changePlayer.xbox))) { change = true; } if (change) { //Debug.Log("CHANGE PLAYER"); //foreach (Unit u in this.Team) //{ // u.UpdateTypeOfPlay(); //} Unit nextControlled = null; if (BallSkipOurOffensive()) { if (BallGoOurBut()) { nextControlled = GetDefensivePlayer(); } else { nextControlled = GetUnitNear(false); } } else { nextControlled = GetUnitNear(false); } ChangeControlled(nextControlled); //if (Controlled) //{ // Controlled.Order = Order.OrderNothing(); // Controlled.IndicateSelected(false); //} // //if (nextControlled) // Controlled = nextControlled; // ////Unit nearFromBall = GetUnitNear(false); ////if (nearFromBall) //// Controlled = nearFromBall; // //if (Controlled) //{ // Controlled.Order = Order.OrderNothing(); // Controlled.IndicateSelected(true); //} } if (Controlled && !game.UseFlorianIA) { Order.TYPE_POSITION typePosition = Team.PositionInMap(Controlled); if (game.Ball.Owner == null || game.Ball.Owner.Team == Team) { //offensiveside foreach (Unit u in Controlled.Team) { if (u != Controlled) { u.Order = Order.OrderOffensiveSide( Controlled, new Vector3(game.settings.Global.Team.Vheight, 0, game.settings.Global.Team.Vwidth / 1.5f), Controlled.Team.south, typePosition ); } } } else { //defensiveside foreach (Unit u in Controlled.Team) { if (u != Controlled) { u.Order = Order.OrderDefensiveSide( Controlled, new Vector3(game.settings.Global.Team.Vheight, 0, game.settings.Global.Team.Vwidth / 1.5f), Controlled.Team.south, typePosition ); } } } } }