//should only be called if CanHenchmanAttackTargetPlayer() returns true
    public void HaveHenchmanAttackTargetPlayer(BoardSpaceEnum henchmanSpace, PlayerManager target, uint damageReduction = 0)
    {
        HenchmanCard henchman = board[henchmanSpace];

        if (henchman.GetAttack() > 0)
        {
            target.ApplyDamage(henchman.GetAttack() - damageReduction);
        }
        //trigger rush for combat damage
        henchman.RushEvent.Invoke();
        henchman.ActionTaken();
    }
    //should only be called if CanHenchmanFight() returns true
    public void HaveHenchmenFight(BoardSpaceEnum playerSpace, BoardSpaceEnum opponentSpace)
    {
        HenchmanCard playerHenchman   = board[playerSpace];
        HenchmanCard opponentHenchman = board[opponentSpace];

        //check if any damage needs to trample over
        int excess = (int)playerHenchman.GetAttack() - opponentHenchman.GetHealth();

        if ((excess > 0) && playerHenchman.IsOverAchiever())
        {
            Debug.Log("ROLLING DAMAGE OVER");
            uint reduction = playerHenchman.GetAttack() - (uint)excess;
            HaveHenchmanAttackTargetPlayer(playerSpace, opponentHenchman.GetController(), damageReduction: reduction);
        }

        //apply damage to the henchmen after applying trample damage to prevent issues arising from the
        //trampler dying after taking damage from the other henchman, then not being at playerSpace anymore
        //FIXME: find a more elegant solution, since this could cause some unintuitive interactions with
        //       triggered effects on the other henchman, since it technically won't "die" until after
        //       damage has trampled over
        playerHenchman.ApplyDamage((int)opponentHenchman.GetAttack());
        opponentHenchman.ApplyDamage((int)playerHenchman.GetAttack());
        playerHenchman.ActionTaken();
    }