Have you tried sending off a companion with a small cavalry party? Even a handful of soldiers will usually try to attack since you are nearby, and they should be able to buy you enough time to join the battle.
There is sadly no minimum standard for EA, it simply means you're paying for something that is usable but incomplete. In fact, EA during alpha is most common, especially if you exclude the AAA studio quick cash grab releases, to make profit before the release reviews get published.
I was most times very optimistic with the development, as I know the usual problems in big ambitious software projects firsthand. I hoped for TW getting their mess sorted out and upping the pace. But now I simply must agree, that the development speed is way too slow to hope for big features if the October release rumors are true.
Duh probably just answered Consul_Kaiser's question about spear attack variations/vectors (adding swing and throw):
Afaik the AI receives around 30 T3+ troops as “bodyguard units“ so that they don‘t get instantly killed by looters before they can recruit additional troops and the AI can recruit from all recruitment slots, as a fix to the broken AI relation system. Additionally they take troops out of garrisons to stock up.
if (collidedWithShieldOnBack && shieldOnBack != null)
{
num += 10f;
}
float absorbedDamageRatio = victimAgentAbsorbedDamageRatio;
float num2 = Game.Current.BasicModels.StrikeMagnitudeModel.ComputeRawDamage(damageType, magnitude, num, absorbedDamageRatio);
float num3 = 1f;
if (!attackBlockedWithShield && !isFallDamage)
{
num3 *= damageMultiplierOfBone;
num3 *= combatDifficultyMultiplier;
}
num2 *= num3;
inflictedDamage = MBMath.ClampInt((int)num2, 0, 2000);
int num4 = MBMath.ClampInt((int)(Game.Current.BasicModels.StrikeMagnitudeModel.ComputeRawDamage(damageType, magnitude, 0f, absorbedDamageRatio) * num3), 0, 2000);
absorbedByArmor = num4 - inflictedDamage;
public static float ComputeRawDamageNew(DamageTypes damageType, float magnitude, float armorEffectiveness, float absorbedDamageRatio)
{
float num = 0f;
float bluntDamageFactorByDamageType = CombatStatCalculator.GetBluntDamageFactorByDamageType(damageType);
float num2 = magnitude * bluntDamageFactorByDamageType;
float num3 = 100f / (100f + armorEffectiveness);
num += num2 * num3;
if (damageType != DamageTypes.Blunt)
{
float num4;
if (damageType != DamageTypes.Cut)
{
if (damageType != DamageTypes.Pierce)
{
return 0f;
}
num4 = Math.Max(0f, magnitude * num3 - armorEffectiveness * 0.33f);
}
else
{
num4 = Math.Max(0f, magnitude * num3 - armorEffectiveness * 0.5f);
}
num += num4 * (1f - bluntDamageFactorByDamageType);
}
return num * absorbedDamageRatio;
}
public override int CalculateDamage(ref AttackInformation attackInformation, ref AttackCollisionData collisionData, in MissionWeapon weapon)
{
CharacterObject characterObject = attackInformation.AttackerAgentCharacter as CharacterObject;
IAgentOriginBase attackerAgentOrigin = attackInformation.AttackerAgentOrigin;
Formation attackerFormation = attackInformation.AttackerFormation;
CharacterObject characterObject2 = attackInformation.VictimAgentCharacter as CharacterObject;
CharacterObject characterObject3 = attackInformation.AttackerCaptainCharacter as CharacterObject;
CharacterObject characterObject4 = attackInformation.VictimCaptainCharacter as CharacterObject;
WeaponComponentData currentUsageItem = attackInformation.VictimMainHandWeapon.CurrentUsageItem;
int result = 0;
MissionWeapon missionWeapon = weapon;
WeaponComponentData currentUsageItem2 = missionWeapon.CurrentUsageItem;
bool flag = false;
if (currentUsageItem2 != null && currentUsageItem2.IsConsumable && collisionData.CollidedWithShieldOnBack && characterObject2 != null && characterObject2.GetPerkValue(DefaultPerks.Crossbow.Pavise))
{
float num = MBMath.ClampFloat(DefaultPerks.Crossbow.Pavise.PrimaryBonus / 100f, 0f, 1f);
flag = (MBRandom.RandomFloat <= num);
}
if (!flag)
{
ExplainedNumber explainedNumber = new ExplainedNumber((float)collisionData.InflictedDamage, null);
if (characterObject != null)
{
if (currentUsageItem2 != null)