コード例 #1
0
    /*
     * public void InitMonsterStat(string name, float mass, float defense, float speed)
     * {
     *     MonsterStat stat = new MonsterStat();
     *     stat.defense = defense;
     *     stat.speed = speed;
     *     stat.mass = mass;
     *
     *     if (!monster_list.ContainsKey(name)) monster_list.Add(name, stat);
     *
     * }
     */
    public void CalcStatsByWavelet(bool summary)
    {
        List <wave> waves = Moon.Instance.Waves;

        stats = new List <WaveStat>();

        for (int wave_number = 0; wave_number < waves.Count; wave_number++)
        {
            wave w = waves[wave_number];

            for (int wavelet_number = 0; wavelet_number < w.wavelets.Count; wavelet_number++)
            {
                InitWavelet wlet = w.wavelets[wavelet_number];
                Dictionary <string, IntFloat> wavelet_count = new Dictionary <string, IntFloat>();

                foreach (InitEnemyCount e in wlet.enemies)
                {
                    IntFloat count = null;
                    wavelet_count.TryGetValue(e.name, out count);
                    if (count == null)
                    {
                        wavelet_count.Add(e.name, new IntFloat(e.c, wlet.interval * e.c));
                    }
                    else
                    {
                        count.myInt   += e.c;
                        count.myFloat += wlet.interval * e.c;
                    }
                }

                AssignWaveStat(wavelet_count, wave_number, wavelet_number);
            }
        }
        PrintStats(summary, true);
    }
コード例 #2
0
ファイル: Moon.cs プロジェクト: Valensta/otherside
    public void InitWave(int i)
    {
        if (i == 0)
        {
            TIME = 0f;
        }

        wait = TIME;



        my_wave    = Waves[i];
        my_wavelet = null;

        LevelMod mod = Peripheral.Instance.getLevelMod();

        point_factor = (mod.dream_uplift + 1f) * my_wave.point_factor();
        //dmg_xp_factor = (mod.xp_uplift + 1f) * my_wave.xp_factor();

        //  Debug.Log($"INITIALIZING WAVE {i} point_factor {point_factor} mod.dream_uplift {mod.dream_uplift} + {Central.Instance.getCurrentDifficultyLevel().ToString()}\n");

        my_wave.enemies_left = (int)my_wave.monster_count;
        done = false;

        m_count        = 0;
        WaveInProgress = true;
        SetWave(i, 0);
    }
コード例 #3
0
    wave getWave()
    {
        wave        new_wave = new wave();
        InitWavelet wavelet  = generateWavelet();

        new_wave.add_wavelet(wavelet, false);
        new_wave.monster_count   = wavelet.GetMonsterCount();
        new_wave.time_name_start = (day) ? TimeName.Day : TimeName.Night;
        new_wave.time_name_end   = (day) ? TimeName.Day : TimeName.Night;

        return(new_wave);
    }
コード例 #4
0
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%            LOAD WAVES

    public void LoadWaves(InitLevel level)
    {
        //random wave mode is not supported!!!
        List <int> pathlist = new List <int>();

        LevelMod level_mod = Peripheral.Instance.getLevelMod();

        Moon.Instance.Waves = new List <wave>();


        for (int x = 0; x < level.waves.Length; x++)
        {
            InitWave init_wave = level.waves[x];
            int      i         = 1;
            wave     mywave    = new wave();
            mywave.points = init_wave.points;
            mywave.xp     = 5f;

            for (int y = 0; y < init_wave.wavelets.Length; y++)
            {
                InitWavelet init_wavelet = init_wave.wavelets[y];
                init_wavelet.Modify(level_mod.wave_time_multiplier);
                mywave.add_wavelet(init_wavelet, false);
                i++;
            }
            mywave.wait = init_wave.wait_time;

            TimeName time_start = EnumUtil.EnumFromString <TimeName>(init_wave.time_start, TimeName.Null);
            TimeName time_end   = EnumUtil.EnumFromString <TimeName>(init_wave.time_end, TimeName.Null);
            if (time_start != TimeName.Null && time_end != TimeName.Null)
            {
                mywave.SetTime(time_start, time_end, init_wave.time_change_percent);
            }
            else if (time_start != TimeName.Null)
            {
                mywave.SetStartTime(time_start);
            }
            else
            {
                mywave.SetStartTime(TimeName.Day);
                // Debug.Log("WAVE missing start time! Assuming Day\n");
            }
            //mywave.adjust_total_run_time();
            Moon.Instance.AddWave(mywave);
        }
        if (LevelBalancer.Instance.am_enabled)
        {
            LevelBalancer.Instance.original_waves = CloneUtil.copyList <wave>(Moon.Instance.Waves);
            LevelBalancer.Instance.AutoSetPaths();
        }
    }
コード例 #5
0
    public void TestToJson()
    {
        InitLevel test = new InitLevel();

        test.init_stats = new InitStats(90, 10, TimeName.Day, 24, 20, 16, new LevelMod[1], EnvType.Default);


        test.toys    = new InitToy[2];
        test.toys[0] = new InitToy("sensible_tower", 1);
        test.toys[1] = new InitToy("airy_tower", 1);


        test.waves = new InitWave[2];
        InitWavelet[] wavelets = new InitWavelet[2];

        InitEnemyCount[] enemies0 = new InitEnemyCount[2];
        enemies0[0] = new InitEnemyCount("soldier", 3, 0);
        enemies0[1] = new InitEnemyCount("furfly", 3, 1);

        wavelets[0] = new InitWavelet(0.5f, 3, enemies0);

        //

        InitEnemyCount[] enemies1 = new InitEnemyCount[2];
        enemies1[0] = new InitEnemyCount("tank", 3, 0);
        enemies1[1] = new InitEnemyCount("furfly", 6, 1);

        wavelets[1] = new InitWavelet(0.8f, 5, enemies1);


        test.waves[0] = new InitWave(TimeName.Night, TimeName.Day, 0.8f, 90, 3, wavelets);
        test.waves[1] = new InitWave(TimeName.Day, TimeName.Day, 0.8f, 95, 4, wavelets);

        test.wishes    = new InitWish[2];
        test.wishes[0] = new InitWish(WishType.MoreDamage, 2);
        test.wishes[1] = new InitWish(WishType.MoreXP, 8);
        Debug.Log(JsonUtility.ToJson(test, true));
    }
コード例 #6
0
    public InitWavelet generateWavelet()
    {
        //if more than 1 path is selected, distribute enemies across all paths
        InitWavelet wavelet = new InitWavelet();


        int sub_count = 0;

        foreach (WaveletBuilder wb in waveletBuilders)
        {
            if (wb.Valid())
            {
                sub_count++;
            }
        }

        wavelet.enemies = new InitEnemyCount[sub_count * repeatTimes];
        int i = 0;

        for (int r = 1; r <= repeatTimes; r++)
        {
            foreach (WaveletBuilder wb in waveletBuilders)
            {
                if (!wb.Valid())
                {
                    continue;
                }

                wavelet.enemies[i] = wb.getSubWavelet();
                i++;
            }
        }
        wavelet.end_wait = 10;
        wavelet.lull     = currentLull;
        wavelet.interval = currentInterval;
        return(wavelet);
    }
コード例 #7
0
    public WaveletStatDetails calculateStats(InitWavelet wavelet, bool include_end_time)
    {
        WaveletStatDetails details = new WaveletStatDetails();

        details.details = new List <WaveStat>();
        WaveStat summary = new WaveStat();
        int      max     = (repeatTimes > 0)? wavelet.enemies.Length / repeatTimes : wavelet.enemies.Length;

        for (int x = 0; x < max; x++)
        {
            InitEnemyCount i       = wavelet.enemies[x];
            WaveStat       subStat = new WaveStat();

            float mass  = EnemyStore.getEffectiveMass(EnumUtil.EnumFromString(i.name, EnemyType.Null));
            float speed = EnemyStore.getSpeed(EnumUtil.EnumFromString(i.name, EnemyType.Null));

            //      Debug.Log($"BEFORE {i.name} Mass {mass} Speed {speed}\n");

            //if (speed == 0) Debug.LogError($"Trying to get speed for an unsupported enemy {i.name}\n");
            float time = i.c * wavelet.interval;

            if (i.name.Equals("Tank"))
            {
                mass += EnemyStore.getEffectiveMass(EnemyType.TinyTank);

                float speed_adjusted =
                    EnemyStore.getSpeed(EnemyType.Tank) * EnemyStore.getEffectiveMass(EnemyType.Tank)
                    + EnemyStore.getSpeed(EnemyType.TinyTank) * EnemyStore.getEffectiveMass(EnemyType.TinyTank);
                speed_adjusted /= mass;
                speed           = speed_adjusted;
            }

            if (i.name.Equals("SturdyTank"))
            {
                mass += EnemyStore.getEffectiveMass(EnemyType.Tank) + EnemyStore.getEffectiveMass(EnemyType.TinyTank);

                float speed_adjusted =
                    EnemyStore.getSpeed(EnemyType.SturdyTank) * EnemyStore.getEffectiveMass(EnemyType.SturdyTank)
                    + EnemyStore.getSpeed(EnemyType.Tank) * EnemyStore.getEffectiveMass(EnemyType.Tank)
                    + EnemyStore.getSpeed(EnemyType.TinyTank) * EnemyStore.getEffectiveMass(EnemyType.TinyTank);
                speed_adjusted /= mass;
                speed           = speed_adjusted;
            }

            if (i.name.Equals("ImpossibleTank"))
            {
                mass += EnemyStore.getEffectiveMass(EnemyType.SturdyTank) + EnemyStore.getEffectiveMass(EnemyType.Tank) + EnemyStore.getEffectiveMass(EnemyType.TinyTank);

                float speed_adjusted =
                    EnemyStore.getSpeed(EnemyType.SturdyTank) * EnemyStore.getEffectiveMass(EnemyType.SturdyTank)
                    + EnemyStore.getSpeed(EnemyType.Tank) * EnemyStore.getEffectiveMass(EnemyType.Tank)
                    + EnemyStore.getSpeed(EnemyType.TinyTank) * EnemyStore.getEffectiveMass(EnemyType.TinyTank)
                    + EnemyStore.getSpeed(EnemyType.ImpossibleTank) * EnemyStore.getEffectiveMass(EnemyType.ImpossibleTank);
                speed_adjusted /= mass;
                speed           = speed_adjusted;
            }

            if (i.name.Equals("Turtle"))
            {
                mass += 8 * EnemyStore.getEffectiveMass(EnemyType.TinyPlane);
            }

            //      Debug.Log($"AFTER {i.name} Mass {mass} Speed {speed}\n");


            summary.count += i.c * repeatTimes;
            summary.total_modified_mass += i.c * mass * repeatTimes;
            //   Debug.Log($"{i.c - 1} * {wavelet.interval} * {repeatTimes}\n");
            summary.time  += ((i.c - 1) * wavelet.interval) * repeatTimes;
            summary.speed += speed * i.c * repeatTimes;

            subStat.speed = speed;
            subStat.time  = time;
            subStat.count = i.c;
            subStat.total_modified_mass = mass * i.c;
            subStat.name = i.name;

            subStat.mass_per_second = speed * i.c * mass / time;

            details.details.Add(subStat);
        }
        float extra = (include_end_time) ? wavelet.end_wait : 0;

        summary.speed /= summary.count;
        summary.time  += (wavelet.enemies.Length - 1) * wavelet.lull + extra;
//        Debug.Log($" + {wavelet.enemies.Length - 1} * {wavelet.lull} + {extra}\n");
        //    Debug.Log($"Speed: {summary.speed} Mass: {summary.total_modified_mass} Time: {summary.time}\n");
        summary.mass_per_second = summary.speed * summary.total_modified_mass / summary.time;

        details.summary = summary;
        return(details);
    }
コード例 #8
0
ファイル: Moon.cs プロジェクト: Valensta/otherside
 public void abortWave()
 {
     WaveInProgress = false;
     my_wavelet     = null;
 }
コード例 #9
0
ファイル: Moon.cs プロジェクト: Valensta/otherside
    void Update()
    {
        if (!WaveInProgress)
        {
            return;
        }

        Sun.Instance.SetTime();

        TIME += Time.deltaTime;

        do_xp = true;


        if (monsters_transform.childCount == 0 && (wait - TIME) > Get.getSkipForwardGap(Central.Instance.current_lvl))
        {
            int buffer = 2;
            Debug.Log($"!!!!! {current_wave}.{current_wavelet} wavelet defined {my_wavelet!=null} SKIPPED {TIME - wait - buffer} seconds!\n");

            Tracker.Log(PlayerEvent.WaveTiming, true,
                        new Dictionary <string, string> {
                { "attribute_1", $"{current_wave}.{current_wavelet} wavelet defined {my_wavelet!=null}" },
                { "attribute_2", "SKIPPED" }
            }, new Dictionary <string, double> {
                { "metric_1", (TIME - wait - buffer) }
            });

            TIME  = wait - buffer; // if we ran out of enemies, let's speed things along
            do_xp = false;
        }



        if (my_wavelet == null)
        {
            if (monsters_transform.childCount >= 3)
            {
                extra_end_wait += Time.deltaTime;
                return;
            }

            TIME = wait;
            Debug.Log($"!!!!! Extra end wait {current_wave}.{current_wavelet} wavelet defined {my_wavelet != null} was {extra_end_wait}\n");

            Tracker.Log(PlayerEvent.WaveTiming, true,
                        new Dictionary <string, string>
            {
                { "attribute_1", $"{current_wave}.{current_wavelet} wavelet defined {my_wavelet != null}" },
                { "attribute_2", "WAITED" }
            },
                        new Dictionary <string, double>()
            {
                { "metric_1", extra_end_wait }
            });


            extra_end_wait = 0f;
            do_xp          = false;
        }

        if (!LevelBalancer.Instance.am_enabled)
        {
            if (do_xp)
            {
                if (TIME > xp_timer)
                {
                    // Debug.Log($"Wave {current_wave} doing XP assignment {time_based_xp} {Time.realtimeSinceStartup} TIME {TIME} xp_timer {xp_timer}\n");
                    onTimeBasedXpAssigned?.Invoke(time_based_xp);
                    xp_timer += xp_grant_interval;
                }
            }
            else
            {
                xp_timer = TIME + xp_grant_interval;
            }
        }

        if (wait > 0 && TIME < wait)
        {
            return;
        }

        if (!done)
        {
            if (my_wavelet == null || my_wavelet.GetMonsterCount() == 0)
            {
                if (current_wavelet < my_wave.wavelets.Count)
                {
                    my_wavelet = my_wave.wavelets[current_wavelet];
                    Noisemaker.Instance.Play("wavelet_start");
                    //if (!balanceMode())
                    SetWavelet(current_wavelet + 1);
                    //    Debug.Log("Wavelet start end " + " Duration.time " + Duration.time + " SUN " + Sun.Instance.current_time_of_day + "\n");

                    m_count = 0;
                    e_count = 0;
                    if (current_wavelet == my_wave.wavelets.Count)
                    {
                        Peripheral.Instance.level_state   = LState.OnLastWavelet;
                        Peripheral.Instance.Wave_interval = my_wavelet.getEndWait();
                        if (onLastWavelet != null)
                        {
                            onLastWavelet(current_wave);
                        }
                    }
                }
                else
                {
                    done = true;
                    //  Debug.Log("Wave end " + " Duration.time " + Duration.time + "\n");
                    Noisemaker.Instance.Play("wave_end");
                }
            }
            if (!done)
            {
                bool reset = (m_count >= my_wavelet.enemies[e_count].c);
                bool last  = (m_count == my_wavelet.enemies[e_count].c - 1);

                if (reset)
                {
                    m_count = 0;
                    e_count++;
                }

                if (e_count < my_wavelet.enemies.Length)
                {
                    if (last)
                    {
                        incrementWait(my_wavelet.lull);
                    }
                    else
                    {
                        incrementWait(my_wavelet.interval);
                    }

                    StartCoroutine(makeMonster(my_wavelet.enemies[e_count].name, my_wavelet.enemies[e_count].p));
                    m_count++;
                }
                else
                {
                    if (current_wavelet != my_wave.wavelets.Count)
                    {
                        incrementWait(my_wavelet.end_wait);
                    }
                    my_wavelet = null;
                }
            }
            return;
        }
        else
        {
            if (Peripheral.Instance.Wave_interval < 0 && monsters_transform.childCount > 0)
            {
                return;
            }
            done = true;
            Noisemaker.Instance.Play("wave_end");
            if (onWaveEnd != null)
            {
                onWaveEnd(current_wave);
            }
            if (!balanceMode())
            {
                SetWave(current_wave + 1, 0);
            }

            WaveInProgress = false;
            Peripheral.Instance.level_state = LState.WaveEnded;
        }
    }
コード例 #10
0
ファイル: Wave.cs プロジェクト: Valensta/otherside
 public void add_wavelet(InitWavelet w, bool old_school)
 {
     wavelets.Add(w);
     monster_count  += w.GetMonsterCount();
     total_run_time += w.GetTotalRunTime(old_school);
 }