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(); }
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); }
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(); } }
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); }
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); }
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); }
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); } }
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); }
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); } }
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(); }
//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); }