示例#1
0
    /**
     *   this is the updated fucntion for the state
     */
    public override void Excute(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        if (PlayerScript.BallInReceivingRange() || !PlayerScript.GetTeam().InControl())
        {
            PlayerScript.ChangeState(CallingObject, ChaseBall.Instance());

            return;
        }

        Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive");

        if (Arr.AtTarget)
        {
            //PlayerScript.ChangeState(CallingObject, Wait.Instance());
            //PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive);
            // PlayerScript.GetSteeringController().TurnOff(Behaviour.Pursue);
            PlayerScript.TrackBall();

            if (PlayerScript.IsClosestTeamMemberToBall())
            {
                PlayerScript.ChangeState(CallingObject, ChaseBall.Instance());
            }
        }
    }
    // 대기중인 플레이어의 목표 지점을 최신화
    public void UpdateTargetsOfWaitingPlayers()
    {
        foreach (var item in players)
        {
            PlayerBase pb = item.GetComponent <PlayerBase>();
            if (pb.Role() != "GoalKeeper")
            {
                FieldPlayer fp = item.GetComponent <FieldPlayer>();

                if (fp.GetFSM() == null)
                {
                    Debug.LogError("No FSM");
                }

                // 본래의 위치로 돌아가게 한다.
                if (fp.GetFSM().IsInstate(Wait.instance) || fp.GetFSM().IsInstate(ReturnToHomeRegion.instance))
                {
                    if (fp.Team().teamColor == TeamColor.Blue)
                    {
                        fp.Steering().SetTarget((fp.Team().initialRegion[fp.Id() - 6]));
                    }
                    else
                    {
                        fp.Steering().SetTarget((fp.Team().initialRegion[fp.Id() - 1]));
                    }
                }
            }
        }
    }
示例#3
0
    /**
     *   this will execute when the state is entered
     */
    public override void Enter(GameObject CallingObject)
    {
        //Set as recieving and controlling player
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetTeam().SetControllingPlayer(PlayerScript);
        PlayerScript.GetTeam().RecievingPlayer = PlayerScript;

        //TODO - maybe add more to this if statement
        //If player is close
        if (!PlayerScript.IsOppenentWithinRadius())
        {
            PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive);
        }
        else
        {
            PlayerScript.GetSteeringController().TurnOn(Behaviour.Pursue);

            Steer2D.Pursue Pur = (Steer2D.Pursue)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Pursue");
            Pur.TargetAgent = PlayerScript.Ball;
        }

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Entering recieve ball state");
        }
    }
示例#4
0
 private void Discharge(FieldPlayer pReceiver, Telegram_CH4 msg = null)
 {
     if (msg == null || !pReceiver.HandleMessage(msg))
     {
         Debug.Log("Empty Msg Detected");
     }
 }
示例#5
0
    public void UpdateTargetsOfWaitingPlayers()
    {
        foreach (var item in players)
        {
            PlayerBase pb = item.GetComponent <PlayerBase>();
            if (pb.Role() != "GoalKeeper")
            {
                FieldPlayer fp = item.GetComponent <FieldPlayer>();
                if (fp.GetFSM() == null)
                {
                    Debug.Log("No FSM");
                }
                if (fp.GetFSM().IsInstate(Wait.instance) || fp.GetFSM().IsInstate(ReturnToHomeRegion.instance))
                {
                    //Debug.Log("원래는 fp.steering().settarget(~~)\n https://github.com/wangchen/Programming-Game-AI-by-Example-src/blob/master/Buckland_Chapter4-SimpleSoccer/SoccerTeam.cpp");

                    if (fp.Team().teamColor == TeamColor.Blue)
                    {
                        fp.Steering().SetTarget((fp.Team().initialRegion[fp.ID() - 6]));
                    }
                    else
                    {
                        fp.Steering().SetTarget((fp.Team().initialRegion[fp.ID() - 1]));
                    }
                    //    fp.gameObject.GetComponent<PlayerBase>().Steering().SetTarget(fp.HomeRegion());
                }
            }
        }
    }
示例#6
0
    /**
     *   this is the updated fucntion for the state
     */
    public override void Excute(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        if (PlayerScript.BallInKickingRange())
        {
            PlayerScript.ChangeState(CallingObject, KickBall.Instance());

            return;
        }


        if (PlayerScript.IsClosestTeamMemberToBall())
        {
            Steer2D.Seek S = (Steer2D.Seek)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Seek");

            if (S)
            {
                S.TargetPoint = PlayerScript.Ball.transform.position;
            }

            return;
        }

        PlayerScript.ChangeState(CallingObject, ReturnToHomeRegion.Instance());
    }
示例#7
0
 public override void OnStart()
 {
     //Debug.Log("IsCanshot Start");
     rightDoor = CreatGrid.Instance.GetPosByXY(Define.m_rightDoor);
     leftDoor  = CreatGrid.Instance.GetPosByXY(Define.m_leftDoor);
     v_Player  = this.GetComponent <FieldPlayer>();
     v_Ball    = CreatGrid.Instance.m_Ball;
 }
示例#8
0
    /**
     *   this will execute when the state is exited
     */
    public override void Exit(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Exiting KickBall State");
        }
    }
示例#9
0
    /**
     *   this will execute when the state is exited
     */
    public override void Exit(GameObject CallingObject)
    {
        //Empty
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Exiting Player Dribble State");
        }
    }
示例#10
0
    /**
     *   this will execute when the state is exited
     */
    public override void Exit(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive);

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Exiting Player Return to home state");
        }
    }
示例#11
0
    /**
     *   this will execute when the state is entered
     */
    public override void Enter(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetTeam().SetControllingPlayer(PlayerScript);

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Entering Player Dribble State");
        }
    }
示例#12
0
    /**
     *   this will execute when the state is entered
     */
    public override void Enter(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetSteeringController().TurnOn(Behaviour.Seek);

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Entering Player Chase Ball State");
        }
    }
        static void Main(string[] args)
        {
            FieldPlayer fieldPlayer = new FieldPlayer();
            Forward     forward     = new Forward();
            MidFielder  midfielder  = new MidFielder();

            // Link decorators
            forward.AssignPlayer(fieldPlayer);
            midfielder.AssignPlayer(forward);

            midfielder.passBall();
        }
示例#14
0
    /**
     *   this will execute when the state is entered
     */
    public override void Enter(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Entering Wait State");
        }

        PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive);

        //Empty
    }
示例#15
0
    public void RequestPass(FieldPlayer requester)
    {
        float randFloat = Random.Range(0f, 1f);

        if (randFloat > .5f)
        {
            return;
        }
        if (IsPassSafeFromAllOpponents(ControllingPlayer().transform.position, requester.transform.position, requester.gameObject, Prm.instance.MaxPassingForce))
        {
            MessageDispatcher_CH4.instance.DispatchMessage(0f, ControllingPlayer().GetComponent <FieldPlayer>().ID(), requester.ID(), SoccerMessages.Msg_PassToMe, requester.transform);
        }
    }
示例#16
0
    /**
     *   this will execute when the state is exited
     */
    public override void Exit(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetTeam().SupportingPlayer = null;

        PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive);


        if (PlayerScript.DebugOn)
        {
            Debug.Log("Exiting Support Attacker State");
        }
    }
示例#17
0
    /**
     *   this will execute when the state is exited
     */
    public override void Exit(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive);
        PlayerScript.GetSteeringController().TurnOff(Behaviour.Pursue);

        PlayerScript.GetTeam().RecievingPlayer = null;

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Exiting Receive ball state");
        }
    }
示例#18
0
    /**
     *   this will execute when the state is entered
     */
    public override void Enter(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive);

        Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive");

        Arr.TargetPoint = PlayerScript.HomePosition;

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Entering Player Return to home state");
        }
    }
示例#19
0
    /**
     *   this will execute when the state is entered
     */
    public override void Enter(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive);

        Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive");

        Arr.TargetPoint = PlayerScript.GetTeam().GetSupportSpot();

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Entering Support Attacker State");
        }
    }
示例#20
0
    /**
     *   this will execute when the state is entered
     */
    public override void Enter(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.GetTeam().SetControllingPlayer(PlayerScript);

        if (!PlayerScript.IsReadyForNextKick())
        {
            PlayerScript.ChangeState(CallingObject, ChaseBall.Instance());
        }

        if (PlayerScript.DebugOn)
        {
            Debug.Log("Entering Kick Ball State");
        }
    }
    // 패스 요청
    public void RequestPass(FieldPlayer requester)
    {
        // 패스 요청 빈도
        const float requestFrequency = 0.7f;
        float       randFloat        = UnityEngine.Random.Range(0f, 1f);

        if (randFloat > requestFrequency)
        {
            return;
        }

        // 가로챔 당할 걱정 없을 경우 패스
        if (IsPassSafeFromAllOpponents(ControllingPlayer().transform.position, requester.transform.position, requester.gameObject, Prm.instance.MaxPassingForce))
        {
            MessageDispatcher_CH4.instance.DispatchMessage(0f, ControllingPlayer().GetComponent <FieldPlayer>().Id(), requester.Id(), SoccerMessages.Msg_PassToMe, requester.transform);
        }
    }
示例#22
0
    /**
     *   this is the updated fucntion for the state
     */
    public override void Excute(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        if (!PlayerScript.GetTeam().InControl())
        {
            PlayerScript.ChangeState(CallingObject, ReturnToHomeRegion.Instance());
            return;
        }


        Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive");

        if (Arr.TargetPoint != PlayerScript.GetTeam().GetSupportSpot())
        {
            PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive);
            Arr.TargetPoint = PlayerScript.GetTeam().GetSupportSpot();
        }

        Vector2 ShootingTarget = new Vector2();

        if (PlayerScript.GetTeam().CanShoot(CallingObject.transform.position, out ShootingTarget, PlayerScript.MaxShootingForce)) //TODO ?Need Confidence here?
        {
            PlayerScript.GetTeam().RequestPass(CallingObject);
        }

        if (Arr.AtTarget)
        {
            //PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive);

            PlayerScript.TrackBall();

            if (!PlayerScript.IsThreatened())
            {
                PlayerScript.GetTeam().RequestPass(CallingObject);
            }
        }

        //If closest to ball and not in goalkeepers hands... Chase the ball
        if (PlayerScript.IsClosestTeamMemberToBall() && (!PlayerScript.GetTeam().GetPitch().GoalKeeperHasBall()))
        {
            PlayerScript.ChangeState(CallingObject, ChaseBall.Instance());
            return;
        }
    }
示例#23
0
    /**
     *   this is the updated fucntion for the state
     */
    public override void Excute(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        if (PlayerScript.GetTeam().GetPitch().GetGameInPlay())
        {
            //If closest to ball and not in goalkeepers hands... Chase the ball
            if (PlayerScript.IsClosestTeamMemberToBall() && (!PlayerScript.GetTeam().GetPitch().GoalKeeperHasBall()))
            {
                PlayerScript.ChangeState(CallingObject, ChaseBall.Instance());
                return;
            }
        }

        Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive");

        if (Arr.AtTarget)
        {
            PlayerScript.ChangeState(CallingObject, Wait.Instance());
        }
    }
示例#24
0
    /**
     *   this is the updated fucntion for the state
     */
    public override void Excute(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        float dot = Vector3.Dot(CallingObject.transform.right, (PlayerScript.OpponentsGoal.transform.position - CallingObject.transform.position).normalized);

        if (dot > 0.7f) //Facing the goal
        {
            //Dribble towards goal
            Vector2 Target = PlayerScript.transform.position + (CallingObject.transform.right * PlayerScript.DribbleForce);
            PlayerScript.Ball.GetComponent <Football>().AddForce(CallingObject.transform.right * PlayerScript.DribbleForce, Target, "Dribbling Towards Goal");
        }
        else
        {
            //Kick to your prefered turn dir
            //Debug.Log("Turning With Ball");
            Vector2 Target = PlayerScript.transform.position + (CallingObject.transform.right * PlayerScript.DribbleForce);

            PlayerScript.Ball.GetComponent <Football>().AddForce(CallingObject.transform.up * PlayerScript.TurningForce * PlayerScript.PreferedTurnDir, Target, "Turning With Ball");
        }

        PlayerScript.ChangeState(CallingObject, ChaseBall.Instance());
    }
示例#25
0
    /**
     *   this is the updated fucntion for the state
     */
    public override void Excute(GameObject CallingObject)
    {
        FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>();

        PlayerScript.TrackBall();



        if (PlayerScript.GetTeam().GetPitch().GetGameInPlay())
        {
            //If closest to ball and not in goalkeepers hands... Chase the ball
            if (PlayerScript.IsClosestTeamMemberToBall() && (!PlayerScript.GetTeam().GetPitch().GoalKeeperHasBall()))
            {
                PlayerScript.ChangeState(CallingObject, ChaseBall.Instance());
                return;
            }
        }

        if (PlayerScript.GetTeam().InControl() && (PlayerScript.GetTeam().ControllingPlayer != PlayerScript && PlayerScript.AheadOfAttacker()))
        {
            PlayerScript.GetTeam().RequestPass(CallingObject);
            return;
        }
    }
示例#26
0
        static void Decorator()
        {
            //'-- Step 1:
            //'Create few players (concrete components)

            //'Create few field Players
            var owen = new FieldPlayer("Owen");
            var beck = new FieldPlayer("Beckham");

            //'Create a goal keeper
            var khan = new GoalKeeper("Khan");

            //'-- Step 2:
            //'Just make them pass the ball
            //'(during a warm up session ;))

            System.Console.WriteLine();
            System.Console.WriteLine(" > Warm up Session... ");

            owen.PassBall();
            beck.PassBall();
            khan.PassBall();

            //'-- Step 3: Create and assign the responsibilities
            //'(when the match starts)

            System.Console.WriteLine();
            System.Console.WriteLine(" > Match is starting.. ");

            //'Set owen as our first forward
            var forward1 = new Forward();
            forward1.AssignPlayer(owen);

            //'Set Beckham as our midfielder
            var midfielder1 = new MidFielder();
            midfielder1.AssignPlayer(beck);

            //'Now, use these players to do actions
            //'specific to their roles

            //'Owen can pass the ball
            forward1.PassBall();
            //'And owen can shoot as well
            forward1.ShootGoal();

            //'Beckham can pass ball
            midfielder1.PassBall();
            //'Beckham can dribble too
            midfielder1.Dribble();

            //' [ Arrange the above operations to some meaningfull sequence, like
            //' "Beckham dribbled and passed the ball to owen and owen shooted the
            //' goal ;) - just for some fun ]"

            //'-- Step 4: Now, changing responsibilities
            //'(during a substitution)

            //'Assume that owen got injured, and we need a new player
            //'to play as our forward1

            System.Console.WriteLine();
            System.Console.WriteLine(" > OOps, Owen " + "got injured. " + "Jerrard replaced Owen.. ");

            //'Create a new player
            var jerrard = new FieldPlayer("Jerrard");

            //'Ask Jerrard to play in position of owen
            forward1.AssignPlayer(jerrard);
            forward1.ShootGoal();

            //'-- Step 5: Adding multiple responsibilities
            //'(When a player need to handle multiple roles)

            //'We already have Beckham as our midfielder.
            //'Let us ask him to play as an additional forward

            var onemoreForward = new Forward();
            onemoreForward.AssignPlayer(beck);

            System.Console.WriteLine();
            System.Console.WriteLine(" > Beckham has " + "multiple responsibilities.. ");

            //'Now Beckham can shoot
            onemoreForward.ShootGoal();
            //'And use his earlier responsibility to dribble too
            midfielder1.Dribble();

            //'According to our design, you can attach the responsibility of
            //'a forward to a goal keeper too, but when you actually
            //'play football, remember that it is dangerous ;)

            //'Wait for key press
        }
 public void RemoveEntity(FieldPlayer pEntity)
 {
     m_EntityMap.Remove(pEntity.ID());
 }
示例#28
0
        static void Decorator()
        {
            //'-- Step 1:
            //'Create few players (concrete components)

            //'Create few field Players
            var owen = new FieldPlayer("Owen");
            var beck = new FieldPlayer("Beckham");

            //'Create a goal keeper
            var khan = new GoalKeeper("Khan");

            //'-- Step 2:
            //'Just make them pass the ball
            //'(during a warm up session ;))

            System.Console.WriteLine();
            System.Console.WriteLine(" > Warm up Session... ");

            owen.PassBall();
            beck.PassBall();
            khan.PassBall();

            //'-- Step 3: Create and assign the responsibilities
            //'(when the match starts)

            System.Console.WriteLine();
            System.Console.WriteLine(" > Match is starting.. ");

            //'Set owen as our first forward
            var forward1 = new Forward();

            forward1.AssignPlayer(owen);

            //'Set Beckham as our midfielder
            var midfielder1 = new MidFielder();

            midfielder1.AssignPlayer(beck);

            //'Now, use these players to do actions
            //'specific to their roles

            //'Owen can pass the ball
            forward1.PassBall();
            //'And owen can shoot as well
            forward1.ShootGoal();

            //'Beckham can pass ball
            midfielder1.PassBall();
            //'Beckham can dribble too
            midfielder1.Dribble();

            //' [ Arrange the above operations to some meaningfull sequence, like
            //' "Beckham dribbled and passed the ball to owen and owen shooted the
            //' goal ;) - just for some fun ]"

            //'-- Step 4: Now, changing responsibilities
            //'(during a substitution)

            //'Assume that owen got injured, and we need a new player
            //'to play as our forward1

            System.Console.WriteLine();
            System.Console.WriteLine(" > OOps, Owen " + "got injured. " + "Jerrard replaced Owen.. ");

            //'Create a new player
            var jerrard = new FieldPlayer("Jerrard");

            //'Ask Jerrard to play in position of owen
            forward1.AssignPlayer(jerrard);
            forward1.ShootGoal();

            //'-- Step 5: Adding multiple responsibilities
            //'(When a player need to handle multiple roles)

            //'We already have Beckham as our midfielder.
            //'Let us ask him to play as an additional forward

            var onemoreForward = new Forward();

            onemoreForward.AssignPlayer(beck);

            System.Console.WriteLine();
            System.Console.WriteLine(" > Beckham has " + "multiple responsibilities.. ");

            //'Now Beckham can shoot
            onemoreForward.ShootGoal();
            //'And use his earlier responsibility to dribble too
            midfielder1.Dribble();

            //'According to our design, you can attach the responsibility of
            //'a forward to a goal keeper too, but when you actually
            //'play football, remember that it is dangerous ;)

            //'Wait for key press
        }
示例#29
0
 public override void OnStart()
 {
     v_Player = GetComponent <FieldPlayer>();
     v_Ball   = v_Player.GetBall().GetComponent <Ball>();
 }
示例#30
0
 public override void OnStart()
 {
     v_Player = this.GetComponent <FieldPlayer>();
 }
示例#31
0
        protected void DrawField()
        {
            int b   = 1;
            int bx2 = b * 2;

            for (int x = 0; x < game.gameParameters.FieldWidth; x++)
            {
                for (int y = 0; y < game.gameParameters.FieldHeight; y++)
                {
                    Tile      t = game.field[x, y];
                    Rectangle r = new Rectangle();
                    switch (t.terrainType)
                    {
                    case TerrainType.Field:
                        r = new Rectangle(0 + b, 0 + b, 64 - bx2, 64 - bx2);
                        break;

                    case TerrainType.Water:
                        r = new Rectangle(64 + b, 0 + b, 64 - bx2, 64 - bx2);
                        break;

                    case TerrainType.Swamp:
                        r = new Rectangle(256 + b, 0 + b, 64 - bx2, 64 - bx2);
                        break;

                    case TerrainType.Hole:
                        r = new Rectangle(128 + b, 0 + b, 64 - bx2, 64 - bx2);
                        break;

                    case TerrainType.Home:
                        r = new Rectangle(0 + b, 0 + b, 64 - bx2, 64 - bx2);
                        break;

                    default:
                        throw new Exception();
                    }
                    spriteBatch.Draw(atlasTexture, new Rectangle(x * a + bias.X, y * a + bias.Y, a, a), r, Color.White);
                    if (t.terrainType == TerrainType.Home)
                    {
                        spriteBatch.Draw(atlasTexture, new Rectangle(x * a + bias.X, y * a + bias.Y, a, a), new Rectangle(320 + b, 64 + b, 64 - bx2, 64 - bx2), playersColors[t.intParam - 1]);
                    }
                    foreach (var pair in t.walls)
                    {
                        if (pair.Value != BorderType.Empty)
                        {
                            switch (pair.Value)
                            {
                            case BorderType.BreakableWall:
                                r = new Rectangle(256, 64, 64, 64);
                                break;

                            case BorderType.UnbreakableWall:
                                r = new Rectangle(0, 64, 64, 64);
                                break;

                            case BorderType.Grate:
                                r = new Rectangle(64, 64, 64, 64);
                                break;

                            default:
                                throw new Exception();
                            }
                            float f = 0;
                            switch (pair.Key)
                            {
                            case Direction.Up:
                                f = 0;
                                break;

                            case Direction.Right:
                                f = MathHelper.PiOver2;
                                break;

                            case Direction.Down:
                                f = MathHelper.PiOver2 * 2;
                                break;

                            case Direction.Left:
                                f = MathHelper.PiOver2 * 3;
                                break;

                            default:
                                throw new Exception();
                            }
                            spriteBatch.Draw(
                                texture: atlasTexture,
                                destinationRectangle: new Rectangle(x * a + a / 2 + bias.X, y * a + a / 2 + bias.Y, a, a),
                                sourceRectangle: r,
                                color: Color.White,
                                rotation: f,
                                origin: new Vector2(32, 32),
                                effects: SpriteEffects.None,
                                layerDepth: 0);
                        }
                    }
                    foreach (var s in t.stuff)
                    {
                        switch (s.type)
                        {
                        case StuffType.Treasure:
                            r = new Rectangle(128 + b, 64 + b, 64 - bx2, 64 - bx2);
                            break;

                        default:
                            throw new Exception();
                        }
                        spriteBatch.Draw(atlasTexture, new Rectangle(x * a + bias.X, y * a + bias.Y, a, a), r, Color.White);
                    }
                }
            }
            for (int i = 0; i < game.field.players.Length; i++)
            {
                FieldPlayer p = game.field.players[i];
                spriteBatch.Draw(atlasTexture, new Rectangle(p.X * a + bias.X, p.Y * a + bias.Y, a, a), new Rectangle(192 + b, 64 + b, 64 - bx2, 64 - bx2), playersColors[i]);
            }
        }