private void LoadData(List <string> heroData) { int index = 2; StringId = heroData[0].Split(' ')[1]; while (heroData[index] != ".end") { List <string> data = heroData[index++].Replace("%", "").Replace("\"", ""). Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries).ToList(); switch (data[0]) { case "rendering:": RenderingRankOverride = int.Parse(data[2]); break; case "commonfx:": if (CommonEffects == null) { CommonEffects = new CommonEffects(data); } else { CommonEffects.LoadData(data); } break; case "combat_skill:": SkillArtInfo skillArt = new SkillArtInfo(data, false); SkillArtInfo.Add(skillArt); break; case "riposte_skill:": SkillArtInfo riposteArt = new SkillArtInfo(data, false); SkillArtInfo.Add(riposteArt); break; default: Debug.LogError("Unknown art token in hero: " + StringId); break; } } index += 2; while (heroData[index] != ".end") { List <string> data = heroData[index++].Replace("%", "").Replace("\"", ""). Split(new [] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries).ToList(); switch (data[0]) { case "resistances:": Resistanses.Add(AttributeType.Stun, float.Parse(data[2]) / 100); Resistanses.Add(AttributeType.Poison, float.Parse(data[4]) / 100); Resistanses.Add(AttributeType.Bleed, float.Parse(data[6]) / 100); Resistanses.Add(AttributeType.Disease, float.Parse(data[8]) / 100); Resistanses.Add(AttributeType.Move, float.Parse(data[10]) / 100); Resistanses.Add(AttributeType.Debuff, float.Parse(data[12]) / 100); Resistanses.Add(AttributeType.DeathBlow, float.Parse(data[14]) / 100); Resistanses.Add(AttributeType.Trap, float.Parse(data[16]) / 100); break; case "weapon:": Equipment weapon = new Equipment(data[2], Weapons.Count + 1, HeroEquipmentSlot.Weapon); weapon.EquipmentModifiers.Add(new FlatModifier(AttributeType.DamageLow, float.Parse(data[6]), false)); weapon.EquipmentModifiers.Add(new FlatModifier(AttributeType.DamageHigh, float.Parse(data[7]), false)); weapon.EquipmentModifiers.Add(new FlatModifier(AttributeType.CritChance, float.Parse(data[9]) / 100, false)); weapon.EquipmentModifiers.Add(new FlatModifier(AttributeType.SpeedRating, float.Parse(data[11]), false)); Weapons.Add(weapon); break; case "armour:": Equipment armor = new Equipment(data[2], Armors.Count + 1, HeroEquipmentSlot.Armor); armor.EquipmentModifiers.Add(new FlatModifier(AttributeType.DefenseRating, float.Parse(data[4]) / 100, false)); armor.EquipmentModifiers.Add(new FlatModifier(AttributeType.HitPoints, float.Parse(data[8]), true)); Armors.Add(armor); break; case "combat_skill:": List <string> combatData = new List <string>(); data = heroData[index - 1].Split(new [] { '\"' }, StringSplitOptions.RemoveEmptyEntries).ToList(); bool isEffectData = false; foreach (var item in data) { if (isEffectData) { if (item.Trim(' ').StartsWith(".")) { isEffectData = false; } else { combatData.Add(item); continue; } } string[] combatItems = item.Replace("%", "").Split( new [] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); if (combatItems[combatItems.Length - 1] == ".effect") { isEffectData = true; } combatData.AddRange(combatItems); } CombatSkillVariants.Add(new CombatSkill(combatData, true)); break; case "combat_move_skill:": MoveSkill = new MoveSkill(data[2], int.Parse(data[8]), int.Parse(data[9])); break; case "riposte_skill:": List <string> riposteData = new List <string>(); data = heroData[index - 1].Split('\"').ToList(); bool isRiposteEffect = false; foreach (var item in data) { if (isRiposteEffect) { if (item.Trim(' ')[0] == '.') { isRiposteEffect = false; } else { riposteData.Add(item); continue; } } string[] combatItems = item.Replace("%", "").Split( new [] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); if (combatItems[combatItems.Length - 1] == ".effect") { isRiposteEffect = true; } riposteData.AddRange(combatItems); } RiposteSkill = new CombatSkill(riposteData, true); break; case "incompatible_party_member:": IncompatiablePartyTag = data[4]; break; case "tag:": Tags.Add(data[2]); break; case "controlled:": break; case "id_index:": IndexId = int.Parse(data[2]); break; case "skill_selection:": CanSelectCombatSkills = bool.Parse(data[2]); NumberOfSelectedCombatSkills = int.Parse(data[4]); break; case "deaths_door:": if (DeathDoor == null) { DeathDoor = new DeathDoor(data); } else { DeathDoor.LoadData(data); } break; case "generation:": if (Generation == null) { Generation = new HeroGeneration(data); } else { Generation.LoadData(data); } break; case "extra_battle_loot:": if (ExtraBattleLoot == null) { ExtraBattleLoot = new LootDefinition(data); } else { ExtraBattleLoot.LoadData(data); } break; case "extra_curio_loot:": if (ExtraCurioLoot == null) { ExtraCurioLoot = new LootDefinition(data); } else { ExtraCurioLoot.LoadData(data); } break; case "extra_stack_limit:": ExtraStackLimit = data[2]; break; case "mode:": Modes.Add(new CharacterMode(data)); break; default: Debug.LogError("Unknown info token " + data[0] + " in hero: " + StringId); break; } } CombatSkills = new List <CombatSkill>(CombatSkillVariants.FindAll(skill => skill.Level == 0)); }
public void ReadBattlegroundData(BinaryReader br) { RoundNumber = br.ReadInt32(); RoundStatus = (RoundStatus)br.ReadInt32(); TurnType = (TurnType)br.ReadInt32(); TurnStatus = (TurnStatus)br.ReadInt32(); HeroAction = (HeroTurnAction)br.ReadInt32(); BattleStatus = (BattleStatus)br.ReadInt32(); SurpriseStatus = (SurpriseStatus)br.ReadInt32(); StallingRoundNumber = br.ReadInt32(); SelectedUnitId = br.ReadInt32(); SelectedTargetId = br.ReadInt32(); LastSkillUsed = br.ReadString(); int orderedUnitsCount = br.ReadInt32(); OrderedUnitsCombatIds.Clear(); for (int i = 0; i < orderedUnitsCount; i++) { OrderedUnitsCombatIds.Add(br.ReadInt32()); } int combatIdsCount = br.ReadInt32(); CombatIds.Clear(); for (int i = 0; i < combatIdsCount; i++) { CombatIds.Add(br.ReadInt32()); } int companionsCount = br.ReadInt32(); Companions.Clear(); for (int i = 0; i < companionsCount; i++) { Companions.Add(br.ReadInt32()); } int capturesCount = br.ReadInt32(); Captures.Clear(); for (int i = 0; i < capturesCount; i++) { Captures.Add(br.ReadInt32()); } int controlsCount = br.ReadInt32(); Controls.Clear(); for (int i = 0; i < controlsCount; i++) { Controls.Add(br.ReadInt32()); } int lastDamagedCount = br.ReadInt32(); LastDamaged.Clear(); for (int i = 0; i < lastDamagedCount; i++) { LastDamaged.Add(br.ReadString()); } int battleLootCount = br.ReadInt32(); BattleLoot.Clear(); for (int i = 0; i < battleLootCount; i++) { var newBattleLoot = new LootDefinition() { Code = br.ReadString(), Count = br.ReadInt32(), }; BattleLoot.Add(newBattleLoot); } int removedUnitsCount = br.ReadInt32(); RemovedUnits.Clear(); for (int i = 0; i < removedUnitsCount; i++) { var newFormationUnitData = new FormationUnitSaveData(); newFormationUnitData.ReadFormationUnitData(br); RemovedUnits.Add(newFormationUnitData); } MonsterFormation.ReadFormationData(br); }