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(); }
// 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); } } }
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())); }