public static int DispatchAttackerConcealmentMissChance(this GameObject attacker)
    {
        var dispatcher = attacker.GetDispatcher();

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

        DispIoObjBonus dispIo = DispIoObjBonus.Default;

        dispatcher.Process(DispatcherType.GetAttackerConcealmentMissChance, D20DispatcherKey.NONE, dispIo);
        return(dispIo.bonlist.HighestBonus);
    }
    public static int DispatchGetLevel(this GameObject critter, int classOffset, BonusList bonlist, GameObject contextObj)
    {
        var dispatcher = critter.GetDispatcher();

        if (dispatcher != null)
        {
            DispIoObjBonus dispIo = DispIoObjBonus.Default;
            dispIo.bonlist = bonlist;
            dispIo.obj     = contextObj;
            dispatcher.Process(DispatcherType.GetLevel, (D20DispatcherKey.CL_Level + classOffset), dispIo);
            return(dispIo.bonOut.OverallBonus);
        }
        else
        {
            return(0);
        }
    }
    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);
    }