void ShowSkillsDialog(List <DFCareer.Skills> skills, bool twoColumn = false)
        {
            bool secondColumn            = false;
            bool showHandToHandDamage    = false;
            List <TextFile.Token> tokens = new List <TextFile.Token>();

            for (int i = 0; i < skills.Count; i++)
            {
                if (!showHandToHandDamage && (skills[i] == DFCareer.Skills.HandToHand))
                {
                    showHandToHandDamage = true;
                }

                if (!twoColumn)
                {
                    tokens.AddRange(DaggerfallUnity.TextProvider.GetSkillSummary(skills[i], 0));
                    if (i < skills.Count - 1)
                    {
                        tokens.Add(TextFile.NewLineToken);
                    }
                }
                else
                {
                    if (!secondColumn)
                    {
                        tokens.AddRange(DaggerfallUnity.TextProvider.GetSkillSummary(skills[i], 0));
                        secondColumn = !secondColumn;
                    }
                    else
                    {
                        tokens.AddRange(DaggerfallUnity.TextProvider.GetSkillSummary(skills[i], 136));
                        secondColumn = !secondColumn;
                        if (i < skills.Count - 1)
                        {
                            tokens.Add(TextFile.NewLineToken);
                        }
                    }
                }
            }

            if (showHandToHandDamage)
            {
                tokens.Add(TextFile.NewLineToken);
                TextFile.Token HandToHandDamageToken = new TextFile.Token();
                int            minDamage             = FormulaHelper.CalculateHandToHandMinDamage(playerEntity.Skills.GetLiveSkillValue(DFCareer.Skills.HandToHand));
                int            maxDamage             = FormulaHelper.CalculateHandToHandMaxDamage(playerEntity.Skills.GetLiveSkillValue(DFCareer.Skills.HandToHand));
                HandToHandDamageToken.text       = DaggerfallUnity.Instance.TextProvider.GetSkillName(DFCareer.Skills.HandToHand) + " dmg: " + minDamage + "-" + maxDamage;
                HandToHandDamageToken.formatting = TextFile.Formatting.Text;
                tokens.Add(HandToHandDamageToken);
            }

            DaggerfallMessageBox messageBox = new DaggerfallMessageBox(uiManager, this);

            messageBox.SetHighlightColor(DaggerfallUI.DaggerfallUnityStatIncreasedTextColor);
            messageBox.SetTextTokens(tokens.ToArray(), null, false);
            messageBox.ClickAnywhereToClose = true;
            messageBox.Show();
        }
Ejemplo n.º 2
0
        // Handle charging into enemies.
        private void HandleCharge(GameObject hitGO, DaggerfallEntityBehaviour hitEntityBehaviour, Vector3 direction)
        {
            if (hitEntityBehaviour.Entity is EnemyEntity)
            {
                EnemyEntity hitEnemyEntity = (EnemyEntity)hitEntityBehaviour.Entity;
                if (!hitEnemyEntity.PickpocketByPlayerAttempted)
                {
                    // Play heavy hit sound.
                    EnemySounds          enemySounds      = hitGO.GetComponent <EnemySounds>();
                    DaggerfallMobileUnit entityMobileUnit = hitGO.GetComponentInChildren <DaggerfallMobileUnit>();
                    Genders gender;
                    if (entityMobileUnit.Summary.Enemy.Gender == MobileGender.Male || hitEnemyEntity.MobileEnemy.ID == (int)MobileTypes.Knight_CityWatch)
                    {
                        gender = Genders.Male;
                    }
                    else
                    {
                        gender = Genders.Female;
                    }
                    enemySounds.PlayCombatVoice(gender, false, true);

                    // Knockback the enemy.
                    EnemyMotor enemyMotor = hitGO.GetComponent <EnemyMotor>();
                    enemyMotor.KnockbackSpeed     = 100;
                    enemyMotor.KnockbackDirection = direction;

                    // Handle charge hit damage and fatigue loss.
                    PlayerEntity playerEntity = GameManager.Instance.PlayerEntity;
                    hitEnemyEntity.PickpocketByPlayerAttempted = true;
                    playerEntity.DecreaseFatigue(PlayerEntity.DefaultFatigueLoss * 15);

                    int minBaseDamage = FormulaHelper.CalculateHandToHandMinDamage(playerEntity.Skills.GetLiveSkillValue(DFCareer.Skills.HandToHand));
                    int maxBaseDamage = FormulaHelper.CalculateHandToHandMaxDamage(playerEntity.Skills.GetLiveSkillValue(DFCareer.Skills.HandToHand));
                    int damage        = UnityEngine.Random.Range(minBaseDamage, maxBaseDamage + 1);
                    damage += playerEntity.Stats.GetLiveStatValue(DFCareer.Stats.Agility) / 10;
                    damage += playerEntity.Stats.GetLiveStatValue(DFCareer.Stats.Willpower) / 10;
                    DaggerfallEntityBehaviour playerEntityBehaviour = playerEntity.EntityBehaviour;
                    hitEntityBehaviour.DamageHealthFromSource(playerEntityBehaviour, damage, true, BloodPos());

                    Debug.LogFormat("Charged down a {0} for {1} damage!", hitEntityBehaviour.name, damage);
                }
            }
        }
Ejemplo n.º 3
0
        protected void SetAttackInfo(MultiFormatTextLabel label, bool rightHand = true)
        {
            var   weapon         = playerEntity.ItemEquipTable.GetItem(rightHand ? EquipSlots.RightHand : EquipSlots.LeftHand);
            short weaponSkill    = 0;
            int   chanceToHitMod = 0;
            int   damageMod      = 0;
            int   minDamage      = 0;
            int   maxDamage      = 0;

            // Note from Numidium: I copied snippets from FormulaHelper.cs to calculate the values used here
            if (weapon != null)
            {
                weaponSkill = weapon.GetWeaponSkillIDAsShort();
                short skillValue = PlayerEntity.Skills.GetLiveSkillValue(weaponSkill);
                chanceToHitMod = skillValue;

                // Apply weapon proficiency
                if (((int)playerEntity.Career.ExpertProficiencies & weapon.GetWeaponSkillUsed()) != 0)
                {
                    damageMod      += (playerEntity.Level / 3) + 1;
                    chanceToHitMod += playerEntity.Level;
                }

                // Apply weapon material modifier
                chanceToHitMod += FormulaHelper.CalculateWeaponToHit(weapon);

                // Apply racial bonuses
                FormulaHelper.ToHitAndDamageMods racialMods = FormulaHelper.CalculateRacialModifiers(PlayerEntity, weapon, PlayerEntity);
                damageMod      += racialMods.damageMod;
                chanceToHitMod += racialMods.toHitMod;

                // Apply stat to-hit bonuses
                chanceToHitMod += (playerEntity.Stats.LiveAgility + playerEntity.Stats.LiveLuck) / 10;

                // Apply adrenaline rush
                const int adrenalineRushModifier         = 5;
                const int improvedAdrenalineRushModifier = 8;
                if (playerEntity.Career.AdrenalineRush && playerEntity.CurrentHealth < playerEntity.MaxHealth / 8)
                {
                    chanceToHitMod += (playerEntity.ImprovedAdrenalineRush) ? improvedAdrenalineRushModifier : adrenalineRushModifier;
                }

                // Apply enchantment modifier
                chanceToHitMod += playerEntity.ChanceToHitModifier;

                // Calculate min and max damage player can do with their current weapon
                damageMod += weapon.GetWeaponMaterialModifier() + FormulaHelper.DamageModifier(playerEntity.Stats.LiveStrength);
                minDamage  = weapon.GetBaseDamageMin() + damageMod;
                maxDamage  = weapon.GetBaseDamageMax() + damageMod;
            }
            // Apply hand-to-hand proficiency. Hand-to-hand proficiency is not applied in classic.
            else
            {
                var handToHandSkill = playerEntity.Skills.GetLiveSkillValue((short)DFCareer.Skills.HandToHand);
                chanceToHitMod += handToHandSkill;
                if (((int)playerEntity.Career.ExpertProficiencies & (int)DFCareer.ProficiencyFlags.HandToHand) != 0)
                {
                    damageMod      += (playerEntity.Level / 3) + 1;
                    chanceToHitMod += playerEntity.Level;
                }

                minDamage = FormulaHelper.CalculateHandToHandMinDamage(handToHandSkill);
                maxDamage = FormulaHelper.CalculateHandToHandMaxDamage(handToHandSkill);
            }

            label.Clear();
            var handText = rightHand ? "Right" : "Left";

            label.SetText(new TextAsset(handText + "\nAtk:\n" + chanceToHitMod.ToString() + "\nDmg:\n" + minDamage.ToString() + "-" + maxDamage.ToString()));
        }