public void ControlUnit(FormationUnit prisoner, FormationUnit controller, int duration) { RaidSceneManager.BattleGround.Controls.Add(new ControlRecord(prisoner, controller, duration)); prisoner.Formation.DeleteUnit(prisoner, false); prisoner.Character.GetStatusEffect(StatusType.Guarded).ResetStatus(); prisoner.Character.GetStatusEffect(StatusType.Guard).ResetStatus(); Round.OrderedUnits.RemoveAll(unit => unit == prisoner); prisoner.Team = controller.Team; prisoner.transform.SetParent(controller.Party.transform, true); prisoner.Party = controller.Party; prisoner.Formation = controller.Formation; prisoner.CombatInfo.PrepareForBattle(prisoner.CombatInfo.CombatId); prisoner.InstantFlip(); prisoner.SetMoveSmoothTime(0.1f); if (prisoner.Formation.AvailableFreeSpace >= prisoner.Size) { prisoner.Formation.SpawnUnit(prisoner, 4); } else if (prisoner.Formation.AvailableSummonSpace >= prisoner.Size) { var purgingCandidates = new List <FormationUnit>(prisoner.Formation.party.Units); purgingCandidates.Sort((x, y) => { if (Mathf.Abs(x.Rank - 4) == Mathf.Abs(y.Rank - 4)) { return(0); } if (Mathf.Abs(x.Rank - 4) < Mathf.Abs(y.Rank - 4)) { 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 (prisoner.Formation.AvailableFreeSpace >= prisoner.Size) { prisoner.Formation.SpawnUnit(prisoner, 4); prisoner.OverlaySlot.UpdateOverlay(); return; } } } Debug.LogError("Not enough control space for " + prisoner.name); } else { Debug.LogError("Not enough control space for " + prisoner.name); } prisoner.OverlaySlot.UpdateOverlay(); }
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); } }