示例#1
0
 public Unit(UnitId unitId, IUnitData unitData, IUnit[] petUnits, Transform transform)
 {
     UnitId    = unitId;
     UnitData  = unitData;
     Transform = transform;
     _petUnits.AddRange(petUnits);
 }
示例#2
0
        public void UpgradeNullRatity(IUnitData data)
        {
            if (data.Stars > 0)
            {
                return;
            }
            var countShards = GetShardsForUpgrage(data.Id, data.Stars);

            if (countShards > data.Shards)
            {
                return;
            }
            var allAbilities = Static.Abilities.Where(x => x.Value.Params.UnitId == data.Id);

            foreach (var temp in allAbilities)
            {
                data.Abilities[temp.Key] = 1;
            }
            var allPerks = Static.Perks.Where(x => x.Value.UnitId == data.Id);

            foreach (var temp in allPerks)
            {
                data.PerkStars[temp.Key] = 1;
            }
            data.EquipmentStars = 1;
            data.Stars          = 1;
            data.Level          = 1;
            data.Shards        -= countShards;
            LogicLog.UpgradeRarityUnit(data.Id, data.Stars);
        }
示例#3
0
        public IObservable <UniRx.Unit> Run()
        {
            IUnitData[] unitDatas = _unitSpawnSettings.GetUnits(_data.unitCommandData.UnitType);
            if (_data.unitCommandData.UnitIndex >= unitDatas.Length)
            {
                string errorMsg = string.Format("Unit Index not in unit datas range: {0}",
                                                _data.unitCommandData.UnitIndex);
                _logger.LogError(LoggedFeature.Units, errorMsg);
                return(Observable.Throw <UniRx.Unit>(new IndexOutOfRangeException(errorMsg)));
            }

            IUnitData unitData = unitDatas[(int)_data.unitCommandData.UnitIndex];

            // First, spawn the pets recursively.
            // We create commands that we execute directly, because
            // we don't want to treat these as standalone commands (they are only ever children of this command)
            IUnit[] pets = new IUnit[_data.unitCommandData.pets.Length];
            for (var i = 0; i < _data.unitCommandData.pets.Length; i++)
            {
                SpawnUnitData petSpawnUnitData =
                    new SpawnUnitData(_data.unitCommandData.pets[i], _data.tileCoords, _data.isInitialSpawn);
                ICommand petSpawnCommand =
                    _commandFactory.Create(typeof(SpawnUnitCommand), typeof(SpawnUnitData), petSpawnUnitData);
                petSpawnCommand.Run();
                pets[i] = _unitRegistry.GetUnit(_data.unitCommandData.pets[i].unitId);
            }

            // Now, spawn the unit itself.
            IUnit unit = _unitPool.Spawn(_data.unitCommandData.unitId, unitData, pets);

            _gridUnitManager.PlaceUnitAtTile(unit, _data.tileCoords);

            _logger.Log(LoggedFeature.Units, "Spawned: {0}. Id: {1}", unitData.Name, unit.UnitId);
            return(Observable.ReturnUnit());
        }
示例#4
0
        private void SpawnUnit(IUnitData unitData, IntVector2 tileCoords)
        {
            UnitCommandData unitCommandData = _unitCommandDataFactory.Create(unitData);
            SpawnUnitData   spawnUnitData   = new SpawnUnitData(unitCommandData, tileCoords, isInitialSpawn: true);

            _commandQueue.Enqueue <SpawnUnitCommand, SpawnUnitData>(spawnUnitData, CommandSource.Game);
        }
示例#5
0
文件: Unit.cs 项目: ModernMAK/BoEG
#pragma warning restore 649
        public void Initialize(IUnitData data)
        {
            _icon = data.Icon;
            _healthable.Initialize(data.HealthableData);
            _magicable.Initialize(data.MagicableData);
            _armorable.Initialize(data.ArmorableData);
            _aggroable.Initialize(data.AggroableData);
            _attackerable.Initialize(data.AttackerableData);
            _movable.Initialize(data.MovableData);
        }
示例#6
0
        public BattleParamData CalculateInitiative(IUnitData data, FormulaController formula)
        {
            var unit = Static.Units[data.Id];

            return(new BattleParamData
            {
                Value = (int)formula.Calculate(unit.Initiative),
                Equip = CalculateEquipInit(data.Id),
                Base = unit.Rarities.Where(x => x.Value.Stars == data.Stars).Sum(x => x.Value.Initiative),
            });
        }
示例#7
0
 public bool TryGetUnit(int unitId, bool assist, out IUnitData data)
 {
     if (assist)
     {
         if (State.Assist != null && State.Assist.Id == unitId)
         {
             data = State.Assist;
             return(true);
         }
     }
     data = State.Units.FirstOrDefault(x => x.Id == unitId);
     return(data != null && data.Level > 0);
 }
        public static UnitData Clone(IUnitData unitData)
        {
            var clonedData = CreateInstance <UnitData>();

            clonedData.name         = unitData.Name;
            clonedData.unitType     = unitData.UnitType;
            clonedData.pets         = unitData.Pets.Select(Clone).ToArray();
            clonedData.sprite       = unitData.Sprite;
            clonedData.avatarSprite = unitData.AvatarSprite;
            clonedData.unitStats    = unitData.UnitStats;

            return(clonedData);
        }
 public void TryUpdateNullRarity(IUnitData temp)
 {
     if (temp.Stars == 0)
     {
         _units.UpgradeNullRatity(temp);
         if (temp.Stars > 0)
         {
             var unit = _units.Static.Units[temp.Id];
             _impact.ExecuteImpact(unit.ImpactInit);
             _units.UpdateLastTeamSlots();
         }
     }
 }
        public uint?ResolveUnitIndex(IUnitData unitData)
        {
            IUnitData[] unitDatas = _unitSpawnSettings.GetUnits(unitData.UnitType);
            for (var i = unitDatas.Length - 1; i >= 0; i--)
            {
                if (unitDatas[i] == unitData)
                {
                    return((uint)i);
                }
            }

            return(null);
        }
        public IUnit Spawn(UnitId unitId, IUnitData unitData, IUnit[] pets)
        {
            // Create Initializer
            UnitRenderer unitRenderer = _unitRendererPool.Spawn();

            _unitBehaviours[unitId] = unitRenderer;

            // Create Unit and register it
            IUnit unit = new Unit(unitId, unitData, pets, _unitBehaviours[unitId].transform);

            unitRenderer.SetUnit(unit);
            _unitRegistry.RegisterUnit(unit);

            return(unit);
        }
        private void SpawnUnit(UnitDataReference unitDataReference, IntVector2 tileCoords)
        {
            IUnitData unitData =
                _unitDataIndexResolver.ResolveUnitData(unitDataReference.UnitType, unitDataReference.UnitIndex);

            if (unitData == null)
            {
                _logger.LogError(LoggedFeature.Units, "UnitData reference not found: {0}", unitDataReference);
                return;
            }

            UnitCommandData unitCommandData = _unitCommandDataFactory.Create(unitData);
            SpawnUnitData   spawnUnitData   = new SpawnUnitData(unitCommandData, tileCoords, isInitialSpawn: true);

            _commandQueue.Enqueue <SpawnUnitCommand, SpawnUnitData>(spawnUnitData, CommandSource.Game);
        }
示例#13
0
    void Awake()
    {
        damageReceived = 0;
        rotationSpeed  = 2;
        isMoving       = false;
        isRotating     = false;
        isCasting      = false;
        isDead         = false;
        isStunned      = false;

        graphics = gameObject.AddComponent <UnitGraphics>();

        if (unitDataEditor != null)
        {
            unitData = new UnitData(unitDataEditor);
        }
    }
        UnitCost GetOverInfusionCosts(IUnitData unitData, int infusion, int excessKills)
        {
            // over infuse logic. Because this is annoyingly complex, it gets comments

            // We use recursion to get the cost of the previous infuse, then add on our current infusion
            var previousInfCost = GetInfusionCosts(unitData, infusion - 1, excessKills);
            var material        = new UnitRecepePiece(unitData.BasicType, 10, UnitRankType.None, 1);

            // Get the material count - this may not be correct, I only tested inf10->11, which was 11 units
            var materialQty = infusion;


            // check see if any qs charges will be involved in the cost of the infuse materials
            UnitCost qsMaterialCost     = default;
            var      remainingQsCharges = qsCharges;

            if (remainingQsCharges > 0)
            {
                // cost of the infuse feed if we have a qs charge
                qsMaterialCost = GetRawUnitCost(material);

                // as we need 10+ mats, we are going to exhaust our QS charges
                // at this stage it isn't possible to have more than 10 QS charges
                qsCharges = 0;
            }

            // get the cost of our unit without any qs charges
            var fullMaterialCost = GetRawUnitCost(material);

            // cost of feed, e.g, 3000 for inf 11, 4000 for inf 12;
            var mainUnitFeedCost = 2000 + (infusion - 10) * 1000;

            // at this stage it seems unrealistic we will get more than 11,000 vet, so it's unlikely there will be any kills on our materials.
            var killRecycleRefund = 0;

            // as we use recursion for each infuse, we should only get the bonus of one here
            var infuseRecycleRefund = GetInfuseRecycleRefund(1);

            // finally we can total it all together
            var materialKills    = fullMaterialCost.Kills * (materialQty - remainingQsCharges) + qsMaterialCost.Kills * remainingQsCharges;
            var materialMinerals = fullMaterialCost.Minerals * (materialQty - remainingQsCharges) + qsMaterialCost.Minerals * remainingQsCharges;
            var totalKillCost    = materialKills + mainUnitFeedCost - infuseRecycleRefund - killRecycleRefund;

            return(new UnitCost(previousInfCost.Minerals + materialMinerals, previousInfCost.Kills + totalKillCost, 0));
        }
 public void InitData(IUnitData data, ChangeStorage storage)
 {
     _storage = storage;
     Id       = data.Id;
     Shards   = data.Shards;
     Stars    = data.Stars;
     Exp      = data.Exp;
     Level    = data.Level;
     LD_Abilities.Init(data.Abilities, storage);
     LD_PerkStars.Init(data.PerkStars, storage);
     LD_PerkCharges.Init(data.PerkCharges, storage);
     LD_Equipment.Init(data.Equipment, storage);
     EquipmentStars = data.EquipmentStars;
     LD_Buffs.Init(data.Buffs, storage);
     ExplorerPosition = data.ExplorerPosition;
     Reserve          = data.Reserve;
     CurrentHp        = data.CurrentHp;
     FamiliarUnlock   = data.FamiliarUnlock;
     MissionCounter   = data.MissionCounter;
 }
示例#16
0
        public (IUnitData data, IUnit unit) GetUnit(int unitId)
        {
            IUnitData data;

            if (State.Assist != null && State.Assist.Id == unitId)
            {
                data = State.Assist;
            }
            else
            {
                data = State.Units.FirstOrDefault(x => x.Id == unitId);
                if (data == null || data.Level < 1)
                {
                    throw new Exception($"Unit id {unitId} missing");
                }
            }
            var unit = Static.Units[unitId];

            return(data, unit);
        }
        UnitCost GetInfusionCosts(IUnitData unitData, int infusion, int excessKills)
        {
#if DEBUG
            RecordDNAStartUnit(unitData, infusion);
#endif
            if (infusion < 11)
            {
                if (infusion == 0)
                {
                    return(new UnitCost(0, 0, excessKills));
                }

                var infuseDiscount = 0;
                if (unitData.Type.IsCoreBasic() && infusion >= 3 && TryUseQSCharge())
                {
                    infuseDiscount = 3;
                }

                if (unitData.Type.IsDNA1() && infusion >= loadout.Perks.DNAStart.DesiredLevel && TryUseDNAStart())
                {
                    infuseDiscount = loadout.Perks.DNAStart.DesiredLevel;
                }
                else if (shouldGrantDNAFreeInf1 && unitData.Type.IsDNA1())
                {
                    infuseDiscount = 1;
                }

                var material     = new UnitRecepePiece(unitData.BasicType, (int)unitData.Evolution, UnitRankType.None, 1);
                var materialCost = GetRawUnitCost(material);
                var(Cost, ExcessKills) = GetFeedCost(infusion, unitData.Type, excessKills, infuseDiscount);
                var materialQty         = UnitsRequiredForInfuse(infusion, infuseDiscount);
                var killRecycleRefund   = GetKillRecycleRefund(materialCost, infusion, infuseDiscount, materialQty);
                var infuseRecycleRefund = GetInfuseRecycleRefund(infusion, infuseDiscount);
                var totalKillCost       = materialCost.Kills * materialQty + Cost - infuseRecycleRefund - killRecycleRefund;
                return(new UnitCost(materialCost.Minerals * materialQty, totalKillCost, ExcessKills));
            }
            else
            {
                return(GetOverInfusionCosts(unitData, infusion, excessKills));
            }
        }
示例#18
0
        public void AddUnitShard(int unitId, int shards)
        {
            var data = State.Units.FirstOrDefault(x => x.Id == unitId);

            if (data == null)
            {
                data = Factory.CreateUnit(unitId);
                State.Units.Add(data);
            }
            var value = data.Shards + shards;

            if (value < 0)
            {
                value = 0;
            }
            data.Shards = value;
            if (data.Stars == 0 && data.Shards == 0)
            {
                State.Units.Remove(data);
            }
        }
        public IMemberBattleData CreateBattleUnit(IUnitData unit, bool assist)
        {
            _context.NeedExploreParam = true;
            _context.SetContextFormula(unit.Id);
            var data = _battle.Factory.CreateBattleMember(
                unit.Id,
                unit.ExplorerPosition,
                _units.CalculateMaxHp(unit, _formula),
                _units.CalculateStrength(unit, _formula),
                _units.CalculateInitiative(unit, _formula),
                BattleMemberType.Unit
                );

            _context.SetContextFormula(null);
            _context.NeedExploreParam = false;
            data.Assist    = assist;
            data.CurrentHp = unit.CurrentHp;
            var abilities = _units.Static.Abilities.Values.Where(x => x.Params.UnitId == unit.Id).ToArray();

            UpdateParams(data, abilities);

            return(data);
        }
示例#20
0
        public static void UpdateData(this IMutableUnitData data, IUnitData update)
        {
            data.DisplayID = update.DisplayID ?? data.DisplayID;
            data.Flags     = update.Flags ?? data.Flags;
            data.Flags2    = update.Flags2 ?? data.Flags2;
            data.Flags3    = update.Flags3 ?? data.Flags3;
            data.RangedAttackRoundBaseTime = update.RangedAttackRoundBaseTime ?? data.RangedAttackRoundBaseTime;
            data.BoundingRadius            = update.BoundingRadius ?? data.BoundingRadius;
            data.CombatReach        = update.CombatReach ?? data.CombatReach;
            data.MountDisplayID     = update.MountDisplayID ?? data.MountDisplayID;
            data.StandState         = update.StandState ?? data.StandState;
            data.PetTalentPoints    = update.PetTalentPoints ?? data.PetTalentPoints;
            data.VisFlags           = update.VisFlags ?? data.VisFlags;
            data.AnimTier           = update.AnimTier ?? data.AnimTier;
            data.CreatedBySpell     = update.CreatedBySpell ?? data.CreatedBySpell;
            data.EmoteState         = update.EmoteState ?? data.EmoteState;
            data.SheatheState       = update.SheatheState ?? data.SheatheState;
            data.PvpFlags           = update.PvpFlags ?? data.PvpFlags;
            data.PetFlags           = update.PetFlags ?? data.PetFlags;
            data.ShapeshiftForm     = update.ShapeshiftForm ?? data.ShapeshiftForm;
            data.HoverHeight        = update.HoverHeight ?? data.HoverHeight;
            data.InteractSpellID    = update.InteractSpellID ?? data.InteractSpellID;
            data.ScalingLevelMin    = update.ScalingLevelMin ?? data.ScalingLevelMin;
            data.ScalingLevelMax    = update.ScalingLevelMax ?? data.ScalingLevelMax;
            data.StateSpellVisualID = update.StateSpellVisualID ?? data.StateSpellVisualID;
            data.StateAnimID        = update.StateAnimID ?? data.StateAnimID;
            data.StateAnimKitID     = update.StateAnimKitID ?? data.StateAnimKitID;
            data.Charm                  = update.Charm ?? data.Charm;
            data.Summon                 = update.Summon ?? data.Summon;
            data.Critter                = update.Critter ?? data.Critter;
            data.CharmedBy              = update.CharmedBy ?? data.CharmedBy;
            data.DemonCreator           = update.DemonCreator ?? data.DemonCreator;
            data.LookAtControllerTarget = update.LookAtControllerTarget ?? data.LookAtControllerTarget;
            data.Target                 = update.Target ?? data.Target;
            data.Race                = update.Race ?? data.Race;
            data.DisplayPower        = update.DisplayPower ?? data.DisplayPower;
            data.EffectiveLevel      = update.EffectiveLevel ?? data.EffectiveLevel;
            data.AuraState           = update.AuraState ?? data.AuraState;
            data.DisplayScale        = update.DisplayScale ?? data.DisplayScale;
            data.CreatureFamily      = update.CreatureFamily ?? data.CreatureFamily;
            data.CreatureType        = update.CreatureType ?? data.CreatureType;
            data.NativeDisplayID     = update.NativeDisplayID ?? data.NativeDisplayID;
            data.NativeXDisplayScale = update.NativeXDisplayScale ?? data.NativeXDisplayScale;
            data.BaseMana            = update.BaseMana ?? data.BaseMana;
            data.BaseHealth          = update.BaseHealth ?? data.BaseHealth;
            data.SummonedBy          = update.SummonedBy ?? data.SummonedBy;
            data.CreatedBy           = update.CreatedBy ?? data.CreatedBy;
            data.ClassId             = update.ClassId ?? data.ClassId;
            data.Sex               = update.Sex ?? data.Sex;
            data.Health            = update.Health ?? data.Health;
            data.MaxHealth         = update.MaxHealth ?? data.MaxHealth;
            data.Level             = update.Level ?? data.Level;
            data.ContentTuningID   = update.ContentTuningID ?? data.ContentTuningID;
            data.ScalingLevelDelta = update.ScalingLevelDelta ?? data.ScalingLevelDelta;
            data.FactionTemplate   = update.FactionTemplate ?? data.FactionTemplate;

            for (int i = 0; i < Math.Min(data.NpcFlags.Length, update.NpcFlags.Length); i++)
            {
                data.NpcFlags[i] = update.NpcFlags[i] ?? data.NpcFlags[i];
            }
            for (int i = 0; i < Math.Min(data.Power.Length, update.Power.Length); i++)
            {
                data.Power[i] = update.Power[i] ?? data.Power[i];
            }
            for (int i = 0; i < Math.Min(data.MaxPower.Length, update.MaxPower.Length); i++)
            {
                data.MaxPower[i] = update.MaxPower[i] ?? data.MaxPower[i];
            }
            for (int i = 0; i < Math.Min(data.AttackRoundBaseTime.Length, update.AttackRoundBaseTime.Length); i++)
            {
                data.AttackRoundBaseTime[i] = update.AttackRoundBaseTime[i] ?? data.AttackRoundBaseTime[i];
            }
            for (int i = 0; i < Math.Min(data.Resistances.Length, update.Resistances.Length); i++)
            {
                data.Resistances[i] = update.Resistances[i] ?? data.Resistances[i];
            }
            for (int i = 0; i < Math.Min(data.VirtualItems.Length, update.VirtualItems.Length); i++)
            {
                if (update.VirtualItems[i] != null)
                {
                    if (data.VirtualItems[i] == null)
                    {
                        data.VirtualItems[i] = update.VirtualItems[i];
                    }
                    else if (data.VirtualItems[i] is IMutableVisibleItem mut)
                    {
                        mut.UpdateData(update.VirtualItems[i]);
                    }
                }
            }
        }
 public virtual IUnitData ReadUpdateUnitData(Packet packet, IUnitData existingData, params object[] indexes)
 {
     return(existingData);
 }
示例#22
0
        public static void UpdateData(this UpdateValuesObjectDataFields fields, IUnitData data)
        {
            var unit = fields.Unit ??= new();

            unit.DisplayID                 = data.DisplayID;
            unit.ClassId                   = data.ClassId;
            unit.Sex                       = data.Sex;
            unit.Health                    = data.Health;
            unit.MaxHealth                 = data.MaxHealth;
            unit.Level                     = data.Level;
            unit.ContentTuningID           = data.ContentTuningID;
            unit.ScalingLevelMin           = data.ScalingLevelMin;
            unit.ScalingLevelMax           = data.ScalingLevelMax;
            unit.ScalingLevelDelta         = data.ScalingLevelDelta;
            unit.FactionTemplate           = data.FactionTemplate;
            unit.Flags                     = data.Flags;
            unit.Flags2                    = data.Flags2;
            unit.Flags3                    = data.Flags3;
            unit.RangedAttackRoundBaseTime = data.RangedAttackRoundBaseTime;
            unit.BoundingRadius            = data.BoundingRadius;
            unit.CombatReach               = data.CombatReach;
            unit.MountDisplayID            = data.MountDisplayID;
            unit.StandState                = data.StandState;
            unit.PetTalentPoints           = data.PetTalentPoints;
            unit.VisFlags                  = data.VisFlags;
            unit.AnimTier                  = data.AnimTier;
            unit.CreatedBySpell            = data.CreatedBySpell;
            unit.EmoteState                = data.EmoteState;
            unit.SheatheState              = data.SheatheState;
            unit.PvpFlags                  = data.PvpFlags;
            unit.PetFlags                  = data.PetFlags;
            unit.ShapeshiftForm            = data.ShapeshiftForm;
            unit.HoverHeight               = data.HoverHeight;
            unit.InteractSpellID           = data.InteractSpellID;
            unit.StateSpellVisualID        = data.StateSpellVisualID;
            unit.StateAnimID               = data.StateAnimID;
            unit.StateAnimKitID            = data.StateAnimKitID;
            unit.Race                      = data.Race;
            unit.DisplayPower              = data.DisplayPower;
            unit.EffectiveLevel            = data.EffectiveLevel;
            unit.AuraState                 = data.AuraState;
            unit.DisplayScale              = data.DisplayScale;
            unit.CreatureFamily            = data.CreatureFamily;
            unit.CreatureType              = data.CreatureType;
            unit.NativeDisplayID           = data.NativeDisplayID;
            unit.NativeXDisplayScale       = data.NativeXDisplayScale;
            unit.BaseMana                  = data.BaseMana;
            unit.BaseHealth                = data.BaseHealth;
            if (data.Charm != null)
            {
                unit.Charm = data.Charm;
            }
            if (data.Summon != null)
            {
                unit.Summon = data.Summon;
            }
            if (data.Critter != null)
            {
                unit.Critter = data.Critter;
            }
            if (data.CharmedBy != null)
            {
                unit.CharmedBy = data.CharmedBy;
            }
            if (data.DemonCreator != null)
            {
                unit.DemonCreator = data.DemonCreator;
            }
            if (data.LookAtControllerTarget != null)
            {
                unit.LookAtControllerTarget = data.LookAtControllerTarget;
            }
            if (data.Target != null)
            {
                unit.Target = data.Target;
            }
            if (data.SummonedBy != null)
            {
                unit.SummonedBy = data.SummonedBy;
            }
            if (data.CreatedBy != null)
            {
                unit.CreatedBy = data.CreatedBy;
            }
            unit.NpcFlags.Reserve(data.NpcFlags.Length);
            for (int i = 0; i < data.NpcFlags.Length; ++i)
            {
                unit.NpcFlags[i] = data.NpcFlags[i].ToProto();
            }

            unit.Power.Reserve(data.Power.Length);
            for (int i = 0; i < data.Power.Length; ++i)
            {
                unit.Power[i] = data.Power[i].ToProto();
            }

            unit.MaxPower.Reserve(data.MaxPower.Length);
            for (int i = 0; i < data.MaxPower.Length; ++i)
            {
                unit.MaxPower[i] = data.MaxPower[i].ToProto();
            }

            unit.AttackRoundBaseTime.Reserve(data.AttackRoundBaseTime.Length);
            for (int i = 0; i < data.AttackRoundBaseTime.Length; ++i)
            {
                unit.AttackRoundBaseTime[i] = data.AttackRoundBaseTime[i].ToProto();
            }

            unit.Resistances.Reserve(data.Resistances.Length);
            for (int i = 0; i < data.Resistances.Length; ++i)
            {
                unit.Resistances[i] = data.Resistances[i].ToProto();
            }

            unit.VirtualItems.Reserve(data.VirtualItems.Length);
            for (int i = 0; i < data.VirtualItems.Length; ++i)
            {
                if (data.VirtualItems[i] != null)
                {
                    unit.VirtualItems[i] = data.VirtualItems[i].ToProto();
                }
            }
        }
示例#23
0
 public Unit() : base()
 {
     UnitData = new UnitData(this);
 }
 public UnitController(IUnitData unitData)
 {
     _unitData = unitData;
 }