public static int dispatch1ESkillLevel(this GameObject critter, SkillId skill, GameObject opposingObj,
                                           SkillCheckFlags flag)
    {
        var noBonus = BonusList.Default;

        return(dispatch1ESkillLevel(critter, skill, ref noBonus, opposingObj, flag));
    }
    public static int dispatch1ESkillLevel(this GameObject critter, SkillId skill, ref BonusList bonusList,
                                           GameObject opposingObj, SkillCheckFlags flag)
    {
        var dispatcher = critter.GetDispatcher();

        if (dispatcher == null)
        {
            return(0);
        }

        DispIoObjBonus dispIO = DispIoObjBonus.Default;

        dispIO.flags   = flag;
        dispIO.obj     = opposingObj;
        dispIO.bonlist = bonusList;
        dispatcher.Process(DispatcherType.SkillLevel, (D20DispatcherKey)(skill + 20), dispIO);
        bonusList = dispIO.bonlist;
        return(dispIO.bonlist.OverallBonus);
    }