public ActionResult NewArmorLot(NewArmorLotModel model)
 {
     if (ModelState.IsValid)
     {
         using (var db = new BGS_DBContext()) {
             string userIdentityId = User.Identity.GetUserId();
             var    seller         = db.Users.Single(u => u.Id == userIdentityId);
             for (int i = 0; i < model.LotCount; i++)
             {
                 ArmorModel newArmorModelModel = GameUtilCreater.ArmorModelFromModel(model);
                 db.ArmorModels.Add(newArmorModelModel);
                 db.SaveChanges();
                 var lot = new LotModel()
                 {
                     Seller   = seller,
                     ItemId   = newArmorModelModel.Id,
                     Price    = model.Price,
                     SellerId = seller.GameId,
                     Status   = LotStatus.Available,
                     Type     = LotType.Armor
                 };
                 db.LotModels.Add(lot);
                 db.SaveChanges();
                 newArmorModelModel.LotId = lot.Id;
             }
             db.SaveChanges();
             return(RedirectToAction("Index", "Market"));
         }
     }
     ModelState.AddModelError("", "Что то не правильно");
     return(View(model));
 }
    private bool BindArmorModel <TArmorModel>(TArmorModel model) where TArmorModel : ArmorModel, new()
    {
        if (model != null)
        {
            return(this.BindArmorModelCheckedNonNull(model));
        }
        ArmorModel model2 = this.defaultArmorModelGroup[ArmorModelSlotUtility.GetArmorModelSlotForClass <TArmorModel>()];

        return((model2 != null) && this.BindArmorModelCheckedNonNull(model2));
    }
 public bool Contains(ArmorModel model)
 {
     if (model == null)
     {
         return(false);
     }
     if (!this.awake)
     {
         ArmorModelGroup defaultArmorModelGroup = this.defaultArmorModelGroup;
         return((defaultArmorModelGroup != null) && (defaultArmorModelGroup[model.slot] == model));
     }
     return(this.models[model.slot] == model);
 }
 private bool BindArmorModel(ArmorModel model, ArmorModelSlot slot)
 {
     if (model == null)
     {
         ArmorModel model2 = this.defaultArmorModelGroup[slot];
         return((model2 != null) && this.BindArmorModelCheckedNonNull(model2));
     }
     if (model.slot != slot)
     {
         Debug.LogError("model.slot != " + slot, model);
         return(false);
     }
     return(this.BindArmorModelCheckedNonNull(model));
 }
    public bool Contains(ArmorModel model)
    {
        if (!model)
        {
            return(false);
        }
        if (this.awake)
        {
            return(this.models[model.slot] == model);
        }
        ArmorModelGroup armorModelGroups = this.defaultArmorModelGroup;

        return(!armorModelGroups ? false : armorModelGroups[model.slot] == model);
    }
    private bool BindArmorModel <TArmorModel>(TArmorModel model)
        where TArmorModel : ArmorModel, new()
    {
        if (model)
        {
            return(this.BindArmorModelCheckedNonNull(model));
        }
        ArmorModel item = this.defaultArmorModelGroup[ArmorModelSlotUtility.GetArmorModelSlotForClass <TArmorModel>()];

        if (!item)
        {
            return(false);
        }
        return(this.BindArmorModelCheckedNonNull(item));
    }
    private bool BindArmorModel(ArmorModel model, ArmorModelSlot slot)
    {
        if (model)
        {
            if (model.slot == slot)
            {
                return(this.BindArmorModelCheckedNonNull(model));
            }
            Debug.LogError(string.Concat("model.slot != ", slot), model);
            return(false);
        }
        ArmorModel item = this.defaultArmorModelGroup[slot];

        return(!item ? false : this.BindArmorModelCheckedNonNull(item));
    }
    public ArmorModelSlotMask BindArmorGroup(ArmorModelGroup group)
    {
        ArmorModelSlotMask mask = 0;

        if (group != null)
        {
            for (ArmorModelSlot slot = ArmorModelSlot.Feet; slot < ((ArmorModelSlot)4); slot = (ArmorModelSlot)(((int)slot) + 1))
            {
                ArmorModel model = group[slot];
                if ((model != null) && this.BindArmorModelCheckedNonNull(model))
                {
                    mask |= slot.ToMask();
                }
            }
        }
        return(mask);
    }
    public ArmorModelSlotMask BindArmorGroup(ArmorModelGroup group)
    {
        ArmorModelSlotMask mask = (ArmorModelSlotMask)0;

        if (group)
        {
            for (ArmorModelSlot i = ArmorModelSlot.Feet; (int)i < 4; i = (ArmorModelSlot)((byte)i + (byte)ArmorModelSlot.Legs))
            {
                ArmorModel item = group[i];
                if (item && this.BindArmorModelCheckedNonNull(item))
                {
                    mask = mask | i.ToMask();
                }
            }
        }
        return(mask);
    }
    public void EquipShield(ItemType itemType) //Equip our shield in the shield pos
    {
        GameObject newShieldObject = EquipItem(itemType, ItemData.EquipPosition.ShieldHand, ShieldParent, ref m_EquippedShield);

        if (newShieldObject == null)
        {
            return;
        }

        ArmorModel armorModel = newShieldObject.GetComponent <ArmorModel>();

        if (armorModel == null)
        {
            Debug.LogWarning("No ArmorModel for this shield");
            return;
        }

        m_Character.Health.RegisterArmor(armorModel);
    }
    private bool BindArmorModelCheckedNonNull(ArmorModel model)
    {
        ArmorModel     censoredModel;
        ArmorModelSlot slot = model.slot;

        if (!rebindingCensorship)
        {
            ArmorModel model2 = this.models[slot];
            if (model2 == model)
            {
                return(false);
            }
        }
        ActorMeshRenderer renderer = this.renderers[slot];

        if (censored)
        {
            censoredModel = model.censoredModel;
            if (censoredModel == null)
            {
                censoredModel = model;
            }
        }
        else
        {
            censoredModel = model;
        }
        if (renderer.actorRig != censoredModel.actorRig)
        {
            return(false);
        }
        if (!base.enabled)
        {
            renderer.renderer.enabled = true;
        }
        renderer.Bind(censoredModel.actorMeshInfo, censoredModel.sharedMaterials);
        if (!base.enabled)
        {
            renderer.renderer.enabled = false;
        }
        this.models[slot] = model;
        return(true);
    }
    public ArmorModelSlotMask BindArmorGroup(ArmorModelGroup group, ArmorModelSlotMask slotMask)
    {
        if (!this.awake)
        {
            if (group == null)
            {
                return(0);
            }
            return(this.Initialize(group.armorModelMemberMap, slotMask));
        }
        ArmorModelSlotMask mask = 0;

        foreach (ArmorModelSlot slot in slotMask.EnumerateSlots())
        {
            ArmorModel model = group[slot];
            if ((model != null) && this.BindArmorModelCheckedNonNull(model))
            {
                mask |= slot.ToMask();
            }
        }
        return(mask);
    }
    private bool BindArmorModelCheckedNonNull(ArmorModel model)
    {
        ArmorModel     armorModel;
        ArmorModelSlot armorModelSlot = model.slot;

        if (!ArmorModelRenderer.rebindingCensorship && this.models[armorModelSlot] == model)
        {
            return(false);
        }
        ActorMeshRenderer item = this.renderers[armorModelSlot];

        if (!ArmorModelRenderer.censored)
        {
            armorModel = model;
        }
        else
        {
            armorModel = model.censoredModel;
            if (!armorModel)
            {
                armorModel = model;
            }
        }
        if (item.actorRig != armorModel.actorRig)
        {
            return(false);
        }
        if (!base.enabled)
        {
            item.renderer.enabled = true;
        }
        item.Bind(armorModel.actorMeshInfo, armorModel.sharedMaterials);
        if (!base.enabled)
        {
            item.renderer.enabled = false;
        }
        this.models[armorModelSlot] = model;
        return(true);
    }
    public ArmorModelSlotMask BindArmorGroup(ArmorModelGroup group, ArmorModelSlotMask slotMask)
    {
        if (!this.awake)
        {
            if (!group)
            {
                return(0);
            }
            return(this.Initialize(group.armorModelMemberMap, slotMask));
        }
        ArmorModelSlotMask mask = (ArmorModelSlotMask)0;

        ArmorModelSlot[] armorModelSlotArray = slotMask.EnumerateSlots();
        for (int i = 0; i < (int)armorModelSlotArray.Length; i++)
        {
            ArmorModelSlot armorModelSlot = armorModelSlotArray[i];
            ArmorModel     item           = group[armorModelSlot];
            if (item && this.BindArmorModelCheckedNonNull(item))
            {
                mask = mask | armorModelSlot.ToMask();
            }
        }
        return(mask);
    }
 public static void InitializeItems()
 {
     foreach (GameObject equipment in Resources.LoadAll("Equipment/Weapon"))
     {
         WeaponModel model = equipment.gameObject.GetComponent <WeaponModel>();
         //Debug.Log($"{model.name}, {model.type}, {model.id}, {equipment.name}, {model.HitboxName}, {model.MovesetName}");
         Weapons.Add(new Weapon(model.name, model.type, model.id, new WeaponProps(model.Damage, model.BaseAttackSpeed), equipment.name, model.HitboxName, model.MovesetName));
     }
     foreach (TextAsset text in Resources.LoadAll <TextAsset>("Equipment/ArmorModels/Head"))
     {
         //Debug.Log(text.text);
         ArmorModel model = (ArmorModel)JsonUtility.FromJson <ArmorModel>(text.text);
         //Debug.Log($"{model.Name}, {model.Type}, {model.Id}, {model.MeshName}, {model.Gender}");
         Armor.Add(new Armor(model.Name, (EquipmentTypes)Enum.Parse(typeof(EquipmentTypes), model.Type), model.Id, new ArmorProps(model.Armor), model.MeshName));
     }
     foreach (TextAsset text in Resources.LoadAll <TextAsset>("Equipment/ArmorModels/Body"))
     {
         ArmorModel model = (ArmorModel)JsonUtility.FromJson <ArmorModel>(text.text);
         Armor.Add(new Armor(model.Name, (EquipmentTypes)Enum.Parse(typeof(EquipmentTypes), model.Type), model.Id, new ArmorProps(model.Armor), model.MeshName));
     }
     foreach (TextAsset text in Resources.LoadAll <TextAsset>("Equipment/ArmorModels/Legs"))
     {
         ArmorModel model = (ArmorModel)JsonUtility.FromJson <ArmorModel>(text.text);
         Armor.Add(new Armor(model.Name, (EquipmentTypes)Enum.Parse(typeof(EquipmentTypes), model.Type), model.Id, new ArmorProps(model.Armor), model.MeshName));
     }
     foreach (TextAsset text in Resources.LoadAll <TextAsset>("Equipment/ArmorModels/Feet"))
     {
         ArmorModel model = (ArmorModel)JsonUtility.FromJson <ArmorModel>(text.text);
         Armor.Add(new Armor(model.Name, (EquipmentTypes)Enum.Parse(typeof(EquipmentTypes), model.Type), model.Id, new ArmorProps(model.Armor), model.MeshName));
     }
     foreach (TextAsset text in Resources.LoadAll <TextAsset>("Equipment/ArmorModels/Hands"))
     {
         ArmorModel model = (ArmorModel)JsonUtility.FromJson <ArmorModel>(text.text);
         Armor.Add(new Armor(model.Name, (EquipmentTypes)Enum.Parse(typeof(EquipmentTypes), model.Type), model.Id, new ArmorProps(model.Armor), model.MeshName));
     }
 }
Exemple #16
0
        private void LoadArmorModels()
        {
            Dictionary <int, ArmorModel> armorsModels = ItemService.GetAllArmorModelsDict();

            foreach (KeyValuePair <int, ArmorModel> modelPair in armorsModels)
            {
                StatsSet   set   = new StatsSet();
                ArmorModel model = modelPair.Value;
                Armor      armor = new Armor(set)
                {
                    Type        = Utilz.GetEnumFromString(model.ArmorType, ArmorTypeId.None),
                    ItemId      = model.ItemId,
                    Name        = model.Name,
                    BodyPart    = Slots[model.BodyPart],
                    Sellable    = model.Sellable,
                    Dropable    = model.Dropable,
                    Destroyable = model.Destroyable,
                    Tradable    = model.Tradeable,
                    Weight      = model.Weight,
                    Duration    = model.Duration
                };
                Armors.Add(modelPair.Key, armor);
            }
        }
    private ArmorModelSlotMask Initialize(ArmorModelMemberMap memberMap, ArmorModelSlotMask memberMask)
    {
        ActorMeshRenderer actorMeshRenderer;

        this.awake = true;
        string   rendererName = ArmorModelSlot.Head.GetRendererName();
        ActorRig item         = this.defaultArmorModelGroup[ArmorModelSlot.Head].actorRig;

        actorMeshRenderer = (!this.originalRenderer ? ActorMeshRenderer.CreateOn(base.transform, rendererName, item, this.boneStructure.rigOrderedTransformArray, base.gameObject.layer) : ActorMeshRenderer.Replace(this.originalRenderer, item, this.boneStructure.rigOrderedTransformArray, rendererName));
        this.renderers[ArmorModelSlot.Head] = actorMeshRenderer;
        for (ArmorModelSlot i = ArmorModelSlot.Feet; i < ArmorModelSlot.Head; i = (ArmorModelSlot)((byte)i + (byte)ArmorModelSlot.Legs))
        {
            this.renderers[i] = actorMeshRenderer.CloneBlank(i.GetRendererName());
        }
        for (ArmorModelSlot j = ArmorModelSlot.Feet; j < ArmorModelSlot.Head; j = (ArmorModelSlot)((byte)j + (byte)ArmorModelSlot.Legs))
        {
            ActorMeshRenderer item1 = this.renderers[j];
            if (item1)
            {
                item1.renderer.enabled = base.enabled;
            }
        }
        ArmorModelSlotMask mask             = (ArmorModelSlotMask)0;
        ArmorModelGroup    armorModelGroups = this.defaultArmorModelGroup;

        if (!armorModelGroups)
        {
            ArmorModelSlot[] armorModelSlotArray = memberMask.EnumerateSlots();
            for (int k = 0; k < (int)armorModelSlotArray.Length; k++)
            {
                ArmorModelSlot armorModelSlot = armorModelSlotArray[k];
                ArmorModel     armorModel     = memberMap.GetArmorModel(armorModelSlot);
                if (armorModel && this.BindArmorModelCheckedNonNull(armorModel))
                {
                    mask = mask | armorModelSlot.ToMask();
                }
            }
        }
        else
        {
            for (ArmorModelSlot l = ArmorModelSlot.Feet; (int)l < 4; l = (ArmorModelSlot)((byte)l + (byte)ArmorModelSlot.Legs))
            {
                if (memberMask.Contains(l))
                {
                    ArmorModel armorModel1 = memberMap.GetArmorModel(l);
                    if (!armorModel1 || !this.BindArmorModelCheckedNonNull(armorModel1))
                    {
                        goto Label1;
                    }
                    mask = mask | l.ToMask();
                    goto Label0;
                }
Label1:
                ArmorModel item2 = armorModelGroups[l];
                if (item2)
                {
                    this.BindArmorModelCheckedNonNull(item2);
                }
Label0:
            }
        }
        return(mask);
    }
Exemple #18
0
        public CharacterCombatModel GenerateMirrorNpc()
        {
            ctx = new ProjectStrawberryEntities();

            npcLevel     = model.Level;
            npcAttribute = 60 + (npcLevel - 1) * 15;
            var mainHandWeaponType = model.MainHand.WeaponType.Name.ToLower();

            if (model.MainHand != null)
            {
                npcAttribute -= model.MainHand.ReqWeaponMastery;
            }

            if (model.OffHand.shld != null)
            {
                vitality = Math.Round(npcAttribute * 0.50);
                strength = Math.Round(npcAttribute * 0.25);
                block    = Math.Round(npcAttribute * 0.25);
            }
            else if (mainHandWeaponType == "axe")
            {
                vitality  = Math.Round(npcAttribute * 0.55);
                strength  = Math.Round(npcAttribute * 0.25);
                quickness = Math.Round(npcAttribute * 0.10);
                evasion   = Math.Round(npcAttribute * 0.05);
                parry     = Math.Round(npcAttribute * 0.05);
                axe       = model.Axe;
            }
            else if (mainHandWeaponType == "dagger")
            {
                vitality = Math.Round(npcAttribute * 0.50);
                strength = Math.Round(npcAttribute * 0.25);
                evasion  = Math.Round(npcAttribute * 0.25);
                dagger   = model.Dagger;
            }
            else if (mainHandWeaponType == "mace")
            {
                vitality = Math.Round(npcAttribute * 0.40);
                strength = Math.Round(npcAttribute * 0.40);
                parry    = Math.Round(npcAttribute * 0.20);
                mace     = model.Mace;
            }
            else if (mainHandWeaponType == "polearm")
            {
                vitality = Math.Round(npcAttribute * 0.50);
                strength = Math.Round(npcAttribute * 0.35);
                evasion  = Math.Round(npcAttribute * 0.15);
                polearm  = model.Polearm;
            }
            else if (mainHandWeaponType == "spear")
            {
                vitality  = Math.Round(npcAttribute * 0.50);
                strength  = Math.Round(npcAttribute * 0.30);
                quickness = Math.Round(npcAttribute * 0.20);
                spear     = model.Spear;
            }
            else if (mainHandWeaponType == "sword")
            {
                vitality = Math.Round(npcAttribute * 0.45);
                strength = Math.Round(npcAttribute * 0.30);
                parry    = Math.Round(npcAttribute * 0.25);
                sword    = model.Sword;
            }
            else
            {
                vitality = Math.Round(npcAttribute * 0.65);
                strength = Math.Round(npcAttribute * 0.35);
            }

            var npc = new CharacterCombatModel()
            {
                Name      = firstName + " " + lastName,
                Vitality  = (int)vitality,
                Axe       = (int)axe,
                Block     = (int)block,
                Dagger    = (int)dagger,
                Evasion   = (int)evasion,
                Health    = (int)vitality,
                Level     = npcLevel,
                Mace      = (int)mace,
                Parry     = (int)parry,
                Polearm   = (int)polearm,
                Quickness = (int)quickness,
                Spear     = (int)spear,
                Stamina   = (int)stamina,
                Strength  = (int)strength,
                Sword     = (int)sword,
            };

            var fist = new WeaponModel()
            {
                MinimumDamage = 0,
                MaximumDamage = 0,
                Name          = "fist",
                TwoHanded     = false,
                WeaponType    = new WeaponTypeModel()
                {
                    Name = "else"
                },
            };

            var skin = new ArmorModel()
            {
                ArmorValue = 0,
                Name       = "skin",
            };

            if (model.MainHand != null)
            {
                npc.MainHand = model.MainHand;
            }
            else
            {
                npc.MainHand = fist;
            }

            if (model.OffHand != null && !model.MainHand.TwoHanded)
            {
                npc.OffHand = model.OffHand;
            }

            npc.Equipment = model.Equipment;
            return(npc);
        }
 //Add armor to player
 public void RegisterArmor(ArmorModel armor)
 {
     m_ArmorModels.Add(armor);
 }
    private ArmorModelSlotMask Initialize(ArmorModelMemberMap memberMap, ArmorModelSlotMask memberMask)
    {
        ActorMeshRenderer renderer;

        this.awake = true;
        string   rendererName = ArmorModelSlot.Head.GetRendererName();
        ActorRig actorRig     = this.defaultArmorModelGroup[ArmorModelSlot.Head].actorRig;

        if (this.originalRenderer != null)
        {
            renderer = ActorMeshRenderer.Replace(this.originalRenderer, actorRig, this.boneStructure.rigOrderedTransformArray, rendererName);
        }
        else
        {
            renderer = ActorMeshRenderer.CreateOn(base.transform, rendererName, actorRig, this.boneStructure.rigOrderedTransformArray, base.gameObject.layer);
        }
        this.renderers[ArmorModelSlot.Head] = renderer;
        for (ArmorModelSlot slot = ArmorModelSlot.Feet; slot < ArmorModelSlot.Head; slot = (ArmorModelSlot)(((int)slot) + 1))
        {
            this.renderers[slot] = renderer.CloneBlank(slot.GetRendererName());
        }
        for (ArmorModelSlot slot2 = ArmorModelSlot.Feet; slot2 < ArmorModelSlot.Head; slot2 = (ArmorModelSlot)(((int)slot2) + 1))
        {
            ActorMeshRenderer renderer2 = this.renderers[slot2];
            if (renderer2 != null)
            {
                renderer2.renderer.enabled = base.enabled;
            }
        }
        ArmorModelSlotMask mask = 0;
        ArmorModelGroup    defaultArmorModelGroup = this.defaultArmorModelGroup;

        if (defaultArmorModelGroup != null)
        {
            for (ArmorModelSlot slot3 = ArmorModelSlot.Feet; slot3 < ((ArmorModelSlot)4); slot3 = (ArmorModelSlot)(((int)slot3) + 1))
            {
                if (memberMask.Contains(slot3))
                {
                    ArmorModel armorModel = memberMap.GetArmorModel(slot3);
                    if ((armorModel != null) && this.BindArmorModelCheckedNonNull(armorModel))
                    {
                        mask |= slot3.ToMask();
                        continue;
                    }
                }
                ArmorModel model2 = defaultArmorModelGroup[slot3];
                if (model2 != null)
                {
                    this.BindArmorModelCheckedNonNull(model2);
                }
            }
            return(mask);
        }
        foreach (ArmorModelSlot slot4 in memberMask.EnumerateSlots())
        {
            ArmorModel model = memberMap.GetArmorModel(slot4);
            if ((model != null) && this.BindArmorModelCheckedNonNull(model))
            {
                mask |= slot4.ToMask();
            }
        }
        return(mask);
    }
 public void UnregisterArmor( ArmorModel armor )
 {
     m_ArmorModels.Remove( armor );
 }
 //Remove armor from player
 public void UnregisterArmor(ArmorModel armor)
 {
     m_ArmorModels.Remove(armor);
 }
        public List <Round> BattleNPC(int player1Id, int player1Forfeit, int?player2Id, int?player2Forfeit)
        {
            var ctx      = new ProjectStrawberryEntities();
            var random   = new Random();
            var generate = new CombatTextGenerator();
            var ccm      = new CharacterModelGenerator();

            // Generate Player1 model and properties
            var player1 = new CharacterCombatModel();

            player1 = ccm.ModelizeCharacter(player1Id);

            double player1HitChanceMainHand = PlayerHitChance(player1);
            double player1HitChanceOffHand  = PlayerHitChance(player1);
            double player1ParryChance       = diminishing_returns(player1.Parry, 7.5);
            double player1DodgeChance       = diminishing_returns(player1.Evasion, 7.5);
            double player1BlockChance       = diminishing_returns(player1.Block, 7.5);

            bool player1HasShield = player1.OffHand.shld != null;
            bool player1HasWeapon = player1.MainHand != null && player1.OffHand.wep != null;

            // Generate Player2 model and properties
            var player2 = new CharacterCombatModel();

            if (player2Id != null)
            {
                player2 = ccm.ModelizeCharacter((int)player2Id);
            }
            else
            {
                var gen = new NpcGenerator(player1, random.Next(0, 47), random.Next(0, 71));
                player2        = gen.GenerateMirrorNpc();
                player2Forfeit = 20;
            }

            double player2HitChanceMainHand = PlayerHitChance(player2);
            double player2HitChanceOffHand  = PlayerHitChance(player2);
            double player2ParryChance       = diminishing_returns(player2.Parry, 7.5);
            double player2DodgeChance       = diminishing_returns(player2.Evasion, 7.5);
            double player2BlockChance       = diminishing_returns(player2.Block, 7.5);

            bool player2HasShield = player2.OffHand.shld != null;
            bool player2HasWeapon = player2.MainHand != null && player2.OffHand.wep != null;

            // Combatlog properties
            List <Round> fullFight = new List <Round>();
            int          roundNr   = 0;
            string       roundLog  = "";
            string       spoiler   = "";

            bool keepFighting = true;
            bool player1HasHighestQuickness = player1.Quickness >= player2.Quickness;
            bool player1Won = false;
            bool player2Won = false;

            while (keepFighting)
            {
                int combatflavorindex = 2;

                int damage      = 0;
                int bonusDamage = 0;
                int minDamage   = 0;
                int maxDamage   = 0;

                roundNr++;

                // Player1 # of attacks + Avoidance chance
                bool player1AttackWithMainHand = false;
                bool player1AttackWithOffHand  = false;

                AttacksPlayerCanDoThisRound(player1, ref player1AttackWithMainHand, ref player1AttackWithOffHand);

                // Player2 # of attacks.
                bool player2AttackWithMainHand = false;
                bool player2AttackWithOffHand  = false;

                AttacksPlayerCanDoThisRound(player2, ref player2AttackWithMainHand, ref player2AttackWithOffHand);

                if (player1HasHighestQuickness)
                {
                    if (keepFighting && player1AttackWithMainHand)
                    {
                        bonusDamage = player1.Strength / 10;
                        minDamage   = player1.MainHand.MinimumDamage + bonusDamage;
                        maxDamage   = player1.MainHand.MaximumDamage + bonusDamage;

                        var bodyPartId = DiceForBodyPart(random.Next(1, 97), player1.MainHand.WeaponType.Name);
                        var bodyPart   = player2.Equipment.FirstOrDefault(e => e.ArmorTypeId == bodyPartId);

                        if (bodyPart == null)
                        {
                            bodyPart = new ArmorModel()
                            {
                                ArmorValue = 0, Name = "skin"
                            };
                        }

                        if (minDamage - bodyPart.ArmorValue < 0)
                        {
                            minDamage = 0;
                        }
                        else
                        {
                            minDamage -= bodyPart.ArmorValue;
                        }

                        if (maxDamage - bodyPart.ArmorValue < 0)
                        {
                            maxDamage = 0;
                        }
                        else
                        {
                            maxDamage -= bodyPart.ArmorValue;
                        }

                        string action = WhatHappenedThatHit(player1HitChanceMainHand, player2DodgeChance, player2ParryChance, player2BlockChance, player2HasShield, player2HasWeapon, random);

                        if (action == "h")
                        {
                            damage          = random.Next(minDamage, maxDamage + 1);
                            roundLog       += generate.CombatTextMaleAttacker(player1.Name, player2.Name, damage, bodyPart.Name, random.Next(0, combatflavorindex));
                            player2.Health -= damage;
                        }
                        else if (action == "b")
                        {
                            roundLog += generate.CombatTextBlock(player1.Name, player2.Name, player1.MainHand.Name.ToLower(), player2.OffHand.shld.Name, random.Next(0, 1));
                        }
                        else if (action == "p")
                        {
                            roundLog += generate.CombatTextParry(player1.Name, player2.Name, random.Next(0, 1));
                        }
                        else if (action == "d")
                        {
                            roundLog += generate.CombatTextDodge(player1.Name, player1.MainHand.Name, player2.Name, random.Next(0, 1));
                        }

                        player1AttackWithMainHand = false;
                    }
                    else if (keepFighting && player1AttackWithOffHand)
                    {
                        bonusDamage = player1.Strength / 10;
                        minDamage   = player1.OffHand.wep.MinimumDamage + bonusDamage;
                        maxDamage   = player1.OffHand.wep.MaximumDamage + bonusDamage;

                        var bodyPartId = DiceForBodyPart(random.Next(1, 97), player1.OffHand.wep.Name);
                        var bodyPart   = player2.Equipment.FirstOrDefault(e => e.ArmorTypeId == bodyPartId);

                        if (minDamage - bodyPart.ArmorValue < 0)
                        {
                            minDamage = 0;
                        }
                        else
                        {
                            minDamage -= bodyPart.ArmorValue;
                        }

                        if (maxDamage - bodyPart.ArmorValue < 0)
                        {
                            maxDamage = 0;
                        }
                        else
                        {
                            maxDamage -= bodyPart.ArmorValue;
                        }

                        string action = WhatHappenedThatHit(player1HitChanceMainHand, player2DodgeChance, player2ParryChance, player2BlockChance, player2HasShield, player2HasWeapon, random);

                        if (action == "h")
                        {
                            damage          = random.Next(minDamage, maxDamage + 1);
                            roundLog       += generate.CombatTextMaleAttacker(player1.Name, player2.Name, damage, bodyPart.Name, random.Next(0, combatflavorindex));
                            player2.Health -= damage;
                        }
                        else if (action == "b")
                        {
                            roundLog += generate.CombatTextBlock(player1.Name, player2.Name, player1.MainHand.Name.ToLower(), player2.OffHand.shld.Name, random.Next(0, 1));
                        }
                        else if (action == "p")
                        {
                            roundLog += generate.CombatTextParry(player1.Name, player2.Name, random.Next(0, 1));
                        }
                        else if (action == "d")
                        {
                            roundLog += generate.CombatTextDodge(player1.Name, player1.MainHand.Name, player2.Name, random.Next(0, 1));
                        }

                        player1AttackWithOffHand = false;
                    }

                    // Check if Player2 forfeits
                    if (player2.Health <= player2.Vitality * (player2Forfeit / 100))
                    {
                        keepFighting = false;
                        player1Won   = true;
                    }

                    if (keepFighting && player2AttackWithMainHand)
                    {
                        bonusDamage = player2.Strength / 10;
                        minDamage   = player2.MainHand.MinimumDamage + bonusDamage;
                        maxDamage   = player2.MainHand.MaximumDamage + bonusDamage;

                        var bodyPartId = DiceForBodyPart(random.Next(1, 97), player2.MainHand.Name);
                        var bodyPart   = player1.Equipment.FirstOrDefault(ec => ec.ArmorTypeId == bodyPartId);

                        if (minDamage - bodyPart.ArmorValue < 0)
                        {
                            minDamage = 0;
                        }
                        else
                        {
                            minDamage -= bodyPart.ArmorValue;
                        }

                        if (maxDamage - bodyPart.ArmorValue < 0)
                        {
                            maxDamage = 0;
                        }
                        else
                        {
                            maxDamage -= bodyPart.ArmorValue;
                        }

                        string action = WhatHappenedThatHit(player2HitChanceMainHand, player1DodgeChance, player1ParryChance, player1BlockChance, player1HasShield, player1HasWeapon, random);

                        if (action == "h")
                        {
                            damage          = random.Next(minDamage, maxDamage + 1);
                            roundLog       += generate.CombatTextMaleAttacker(player2.Name, player1.Name, damage, bodyPart.Name, random.Next(0, combatflavorindex));
                            player1.Health -= damage;
                        }
                        else if (action == "b")
                        {
                            roundLog += generate.CombatTextBlock(player2.Name, player1.Name, player2.MainHand.Name.ToLower(), player1.OffHand.shld.Name, random.Next(0, 1));
                        }
                        else if (action == "p")
                        {
                            roundLog += generate.CombatTextParry(player2.Name, player1.Name, random.Next(0, 1));
                        }
                        else if (action == "d")
                        {
                            roundLog += generate.CombatTextDodge(player2.Name, player2.MainHand.Name, player1.Name, random.Next(0, 1));
                        }

                        player2AttackWithMainHand = false;
                    }
                    else if (keepFighting && player2AttackWithOffHand)
                    {
                        bonusDamage = player2.Strength / 10;
                        minDamage   = player2.OffHand.wep.MinimumDamage + bonusDamage;
                        maxDamage   = player2.OffHand.wep.MaximumDamage + bonusDamage;

                        var bodyPartId = DiceForBodyPart(random.Next(1, 97), player2.OffHand.wep.Name);
                        var bodyPart   = player1.Equipment.FirstOrDefault(ec => ec.ArmorTypeId == bodyPartId);

                        if (minDamage - bodyPart.ArmorValue < 0)
                        {
                            minDamage = 0;
                        }
                        else
                        {
                            minDamage -= bodyPart.ArmorValue;
                        }

                        if (maxDamage - bodyPart.ArmorValue < 0)
                        {
                            maxDamage = 0;
                        }
                        else
                        {
                            maxDamage -= bodyPart.ArmorValue;
                        }

                        string action = WhatHappenedThatHit(player2HitChanceMainHand, player1DodgeChance, player1ParryChance, player1BlockChance, player1HasShield, player1HasWeapon, random);

                        if (action == "h")
                        {
                            damage          = random.Next(minDamage, maxDamage + 1);
                            roundLog       += generate.CombatTextMaleAttacker(player2.Name, player1.Name, damage, bodyPart.Name, random.Next(0, combatflavorindex));
                            player1.Health -= damage;
                        }
                        else if (action == "b")
                        {
                            roundLog += generate.CombatTextBlock(player2.Name, player1.Name, player2.MainHand.Name.ToLower(), player1.OffHand.shld.Name, random.Next(0, 1));
                        }
                        else if (action == "p")
                        {
                            roundLog += generate.CombatTextParry(player2.Name, player1.Name, random.Next(0, 1));
                        }
                        else if (action == "d")
                        {
                            roundLog += generate.CombatTextDodge(player2.Name, player2.MainHand.Name, player1.Name, random.Next(0, 1));
                        }

                        player2AttackWithOffHand = false;
                    }

                    // Check if player1 forfeits
                    if (player1.Health <= player1.Vitality * (player1Forfeit / 100))
                    {
                        keepFighting = false;
                        player2Won   = true;
                    }
                }
                else
                {
                    if (keepFighting && player2AttackWithMainHand)
                    {
                        bonusDamage = player2.Strength / 10;
                        minDamage   = player2.MainHand.MinimumDamage + bonusDamage;
                        maxDamage   = player2.MainHand.MaximumDamage + bonusDamage;

                        var bodyPartId = DiceForBodyPart(random.Next(1, 97), player2.MainHand.Name);
                        var bodyPart   = player1.Equipment.FirstOrDefault(ec => ec.ArmorTypeId == bodyPartId);

                        if (minDamage - bodyPart.ArmorValue < 0)
                        {
                            minDamage = 0;
                        }
                        else
                        {
                            minDamage -= bodyPart.ArmorValue;
                        }

                        if (maxDamage - bodyPart.ArmorValue < 0)
                        {
                            maxDamage = 0;
                        }
                        else
                        {
                            maxDamage -= bodyPart.ArmorValue;
                        }

                        string action = WhatHappenedThatHit(player2HitChanceMainHand, player1DodgeChance, player1ParryChance, player1BlockChance, player1HasShield, player1HasWeapon, random);

                        if (action == "h")
                        {
                            damage          = random.Next(minDamage, maxDamage + 1);
                            roundLog       += generate.CombatTextMaleAttacker(player2.Name, player1.Name, damage, bodyPart.Name, random.Next(0, combatflavorindex));
                            player1.Health -= damage;
                        }
                        else if (action == "b")
                        {
                            roundLog += generate.CombatTextBlock(player2.Name, player1.Name, player2.MainHand.Name.ToLower(), player1.OffHand.shld.Name, random.Next(0, 1));
                        }
                        else if (action == "p")
                        {
                            roundLog += generate.CombatTextParry(player2.Name, player1.Name, random.Next(0, 1));
                        }
                        else if (action == "d")
                        {
                            roundLog += generate.CombatTextDodge(player2.Name, player2.MainHand.Name, player1.Name, random.Next(0, 1));
                        }

                        player2AttackWithMainHand = false;
                    }
                    else if (keepFighting && player2AttackWithOffHand)
                    {
                        bonusDamage = player2.Strength / 10;
                        minDamage   = player2.OffHand.wep.MinimumDamage + bonusDamage;
                        maxDamage   = player2.OffHand.wep.MaximumDamage + bonusDamage;

                        var bodyPartId = DiceForBodyPart(random.Next(1, 97), player2.OffHand.wep.Name);
                        var bodyPart   = player1.Equipment.FirstOrDefault(ec => ec.ArmorTypeId == bodyPartId);

                        if (minDamage - bodyPart.ArmorValue < 0)
                        {
                            minDamage = 0;
                        }
                        else
                        {
                            minDamage -= bodyPart.ArmorValue;
                        }

                        if (maxDamage - bodyPart.ArmorValue < 0)
                        {
                            maxDamage = 0;
                        }
                        else
                        {
                            maxDamage -= bodyPart.ArmorValue;
                        }

                        string action = WhatHappenedThatHit(player2HitChanceMainHand, player1DodgeChance, player1ParryChance, player1BlockChance, player1HasShield, player1HasWeapon, random);

                        if (action == "h")
                        {
                            damage          = random.Next(minDamage, maxDamage + 1);
                            roundLog       += generate.CombatTextMaleAttacker(player2.Name, player1.Name, damage, bodyPart.Name, random.Next(0, combatflavorindex));
                            player1.Health -= damage;
                        }
                        else if (action == "b")
                        {
                            roundLog += generate.CombatTextBlock(player2.Name, player1.Name, player2.MainHand.Name.ToLower(), player1.OffHand.shld.Name, random.Next(0, 1));
                        }
                        else if (action == "p")
                        {
                            roundLog += generate.CombatTextParry(player2.Name, player1.Name, random.Next(0, 1));
                        }
                        else if (action == "d")
                        {
                            roundLog += generate.CombatTextDodge(player2.Name, player2.MainHand.Name, player1.Name, random.Next(0, 1));
                        }

                        player2AttackWithOffHand = false;
                    }

                    // Check if player 1 forfeits
                    if (player1.Health <= player1.Vitality * (player1Forfeit / 100))
                    {
                        keepFighting = false;
                        player2Won   = true;
                    }

                    if (keepFighting && player1AttackWithMainHand)
                    {
                        bonusDamage = player1.Strength / 10;
                        minDamage   = player1.MainHand.MinimumDamage + bonusDamage;
                        maxDamage   = player1.MainHand.MaximumDamage + bonusDamage;

                        var bodyPartId = DiceForBodyPart(random.Next(1, 97), player1.MainHand.Name);
                        var bodyPart   = player2.Equipment.FirstOrDefault(al => al.ArmorTypeId == bodyPartId);

                        if (minDamage - bodyPart.ArmorValue < 0)
                        {
                            minDamage = 0;
                        }
                        else
                        {
                            minDamage -= bodyPart.ArmorValue;
                        }

                        if (maxDamage - bodyPart.ArmorValue < 0)
                        {
                            maxDamage = 0;
                        }
                        else
                        {
                            maxDamage -= bodyPart.ArmorValue;
                        }

                        string action = WhatHappenedThatHit(player1HitChanceMainHand, player2DodgeChance, player2ParryChance, player2BlockChance, player2HasShield, player2HasWeapon, random);

                        if (action == "h")
                        {
                            damage          = random.Next(minDamage, maxDamage + 1);
                            roundLog       += generate.CombatTextMaleAttacker(player1.Name, player2.Name, damage, bodyPart.Name, random.Next(0, combatflavorindex));
                            player2.Health -= damage;
                        }
                        else if (action == "b")
                        {
                            roundLog += generate.CombatTextBlock(player1.Name, player2.Name, player1.MainHand.Name.ToLower(), player2.OffHand.shld.Name, random.Next(0, 1));
                        }
                        else if (action == "p")
                        {
                            roundLog += generate.CombatTextParry(player1.Name, player2.Name, random.Next(0, 1));
                        }
                        else if (action == "d")
                        {
                            roundLog += generate.CombatTextDodge(player1.Name, player1.MainHand.Name, player2.Name, random.Next(0, 1));
                        }

                        player1AttackWithMainHand = false;
                    }
                    else if (keepFighting && player1AttackWithOffHand)
                    {
                        bonusDamage = player1.Strength / 10;
                        minDamage   = player2.OffHand.wep.MinimumDamage + bonusDamage;
                        maxDamage   = player2.OffHand.wep.MaximumDamage + bonusDamage;

                        var bodyPartId = DiceForBodyPart(random.Next(1, 97), player2.OffHand.wep.Name);
                        var bodyPart   = player2.Equipment.FirstOrDefault(al => al.ArmorTypeId == bodyPartId);

                        if (minDamage - bodyPart.ArmorValue < 0)
                        {
                            minDamage = 0;
                        }
                        else
                        {
                            minDamage -= bodyPart.ArmorValue;
                        }

                        if (maxDamage - bodyPart.ArmorValue < 0)
                        {
                            maxDamage = 0;
                        }
                        else
                        {
                            maxDamage -= bodyPart.ArmorValue;
                        }

                        string action = WhatHappenedThatHit(player1HitChanceMainHand, player2DodgeChance, player2ParryChance, player2BlockChance, player2HasShield, player2HasWeapon, random);

                        if (action == "h")
                        {
                            damage          = random.Next(minDamage, maxDamage + 1);
                            roundLog       += generate.CombatTextMaleAttacker(player1.Name, player2.Name, damage, bodyPart.Name, random.Next(0, combatflavorindex));
                            player2.Health -= damage;
                        }
                        else if (action == "b")
                        {
                            roundLog += generate.CombatTextBlock(player1.Name, player2.Name, player1.MainHand.Name.ToLower(), player2.OffHand.shld.Name, random.Next(0, 1));
                        }
                        else if (action == "p")
                        {
                            roundLog += generate.CombatTextParry(player1.Name, player2.Name, random.Next(0, 1));
                        }
                        else if (action == "d")
                        {
                            roundLog += generate.CombatTextDodge(player1.Name, player1.MainHand.Name, player2.Name, random.Next(0, 1));
                        }

                        player1AttackWithOffHand = false;
                    }

                    // check if player2 forfeits
                    if (player2.Health <= player2.Vitality * (player2Forfeit / 100))
                    {
                        keepFighting = false;
                        player1Won   = true;
                    }
                }

                if (!keepFighting)
                {
                    if (player1Won)
                    {
                        roundLog += player2.Name + " choose to yield, " + player1.Name + " wins the duel.";
                        spoiler   = player1.Name + " defeated " + player2.Name + " in a random duel.";
                    }
                    if (player2Won)
                    {
                        roundLog += player1.Name + " choose to yield, " + player2.Name + " wins the duel.";
                        spoiler   = player2.Name + " defeated " + player1.Name + " in a random duel.";
                    }
                }

                var round = new Round()
                {
                    RoundNr = roundNr,
                    Log     = roundLog,
                };

                fullFight.Add(round);

                roundLog = string.Empty;
            }

            if (player1.Health < 0)
            {
                int  survivalDice  = random.Next(1, 6);
                bool characterDied = FateOfCharacter(survivalDice, player1);

                if (characterDied)
                {
                    player1.Alive = false;

                    roundNr++;
                    var round = new Round()
                    {
                        RoundNr = roundNr,
                        Log     = player1.Name + " dies from the wounds ",
                    };
                }
            }
            else if (player2.Health < 0)
            {
                int  survivalDice  = random.Next(1, 6);
                bool characterDied = FateOfCharacter(survivalDice, player2);

                if (characterDied)
                {
                    player2.Alive = false;

                    roundNr++;
                    var round = new Round()
                    {
                        RoundNr = roundNr,
                        Log     = player2.Name + " dies from the wounds ",
                    };
                }
            }

            SaveCombatLogToDatabase(ctx, fullFight, player1, spoiler);

            if (player2Id != null)
            {
                SaveCombatLogToDatabase(ctx, fullFight, player2, spoiler);
            }

            ctx.Arenas.Remove(ctx.Arenas.FirstOrDefault(a => a.CharacterId == player1.Id));

            if (ctx.Arenas.Any(a => a.CharacterId == player2Id))
            {
                ctx.Arenas.Remove(ctx.Arenas.FirstOrDefault(a => a.CharacterId == player2.Id));
            }

            if (player1Won)
            {
                UpdateCharacterStats(player1);
            }
            else
            {
                if (player2Id != null)
                {
                    UpdateCharacterStats(player2);
                }
            }

            ctx.SaveChanges();

            return(fullFight);
        }
 public void RegisterArmor( ArmorModel armor )
 {
     m_ArmorModels.Add( armor );
 }
        public ActionResult BuyLot(int lotId)
        {
            using (var db = new BGS_DBContext())
            {
                var  id   = User.Identity.GetUserId();
                var  lot  = db.LotModels.Single(p => p.Id == lotId);
                User user = db.Users.Single(u => u.Id == id);
                if (user.AccountBalance - lot.Price > 0)
                {
                    switch (lot.Type)
                    {
                    default: throw new Exception("No this lot");

                    case LotType.Unit:
                        UnitModel unitModel = db.UnitModels.Single(u => u.LotId == lotId);
                        unitModel.LotId = null;
                        unitModel.Owner = user;
                        break;

                    case LotType.Armor:
                        ArmorModel armorModel = db.ArmorModels.Single(u => u.LotId == lotId);
                        armorModel.LotId = null;
                        armorModel.Owner = user;
                        break;

                    case LotType.Accessory:
                        AccessoryModel accessoryModel = db.AccessoryModels.Single(u => u.LotId == lotId);
                        accessoryModel.LotId = null;
                        accessoryModel.Owner = user;
                        break;

                    case LotType.Weapon:
                        WeaponModel weaponModel = db.WeaponModels.Single(u => u.LotId == lotId);
                        weaponModel.LotId = null;
                        weaponModel.Owner = user;
                        break;

                    case LotType.Storage:
                        StorageModel storageModel = db.StorageModels.Single(u => u.LotId == lotId);
                        storageModel.LotId = null;
                        storageModel.Owner = user;
                        break;

                    case LotType.Modification:
                        AimModificationModel      aim      = db.AimModificationModels.SingleOrDefault(a => a.LotId == lot.Id);
                        MagazineModificationModel magazine = db.MagazineModificationModels.SingleOrDefault(a => a.LotId == lot.Id);
                        BarrelModificationModel   barrel   = db.BarrelModificationModels.SingleOrDefault(a => a.LotId == lot.Id);
                        ButtModificationModel     butt     = db.ButtModificationModels.SingleOrDefault(a => a.LotId == lot.Id);
                        if (aim != null)
                        {
                            aim.LotId = null; aim.Owner = user;
                        }
                        if (magazine != null)
                        {
                            magazine.LotId = null; magazine.Owner = user;
                        }
                        if (barrel != null)
                        {
                            barrel.LotId = null; barrel.Owner = user;
                        }
                        if (butt != null)
                        {
                            butt.LotId = null; butt.Owner = user;
                        }
                        break;
                    }
                    lot.Status                 = LotStatus.Closed;
                    lot.BuyerId                = user.GameId;
                    user.AccountBalance       -= lot.Price;
                    lot.Seller.AccountBalance += lot.Price;
                    db.SaveChanges();
                    return(RedirectToAction("Index", "Market",
                                            new { buy = $"Лот #{lot.Id} успешно куплен за {lot.Price}$4" }));
                }
                else
                {
                    return(RedirectToAction("Index", "Market",
                                            new { error = "У вас не хватает средств для этой покупки" }));
                }
            }
        }