示例#1
0
    private void SpawnEnemyAt(int x, int z, string name = "")
    {
        var        spawnLoc = new Vector2Int(x, z);
        var        rand     = SeededRandom.Range(1, 4);
        GameObject newEnemy;

        switch (rand)
        {
        case 1:
            newEnemy = EnemySpawner.SpawnArcher(spawnLoc);
            break;

        case 2:
            newEnemy = EnemySpawner.SpawnBrute(spawnLoc);
            break;

        default:
            newEnemy = EnemySpawner.SpawnBasicMeleeEnemy(spawnLoc);
            break;
        }
        var enemyBody = newEnemy.GetComponent <EnemyBody>();

        enemies.Add(enemyBody);
        enemyBody.name = "EnemyID: " + enemies.Count;
        PlaceObjectOn(spawnLoc.x, spawnLoc.y, enemyBody);
    }
示例#2
0
    public void SetSize()
    {
        var width  = SeededRandom.Range(Info.MinWidth, Info.MaxWidth);
        var height = SeededRandom.Range(Info.MinHeight, Info.MaxHeight);

        Bounds.Resize(width, height);
    }
示例#3
0
    private void SpawnMoneyAt(int x, int z)
    {
        GameObject   moneyObj           = ItemSpawner.SpawnMoney(new Vector2Int(x, z));
        DroppedMoney newMoneyBloodMoney = moneyObj.GetComponent <DroppedMoney>();
        int          amount             = SeededRandom.Range(10, 20); // Technically, the amount of money can change if you swap floors. Hopefully nobody notices.

        newMoneyBloodMoney.Initialize(amount);                        // Set how much this is worth

        newMoneyBloodMoney.xPos = x;
        newMoneyBloodMoney.zPos = z;

        map[x, z].SetItemOnTile(newMoneyBloodMoney);
    }
示例#4
0
    protected virtual bool PlaceExit(Room prev, float direction, float pathVariance)
    {
        var res = AttemptToPlaceRoom(prev, exit, direction + SeededRandom.Range(-pathVariance, pathVariance));

        if (res != -1)
        {
            PlacedRooms.Add(exit);
            return(true);
        }
        else
        {
            return(false);
        }
    }
    protected override bool PlaceExit(Room prev, float direction, float pathVariance)
    {
        var res = AttemptToPlaceRoom(prev, BossRoom, direction + SeededRandom.Range(-pathVariance, pathVariance));

        if (res != -1)
        {
            PlacedRooms.Add(BossRoom);
            return(base.PlaceExit(BossRoom, direction, pathVariance));
        }
        else
        {
            return(false);
        }
    }
示例#6
0
    public static Tile GetRandomTopWallDecoration()
    {
        int rand = SeededRandom.Range(0, 3);

        switch (rand)
        {
        case 0:
            return(Ring[0]);

        case 1:
            return(Ring[1]);

        case 2:
        default:
            return(Flag);
        }
    }
示例#7
0
    public static Tile GetRandomFloorDecoration()
    {
        int rand = SeededRandom.Range(0, 4);

        switch (rand)
        {
        case 0:
            return(Bones);

        case 1:
            return(Boxes[0]);

        case 2:
            return(Boxes[1]);

        case 3:
        default:
            return(Skull);
        }
    }
示例#8
0
    private List <int> GetBossFloors()
    {
        //Last floor should always be a boss
        var floors = NumberOfFloors - 1;
        var bosses = NumberOfBosses - 1;
        var res    = new List <int>();

        while (bosses > 0 && res.Count != floors)
        {
            var randomInt = SeededRandom.Range(0, floors);
            if (!res.Contains(randomInt))
            {
                res.Add(randomInt);
                bosses--;
            }
        }

        res.Add(NumberOfFloors - 1);
        return(res);
    }
示例#9
0
    protected void CreateBranches(List <Room> roomsToBranch)
    {
        Debug.Log($"Number of rooms to branch: {roomsToBranch.Count}");
        var currentBranch = new List <Room>();
        var i             = 0;

        while (i < roomsToBranch.Count)
        {
            currentBranch.Clear();
            var room           = roomsToBranch[i];
            var curr           = SeededRandom.PickRandom(branchable);
            var numConnections = SeededRandom.PickRandom(branchConnectionLength);
            currentBranch = TryCreateBranch(room, curr, numConnections);
            if (currentBranch.Count != numConnections + 1)
            {
                continue;
            }

            foreach (var branched in currentBranch)
            {
                if (branched.Info.MaxConnections > 1 && SeededRandom.RandBool(.3f))
                {
                    if (branched is StandardRoom)
                    {
                        for (int j = 0; j < SeededRandom.Range(1, 4); j++)
                        {
                            branchable.Add(branched);
                        }
                    }
                    else
                    {
                        branchable.Add(branched);
                    }
                }
            }
            i++;
        }
    }
示例#10
0
    protected virtual List <Room> InitRooms()
    {
        var rooms = new List <Room>();

        Entrance = new Entrance();
        Exit     = new Exit();
        rooms.Add(Entrance);
        rooms.Add(Exit);

        for (int i = 0; i < CustomRun.instance.RoomsPerFloor - 2; i++)
        {
            rooms.Add(new StandardRoom());
        }
        var randomInt = SeededRandom.Range(0, rooms.Count);

        rooms.Insert(randomInt, new LargeSqaureRoom());
        rooms.Add(new CoinRoom());
        //for (int i = 0; i < 2; i++)
        //{
        //    rooms.Add(new SpecialRoom());
        //}
        return(rooms);
    }
示例#11
0
    public override bool Build(List <Room> rooms)
    {
        this.Rooms = rooms;
        InitBuilder();

        if (entrance == null || exit == null)
        {
            return(false);
        }

        float direction = SeededRandom.RandomDirection();

        entrance.SetSize();
        entrance.Bounds.SetPosition(0, 0);
        PlacedRooms.Add(entrance);
        branchable.Add(entrance);

        int roomsOnPath = (int)(multiConnections.Count * pathLengthPercentage) + SeededRandom.PickRandom(pathLengthJitters);

        roomsOnPath = Math.Min(roomsOnPath, multiConnections.Count);
        float pathVariance = 15;

        var   curr = entrance;
        float res;
        int   rejected = 0;

        for (int i = 0; i < roomsOnPath; i++)
        {
            for (int j = 0; j < SeededRandom.PickRandom(pathConnectionLength); j++)
            {
                var connectionRoom = new ConnectionRoom();
                res = AttemptToPlaceRoom(curr, connectionRoom, direction + SeededRandom.Range(-pathVariance, pathVariance));
                if (res != -1)
                {
                    PlacedRooms.Add(connectionRoom);
                    branchable.Add(connectionRoom);
                    curr = connectionRoom;
                }
                else
                {
                    rejected++;
                }
            }
            var next = multiConnections[i];
            res = AttemptToPlaceRoom(curr, next, direction + SeededRandom.Range(-pathVariance, pathVariance));
            if (res != -1)
            {
                PlacedRooms.Add(next);
                branchable.Add(next);
                curr = next;
            }
            else
            {
                rejected++;
            }
        }
        for (int j = 0; j < SeededRandom.PickRandom(pathConnectionLength); j++)
        {
            var connectionRoom = new ConnectionRoom();
            res = AttemptToPlaceRoom(curr, connectionRoom, direction + SeededRandom.Range(-pathVariance, pathVariance));
            if (res != -1)
            {
                PlacedRooms.Add(connectionRoom);
                branchable.Add(connectionRoom);
                curr = connectionRoom;
            }
            else
            {
                rejected++;
            }
        }

        if (!PlaceExit(curr, direction, pathVariance))
        {
            return(false);
        }

        var roomsToBranch = GetRoomsToBranch(roomsOnPath);

        CreateBranches(roomsToBranch);

        FindNeighbours();

        return(true);
    }
示例#12
0
 void Start()
 {
     rotateSpeed = new Vector3(SeededRandom.Range(rotationSpeed.minOffset.x, rotationSpeed.maxOffset.x),
                               SeededRandom.Range(rotationSpeed.minOffset.y, rotationSpeed.maxOffset.y),
                               SeededRandom.Range(rotationSpeed.minOffset.z, rotationSpeed.maxOffset.z));
 }
示例#13
0
 public static Vector3 RandomPositionInView(float margin)
 {
     return(new Vector3(SeededRandom.Range(trueBottomLeft.x + margin, trueTopRight.x - margin), SeededRandom.Range(trueBottomLeft.y + margin, trueTopRight.y - margin), 0f));
 }
示例#14
0
    /// <summary>
    /// Spawns object(s).
    /// </summary>
    void MultiSpawn()
    {
        // Get base range
        float min = Mathf.Abs(maxAngleOfEntryOffset - minAngleOfEntryOffset) / 2f;
        float max = -min;

        // Get angular distance between object spawns
        float separation = Mathf.Abs(maxAngleOfEntryOffset - minAngleOfEntryOffset) + angularSeparation;

        // Get starting angle
        float baseAngle = angleOfEntry;

        switch (angleOfEntryType)
        {
        // AngleOfEntryType.FixedAngle not needed
        case AngleOfEntryType.WaveDirection:
            baseAngle = SpaceObjectDirection.GetAngle();
            break;

        case AngleOfEntryType.RandomAngle:
            baseAngle = SeededRandom.Range(0f, Mathf.PI * 2f);
            break;
        }

        baseAngle += (Mathf.Abs(minAngleOfEntryOffset) + max) * SeededRandom.Sign();
        float angle = baseAngle + SeededRandom.Range(min, max);

        // We have our start position
        Vector3 start = Screen.GetRadiusEdge(angle);

        if (angleOfEntryType == AngleOfEntryType.FixedPosition)
        {
            start = fixedPosition;
        }
        else if (angleOfEntryType == AngleOfEntryType.RandomPosition)
        {
            start = Screen.RandomPositionInView(4f);
        }

        // Decide on target
        Vector3 target          = DecideTarget(start);
        float   baseTargetAngle = GetTargetAngle(start, target);
        float   targetAngle     = SeededRandom.Range(minTargetOffset, maxTargetOffset) * SeededRandom.Sign() + baseTargetAngle;

        // Always spawn 1
        Spawn(start, targetAngle);

        // Loop through all spawns
        for (int i = 1; i < SeededRandom.Range(minMultiSpawns, maxMultiSpawns + 1); i++)
        {
            // Get positional modifier
            int modifier = (i + 1) / 2;
            if (i % 2 == 0)
            {
                modifier *= -1;
            }
            // Base angle for current spawn
            angle = (separation * modifier) + baseAngle + SeededRandom.Range(min, max);
            start = Screen.GetRadiusEdge(angle);

            // Do we need to pick another base angle?
            if (!parallel)
            {
                target          = DecideTarget(start);
                baseTargetAngle = GetTargetAngle(start, target);
            }

            targetAngle = SeededRandom.Range(minTargetOffset, maxTargetOffset) * SeededRandom.Sign() + baseTargetAngle;

            Spawn(start, targetAngle);
        }
    }
示例#15
0
    /// <summary>
    /// Spawn the specified offset and baseAngle.
    /// </summary>
    /// <param name="offset">Offset. The index of the multispawn at which this spawn is.</param>
    /// <param name="baseAngle">Base angle. The angle all multispawn objects will be based on.</param>
    void Spawn(int offset, float baseAngle)
    {
        Vector3 oldPosition = transform.position;

        float   corrector;
        Vector3 corrected = transform.position;

        if (spawnAlignment.x != 0f)
        {
            corrector   = Mathf.Ceil(transform.position.x / spawnAlignment.x);
            corrected.x = corrector * spawnAlignment.x;
        }
        if (spawnAlignment.y != 0f)
        {
            corrector   = Mathf.Ceil(transform.position.y / spawnAlignment.y);
            corrected.y = corrector * spawnAlignment.y;
        }
        if (spawnAlignment.z != 0f)
        {
            corrector   = Mathf.Ceil(transform.position.z / spawnAlignment.z);
            corrected.z = corrector * spawnAlignment.z;
        }
        transform.position = corrected;

        // Get the angle at which to spawn
        int   adapter = Mathf.FloorToInt((offset + 1) / 2f) * Global.signs [offset % 2];
        float angle   = (angularSeparation) * adapter + baseAngle;

        // Pre rotate so transform.up becomes usable
        transform.eulerAngles = new Vector3(0f, 0f, (baseAngle + (Mathf.PI * 0.5f)) * Mathf.Rad2Deg);

        // Decide starting position
        // SpaceObjectSpawnType.Predefined not needed in switch
        switch (spawnType)
        {
        case SpaceObjectSpawnType.Parallel:
            transform.position = Screen.GetRadiusEdge(angle);
            break;
        }

        corrected           = adapter * gridSeparation;
        transform.position += corrected;

        // Add random offset to start position
        transform.position = new Vector3(transform.position.x - SeededRandom.Range(spawnOffsets.minOffset.x, spawnOffsets.maxOffset.x),
                                         transform.position.y - SeededRandom.Range(spawnOffsets.minOffset.y, spawnOffsets.maxOffset.y),
                                         transform.position.z - SeededRandom.Range(spawnOffsets.minOffset.z, spawnOffsets.maxOffset.z));

        Vector3 targetPoint = predefinedTrajectory;

        // SpaceObjectTrajectoryType.Predefined no needed in switch
        switch (trajectoryType)
        {
        case SpaceObjectTrajectoryType.Targeted:
            // Pick a random target, if none exists, use predefined targetPoint
            GameObject target = ShipContainer.GetSpaceShip(SeededRandom.Range(0, 25));
            if (target != null)
            {
                targetPoint = target.transform.position;
            }
            break;

        case SpaceObjectTrajectoryType.TargetOpposite:
            // Set target to the opposite of the screen, multispawns will move parallel
            targetPoint = Screen.GetScreenEdge(transform.position, transform.up);
            break;

        case SpaceObjectTrajectoryType.TargetOppositeX:
            targetPoint    = transform.position;
            targetPoint.x *= -1f;
            break;

        case SpaceObjectTrajectoryType.TargetOppositeY:
            targetPoint    = transform.position;
            targetPoint.y *= -1f;
            break;

        case SpaceObjectTrajectoryType.TargetZero:
            targetPoint = Vector3.zero;
            break;
        }

        GameObject newObject = Instantiate(prefab) as GameObject;
        Movement   movement  = newObject.GetComponent <Movement> ();

        if (movement)
        {
            movement.SetTarget(targetPoint);
        }

        targetPoint          -= transform.position;
        transform.eulerAngles = new Vector3(0f, 0f, Mathf.Atan2(targetPoint.y, targetPoint.x) * Mathf.Rad2Deg + 270f);

        newObject.transform.parent   = transform.parent;
        newObject.transform.position = transform.position;
        newObject.transform.rotation = transform.rotation;

        transform.position = oldPosition;
    }