Ejemplo n.º 1
0
    //reset the guard (move to the starting position, reset the counters, etc.)
    public void ResetGuard()
    {
        _step               = 0;
        _checkStep          = 0;
        Behavior.GuardState = Guard.GuardStates.Patrol;

        gameObject.transform.position = new Vector3(Behavior.Patrol.StartNode.x, Behavior.Patrol.StartNode.y);
        Direction.gameObject.SetActive(true);
        _orientation = Node.Dir.None;
        for (int i = 1; i <= Behavior.RouteLength; i++)
        {
            _orientation =
                Behavior.Patrol.PatrolRoutePhen[(int)(Mathf.Repeat(Behavior.RouteLength - 1, Behavior.RouteLength))].Direction;
            if (_orientation != Node.Dir.None)
            {
                break;
            }
        }
        if (_orientation == Node.Dir.None)
        {
            _orientation = Node.Dir.North;
        }
        Direction.eulerAngles = new Vector3(0f, 0f,
                                            _dirToAngle[_orientation]);
    }
Ejemplo n.º 2
0
    // modify the tile route diplay
    public void ModifyRouteDisplay(Vector2 origin, Vector2 dest, Node.Dir direction, Color color)
    {
        if (direction != Node.Dir.None)
        {
            _grid[(int)(origin.x)][(int)(origin.y)].Tile.GetComponent <MapTileController>().ModifyRoute(direction, color);
        }
        switch (direction)
        {
        case Node.Dir.East:
            _grid[(int)(dest.x)][(int)(dest.y)].Tile.GetComponent <MapTileController>().ModifyRoute(Node.Dir.West, color);
            break;

        case Node.Dir.North:
            _grid[(int)(dest.x)][(int)(dest.y)].Tile.GetComponent <MapTileController>().ModifyRoute(Node.Dir.South, color);
            break;

        case Node.Dir.West:
            _grid[(int)(dest.x)][(int)(dest.y)].Tile.GetComponent <MapTileController>().ModifyRoute(Node.Dir.East, color);
            break;

        case Node.Dir.South:
            _grid[(int)(dest.x)][(int)(dest.y)].Tile.GetComponent <MapTileController>().ModifyRoute(Node.Dir.North, color);
            break;

        case Node.Dir.None:
            _grid[(int)(dest.x)][(int)(dest.y)].Tile.GetComponent <MapTileController>().ModifyPause(color);
            break;
        }
    }
Ejemplo n.º 3
0
    // to process the move command for the ninja from the player
    private Noise MoveNinja(Node.Dir direction, int speed)
    {
        if (speed == 1)
        {
            _ninjaNoise = new Noise(new Vector2(_ninjaObject.transform.position.x, _ninjaObject.transform.position.y),
                                    GenerateNinjaNoise(speed));
            MoveGuards();
        }

        Vector2 newPos = new Vector2(_ninjaObject.transform.position.x, _ninjaObject.transform.position.y);

        for (int i = 0; i < speed; i++)
        {
            newPos = MapGrid.Move(newPos, direction);
        }

        _ninjaObject.transform.position = new Vector3(newPos.x, newPos.y);

        if (MapGrid.IsAtGoal(newPos))
        {
            EndGame("You win!");
        }

        return(new Noise(new Vector2(_ninjaObject.transform.position.x, _ninjaObject.transform.position.y),
                         GenerateNinjaNoise(speed)));
    }
Ejemplo n.º 4
0
    public SimpleAction Mutate()
    {
        Node.Dir prev = Direction;
        do
        {
            Direction = (Node.Dir)(Random.Range(0, 4));
        }while (Direction == prev);

        return(this);
    }
Ejemplo n.º 5
0
 public void ModifyRoute(Node.Dir direction, Color color)
 {
     if (_routes[direction].color != Color.white)
     {
         if (_routes[direction].color != color)
         {
             _routes[direction].color = Color.gray;
         }
     }
     else
     {
         _routes[direction].enabled = true;
         _routes[direction].color   = color;
     }
 }
Ejemplo n.º 6
0
 // get the results of moving from the position pos in the direction direction
 public Vector2 Move(Vector2 pos, Node.Dir direction)
 {
     if (direction == Node.Dir.None)
     {
         return(pos);
     }
     else if (_grid[(int)(pos.x)][(int)(pos.y)].Edges[direction].IsPassable)
     {
         return(pos + dirModifyer[direction]);
     }
     else
     {
         return(pos);
     }
 }
Ejemplo n.º 7
0
 public void ModifyBorder(Node.Dir direction, bool isPass, bool isPerc)
 {
     if (isPass)
     {
         _borders[direction].color   = Color.white;
         _borders[direction].enabled = false;
     }
     else if (isPerc)
     {
         _borders[direction].enabled = true;
         _borders[direction].color   = percColor;
     }
     else
     {
         _borders[direction].enabled = true;
         _borders[direction].color   = impassColor;
     }
 }
Ejemplo n.º 8
0
    // moving in the normal game. Responce to the OnMove event
    private void Move(Map map, List <Noise> noises, Vector3 ninjaPos)
    {
        CheckDetection(map, noises, ninjaPos);

        if (_checkStep == Behavior.RouteLength)
        {
            Behavior.GuardState = Guard.GuardStates.Patrol;
            _checkStep          = 0;
        }

        if (Behavior.GuardState == Guard.GuardStates.Patrol)
        {
            switch (Behavior.Patrol.PatrolRoutePhen[_step].Direction)
            {
            case Node.Dir.South:
                transform.position   += Vector3.down;
                _orientation          = Node.Dir.South;
                Direction.eulerAngles = new Vector3(0f, 0f, _dirToAngle[Node.Dir.South]);
                break;

            case Node.Dir.North:
                transform.position   += Vector3.up;
                _orientation          = Node.Dir.North;
                Direction.eulerAngles = new Vector3(0f, 0f, _dirToAngle[Node.Dir.North]);
                break;

            case Node.Dir.West:
                transform.position   += Vector3.left;
                _orientation          = Node.Dir.West;
                Direction.eulerAngles = new Vector3(0f, 0f, _dirToAngle[Node.Dir.West]);
                break;

            case Node.Dir.East:
                transform.position   += Vector3.right;
                _orientation          = Node.Dir.East;
                Direction.eulerAngles = new Vector3(0f, 0f, _dirToAngle[Node.Dir.East]);
                break;

            case Node.Dir.None:
                break;
            }
            _step = (_step + 1) % Behavior.RouteLength;
        }
        else
        {
            switch (Behavior.CheckPath[_checkStep].Direction)
            {
            case Node.Dir.South:
                transform.position   += Vector3.down;
                _orientation          = Node.Dir.South;
                Direction.eulerAngles = new Vector3(0f, 0f, _dirToAngle[Node.Dir.South]);
                break;

            case Node.Dir.North:
                transform.position   += Vector3.up;
                _orientation          = Node.Dir.North;
                Direction.eulerAngles = new Vector3(0f, 0f, _dirToAngle[Node.Dir.North]);
                break;

            case Node.Dir.West:
                transform.position   += Vector3.left;
                _orientation          = Node.Dir.West;
                Direction.eulerAngles = new Vector3(0f, 0f, _dirToAngle[Node.Dir.West]);
                break;

            case Node.Dir.East:
                transform.position   += Vector3.right;
                _orientation          = Node.Dir.East;
                Direction.eulerAngles = new Vector3(0f, 0f, _dirToAngle[Node.Dir.East]);
                break;

            case Node.Dir.None:
                break;
            }
            _checkStep++;
        }

        if (ninjaPos == transform.position)
        {
            RaiseAlarm(ninjaPos, ninjaPos);
        }
    }
Ejemplo n.º 9
0
    // get the hearing and vision values
    private Vector2 GetPercepts(Noise noise, Map map)
    {
        Vector2 percepts = new Vector2();

        Vector2 pos       = new Vector2(transform.position.x, transform.position.y);
        float   detection = map.GetDetection(Behavior.Id, noise.pos);

        if (Random.value <= detection)
        {
            percepts.x = noise.intencity * 100f;
        }
        else
        {
            percepts.x = 0f;
        }

        Node.Dir orientation = Node.Dir.None;
        for (int i = 1; i <= Behavior.RouteLength; i++)
        {
            orientation =
                Behavior.Patrol.PatrolRoutePhen[(int)(Mathf.Repeat(_step - 1, Behavior.RouteLength))].Direction;
            if (orientation != Node.Dir.None)
            {
                break;
            }
        }
        if (orientation == Node.Dir.None)
        {
            orientation = Node.Dir.North;
        }

        float trueDet = Mathf.Max(0f, 1f - (Mathf.Abs(pos.x - noise.pos.x) + Mathf.Abs(pos.y - noise.pos.y) - 1) * _detDecrease);

        switch (orientation)
        {
        case Node.Dir.South:
            if (noise.pos.y < pos.y &&
                Mathf.Atan2(Mathf.Abs(noise.pos.x - pos.x), pos.y - noise.pos.y) <= (Mathf.PI / 4 + Mathf.Epsilon) &&
                Mathf.Abs(detection - trueDet) < Mathf.Epsilon)
            {
                percepts.y = Mathf.Min(1f, detection * 2) * 100f;
            }
            else
            {
                percepts.y = 0f;
            }
            break;

        case Node.Dir.North:
            if (noise.pos.y > pos.x &&
                Mathf.Atan2(Mathf.Abs(noise.pos.x - pos.x), noise.pos.y - pos.y) <= (Mathf.PI / 4 + Mathf.Epsilon) &&
                Mathf.Abs(detection - trueDet) < Mathf.Epsilon)
            {
                percepts.y = Mathf.Min(1f, detection * 2) * 100f;
            }
            else
            {
                percepts.y = 0f;
            }
            break;

        case Node.Dir.West:
            if (noise.pos.x < pos.x &&
                Mathf.Atan2(Mathf.Abs(noise.pos.y - pos.y), pos.x - noise.pos.x) <= (Mathf.PI / 4 + Mathf.Epsilon) &&
                Mathf.Abs(detection - trueDet) < Mathf.Epsilon)
            {
                percepts.y = Mathf.Min(1f, detection * 2) * 100f;
            }
            else
            {
                percepts.y = 0f;
            }
            break;

        case Node.Dir.East:
            if (noise.pos.x > pos.x &&
                Mathf.Atan2(Mathf.Abs(noise.pos.y - pos.y), noise.pos.x - pos.x) <= (Mathf.PI / 4 + Mathf.Epsilon) &&
                Mathf.Abs(detection - trueDet) < Mathf.Epsilon)
            {
                percepts.y = Mathf.Min(1f, detection * 2) * 100f;
            }
            else
            {
                percepts.y = 0f;
            }
            break;
        }


        return(percepts);
    }
Ejemplo n.º 10
0
 public SimpleAction(Node.Dir direction = Node.Dir.North)
 {
     Direction = direction;
 }