示例#1
0
    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();
    }
示例#2
0
    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);
    }
示例#3
0
    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);
        }
    }