Example #1
0
    /// <summary>
    /// please use these values:
    /// 1 = N, 2 = NE, 3 = E, 4 = SE, 5 = S, 6 = SW, 7 = W, 8 = NW
    /// This is because it is better to not allow any variations between the
    /// defined directions
    /// </summary>
    protected void NudgeInDir(int dir)
    {
        Vector2Int nudgeDir = Vector2Int.zero;

        switch (dir)
        {
        case 1:                 //N
            nudgeDir = Vector2Int.up;
            break;

        case 2:                 //NE
            nudgeDir = Vector2Int.one;
            break;

        case 3:                 //E
            nudgeDir = Vector2Int.right;
            break;

        case 4:                 //SE
            nudgeDir = new Vector2Int(1, -1);
            break;

        case 5:                 //S
            nudgeDir = Vector2Int.down;
            break;

        case 6:                 //SW
            nudgeDir = Vector2Int.one * -1;
            break;

        case 7:                 //W
            nudgeDir = Vector2Int.left;
            break;

        case 8:                 //NW
            nudgeDir = new Vector2Int(-1, 1);
            break;
        }

        if (nudgeDir != Vector2Int.zero)
        {
            cnt.Push(nudgeDir);
            var angleOfDir = Vector3.Angle((Vector2)nudgeDir, transform.up);
            if (nudgeDir.x < 0f)
            {
                angleOfDir = -angleOfDir;
            }

            dirSprites.CheckSpriteServer(angleOfDir);
        }
    }
Example #2
0
    /// <summary>
    /// Nudge the Mob in a certain direction
    /// </summary>
    /// <param name="dir"></param>
    protected void NudgeInDirection(Vector2Int dir)
    {
        if (dir != Vector2Int.zero)
        {
            cnt.Push(dir);
            var angleOfDir = Vector3.Angle((Vector2)dir, transform.up);
            if (dir.x < 0f)
            {
                angleOfDir = -angleOfDir;
            }

            dirSprites.CheckSpriteServer(angleOfDir);
        }
    }
Example #3
0
    /// <summary>
    /// General use movement for npcs
    /// 0 = no move (1 - 8 are directions to move in reading from left to right)
    /// </summary>
    /// <param name="act"></param>
    protected void PerformMoveAction(int act)
    {
        if (act == 0)
        {
            performingDecision = false;
        }
        else
        {
            Vector2Int dirToMove = Vector2Int.zero;
            int        count     = 1;
            for (int y = 1; y > -2; y--)
            {
                for (int x = -1; x < 2; x++)
                {
                    if (count == act)
                    {
                        dirToMove.x += x;
                        dirToMove.y += y;
                        y            = -100;
                        break;
                    }
                    else
                    {
                        count++;
                    }
                }
            }

            if (dirToMove == Vector2Int.zero)
            {
                performingDecision = false;
                return;
            }

            var dest = registerObj.LocalPositionServer + (Vector3Int)dirToMove;

            if (!cnt.Push(dirToMove))
            {
                //Path is blocked try again
                performingDecision = false;
                DoorController tryGetDoor =
                    registerObj.Matrix.GetFirst <DoorController>(
                        dest, true);
                if (tryGetDoor)
                {
                    tryGetDoor.MobTryOpen(gameObject);
                }
            }
            else
            {
                OnPushSolid(dest);
            }

            var angleOfDir = Vector2.Angle(dirToMove, transform.up);
            if (dirToMove.x < 0f)
            {
                angleOfDir = -angleOfDir;
            }

            if (dirSprites != null)
            {
                dirSprites.CheckSpriteServer(angleOfDir);
            }
        }
    }
Example #4
0
    IEnumerator PerformFollowPath(List <Node> path)
    {
        int node = 1;

        while (node < path.Count)
        {
            if (!activated)
            {
                yield return(WaitFor.EndOfFrame);

                yield break;
            }

            if (!movingToTile)
            {
                if (tickRate != 0f)
                {
                    yield return(WaitFor.Seconds(tickRate));
                }

                var dir = path[node].position - Vector2Int.RoundToInt(transform.localPosition);
                if (!registerTile.Matrix.IsPassableAt(registerTile.LocalPositionServer + (Vector3Int)dir, true))
                {
                    var dC = registerTile.Matrix.GetFirst <DoorController>(
                        registerTile.LocalPositionServer + (Vector3Int)dir, true);
                    if (dC != null)
                    {
                        dC.ServerTryOpen(gameObject);
                        yield return(WaitFor.Seconds(1f));
                    }
                    else
                    {
                        ResetMovingValues();
                        FollowCompleted();
                        Logger.Log("Path following timed out. Something must be in the way", Category.Movement);
                        yield break;
                    }
                }

                var angleOfDir = Vector2.Angle(dir, transform.up);
                if (dir.x < 0f)
                {
                    angleOfDir = -angleOfDir;
                }

                if (dirSprites != null)
                {
                    dirSprites.CheckSpriteServer(angleOfDir);
                }

                cnt.Push(dir);
                movingToTile = true;
            }
            else
            {
                if (arrivedAtTile)
                {
                    movingToTile  = false;
                    arrivedAtTile = false;
                    timeOut       = 0f;
                    node++;
                }
                else
                {
                    //Mob has 5 seconds to get to the next tile
                    //or the AI should do something else
                    timeOut += Time.deltaTime;
                    if (timeOut > 5f)
                    {
                        ResetMovingValues();
                        Logger.Log("Path following timed out. Something must be in the way", Category.Movement);
                        FollowCompleted();
                        yield break;
                    }
                }
            }

            yield return(WaitFor.EndOfFrame);
        }

        yield return(WaitFor.EndOfFrame);

        ResetMovingValues();
        FollowCompleted();
    }