Exemple #1
0
    // TODO: fix movement, see card.
    // May need new to create new method, GetDirectionsToPlayer(shouldDiag)
    private void Move(Vector3 dir)
    {
        if (dir.x > 0)
        {
            currDir = Direction.right;
        }
        else if (dir.x < 0)
        {
            currDir = Direction.left;
        }
        else if (dir.y > 0)
        {
            currDir = Direction.up;
        }
        else
        {
            currDir = Direction.down;
        }


        if (CanMoveForEnemy(transform.position, currDir))
        {
            MoveDir(dir);
        }
        else
        {
            Direction randomDir = (Direction)Random.Range(0, 4);
            if (CanMoveForEnemy(transform.position, randomDir))
            {
                MoveDir(DirectionUtil.Convert(randomDir));
            }
        }
    }
Exemple #2
0
    private bool ComplexHallwayCheckSpot(Vector3Int pos, Direction dir)
    {
        // Check these positions
        //   . . .
        //   . v .
        //   # # #

        pos += new Vector3Int(MID, MID, 0);
        Vector3Int posA = pos + DirectionUtil.Convert(dir);
        Vector3Int posB = posA + DirectionUtil.Convert(DirectionUtil.NextDir(dir));
        Vector3Int posC = posA + DirectionUtil.Convert(DirectionUtil.PrevDir(dir));

        // hacky code
        if (pos.x < 1 || MAX_SIZE - 2 < pos.x || pos.y < 1 || MAX_SIZE - 2 < pos.y)
        {
            return(false);
        }

        if (grid[posA.x, posA.y] || grid[posB.x, posB.y] || grid[posC.x, posC.y])
        {
            return(false);
        }

        return(true);
    }
Exemple #3
0
    private bool IsConnectionBlocked(Vector3Int pos, Direction dir)
    {
        // check 3x3 outside
        // #.......#
        // ###-P-###
        //    ???
        //    ???
        //    ???

        pos += new Vector3Int(MID, MID, 0);
        Vector3Int posP   = pos + DirectionUtil.Convert(DirectionUtil.PrevDir(dir));
        Vector3Int posN   = pos + DirectionUtil.Convert(DirectionUtil.NextDir(dir));
        Vector3Int dirVec = DirectionUtil.Convert(dir);

        for (int i = 0; i < 3; i++)
        {
            pos  += dirVec;
            posP += dirVec;
            posN += dirVec;

            if (grid[pos.x, pos.y] || grid[posP.x, posP.y] || grid[posN.x, posN.y])
            {
                return(true);
            }
        }

        return(false);
    }
Exemple #4
0
    public void SetSnakeSpawn(Vector3 pos, Direction dir)
    {
        Player.body[0].transform.position = pos;
        for (int i = 1; i < Player.body.Length; i++)
        {
            Player.body[i].transform.position = pos - DirectionUtil.Convert(dir);
        }

        currDir = dir;
        directionQueue.Clear();
    }
    protected virtual void Shoot()
    {
        Vector3 dir = DirectionUtil.Convert(direction);

        GameObject      go = ProjectileManager.CreateProjectile(projectile);
        BasicProjectile bp = go.GetComponent <BasicProjectile>();

        go.transform.position = transform.position; // + dir
        go.transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg);
        bp.direction          = dir;
        bp.IgnoreCollision(GetComponent <Collider2D>());
    }
Exemple #6
0
    protected override void Shoot()
    {
        Vector3 dir = DirectionUtil.Convert(direction);

        GameObject  go = ProjectileManager.CreateProjectile(projectile);
        RayCastProj rc = go.GetComponent <RayCastProj>();

        go.transform.position = bulletSpawn.position; // + dir
        rc.startPos           = bulletSpawn.position;
        rc.direction          = dir;
        rc.Cast();
    }
Exemple #7
0
    private void Prefire()
    {
        Vector3 dir = DirectionUtil.Convert(direction);

        GameObject  go = ProjectileManager.CreateProjectile(prefireLaser);
        RayCastProj rc = go.GetComponent <RayCastProj>();

        go.transform.position = bulletSpawn.position; // + dir
        rc.startPos           = bulletSpawn.position;
        rc.direction          = dir;
        rc.IgnoreCollision(GetComponent <Collider2D>());
        rc.Cast();
    }
Exemple #8
0
    // assumes origRoom is already in rooms
    public bool Add(RCObj origRoom, int origConnectionIndex, RCObj newRoom, int newConnectionIndex)
    {
        if (!rooms.Contains(origRoom) || !origRoom.connections[origConnectionIndex].isAvailable ||
            !newRoom.connections[newConnectionIndex].isAvailable)
        {
            Debug.LogWarning("Something went wrong when adding a room to composite!");
        }

        Direction  dirOut     = origRoom.connections[origConnectionIndex].side;
        Vector3Int nearestPos = origRoom.pos + origRoom.connections[origConnectionIndex].pos -
                                newRoom.connections[newConnectionIndex].pos + MIN_HALLWAY * DirectionUtil.Convert(dirOut);

        HallwayObj hallway = new HallwayObj(origRoom, newRoom,
                                            origRoom.connections[origConnectionIndex], newRoom.connections[newConnectionIndex], true);

        for (int i = 0; i < MAX_HALLWAY; i++)
        {
            if (Constants.doRandom)
            {
                if (Random.Range(0, 1f) < 0.3f)
                {
                    continue;
                }
            }

            newRoom.pos = nearestPos + (i * DirectionUtil.Convert(dirOut));
            if (CanAddRoom(newRoom))
            {
                if (TryGenerateSimpleHallway(hallway))
                {
                    hallway.roomA.connectedObjects.Add(hallway.roomB);
                    hallway.roomB.connectedObjects.Add(hallway.roomA);

                    rooms.Add(newRoom);
                    origRoom.connections[origConnectionIndex].isAvailable = false;
                    newRoom.connections[newConnectionIndex].isAvailable   = false;

                    AddRoomToGrid(newRoom);
                    AddHalwayToGrid(hallway);
                    UpdateDoorAvailability();
                    return(true);
                }
            }
        }

        return(false);
    }
Exemple #9
0
    // returns if found end
    private bool ComplexHallwayHelperHelper(Vector3Int pos, Direction dir, Vector3Int end,
                                            Dictionary <Vector3Int, Vector3Int> child2parent, Queue <System.Tuple <Vector3Int, Direction> > frontier)
    {
        Vector3Int nextPos = pos + DirectionUtil.Convert(dir);

        if (nextPos == end)
        {
            child2parent[nextPos] = pos;
            return(true);
        }
        if (!child2parent.ContainsKey(nextPos) && ComplexHallwayCheckSpot(nextPos, dir))
        {
            frontier.Enqueue(new System.Tuple <Vector3Int, Direction>(nextPos, dir));
            child2parent[nextPos] = pos;
        }
        return(false);
    }
Exemple #10
0
    private bool TryGenerateSimpleHallway(HallwayObj hallway)
    {
        Vector3Int start = basePos + hallway.roomA.pos + hallway.connectionA.pos;
        Vector3Int end   = basePos + hallway.roomB.pos + hallway.connectionB.pos;

        if (start.x != end.x && start.y != end.y)
        {
            Debug.LogWarning("Simple hallway couldn't be made because points aren't in a line!");
            return(false);
        }

        List <Vector3Int> path = new List <Vector3Int>();
        Vector3Int        dir  = DirectionUtil.Convert(hallway.connectionA.side);
        Vector3Int        pos  = start + dir;
        Vector3Int        posP = pos + DirectionUtil.Convert(DirectionUtil.PrevDir(hallway.connectionA.side));
        Vector3Int        posN = pos + DirectionUtil.Convert(DirectionUtil.NextDir(hallway.connectionA.side));
        int lim = 0;

        while (pos != end && lim < SIMPLE_HALLWAY_LIMIT)
        {
            if (grid[MID + pos.x, MID + pos.y] || grid[MID + posP.x, MID + posP.y] || grid[MID + posN.x, MID + posN.y])
            {
                return(false);
            }

            path.Add(pos - basePos);
            pos  += dir;
            posP += dir;
            posN += dir;
            lim  += 1;
        }

        if (lim >= SIMPLE_HALLWAY_LIMIT)
        {
            Debug.LogWarning("Exceeded limit on simple path gen!");
            return(false);
        }
        hallway.path = path;
        return(true);
    }
Exemple #11
0
    void Update()
    {
        if (CheckCanInput())
        {
            if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow))
            {
                ChangeDirection(Direction.right);
            }
            else if (Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow))
            {
                ChangeDirection(Direction.down);
            }
            else if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow))
            {
                ChangeDirection(Direction.left);
            }
            else if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow))
            {
                ChangeDirection(Direction.up);
            }

            //  Legacy Movement
            //if (Input.GetKeyDown(KeyCode.R))
            //{
            //    ChangeDirection(Direction.right);
            //}
            //else if (Input.GetKeyDown(KeyCode.D))
            //{
            //    ChangeDirection(Direction.down);
            //}
            //else if (Input.GetKeyDown(KeyCode.L))
            //{
            //    ChangeDirection(Direction.left);
            //}
            //else if (Input.GetKeyDown(KeyCode.U))
            //{
            //    ChangeDirection(Direction.up);
            //}


            isSprinting = canSpecialMove && !isReversing && Input.GetKey(KeyCode.LeftShift);

            bool wasReversing = isReversing;
            isReversing = canSpecialMove && !isSprinting && Input.GetKey(KeyCode.LeftControl);

            if (isReversing != wasReversing)
            {
                if (isReversing) // start reversing
                {
                    currDir = DirectionUtil.Convert(tip.transform.position - Player.body[3].transform.position);
                }
                else // stop reversing
                {
                    currDir = DirectionUtil.Convert(transform.position - Player.body[1].transform.position);
                }
            }

            isSpecialMovement = isSprinting || isReversing;
            Player.playerWeaponManager.isSprinting = isSpecialMovement;

            //if (Input.GetKeyDown(KeyCode.R))
            //{
            //    RestartSnake();
            //}
        }
    }
Exemple #12
0
    public void ReverseBody()
    {
        //AudioManager.Play("player_reversing");

        canOpenChest = true;

        //Vector3 headDir = DirectionUtil.Convert(currDir);
        Vector3 tipDir = DirectionUtil.Convert(currDir);
        //if (Player.playerEffects.GetExitingIndex() > 0)
        //    headDir = Vector3.zero;
        //Vector3 body2Dir = Player.body[1].transform.position - Player.body[0].transform.position;
        Vector3 body2TailDir = Player.body[2].transform.position - Player.body[3].transform.position;

        //tipSprite.transform.position = Player.body[3].transform.position;
        //Player.body[3].transform.position = Player.body[2].transform.position;
        //Player.body[2].transform.position = Player.body[1].transform.position;
        //Player.body[1].transform.position = Player.body[0].transform.position;
        //transform.position += headDir;
        Player.body[0].transform.position = Player.body[1].transform.position;
        Player.body[1].transform.position = Player.body[2].transform.position;
        Player.body[2].transform.position = Player.body[3].transform.position;
        Player.body[3].transform.position = tipSprite.transform.position;
        tipSprite.transform.position     += tipDir;

        // setting sprites
        //float headRot = Mathf.Atan2(headDir.y, headDir.x) * Mathf.Rad2Deg;
        //float tailRot = Mathf.Atan2(tipDir.y, tipDir.x) * Mathf.Rad2Deg;


        // head
        //Vector3 tipDir = Player.body[3].transform.position - tip.transform.position;
        //float tipRot = Mathf.Atan2(tipDir.y, tipDir.x) * Mathf.Rad2Deg;
        Vector3 headDir = transform.position - Player.body[1].transform.position;
        float   headRot = Mathf.Atan2(headDir.y, headDir.x) * Mathf.Rad2Deg;

        //Player.body[0].transform.rotation = Quaternion.Euler(0, 0, tipRot);
        segSprites[0].SetSprite(snakeHead, false, headRot, Vector3.zero, -headDir);


        // body
        //bool body1ShouldBend = Vector3.Dot(headDir, body2Dir) == 0;
        //float body1Rot = 0;

        //segSprites[2].SetSprite(segSprites[1]);

        //if (body1ShouldBend)
        //{
        //    Vector3 bendDir = headDir + body2Dir;
        //    body1Rot = Mathf.Atan2(bendDir.y, bendDir.x) * Mathf.Rad2Deg - 45;
        //    // float forwardAngle = (headRot - body1Rot - 45) * 2 + body1Rot + 45
        //    segSprites[1].SetSprite(snakeBent, true, body1Rot, headDir, body2Dir);
        //}
        //else
        //{
        //    body1Rot = Mathf.Atan2(headDir.y, headDir.x) * Mathf.Rad2Deg;
        //    segSprites[1].SetSprite(snakeStraight, false, body1Rot, headDir, body2Dir);
        //}

        segSprites[1].SetSprite(segSprites[2]);

        Sprite s = segSprites[3].isBent ? snakeBodyBent : snakeBodyStraight;

        segSprites[2].SetSprite(segSprites[3], s);


        // tail
        Vector3 tailBodyDir    = Player.body[2].transform.position - Player.body[3].transform.position;
        Vector3 tailTipDir     = tip.transform.position - Player.body[3].transform.position;
        bool    tailShouldBend = Vector3.Dot(tailTipDir, tailBodyDir) == 0;
        float   tailRot;

        if (tailShouldBend)
        {
            Vector3 bendDir = tailTipDir + tailBodyDir;
            tailRot = Mathf.Atan2(bendDir.y, bendDir.x) * Mathf.Rad2Deg - 45;
            segSprites[3].SetSprite(snakeTailBent, true, tailRot, tailTipDir, tailBodyDir);
        }
        else
        {
            tailRot = Mathf.Atan2(-tipDir.y, -tipDir.x) * Mathf.Rad2Deg;
            segSprites[3].SetSprite(snakeTailStraight, false, tailRot, tailTipDir, tailBodyDir);
        }

        //segSprites[3].SetSprite(snakeTail, segSprites[2].isBent, tailRot, tailBodyDir, -tipDir);


        // tip
        float tipRot = 180 + Mathf.Atan2(tipDir.y, tipDir.x) * Mathf.Rad2Deg;

        tipSprite.transform.rotation = Quaternion.Euler(0, 0, tipRot);
    }
Exemple #13
0
    public void MoveBody()
    {
        canOpenChest = true;

        Vector3 headDir = DirectionUtil.Convert(currDir);

        if (Player.playerEffects.GetExitingIndex() > 0)
        {
            headDir = Vector3.zero;
        }
        Vector3 body2Dir = Player.body[1].transform.position - Player.body[0].transform.position;

        tipSprite.transform.position      = Player.body[3].transform.position;
        Player.body[3].transform.position = Player.body[2].transform.position;
        Player.body[2].transform.position = Player.body[1].transform.position;
        Player.body[1].transform.position = Player.body[0].transform.position;
        transform.position += headDir;

        // setting sprites
        float headRot = Mathf.Atan2(headDir.y, headDir.x) * Mathf.Rad2Deg;

        // tip
        Vector3 tipDir = Player.body[3].transform.position - tip.transform.position;
        float   tipRot = Mathf.Atan2(tipDir.y, tipDir.x) * Mathf.Rad2Deg;

        tipSprite.transform.rotation = Quaternion.Euler(0, 0, tipRot);

        // tail
        Vector3 tailBodyDir = Player.body[2].transform.position - Player.body[3].transform.position;
        float   tailRot     = Mathf.Atan2(tailBodyDir.y, tailBodyDir.x) * Mathf.Rad2Deg;

        if (segSprites[2].isBent)
        {
            segSprites[3].SetSprite(segSprites[2], snakeTailBent);
        }
        else
        {
            segSprites[3].SetSprite(segSprites[2], snakeTailStraight);
        }

        // body
        bool  body1ShouldBend = Vector3.Dot(headDir, body2Dir) == 0;
        float body1Rot        = 0;

        segSprites[2].SetSprite(segSprites[1]);

        if (body1ShouldBend)
        {
            Vector3 bendDir = headDir + body2Dir;
            body1Rot = Mathf.Atan2(bendDir.y, bendDir.x) * Mathf.Rad2Deg - 45;
            // float forwardAngle = (headRot - body1Rot - 45) * 2 + body1Rot + 45
            segSprites[1].SetSprite(snakeBodyBent, true, body1Rot, headDir, body2Dir);
        }
        else
        {
            body1Rot = Mathf.Atan2(headDir.y, headDir.x) * Mathf.Rad2Deg;
            segSprites[1].SetSprite(snakeBodyStraight, false, body1Rot, headDir, body2Dir);
        }


        // head
        segSprites[0].SetSprite(snakeHead, false, headRot, Vector3.zero, -headDir);
    }
Exemple #14
0
    private bool TryGenerateComplexHallwayHelper(HallwayObj hallway)
    {
        Vector3Int rawStart = basePos + hallway.roomA.pos + hallway.connectionA.pos;
        Vector3Int rawEnd   = basePos + hallway.roomB.pos + hallway.connectionB.pos;

        Direction startDir = hallway.connectionA.side;
        Direction endDir   = hallway.connectionB.side;

        Vector3Int start = rawStart + DirectionUtil.Convert(startDir);
        Vector3Int end   = rawEnd + DirectionUtil.Convert(endDir);

        List <Vector3Int> path = new List <Vector3Int>();

        int lim = 0; // nodes expanded

        // pos, dir
        Queue <System.Tuple <Vector3Int, Direction> > frontier     = new Queue <System.Tuple <Vector3Int, Direction> >();
        Dictionary <Vector3Int, Vector3Int>           child2parent = new Dictionary <Vector3Int, Vector3Int>();

        frontier.Enqueue(new System.Tuple <Vector3Int, Direction>(start, startDir));
        child2parent[start] = start;
        bool foundPath = false;

        // BFS -- add direction first
        //   note: this should be an A* search but i don't want to implement a priority queue
        while (frontier.Count > 0 && lim < COMPLEX_HALLWAY_LIMIT)
        {
            System.Tuple <Vector3Int, Direction> node = frontier.Dequeue();
            Vector3Int pos = node.Item1;
            Direction  dir = node.Item2;
            lim += 1;

            // go through neighbors in order of: dir => dir + 1 => dir - 1
            // check
            //   not in dictionary
            //   is legal spot (check new tiles on grid)
            //     if (grid[MID + pos.x, MID + pos.y])

            Direction nextDir = dir;
            if (ComplexHallwayHelperHelper(pos, nextDir, end, child2parent, frontier))
            {
                foundPath = true;
                break;
            }

            nextDir = DirectionUtil.NextDir(dir);
            if (ComplexHallwayHelperHelper(pos, nextDir, end, child2parent, frontier))
            {
                foundPath = true;
                break;
            }

            nextDir = DirectionUtil.PrevDir(dir);
            if (ComplexHallwayHelperHelper(pos, nextDir, end, child2parent, frontier))
            {
                foundPath = true;
                break;
            }
        }


        //if (lim >= COMPLEX_HALLWAY_LIMIT)
        //    Debug.LogWarning("Exceeded limit on complex path gen!");
        if (!foundPath)
        {
            return(false);
        }

        //Debug.Log("Succeeded in generating complex hallway!");

        Vector3Int p = end;

        path.Add(p - basePos);
        while (p != start)
        {
            p = child2parent[p];
            path.Add(p - basePos);
        }


        hallway.path = path;
        return(true);
    }