public void CreateFormation(BattleFormationSaveData formationSaveData) { Units = new List <FormationUnit>(); foreach (var unitSaveData in formationSaveData.unitData) { if (unitSaveData.IsHero) { Hero hero = DarkestDungeonManager.Campaign.Heroes.Find(estateHero => estateHero.RosterId == unitSaveData.RosterId); FormationUnit unit = Instantiate(Resources.Load <GameObject>("Prefabs/Heroes/" + hero.Class)).GetComponent <FormationUnit>(); unit.transform.SetParent(transform, false); unit.Party = this; unit.Initialize(hero, unitSaveData); Units.Add(unit); unit.ResetAnimations(); if (hero.HeroClass.Modes.Count > 0) { var currentMode = hero.HeroClass.Modes.Find(mode => mode.Id == unitSaveData.CurrentMode); if (currentMode != null) { hero.CurrentMode = currentMode; } else { hero.CurrentMode = hero.HeroClass.Modes.Find(mode => mode.IsRaidDefault); } } } else { GameObject unitObject = unitSaveData.IsCorpse ? Resources.Load("Prefabs/Monsters/" + unitSaveData.OriginalClass) as GameObject : Resources.Load("Prefabs/Monsters/" + unitSaveData.Class) as GameObject; FormationUnit unit = Instantiate(unitObject).GetComponent <FormationUnit>(); unit.transform.SetParent(transform, false); unit.Party = this; var monsterSave = new Monster(unitSaveData); unit.Initialize(monsterSave, unitSaveData); Units.Add(unit); unit.ResetAnimations(); if (unitSaveData.IsCorpse) { unit.SetInstantCorpseAnimation(); } } } }
public void CreateFormation(BattleEncounter encounter) { Units = new List <FormationUnit>(); int summonRank = 1; foreach (var monster in encounter.Monsters) { GameObject unitObject = Resources.Load("Prefabs/Monsters/" + monster.Class) as GameObject; if (unitObject == null) { unitObject = (Resources.Load("Prefabs/Monsters/brigand_cutthroat") as GameObject); } FormationUnit unit = Instantiate(unitObject).GetComponent <FormationUnit>(); unit.transform.SetParent(transform, false); unit.Party = this; unit.Initialize(monster, summonRank, Team.Monsters); Units.Add(unit); summonRank += monster.Size; unit.ResetAnimations(); } }
public void CreateFormation(RaidParty party, PhotonPlayer player) { Units = new List <FormationUnit>(); for (int i = 0; i < party.HeroInfo.Count; i++) { if (party.HeroInfo[i].IsAlive) { FormationUnit unit = Instantiate((Resources.Load("Prefabs/Heroes/" + party.HeroInfo[i].Hero.ClassStringId) as GameObject)).GetComponent <FormationUnit>(); unit.transform.SetParent(transform, false); unit.Party = this; unit.Initialize(party.HeroInfo[i].Hero, 4 - i, player.isMasterClient ? Team.Heroes : Team.Monsters); Units.Add(unit); unit.ResetAnimations(); if (party.HeroInfo[i].Hero.HeroClass.Modes.Count > 0) { party.HeroInfo[i].Hero.CurrentMode = party.HeroInfo[i].Hero.HeroClass.Modes.Find(mode => mode.IsRaidDefault); } } } }
public FormationUnit ReplaceUnit(MonsterData data, FormationUnit oldUnit, GameObject newObject, bool roll = false, float carryHp = 0) { #region Companion var companionRecord = Companions.Find(record => record.TargetUnit == oldUnit || record.CompanionUnit == oldUnit); if (companionRecord != null) { Companions.Remove(companionRecord); if (companionRecord.CompanionUnit == oldUnit) { foreach (var buff in companionRecord.CompanionComponent.Buffs) { companionRecord.TargetUnit.Character.RemoveSourceBuff(buff, BuffSourceType.Adventure); } companionRecord.TargetUnit.OverlaySlot.UpdateOverlay(); } } #endregion FormationUnit newUnit = Instantiate(newObject).GetComponent <FormationUnit>(); newUnit.Initialize(new Monster(data), oldUnit.Rank, Team.Monsters); newUnit.transform.SetParent(oldUnit.transform.parent, false); newUnit.transform.position = oldUnit.transform.position; newUnit.Party = oldUnit.Party; newUnit.Party.Units[newUnit.Party.Units.IndexOf(oldUnit)] = newUnit; newUnit.Formation = oldUnit.Formation; RaidSceneManager.TorchMeter.ApplyBuffsForUnit(newUnit); oldUnit.OverlaySlot.LockOnUnit(newUnit); oldUnit.RankSlot.PutInSlot(newUnit); if (carryHp != 0) { newUnit.Character.Health.ValueRatio = carryHp; } newUnit.CombatInfo.PrepareForBattle(oldUnit.CombatInfo.CombatId, newUnit.Character as Monster, true); DarkestSoundManager.ExecuteNarration("change_monster_class", NarrationPlace.Raid, oldUnit.Character.Class, newUnit.Character.Class); if (!newUnit.RankSlot.Ranks.facingRight) { newUnit.InstantFlip(); } newUnit.ResetAnimations(); if (roll) { for (int i = 0; i < Round.OrderedUnits.Count; i++) { if (Round.OrderedUnits[i] == oldUnit) { Round.OrderedUnits[i] = newUnit; } } } else { Round.OrderedUnits.RemoveAll(unit => unit == oldUnit); } if (SharedHealth.IsActive && data.SharedHealth != null) { SharedHealth.SharedUnits.Remove(oldUnit); SharedHealth.SharedUnits.Add(newUnit); newUnit.Character[AttributeType.HitPoints, true] = SharedHealth.Health; } Destroy(oldUnit.gameObject); #region Companion Check if (data.Companion != null) { var companion = newUnit.Formation.party.Units.Find(unit => unit.Character.Class == data.Companion.MonsterClass); if (companion != null) { Companions.Add(new CompanionRecord(newUnit, companion)); foreach (var buff in data.Companion.Buffs) { newUnit.Character.AddBuff(new BuffInfo(buff, BuffDurationType.Raid, BuffSourceType.Adventure, 3)); } newUnit.OverlaySlot.UpdateOverlay(); } } for (int i = 0; i < newUnit.Party.Units.Count; i++) { if (newUnit.Party.Units[i] != newUnit && newUnit.Party.Units[i].Character.IsMonster) { var monster = newUnit.Party.Units[i].Character as Monster; if (monster.Data.Companion != null) { var companion = newUnit.Party.Units.Find(unit => unit.Character.Class == monster.Data.Companion.MonsterClass); if (companion != null) { Companions.Add(new CompanionRecord(newUnit.Party.Units[i], companion)); foreach (var buff in monster.Data.Companion.Buffs) { newUnit.Party.Units[i].Character.AddBuff(new BuffInfo(buff, BuffDurationType.Raid, BuffSourceType.Adventure, 3)); } newUnit.Party.Units[i].OverlaySlot.UpdateOverlay(); } } } } #endregion return(newUnit); }
public void SummonUnit(MonsterData monsterData, GameObject unitObject, int targetRank, bool initiativeRoll, bool canSpawnLoot) { FormationUnit newUnit = Instantiate(unitObject).GetComponent <FormationUnit>(); newUnit.Initialize(new Monster(monsterData), targetRank, Team.Monsters); newUnit.transform.SetParent(MonsterParty.transform, false); newUnit.RectTransform.position = MonsterFormation.rankHolder.rankMarkSlots[targetRank - 1].transform.position; newUnit.Party = MonsterParty; newUnit.Formation = MonsterFormation; newUnit.CombatInfo.PrepareForBattle(PickId(), newUnit.Character as Monster, canSpawnLoot); RaidSceneManager.TorchMeter.ApplyBuffsForUnit(newUnit); if (!MonsterFormation.ranks.facingRight) { newUnit.InstantFlip(); } newUnit.ResetAnimations(); if (newUnit.Formation.AvailableFreeSpace >= newUnit.Size) { newUnit.Formation.SpawnUnit(newUnit, targetRank); if (initiativeRoll) { Round.InsertInitiativeRoll(newUnit); } #region Spawn Check if (monsterData.Spawn != null) { for (int i = 0; i < monsterData.Spawn.Effects.Count; i++) { for (int j = 0; j < monsterData.Spawn.Effects[i].SubEffects.Count; j++) { monsterData.Spawn.Effects[i].SubEffects[j].ApplyInstant(newUnit, newUnit, monsterData.Spawn.Effects[i]); } } newUnit.OverlaySlot.UpdateOverlay(); } #endregion #region Companion Check if (monsterData.Companion != null) { var companion = newUnit.Formation.party.Units.Find(unit => unit.Character.Class == monsterData.Companion.MonsterClass); if (companion != null) { Companions.Add(new CompanionRecord(newUnit, companion)); foreach (var buff in monsterData.Companion.Buffs) { newUnit.Character.AddBuff(new BuffInfo(buff, BuffDurationType.Raid, BuffSourceType.Adventure, 3)); } newUnit.OverlaySlot.UpdateOverlay(); } } for (int i = 0; i < newUnit.Party.Units.Count; i++) { if (newUnit.Party.Units[i] != newUnit && newUnit.Party.Units[i].Character.IsMonster) { var monster = newUnit.Party.Units[i].Character as Monster; if (monster.Data.Companion != null) { var companion = newUnit.Party.Units.Find(unit => unit.Character.Class == monster.Data.Companion.MonsterClass); if (companion != null) { Companions.Add(new CompanionRecord(newUnit.Party.Units[i], companion)); foreach (var buff in monster.Data.Companion.Buffs) { newUnit.Party.Units[i].Character.AddBuff(new BuffInfo(buff, BuffDurationType.Raid, BuffSourceType.Adventure, 3)); } newUnit.Party.Units[i].OverlaySlot.UpdateOverlay(); } } } } #endregion } else if (newUnit.Formation.AvailableSummonSpace >= newUnit.Size) { var purgingCandidates = new List <FormationUnit>(newUnit.Formation.party.Units); purgingCandidates.Sort((x, y) => { if (Mathf.Abs(x.Rank - targetRank) == Mathf.Abs(y.Rank - targetRank)) { return(0); } if (Mathf.Abs(x.Rank - targetRank) < Mathf.Abs(y.Rank - targetRank)) { return(1); } else { return(-1); } }); for (int i = purgingCandidates.Count - 1; i >= 0; i--) { if (purgingCandidates[i].Character.IsMonster && purgingCandidates[i].Character.BattleModifiers.CanBeSummonRank) { RaidSceneManager.Instanse.SummonPurging(purgingCandidates[i]); if (newUnit.Formation.AvailableFreeSpace >= newUnit.Size) { newUnit.Formation.SpawnUnit(newUnit, targetRank); if (initiativeRoll) { Round.InsertInitiativeRoll(newUnit); } #region Spawn Check if (monsterData.Spawn != null) { for (int k = 0; k < monsterData.Spawn.Effects.Count; k++) { for (int j = 0; j < monsterData.Spawn.Effects[k].SubEffects.Count; j++) { monsterData.Spawn.Effects[k].SubEffects[j].ApplyInstant(newUnit, newUnit, monsterData.Spawn.Effects[k]); } } newUnit.OverlaySlot.UpdateOverlay(); } #endregion #region Companion Check if (monsterData.Companion != null) { var companion = newUnit.Formation.party.Units.Find(unit => unit.Character.Class == monsterData.Companion.MonsterClass); if (companion != null) { Companions.Add(new CompanionRecord(newUnit, companion)); foreach (var buff in monsterData.Companion.Buffs) { newUnit.Character.AddBuff(new BuffInfo(buff, BuffDurationType.Raid, BuffSourceType.Adventure, 3)); } newUnit.OverlaySlot.UpdateOverlay(); } } for (int j = 0; j < newUnit.Party.Units.Count; j++) { if (newUnit.Party.Units[j] != newUnit && newUnit.Party.Units[j].Character.IsMonster) { var monster = newUnit.Party.Units[j].Character as Monster; if (monster.Data.Companion != null) { var companion = newUnit.Party.Units.Find(unit => unit.Character.Class == monster.Data.Companion.MonsterClass); if (companion != null) { Companions.Add(new CompanionRecord(newUnit.Party.Units[j], companion)); foreach (var buff in monster.Data.Companion.Buffs) { newUnit.Party.Units[j].Character.AddBuff(new BuffInfo(buff, BuffDurationType.Raid, BuffSourceType.Adventure, 3)); } newUnit.Party.Units[j].OverlaySlot.UpdateOverlay(); } } } } #endregion return; } } } ReturnId(newUnit.CombatInfo.CombatId); Debug.LogError("Not enough summon space for " + newUnit.name); Destroy(newUnit.gameObject); } else { ReturnId(newUnit.CombatInfo.CombatId); Debug.LogError("Not enough summon space for " + newUnit.name); Destroy(newUnit.gameObject); } }
public void LoadBattle(BattleGroundSaveData battleSaveData) { InitiateSavedBattle(); LoadEncounter(battleSaveData.MonsterFormation); #region Load Guard Statuses for (int i = 0; i < HeroParty.Units.Count; i++) { var heroGuardedStatus = HeroParty.Units[i].Character[StatusType.Guarded] as GuardedStatusEffect; if (heroGuardedStatus.GuardDuration > 0) { var guardUnit = FindById(heroGuardedStatus.GuardCombatId); if (guardUnit != null) { heroGuardedStatus.Guard = guardUnit; var guardStatus = guardUnit.Character[StatusType.Guard] as GuardStatusEffect; guardStatus.Targets.Add(HeroParty.Units[i]); } } } for (int i = 0; i < MonsterParty.Units.Count; i++) { var monsterGuardedStatus = MonsterParty.Units[i].Character[StatusType.Guarded] as GuardedStatusEffect; if (monsterGuardedStatus.GuardDuration > 0) { var guardUnit = FindById(monsterGuardedStatus.GuardCombatId); if (guardUnit != null) { monsterGuardedStatus.Guard = guardUnit; var guardStatus = guardUnit.Character[StatusType.Guard] as GuardStatusEffect; guardStatus.Targets.Add(MonsterParty.Units[i]); } } } #endregion #region Load Battle Info Round.RoundNumber = battleSaveData.RoundNumber; Round.RoundStatus = battleSaveData.RoundStatus; Round.TurnType = battleSaveData.TurnType; Round.TurnStatus = battleSaveData.TurnStatus; Round.HeroAction = battleSaveData.HeroAction; BattleStatus = battleSaveData.BattleStatus; SurpriseStatus = battleSaveData.SurpriseStatus; StallingRoundNumber = battleSaveData.StallingRoundNumber; Round.SelectedUnit = FindById(battleSaveData.SelectedUnitId); Round.SelectedTarget = FindById(battleSaveData.SelectedTargetId); LastSkillUsed = battleSaveData.LastSkillUsed; Round.OrderedUnits.Clear(); for (int i = 0; i < battleSaveData.OrderedUnitsCombatIds.Count; i++) { var newOrderedUnit = FindById(battleSaveData.OrderedUnitsCombatIds[i]); if (newOrderedUnit != null) { Round.OrderedUnits.Add(newOrderedUnit); } } CombatIds = battleSaveData.CombatIds; LastDamaged = battleSaveData.LastDamaged; BattleLoot = battleSaveData.BattleLoot; #endregion #region Load Removed Captured Units for (int i = 0; i < battleSaveData.RemovedUnits.Count; i++) { var prisonerSaveData = battleSaveData.RemovedUnits[i]; if (prisonerSaveData.IsHero) { Hero hero = DarkestDungeonManager.Campaign.Heroes.Find(estateHero => estateHero.RosterId == prisonerSaveData.RosterId); FormationUnit unit = Instantiate(Resources.Load <GameObject>("Prefabs/Heroes/" + hero.Class)).GetComponent <FormationUnit>(); unit.transform.SetParent(HeroParty.transform, false); unit.Party = HeroParty; unit.Formation = HeroFormation; unit.Initialize(hero, prisonerSaveData); unit.ResetAnimations(); if (hero.HeroClass.Modes.Count > 0) { var currentMode = hero.HeroClass.Modes.Find(mode => mode.Id == prisonerSaveData.CurrentMode); if (currentMode != null) { hero.CurrentMode = currentMode; } else { hero.CurrentMode = hero.HeroClass.Modes.Find(mode => mode.IsRaidDefault); } } loadedRemovedPrisoners.Add(unit); unit.gameObject.SetActive(false); } else { GameObject unitObject = Resources.Load("Prefabs/Monsters/" + prisonerSaveData.Class) as GameObject; FormationUnit unit = Instantiate(unitObject).GetComponent <FormationUnit>(); unit.transform.SetParent(HeroParty.transform, false); unit.Party = HeroParty; unit.Formation = HeroFormation; var monsterSave = new Monster(prisonerSaveData); unit.Initialize(monsterSave, prisonerSaveData); unit.ResetAnimations(); loadedRemovedPrisoners.Add(unit); unit.gameObject.SetActive(false); } } #endregion }