//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]); }
// 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; } }
// 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))); }
public SimpleAction Mutate() { Node.Dir prev = Direction; do { Direction = (Node.Dir)(Random.Range(0, 4)); }while (Direction == prev); return(this); }
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; } }
// 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); } }
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; } }
// 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); } }
// 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); }
public SimpleAction(Node.Dir direction = Node.Dir.North) { Direction = direction; }