Пример #1
0
    public void loadSnapshot(RuneSaver saver)
    {
        runetype       = saver.runetype;
        toy_type       = saver.toy_type;
        invested_cost  = saver.invested_cost;
        ID             = saver.ID;
        level          = saver.level;
        xp             = saver.xp;
        distance_bonus = saver.distance_bonus;
        order          = saver.order;

        if (saver.max_level < 0)
        {
            saver.max_level = 0;
        }
        int max_level = Mathf.Max(saver.max_level,
                                  LevelStore.getMaxLevel(Central.Instance.current_lvl, Peripheral.Instance.difficulty, runetype, toy_type));

        setMaxLevel(max_level);

        Sun.OnDayTimeChange += OnDayTimeChange;
        StaticRune.assignStatBits(ref stats, this);

        foreach (StatBitSaver s in saver.stats)
        {
            StatBit stat = getStat(s.effect_type);
            stat.loadSnapshot(s, this);
        }

        UpdateTimeOfDay();
        setXpReqs();
        UpdateStats();
    }
Пример #2
0
    public void setPrimaryLabel()
    {
        if (primary_label == null)
        {
            return;
        }


        MyText primary_desc = primary_label.getText(LabelName.Null);

        string text = StaticRune.getPrimaryDescription(parent.rune);

        setVerboseImageLabels(primary_label, StaticRune.getPrimaryDamageType(parent.rune));

        if (text.Equals(""))
        {
            primary_label.gameObject.SetActive(false);
            return;
        }
        else
        {
            primary_label.gameObject.SetActive(true);
            primary_desc.setText(text);
        }


        MyText tower_name = primary_label.getText(LabelName.Name);

        string my_name = StaticRune.getProperName(parent);

        tower_name.setText(my_name);
    }
Пример #3
0
    public void InitHelperPanels(bool set)
    {
//        Debug.Log($"Init helper panels {gameObject.name} {set}\n");
        if (!set)
        {
            if (rune_buttons != null)
            {
                rune_buttons.gameObject.SetActive(false);
            }
            if (firearm && firearm.ammo_panel)
            {
                firearm.ammo_panel.gameObject.SetActive(false);
            }
            return;
        }

        if (stats.ammo != -1)
        {
            firearm.setAmmo((int)(Mathf.Max(1, stats.ammo) *
                                  (1f + StaticRune.GetTimeBonus(rune.runetype, rune.toy_type))));

            firearm.InitAmmoPanel();
        }
        else
        {
            InitRuneButtons();
        }
    }
Пример #4
0
    public float _getSignalSize(unitStats s)
    {
        float size = 0.5f;


        float distance_bonus = 0f;

        if (s.toy_id.toy_type == ToyType.Temporary)
        {
            distance_bonus = StaticRune.GetDistanceBonus(s.name, islands[island_selected].transform.position, null);
        }
        if (s.toy_id.rune_type == RuneType.SensibleCity)
        {
            return(0.5f);
        }
        if (s != null)
        {
            size = StaticRune.time_bonus_aff(StaticStat.getBaseFactor(s.toy_id.rune_type, EffectType.Range, s.toy_id.toy_type == ToyType.Hero),
                                             EffectType.Range, s.toy_id.rune_type, s.toy_id.toy_type, distance_bonus) / 2f;
        }

        //   Debug.Log("Getting signal size for " + selected + " got " + size + "\n");

        return(size);
    }
Пример #5
0
    public void UpdateStats()
    {
        //     Debug.Log("Updating stats " + stats.Length + "\n");
        int actives         = 0;
        int special_actives = 0;

        if (stats == null)
        {
            return;
        }
        for (int i = 0; i < stats.Length; i++)
        {
            bool special = Get.isSpecial(stats[i].effect_type);
            stats[i].checkFinisher();
            if (stats[i].active && special)
            {
                special_actives++;
            }
            if (stats[i].active && !special)
            {
                actives++;
            }
        }
        int my_i         = 0;
        int my_special_i = 0;

        StatBit[] my_stats         = new StatBit[actives];
        StatBit[] my_special_stats = new StatBit[special_actives];

        float current_time_bonus = StaticRune.GetTimeBonus(runetype, toy_type);

        for (int i = 0; i < stats.Length; i++)
        {
            stats[i].setModifier(current_time_bonus, distance_bonus);
            if (!stats[i].active)
            {
                continue;
            }

            bool special = Get.isSpecial(stats[i].effect_type);
            if (special)
            {
                my_special_stats[my_special_i] = stats[i];
                my_special_i++;
            }
            else
            {
                my_stats[my_i] = stats[i];
                my_i++;
            }
        }

        stat_sum         = new StatSum(level, xp, my_stats, runetype);
        special_stat_sum = new StatSum(level, xp, my_special_stats, runetype);
    }
Пример #6
0
    public float get(EffectType type)
    {
        int i = getStatID(type);


        if (i != -1 && stats[i].active)
        {
            return(StaticRune.time_bonus_aff(stats[i].get(), type, runetype, toy_type, distance_bonus));
        }
        return(0);
    }
Пример #7
0
    public void UpdateTimeOfDay()
    {
        float current_time_bonus = StaticRune.GetTimeBonus(runetype, toy_type);

        if (stats == null)
        {
            return;
        }
        for (int i = 0; i < stats.Length; i++)
        {
            //if (!stats[i].active) continue;
            stats[i].setModifier(current_time_bonus, distance_bonus);
        }
    }
Пример #8
0
    public string verify_toy_for_distance(string toy_name)
    {
        string return_me;

        if (Central.Instance.getToy(toy_name).required_building.Equals("") || StaticRune.GetDistanceBonus(toy_name, this.transform.position, null) > 0)
        {
            return_me = toy_name;
        }
        else
        {
            return_me = "TOOFAR";
        }
        //    Debug.Log("Checking distance for " + Central.Instance.getToy(toy_name).required_building  + " : " + toy_name + " -> " + return_me + "\n");
        return(return_me);
    }
Пример #9
0
 void SetTimeBonus(TimeName name)
 {
     if (time_bonus == null)
     {
         return;
     }
     if (StaticRune.GetTimeBonus(parent.rune.runetype, parent.rune.toy_type) > 0)
     {
         time_bonus.gameObject.SetActive(false);
     }
     else
     {
         time_bonus.gameObject.SetActive(false);
     }
 }
Пример #10
0
    public void initStats(RuneType rtype, int _max_lvl, ToyType _toy_type)
    {
        runetype = rtype;
        if (_max_lvl < 0)
        {
            _max_lvl = 0;
        }
        setMaxLevel(_max_lvl);

        toy_type             = _toy_type;
        invested_cost        = 0;
        Sun.OnDayTimeChange += OnDayTimeChange;
        StaticRune.assignStatBits(ref stats, this);
        dmg_xp = 0f;
        setXpReqs();

        UpdateStats();
    }
Пример #11
0
    //1 is fully defended
    public float HurtMe(StatSum statsum, Firearm firearm, EffectType primary_effecttype, int primary_level)
    {
        if (dying)
        {
            return(0);
        }
        if (checkIfWasKilled())
        {
            return(0);
        }

        float factor = statsum.factor;//does anybody know what this is for? laser?
        float defense;
        float xp = 0f;



        StatBit[] statbits = statsum.stats;


        for (int i = 0; i < statbits.Length; i++)
        {
            StatBit skill_stats = statbits[i];
            if (statbits[i].effect_type == EffectType.Range)
            {
                continue;
            }
            if (statbits[i].effect_type == EffectType.ReloadTime)
            {
                continue;
            }

            switch (statsum.runetype)
            {
            case RuneType.Sensible:
                bool is_laser = (statsum.GetStatBit(EffectType.Laser) != null);

                if (is_laser)
                {
                    defense = Get.GetDefense(defenses, EffectType.Force);
                    if (statbits[i].effect_type == EffectType.Laser && defense < 1)
                    {
                        float add = stats.getXp(ForceMe(skill_stats.getModifiedStats(factor, defense)));
                        xp += add;
                        assignXp(add, firearm, primary_effecttype, EffectType.Laser, primary_level, skill_stats.level);
                    }
                }
                else
                {
                    if (statbits[i].effect_type == EffectType.Stun)
                    {
                        float add = StunMe(skill_stats.getModifiedStats(factor, 0)) / 10f;
                        xp += add;
                        assignXp(add, firearm, primary_effecttype, EffectType.Stun, primary_level,
                                 skill_stats.level);
                    }

                    if (statbits[i].effect_type == EffectType.Transform)
                    {
                        defense = Get.GetDefense(defenses, EffectType.Transform);
                        //applied with diffuse, which has a factor. this is not susceptible to that factor
                        if (defense < 1)
                        {
                            TransformMe(skill_stats.getModifiedStats(factor, defense), factor);
                        }
                    }

                    float force_defense = Get.GetDefense(defenses, EffectType.Force);
                    if (force_defense < 1)
                    {
                        if (statbits[i].effect_type == EffectType.Force)
                        {
                            //                   Debug.Log("factor " + statsum.factor + "\n");
                            float add = stats.getXp(ForceMe(statsum.getModifiedPrimaryStats(force_defense)));
                            xp += add;
                            assignXp(add, firearm, primary_effecttype, EffectType.Force, primary_level, skill_stats.level);
                        }


                        if (statbits[i].effect_type == EffectType.Explode_Force)
                        {
                            float add = stats.getXp(ForceMe(skill_stats.getModifiedStats(factor, force_defense)));
                            xp += add;
                            assignXp(add, firearm, primary_effecttype, EffectType.Explode_Force, primary_level, skill_stats.level);
                        }
                    }


                    if (statbits[i].effect_type == EffectType.Speed && statbits[i].effect_sub_type == EffectSubType.Ultra)
                    {
                        float add = SpeedMe(skill_stats.getModifiedStats(factor, 0), statbits[i].effect_type, statbits[i].effect_sub_type);
                        xp += add * (1 + firearm.toy.rune.level * 0.5f);
                        assignXp(add, firearm, primary_effecttype, EffectType.Meteor, primary_level, skill_stats.level);
                    }
                }

                break;

            case RuneType.Airy:

                if (statbits[i].effect_type == EffectType.Weaken)
                {
                    defense = (statbits[i].effect_sub_type == EffectSubType.Null) ? Get.GetDefense(defenses, EffectType.Weaken) : 0;
                    if (defense < 1)
                    {
                        float add = WeakenMe(skill_stats.getModifiedStats(factor, defense));
                        xp += add;
                        assignXp(add, firearm, primary_effecttype, EffectType.Weaken, primary_level, skill_stats.level);
                    }
                }


                float speed_defense = Get.GetDefense(defenses, EffectType.Speed) / 2f;   //otherwise they seem like they are very resistant to speed
                if (statbits[i].effect_type == EffectType.Speed && speed_defense < 1)
                {
                    float add = SpeedMe(skill_stats.getModifiedStats(factor, speed_defense), statbits[i].effect_type, statbits[i].effect_sub_type);     //this xp factor is to balance out xp to  match other towers that do more damage
                    xp += add;

                    assignXp(add, firearm, primary_effecttype, EffectType.Speed, primary_level, skill_stats.level);
                }

                if (statbits[i].effect_type == EffectType.Speed && statbits[i].effect_sub_type == EffectSubType.Freeze)
                {
                    float add = SpeedMe(skill_stats.getModifiedStats(factor, 0), statbits[i].effect_type, statbits[i].effect_sub_type);
                    //  Debug.Log("timefreeze factor is " + factor + "\n");
                    xp += add;
                    assignXp(add, firearm, primary_effecttype, EffectType.Frost, primary_level, skill_stats.level);
                }


                float hey_defense = Get.GetDefense(defenses, EffectType.Force);
                if (statbits[i].effect_type == EffectType.Force && speed_defense < 1)
                {
                    float add = stats.getXp(ForceMe(skill_stats.getModifiedStats(factor, hey_defense)));
                    xp += add;
                    assignXp(add, firearm, primary_effecttype, EffectType.Force, primary_level, skill_stats.level);
                }


                if (statbits[i].effect_type == EffectType.DirectDamage)
                {
                    float add = stats.getXp(ForceMe(skill_stats.getModifiedStats(factor, 0)));
                    xp += add;
                    assignXp(add, firearm, primary_effecttype, EffectType.DirectDamage, primary_level, skill_stats.level);
                }

                //SSkill
                if (statbits[i].effect_type == EffectType.EMP)
                {
                    EMPMe(skill_stats.getModifiedStats(factor, 0), false);
                }

                //Regular Skill: Foil -> Foil Lava -> summons EMP
                if (primary_effecttype == EffectType.Foil && statbits[i].effect_type == EffectType.Foil)
                {
                    EMPMe(skill_stats.getModifiedStats(factor, 0), true);
                }

                break;


            case RuneType.Vexing:
                float vf_defense = Get.GetDefense(defenses, EffectType.VexingForce);
                if ((primary_effecttype != EffectType.Focus && statbits[i].effect_type == EffectType.VexingForce) ||
                    (primary_effecttype == EffectType.Focus && primary_effecttype == statbits[i].effect_type))     // for Focus, use focus statbits, not VF
                {
                    if (vf_defense < 1)
                    {
                        float add = stats.getXp(ForceMe(statsum.getModifiedPrimaryStats(vf_defense)));
                        xp += add;
                        assignXp(add, firearm, primary_effecttype, EffectType.VexingForce, primary_level, skill_stats.level);
                    }
                }

                if (statbits[i].effect_type == EffectType.DOT)
                {
                    DOTMe(skill_stats.getModifiedStats(factor, vf_defense), firearm, skill_stats.level);
                    //does damage through an invoke which can't get back to this
                    //invoke calls MassMe, which assigns XP
                }

                if (statbits[i].effect_type == EffectType.Critical)
                {
                    float critical_factor = firearm.critical.getCriticalForce();    //so that we can do correct xp attribution for it
                    if (critical_factor > 0)
                    {
                        float   new_defense = vf_defense / (1 + critical_factor);
                        float[] new_stats   = statsum.getModifiedPrimaryStats(vf_defense / (1 + critical_factor));
                        float   add         = stats.getXp(ForceMe(new_stats));
                        xp += add;
                        assignXp(add, firearm, EffectType.Critical, EffectType.Critical, primary_level, skill_stats.level);
                    }
                }

                if (statbits[i].effect_type == EffectType.Teleport)
                {
                    defense = Get.GetDefense(defenses, EffectType.Teleport);
                    if (defense >= 1)
                    {
                        return(xp);
                    }
                    float add = TeleportMe(skill_stats.getModifiedStats(factor, defense));
                    xp += add;
                    assignXp(add, firearm, primary_effecttype, EffectType.Teleport, primary_level, skill_stats.level);
                }

                if (statbits[i].effect_type == EffectType.Fear)
                {
                    defense = Get.GetDefense(defenses, EffectType.Fear);
                    if (defense < 1)
                    {
                        FearMe(skill_stats.getModifiedStats(factor, defense));
                    }
                }

                break;


            case RuneType.Time:

                if (statbits[i].effect_type == EffectType.Speed && statbits[i].effect_sub_type == EffectSubType.Ultra)
                {
                    defense = Get.GetDefense(defenses, StaticRune.getPrimaryDamageType(statsum.runetype));
                    if (defense >= 1)
                    {
                        return(xp);
                    }

                    float add = SpeedMe(skill_stats.getModifiedStats(factor, defense), EffectType.Speed, statbits[i].effect_sub_type);
                    xp += add;
                    assignXp(add, firearm, primary_effecttype, EffectType.Speed, primary_level, skill_stats.level);
                }
                break;

            case RuneType.Fast:
            case RuneType.Slow:
                if (statbits[i].effect_type == EffectType.Force)
                {
                    defense = Get.GetDefense(defenses, StaticRune.getPrimaryDamageType(statsum.runetype));

                    if (defense >= 1)
                    {
                        return(xp);
                    }

                    float add = stats.getXp(ForceMe(skill_stats.getModifiedStats(factor, defense)));
                    Debug.Log($"Night tower {Sun.Instance.GetCurrentTime()} {firearm.gameObject.name} {this.gameObject.name} defense {defense} xp {add} primary effect {primary_effecttype}\n");
                    xp += add;
                    assignXp(add, firearm, primary_effecttype, EffectType.Force, primary_level, skill_stats.level);
                }

                break;

            default:

                if (statbits[i].effect_type == EffectType.Force)
                {
                    defense = Get.GetDefense(defenses, EffectType.Force);
                    if (defense >= 1)
                    {
                        return(xp);
                    }
                    float add = stats.getXp(ForceMe(skill_stats.getModifiedStats(factor, defense)));
                    xp += add;
                    assignXp(add, firearm, primary_effecttype, EffectType.Force, primary_level, skill_stats.level);
                }
                break;
            }
        }

        //  Debug.Log("Total xp " + xp + "\n");
        return(xp);
    }