void Attack::Act(IGame& game) const { State attacker = game.Get(actor); auto& targetActor = dynamic_cast<const Identity&>(target); State victim(game.Get(targetActor)); if (!part) { Engage(attacker); game.Adjust(actor, attacker, skill.name); game.Adjust(targetActor, victim, L"Miss " + skill.name); return; } auto skillLevel = attacker.SkillLevel(skill, &victim); if (skillLevel.Value() == 0) { Engage(attacker); game.Adjust(actor, attacker, skill.name); game.Adjust(targetActor, victim, L"Resist " + skill.name + L":" + skillLevel.Description()); return; } auto damage = attacker.AttackDamage(skill, skillLevel); Damage pain = damage - victim.Mitigation(*part); if (!victim.Hurt(*part, pain, actor.Description()+L"'"+skill.description)) { Engage(attacker); game.Adjust(actor, attacker, skill.name); game.Adjust(targetActor, victim, L"Mitigate " + skill.name + L"@" + part->Name() + L":" + pain.ActionDescription()); return; } Engage(attacker); game.Adjust(actor, attacker, skill.name); game.Adjust(targetActor, victim, L"Hit " + skill.name + L"@" + part->Name() + L":" + pain.ActionDescription()); }