It is not a dialogue, but a menu.
I am also learning C# to try and mod Bannerlord and I have to agree with OP's assessment of the language. Coming from Python, Lisp, even C it seems like a TON of boilerplate to do even simple tasks. If I understand the paradigm correctly, in order to mod any feature you have to override the entire class? What a waste. In Python for example, you can just monkey patch in a specific method or attribute and avoid blasting an entire base class. Seems overriding classes is just going to create unnecessary conflicts between mods and between different versions. The whole public/private layout of the code I have viewed so far in dotPeek seems arbitrary and entirely unnecessary. Tons of getters and setters that do nothing but retrieve an attribute or set that attribute.
I found some exploits too. It seems like under some circumstances the AI dies easily despite being able to feint and parry very well. Frustrating.I tried your code and I'm not 100% convinced by it. Maybe it is the way I implemented it... Could you upload the file just so I can test ?
I have been working on that piece of code a few hours too. But at the time it was located in another model.
Anyway, you want to consider that those abilities are, for an overwhelming part, between 0 and 1. Only the timers and some AI abilities that I might have missed do not fall into that range.
So setting 100 or everything like that seems pretty suspicious considering you want to reverse engineer the code. It also explains why you experienced troubles with the "decide -> attack" ability.
To be honest, I think this part of the code is handled properly by the developers and I think the combat AI is very convincing with the right values set. It is extremely easy to tweak as is the damage system. We just need a way now to control the formation and strategic AI and we will be able to build some great mods.
agentDrivenProperties.AiParryDecisionChangeValue = 0; agentDrivenProperties.AiMovemetDelayFactor = 0; agentDrivenProperties.AiCheckMovementIntervalFactor = 0; agentDrivenProperties.AiAttackingShieldDefenseTimer = 0; agentDrivenProperties.AiAttackingShieldDefenseChance = 0; agentDrivenProperties.AIRealizeBlockingFromIncorrectSideAbility = 0; agentDrivenProperties.AIDecideOnRealizeEnemyBlockingAttackAbility = 100; agentDrivenProperties.AIParryOnAttackingContinueAbility = 100; agentDrivenProperties.AiDecideOnAttackingContinue = 100; agentDrivenProperties.AiDecideOnAttackContinueAction = 100; agentDrivenProperties.AiDecideOnAttackWhenReceiveHitTiming = 0; agentDrivenProperties.AiAttackCalculationMaxTimeFactor = 0; agentDrivenProperties.AiKick = 0; agentDrivenProperties.AIParryOnAttackAbility = 100; agentDrivenProperties.AIDecideOnAttackChance = 100; agentDrivenProperties.AiAttackOnParryTiming = 0; agentDrivenProperties.AIAttackOnParryChance = 0; agentDrivenProperties.AiDefendWithShieldDecisionChanceValue = 0; agentDrivenProperties.AiTryChamberAttackOnDecide = 0; agentDrivenProperties.AiMoveEnemySideTimeValue = 0; agentDrivenProperties.AiStandGroundTimerValue = 0; agentDrivenProperties.AIEstimateStunDurationPrecision = 0; agentDrivenProperties.AISetNoDefendTimerAfterParryingAbility = 0; agentDrivenProperties.AISetNoDefendTimerAfterHittingAbility = 0; agentDrivenProperties.AISetNoAttackTimerAfterBeingParriedAbility = 0; agentDrivenProperties.AISetNoAttackTimerAfterBeingHitAbility = 0; agentDrivenProperties.AiRandomizedDefendDirectionChance = 0; agentDrivenProperties.AiSpeciesIndex = 0; agentDrivenProperties.AiUseShieldAgainstEnemyMissileProbability = 0; agentDrivenProperties.AiRaiseShieldDelayTimeBase = 0; agentDrivenProperties.AIAttackOnDecideChance =0.9f; agentDrivenProperties.AiRangerHorizontalErrorMultiplier = 0; agentDrivenProperties.AiRangerVerticalErrorMultiplier = 0; agentDrivenProperties.AiRangerLeadErrorMax = 0; agentDrivenProperties.AiRangerLeadErrorMin = 0; agentDrivenProperties.AiChargeHorsebackTargetDistFactor = 0; agentDrivenProperties.AiHearingDistanceFactor = 0; agentDrivenProperties.AiStandGroundTimerMoveAlongValue = 0; agentDrivenProperties.AiMinimumDistanceToContinueFactor = 0; agentDrivenProperties.AIParryOnDecideAbility = 100; agentDrivenProperties.AIBlockOnDecideAbility = 0; agentDrivenProperties.AiWaitBeforeShootFactor = 0; //agentDrivenProperties.ArmorTorso = 0; //agentDrivenProperties.ArmorHead = 0; //agentDrivenProperties.WeaponsEncumbrance = 0; //agentDrivenProperties.ArmorEncumbrance = 0; //agentDrivenProperties.WeaponRotationalAccuracyPenaltyInRadians = 0; //agentDrivenProperties.WeaponUnsteadyEndTime = 0; //agentDrivenProperties.WeaponUnsteadyBeginTime = 0; //agentDrivenProperties.ArmorLegs = 0; //agentDrivenProperties.WeaponMaxUnsteadyAccuracyPenalty = 0; //agentDrivenProperties.WeaponStationaryAccuracyMultiplier = 0; //agentDrivenProperties.WeaponInaccuracy = 0; //agentDrivenProperties.ReloadSpeed = 0; //agentDrivenProperties.ThrustKnockBackChanceBonus = 0; //agentDrivenProperties.HandlingMultiplier = 0; //agentDrivenProperties.ThrustOrRangedReadySpeedMultiplier = 0; //agentDrivenProperties.SwingSpeedMultiplier = 1; //agentDrivenProperties.WeaponMaxMovementAccuracyPenalty = 0; agentDrivenProperties.AIHoldingReadyMaxDuration = 0; //agentDrivenProperties.ArmorArms = 0; //agentDrivenProperties.LongestRangedWeaponInaccuracy = 0; agentDrivenProperties.AiShootFreq = 0; agentDrivenProperties.AiFlyingMissileCheckRadius = 0; agentDrivenProperties.AiFacingMissileWatch = 0; agentDrivenProperties.AiRangedHorsebackMissileRange = 0; //agentDrivenProperties.MountDifficulty = 0; //agentDrivenProperties.MountChargeDamage = 0; //agentDrivenProperties.MountSpeed = 0; //agentDrivenProperties.LongestRangedWeaponSlotIndex = 0; //agentDrivenProperties.MountManeuver = 0; //agentDrivenProperties.AttributeHorseArchery = 0; //agentDrivenProperties.CombatMaxSpeedMultiplier = 100; //agentDrivenProperties.MaxSpeedMultiplier = 0; //agentDrivenProperties.TopSpeedReachDuration = 0; // crashses at 0 //agentDrivenProperties.ShieldBashStunDurationMultiplier = 0; //agentDrivenProperties.AttributeShieldMissileCollisionBodySizeAdder = 0; //agentDrivenProperties.AttributeShield = 0; //agentDrivenProperties.AttributeRiding = 0; //agentDrivenProperties.AttributeCourage = 0; agentDrivenProperties.AIHoldingReadyVariationPercentage = 0;
Isn't it because spiked club is faster?
But yeah I have similar experiences in the Empire arena, it is somehow easier to beat opponents with spiked club than it is with sword.
You can adjust the FOV for 1st person, I agree the FOV is a bit too much but youtube made it look worse than actual in game.I hate 1st person and if I had any more adrenaline than I already get from this game, I'd probably have a heart attack. Also, the FOV looks off-putting to me. Oddly enough, I find 3rd person to be much more immersive for me. I'm glad you enjoy 1st person and there is an option in the game for you, you are clearly very good at combat in this game.
The Bots AI scales with the level of the troop
What really surprises me in that video is someone playing first person and actually blocking, unless he's using autoblock
This strategy works on both way. Align your archers and if the enemy is a Khuzait with mounted archers, your troops will empty their quivers trying to shoot them.
There should be a option to tell your troops on which enemy to focus, for example the cavalry targeting the archers.
Why is it difficult to implement AI melee combat that makes sense rather than random incoherent swinging?
It seems to me that all weapons should be able to be held out in front to deny enemy from closing in. As seen in all of the videos posted here demonstrating how a spear is used.
As it stands, mount and blade combat was originally fun for me when I was young, when it grew repetitive I listened to audio books simultaneously. Now, however I find it boring. The failure to give spears an adequate implementation is part of a larger failure to make combat interesting, which requires tactics as can be found from real life battlefields of the past.
nerfing tanneries is totally ok. they were over the top compared to other workshops. but what i dont like is the overall attempt to put as much grind as possible in the game. u grind for exp, relation, access to units, money and so on. this is only my personal oppinion and no one has to agree, but i do not enjoy the direction the game is going right now. extending the time u put in a game by adding grind instead of content seems like a cheap solution. i hope they will rethink this.
My rig is bad. On paper shouldn't be bad, I bought it some years ago i5, medium graphics card, no SSD, 16Gb. The guy who assembled it must have hated me and it never worked top notch. In MP I had FPS drops constantly.
I said it may happen in single player as a possiblity, really I only experienced it in MP, so my first thought was that it was ping related. You know if a guy with bad ping enters a server it may delay all updates, that was my guess.
But yes, my FPS were bad and my monitor is medium quality, 60FPS default. My ping was ok.
There are already enough RPG games. Games like Witcher, Elder Scrolls and countless MMOs already give you enough side quests, loot and skillpoints. Why would you want this game to offer you the same things so many other games already have?
M&B series has always offered something unique - it's battle system, where you are both a commander and a fighter. Improving that should be priority #1 for the devs. Grinding smithing skill to get a weapon with higher numbers is not fun gameplay and I wouldn't want them to waste any development time on stuff like that.
what the duck. after all that complaining that combat AI is bad (ok, I admit I may have mentioned it once only) it turns there's a simple mod enabling harder difficulty?
But they don´t seem to play their own game but I can understand this, I also stopped playing.
They should notice bugs like the vassal thing if they would play the game before they update it. Or then bug when creating the kingdom crashes the game and so on.