Ejemplo n.º 1
0
        DFPosition GetNextNavPosition(MobileDirection direction)
        {
            DFPosition nextPosition = new DFPosition(0, 0);

            switch (direction)
            {
            case MobileDirection.North:
                nextPosition = new DFPosition(currentNavPosition.X, currentNavPosition.Y - 1);
                break;

            case MobileDirection.South:
                nextPosition = new DFPosition(currentNavPosition.X, currentNavPosition.Y + 1);
                break;

            case MobileDirection.East:
                nextPosition = new DFPosition(currentNavPosition.X + 1, currentNavPosition.Y);
                break;

            case MobileDirection.West:
                nextPosition = new DFPosition(currentNavPosition.X - 1, currentNavPosition.Y);
                break;
            }

            return(nextPosition);
        }
Ejemplo n.º 2
0
        void SetFacing(MobileDirection facing)
        {
            // Select a random facing direction
            if (facing == MobileDirection.Random)
            {
                facing = (MobileDirection)Random.Range((int)MobileDirection.North, (int)MobileDirection.West + 1);
            }

            // Set mobile transform facing in this direction
            switch (facing)
            {
            case MobileDirection.North:
                transform.rotation = Quaternion.Euler(0, 0, 0);
                break;

            case MobileDirection.South:
                transform.rotation = Quaternion.Euler(0, 180, 0);
                break;

            case MobileDirection.East:
                transform.rotation = Quaternion.Euler(0, 90, 0);
                break;

            case MobileDirection.West:
                transform.rotation = Quaternion.Euler(0, -90, 0);
                break;
            }

            // Store new facing
            currentDirection = facing;
        }
Ejemplo n.º 3
0
 public static LayerComparer FromDirection(MobileDirection dir)
 {
     dir &= MobileDirection.Up;
     if (dir == MobileDirection.Down)
     {
         return Forward;
     }
     return Backward;
 }
Ejemplo n.º 4
0
 public static LayerComparer FromDirection(MobileDirection dir)
 {
     dir &= MobileDirection.Up;
     if (dir == MobileDirection.Down)
     {
         return(Forward);
     }
     return(Backward);
 }
Ejemplo n.º 5
0
        // Check for geometry in the way (stairs,...)
        bool IsDirectionClear(MobileDirection direction)
        {
            Vector3 tempTargetScenePosition = cityNavigation.WorldToScenePosition(cityNavigation.NavGridToWorldPosition(GetNextNavPosition(direction)));

            // Aim low to better detect stairs
            tempTargetScenePosition.y += 0.1f;
            Ray  ray       = new Ray(transform.position, tempTargetScenePosition - transform.position);
            bool collision = Physics.Raycast(transform.position, tempTargetScenePosition - transform.position, Vector3.Distance(transform.position, tempTargetScenePosition), ~mobileAsset.GetLayerMask());

            // Debug.DrawRay(transform.position, tempTargetScenePosition - transform.position, collision ? Color.red : Color.green, 1f);
            return(!collision);
        }
Ejemplo n.º 6
0
        int GetNextNavPositionWeight(MobileDirection direction)
        {
            // Must have a current position on navgrid
            if (!cityNavigation || currentNavPosition.X == -1 || currentNavPosition.Y == -1)
            {
                return(0);
            }

            // Get next nav position and regard occupied tiles as weight 0
            DFPosition nextPosition = GetNextNavPosition(direction);

            if (cityNavigation.HasFlags(nextPosition, CityNavigation.TileFlags.Occupied))
            {
                return(0);
            }

            return(cityNavigation.GetNavGridWeightLocal(nextPosition));
        }
Ejemplo n.º 7
0
        void SeekingTile()
        {
            // Population manager will recycle this mobile if it can't find a target after several attempts
            seekCount++;

            // Ensure mobile is on grid
            InitNavPosition(currentNavPosition);

            // Get surrounding weights
            localWeights[(int)MobileDirection.North] = GetNextNavPositionWeight(MobileDirection.North);
            localWeights[(int)MobileDirection.South] = GetNextNavPositionWeight(MobileDirection.South);
            localWeights[(int)MobileDirection.East]  = GetNextNavPositionWeight(MobileDirection.East);
            localWeights[(int)MobileDirection.West]  = GetNextNavPositionWeight(MobileDirection.West);

            // Get current and target weights
            int currentWeight = GetCurrentNavPositionWeight();
            int targetWeight  = localWeights[(int)currentDirection];

            // A small chance to randomly change direction - this keeps the movement shuffled
            if (Random.Range(0f, 1f) < randomChangeChance)
            {
                targetWeight = 0;
            }

            // Always change direction if target weight is zero - weight of target doesn't matter
            if (targetWeight == 0)
            {
                // Try to move in any valid random direction
                int randomDirection = Random.Range(0, localWeights.Length);
                if (localWeights[randomDirection] == 0)
                {
                    return;
                }

                SetFacing((MobileDirection)randomDirection);
                SetTargetPosition();
                return;
            }

            // High chance to change direction if target weight lower than current weight
            // This will cause mobiles to generally follow roads and other nice surfaces
            if (targetWeight < currentWeight && Random.Range(0f, 1f) > tileDowngradeChance)
            {
                // Evaluate in random order so if multiple equal "bests" are found we go a random direction
                int             bestWeight    = targetWeight;
                MobileDirection bestDirection = currentDirection;
                System.Random   rand          = new System.Random();
                foreach (int i in Enumerable.Range(0, 3).OrderBy(x => rand.Next(3)))
                {
                    if (localWeights[i] > bestWeight)
                    {
                        bestWeight    = localWeights[i];
                        bestDirection = (MobileDirection)i;
                    }
                }

                // Start heading in new best direction
                SetFacing(bestDirection);
                currentDirection = bestDirection;
                SetTargetPosition();
                return;
            }

            // Otherwise keep marching in current direction
            SetTargetPosition();
        }
Ejemplo n.º 8
0
 public static LayerComparer FromDirection(MobileDirection dir)
 {
     return(LayerComparer.maleComparers[(int)(dir & MobileDirection.Up)]);
 }