Beispiel #1
0
 public static void FloorSpikeTargetPlayer(Boss b, AttackGroup a, FloorSpike.Data d,
                                           RuntimeAnimatorController animator)
 {
     if (b.player != null)
     {
         FloorSpike(b, d, animator, b.player.transform.position.x);
     }
     a.StartCooldown();
 }
Beispiel #2
0
    // Summon multiple floor spikes.
    public static void FloorSpikes(Boss b, AttackGroup a, FloorSpike.Data d,
                                   RuntimeAnimatorController animator, float count)
    {
        Room room      = b.room;
        int  trueCount = Mathf.FloorToInt(count);

        for (int i = 0; i < trueCount; ++i)
        {
            FloorSpike(b, d, animator, room.GetRandomFloorXPosition());
        }
        a.StartCooldown();
    }
Beispiel #3
0
    // Summon one floor spike at the given worldspace x position.
    public static void FloorSpike(Boss b, FloorSpike.Data d,
                                  RuntimeAnimatorController animator, float xPosition)
    {
        Room       room = b.room;
        GameObject obj  = Instantiate(b.prefabFloorSpike, b.transform);
        FloorSpike fs   = obj.GetComponent <FloorSpike>();

        fs.SetData(d);
        fs.SetAnimatorController(animator);
        float colliderHeight = fs.GetHitboxHeight();

        obj.transform.position = new Vector2(xPosition,
                                             room.GetFloorYPosition() - colliderHeight * 0.5f);
    }
Beispiel #4
0
    // Read data for a floor spike.
    private FloorSpike.Data ReadFloorSpike(JSONNodeReader attackNodeReader, string appearance)
    {
        GameObject spikeWarning;

        spikeWarnings.TryGetValue(appearance, out spikeWarning);

        FloorSpike.Data d = new FloorSpike.Data(
            attackNodeReader.Get("damage", 20),
            spikeWarning,
            attackNodeReader.Get("seconds of warning", 1.0f),
            attackNodeReader.Get("seconds of rising", 0.2f),
            attackNodeReader.Get("seconds to idle", 3.0f),
            attackNodeReader.Get("seconds to lower", 0.5f),
            attackNodeReader.Get("height to rise", 1.0f),
            attackNodeReader.Get("height to rise variance", 0.0f));

        int damageBonusPerArena = attackNodeReader.Get("damage bonus per arena", 0);

        DifficultyIncreased += () => d.damage += damageBonusPerArena;

        return(d);
    }
Beispiel #5
0
    private void Awake()
    {
        JSONNodeReader  jsonReader   = new JSONNodeReader(fileBosses);
        JSONArrayReader bossesReader = jsonReader.Get <JSONArrayReader>("bosses");
        JSONNodeReader  bossNodeReader;

        while (bossesReader.GetNextNode(out bossNodeReader))
        {
            List <Boss.AttackGroup> attackGroups = new List <Boss.AttackGroup>();

            JSONArrayReader attackGroupsReader =
                bossNodeReader.Get <JSONArrayReader>("attack groups");
            JSONNodeReader attackGroupNodeReader;
            while (attackGroupsReader.GetNextNode(out attackGroupNodeReader))
            {
                Boss.AttackGroup attackGroup = new Boss.AttackGroup(
                    attackGroupNodeReader.Get("seconds of cooldown", 2.0f),
                    attackGroupNodeReader.Get("seconds of cooldown variance", 0.5f));

                float secondsOfCooldownBonusPerArena =
                    attackGroupNodeReader.Get("seconds of cooldown bonus per arena", 0.0f);
                float secondsOfCooldownMin = attackGroupNodeReader.Get("seconds of cooldown min", 0.1f);

                DifficultyIncreased += () => attackGroup.SetSecondsOfCooldown(
                    UtilApproach.Float(attackGroup.GetSecondsOfCooldown(),
                                       secondsOfCooldownMin,
                                       -secondsOfCooldownBonusPerArena)
                    );

                JSONArrayReader attacksReader = attackGroupNodeReader.Get <JSONArrayReader>("attacks");
                JSONNodeReader  attackNodeReader;
                while (attacksReader.GetNextNode(out attackNodeReader))
                {
                    string identifier = attackNodeReader.Get("identifier", "ERROR");
                    string appearance = attackNodeReader.Get("appearance", "ERROR");
                    if (identifier == "FloorSpikes")
                    {
                        float count = attackNodeReader.Get("count", 3);

                        RuntimeAnimatorController rac;
                        spikeAnimators.TryGetValue(appearance, out rac);

                        FloorSpike.Data d = ReadFloorSpike(attackNodeReader, appearance);

                        attackGroup.AddAttack(x => Boss.FloorSpikes(x,
                                                                    attackGroup, d, rac, count));

                        float countBonusPerArena = attackNodeReader.Get("count bonus per arena", 0.0f);
                        float countMax           = attackNodeReader.Get("count max", 6);
                        DifficultyIncreased +=
                            () => count      = UtilApproach.Float(count, countMax, countBonusPerArena);
                    }
                    else if (identifier == "FloorSpikeTargetPlayer")
                    {
                        RuntimeAnimatorController rac;
                        spikeAnimators.TryGetValue(appearance, out rac);

                        FloorSpike.Data d = ReadFloorSpike(attackNodeReader, appearance);

                        attackGroup.AddAttack(x => Boss.FloorSpikeTargetPlayer(x,
                                                                               attackGroup, d, rac));
                    }
                    else if (identifier == "Orb")
                    {
                        RuntimeAnimatorController rac;
                        orbAnimators.TryGetValue(appearance, out rac);

                        BossOrb.Data d = new BossOrb.Data(
                            attackNodeReader.Get("damage", 20),
                            attackNodeReader.Get("seconds to idle", 3.0f),
                            attackNodeReader.Get("seconds to idle variance", 2.0f),
                            attackNodeReader.Get("seconds to move to center", 0.2f),
                            attackNodeReader.Get("seconds to move to bottom", 0.8f),
                            attackNodeReader.Get("horizontal speed", 8.0f));

                        string positionName = attackNodeReader.Get("position", "ERROR");

                        attackGroup.AddAttack(x => Boss.SpawnOrb(x, attackGroup,
                                                                 d, positionName, rac));

                        int damageBonusPerArena = attackNodeReader.Get("damage bonus per arena", 0);
                        int damageMax           = attackNodeReader.Get("damage max", 10000);
                        DifficultyIncreased += () => d.damage =
                            UtilApproach.Int(d.damage, damageMax, damageBonusPerArena);
                    }

                    /*
                     * else if (identifier == "HorizontalProjectile")
                     * {
                     *  int damage = attackNodeReader.Get("damage", 20);
                     *  float speed = attackNodeReader.Get("speed", 8.0f);
                     *  float spawnHeight = attackNodeReader.Get("spawn height", 1.0f);
                     *  float seconds = attackNodeReader.Get("seconds to wait after attack",
                     *      1.0f);
                     *  Velocity2D.Data d = new Velocity2D.Data(new Vector2(-speed, 0.0f));
                     *  attacks.Add(x => Boss.FireProjectile(x, d, damage, spawnHeight,
                     *      seconds));
                     * }
                     */
                }

                attackGroups.Add(attackGroup);
            }

            Boss.Data boss = new Boss.Data(
                bossNodeReader.Get("identifier", "ERROR"),
                bossNodeReader.Get("base health", 1),
                attackGroups);

            int healthBonusPerArena = bossNodeReader.Get("health bonus per arena", 0);
            DifficultyIncreased += () => boss.baseHealth += healthBonusPerArena;

            pool.Add(boss);
        }
    }