spacehamster / KingmakerTurnbasedCombatFix

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Confusion buff doesn't work in Turn Based

MangledMouse opened this issue · comments

As title. Enemies that receive this buff do not ever waste their turn doing nothing, attack nearest ally, or poke themselves. They do lose their attacks of opportunity though. It is unclear to me why this behavior occurs since this block in the UnitConfusionController seems like attention was paid to this circumstance.

protected override void TickOnUnit(UnitEntityData unit)
{
if (CombatController.IsInTurnBasedCombat())
{
if (unit.IsCurrentUnit())
{
UnitPartConfusion unitPartConfusion = unit.Get();
if ((bool) (UnitPart) unitPartConfusion && unitPartConfusion.RoundStartTime < Game.Instance.TimeController.GameTime)
{
unitPartConfusion.Cmd?.Interrupt(true);
unitPartConfusion.RoundStartTime = TimeSpan.Zero;
}
}
else if (!CombatController.IsPassing() || unit.IsInCombat)
return;
}
if (unit.Descriptor.State.HasCondition(UnitCondition.Confusion) || unit.Descriptor.State.HasCondition(UnitCondition.AttackNearest))
{
UnitPartConfusion part = unit.Ensure();
bool flag = !unit.CombatState.HasCooldownForCommand(UnitCommand.CommandType.Standard);
if (Game.Instance.TimeController.GameTime - part.RoundStartTime > UnitConfusionController.RoundDuration & flag)
{
RuleRollDice ruleRollDice = Rulebook.Trigger(new RuleRollDice(unit, new DiceFormula(1, DiceType.D100)));
int num = unit.Descriptor.State.HasCondition(UnitCondition.AttackNearest) ? 100 : ruleRollDice.Result.Value;
part.State = num >= 26 ? (num >= 51 ? (num >= 76 ? ConfusionState.AttackNearest : ConfusionState.SelfHarm) : ConfusionState.DoNothing) : ConfusionState.ActNormally;
if (part.State == ConfusionState.ActNormally)
part.ReleaseControl();
else
part.RetainControl();
part.RoundStartTime = Game.Instance.TimeController.GameTime;
part.Cmd?.Interrupt(true);
part.Cmd = (UnitCommand) null;
}
if (part.Cmd != null || !unit.Descriptor.State.CanAct || part.State == ConfusionState.ActNormally)
return;
if (flag)
{
switch (part.State)
{
case ConfusionState.DoNothing:
part.Cmd = UnitConfusionController.DoNothing(part);
break;
case ConfusionState.SelfHarm:
part.Cmd = UnitConfusionController.SelfHarm(part);
break;
case ConfusionState.AttackNearest:
part.Cmd = UnitConfusionController.AttackNearest(part);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
else
part.Cmd = UnitConfusionController.DoNothing(part);
if (part.Cmd == null)
return;
part.Owner.Unit.Commands.Run(part.Cmd);
}
else
unit.Remove();
}