Ejemplo n.º 1
0
    private void CalculateGOAP()
    {
        initialState = new WorldState()
        {
            playerMaxLife          = World.Config.playerMaxLife,
            playerCurrLife         = World.Config.playerMaxLife,
            playerBaseAtk          = World.Config.playerBaseAtk,
            playerGold             = World.Config.playerGold,
            playerSeriouslyInjured = false,

            currentWeapon       = World.Config.currentWeapon,
            weaponUsesRemaining = World.Config.weaponUsesRemaining,

            bossLife = World.Config.bossMaxLife
        };

        Debug.Log("--Calculating GOAP...--".Bold());
        currentActionsList = GOAP.Run(initialState, (state) => state.bossLife <= 0, actions, state => state.bossLife / World.Config.bossMaxLife * World.Config.bossLifeWeight, World.Config.maxSteps);

        if (currentActionsList == null)
        {
            Debug.Log("No possible actions"); return;
        }

        foreach (var action in currentActionsList)
        {
            Debug.Log(action.name);
        }


        model.ResetModel(World.Config);

        StopAllCoroutines();
        StartCoroutine(ExecuteGOAP());
    }
Ejemplo n.º 2
0
    string CalculateGOAP()
    {
        var initialState = new WorldState()
        {
            playerMaxLife          = t.playerMaxLife,
            playerCurrLife         = t.playerMaxLife,
            playerBaseAtk          = t.playerBaseAtk,
            playerGold             = t.playerGold,
            playerSeriouslyInjured = false,

            currentWeapon       = t.currentWeapon,
            weaponUsesRemaining = t.weaponUsesRemaining,

            bossLife = t.bossMaxLife
        };

        var currentActionsList = GOAP.Run(initialState, (state) => state.bossLife <= 0, actions, state => state.bossLife / t.bossMaxLife * t.bossLifeWeight, t.maxSteps);

        if (currentActionsList == null)
        {
            return("No possible actions");
        }

        string output = "";

        foreach (var action in currentActionsList)
        {
            output += action.name + "\n";
        }
        return(output);
    }
Ejemplo n.º 3
0
        public void test_goap()
        {
            GOAP goap = new GOAP(12); {
                goap.add_act(new DoBuy());
                goap.add_act(new DoEat());
                goap.add_act(new DoSearch());
                goap.add_act(new DoSleep());
                goap.add_act(new DoWork());
            }
            State start = new State(); {
                start.add((int)StateTag.Angry, false);
                start.add((int)StateTag.Food, false);
                start.add((int)StateTag.Happy, false);
                start.add((int)StateTag.Weapon, false);
                start.add((int)StateTag.Hunger, true);
                start.add((int)StateTag.Money, true);
            }
            State goal = new State(); {
                goal.add((int)StateTag.Happy, true);
                goal.add((int)StateTag.Weapon, true);
            }
            Stack <IActionNode> todo = new Stack <IActionNode>();

            goap.plan(start, goal, ref todo);
            foreach (var act in todo)
            {
                UnityEngine.Debug.Log((ActionTag)act.id);
            }
        }
Ejemplo n.º 4
0
 public Planner(Preferences <WorldState> preferences, Action <IEnumerable <WorldState> > callback)
 {
     _goap = new GOAP <WorldState>(
         GOAPDefaults.DefaultWorldState,
         GOAPDefaults.ActionList,
         GOAPDefaults.Heuristic,
         preferences,
         GOAPDefaults.Expand,
         callback
         );
 }
Ejemplo n.º 5
0
    public void FindPlan(Dictionary <string, int> goalState, System.Action successCallback, System.Action failureCallback)
    {
        Dictionary <string, int> startState    = inventory.GetItemsAsState();
        Dictionary <string, int> combinedState = new Dictionary <string, int>(goalState);

        // Add goal and start state
        foreach (KeyValuePair <string, int> stateComponent in goalState)
        {
            if (startState.ContainsKey(stateComponent.Key))
            {
                combinedState[stateComponent.Key] += startState[stateComponent.Key];
            }
        }

        // GOAP generation
        GOAP goap = new GOAP(this, startState, combinedState, successCallback, failureCallback);

        goap.CreatePlan();
    }
Ejemplo n.º 6
0
    private void RunGOAP()
    {
        var actions = new List <GOAPAction <BomberEnemy> >();

        actions.Add(new GOAPAction <BomberEnemy>
                    (
                        "GoCore",
                        1f,
                        bomber => bomber.currentLife > bomber.maxLife / 2,
                        bomber =>
        {
            BomberEnemy bomberEnemy = this;

            var tempPath = LazyAStar.Run(target, IsTarget, NeightAndDanger, DistanceToCoreNode).ToList();
            for (int i = 0; i < tempPath.Count - 1; i++)
            {
                bomberEnemy.path.Enqueue(tempPath[i].Item2);
            }
            return(bomberEnemy);
        }

                    ));

        actions.Add(new GOAPAction <BomberEnemy>
                    (
                        "AttackCore",
                        0.5f,
                        bomber => bomber.target.nextNodes.First() == NodeConteiner.instance.TargetNode(),
                        bomber =>
        {
            BomberEnemy bomberEnemy = this;
            bomberEnemy.target      = NodeConteiner.instance.TargetNode();
            return(bomberEnemy);
        }

                    ));

        GOAP.Run(this, x => x.target = NodeConteiner.instance.TargetNode(),
                 actions, Heuristic);
    }
Ejemplo n.º 7
0
    protected override void Start()
    {
        base.Awake();

        List <Phenix.Unity.AI.GOAPGoal> goals = new List <Phenix.Unity.AI.GOAPGoal>();

        foreach (var goalType in _goals)
        {
            switch (goalType)
            {
            case GOAPGoalType1.IDLE:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.IN_IDLE, true, false));
                goals.Add(new GOAPGoalIdle(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.ORDER_MOVE:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.ORDER_MOVE, false, false));
                goals.Add(new GOAPGoalOrderMove(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.ORDER_ATTACK:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.ORDER_ATTACK, false, false));
                goals.Add(new GOAPGoalOrderAttack(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.ORDER_DODGE:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.ORDER_ROLL, false, false));
                goals.Add(new GOAPGoalOrderDodge(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.CALM:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.WEAPON_IN_HAND, false, false));
                goals.Add(new GOAPGoalCalm(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.RETREAT:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.IN_COMBAT_RANGE, false, false));
                goals.Add(new GOAPGoalRetreat(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.PRESS:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.IN_COMBAT_RANGE, true, false));
                goals.Add(new GOAPGoalPress(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.AVOID_LEFT:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.MOVE_TO_LEFT, true, true));
                goals.Add(new GOAPGoalAvoidLeft(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.AVOID_RIGHT:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.MOVE_TO_RIGHT, true, true));
                goals.Add(new GOAPGoalAvoidRight(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.ALERT:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.LOOKING_AT_TARGET, true, false));
                goals.Add(new GOAPGoalAlert(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.ATTACK_TARGET:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.ATTACK_TARGET, true, true));
                goals.Add(new GOAPGoalAttack(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.SHOW:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.WILL_PLAY_ANIM, false, false));
                goals.Add(new GOAPGoalShow(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.REACT_TO_DAMAGE:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.REACT_TO_DAMAGE, false, false));
                goals.Add(new GOAPGoalReactToDamage1(Agent, goalBits));
            }
            break;

            case GOAPGoalType1.BLOCK:
            {
                List <WorldStateBitDataGoal> goalBits = new List <WorldStateBitDataGoal>();
                goalBits.Add(new WorldStateBitDataGoal((int)WorldStatePropType.FINISH_BLOCK, true, true));
                goals.Add(new GOAPGoalBlock1(Agent, goalBits));
            }
            break;

            default:
                break;
            }
        }

        List <Phenix.Unity.AI.GOAPAction> actions = new List <Phenix.Unity.AI.GOAPAction>();

        foreach (var actionType in _actions)
        {
            switch (actionType)
            {
            case GOAPActionType1.SHOW_SWORD:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_IDLE, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.WEAPON_IN_HAND, true, false));

                actions.Add(new GOAPActionShowSword(GOAPActionType1.SHOW_SWORD, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.LOOK_AT_TARGET:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.LOOKING_AT_TARGET, true, false));

                actions.Add(new GOAPActionLookAt(GOAPActionType1.LOOK_AT_TARGET, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.IDLE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.IN_IDLE, true, false));

                actions.Add(new GOAPActionIdle(GOAPActionType1.IDLE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.GOTO_MELEE_RANGE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_COMBAT_RANGE, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.IN_WEAPON_RANGE, true, false));

                actions.Add(new GOAPActionGoToMeleeRange1(GOAPActionType1.GOTO_MELEE_RANGE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_MELEE_MULTI_SWORDS:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_WEAPON_RANGE, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackMeleeMultiSwords(GOAPActionType1.ATTACK_MELEE_MULTI_SWORDS, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_WHIRL:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_WEAPON_RANGE, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.ENOUGH_BERSERK, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackWhirl1(GOAPActionType1.ATTACK_WHIRL, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ORDER_MOVE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ORDER_MOVE, false, false));

                actions.Add(new GOAPActionOrderMove(GOAPActionType1.ORDER_MOVE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ORDER_ATTACK_MELEE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ORDER_ATTACK, false, false));

                actions.Add(new GOAPActionOrderAttackMelee(GOAPActionType1.ORDER_ATTACK_MELEE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ORDER_ROLL:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ORDER_ROLL, false, false));

                actions.Add(new GOAPActionOrderRoll(GOAPActionType1.ORDER_ROLL, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.HIDE_SWORD:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_IDLE, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.WEAPON_IN_HAND, false, false));

                actions.Add(new GOAPActionHideSword(GOAPActionType1.HIDE_SWORD, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.COMBAT_MOVE_BACKWARD:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.IN_COMBAT_RANGE, false, false));

                actions.Add(new GOAPActionCombatMoveBackward(GOAPActionType1.COMBAT_MOVE_BACKWARD, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.COMBAT_MOVE_FORWARD:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.IN_COMBAT_RANGE, true, false));

                actions.Add(new GOAPActionCombatMoveForward(GOAPActionType1.COMBAT_MOVE_FORWARD, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.COMBAT_MOVE_LEFT:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.MOVE_TO_LEFT, true, false));

                actions.Add(new GOAPActionCombatMoveLeft(GOAPActionType1.COMBAT_MOVE_LEFT, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.COMBAT_MOVE_RIGHT:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.MOVE_TO_RIGHT, true, false));

                actions.Add(new GOAPActionCombatMoveRight(GOAPActionType1.COMBAT_MOVE_RIGHT, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.PLAY_ANIM:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.WILL_PLAY_ANIM, false, true));

                actions.Add(new GOAPActionPlayAnim(GOAPActionType1.PLAY_ANIM, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.REACT_TO_DAMAGE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.REACT_TO_DAMAGE, false, false));

                actions.Add(new GOAPActionReactToDamage(GOAPActionType1.REACT_TO_DAMAGE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.BLOCK:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.FINISH_BLOCK, true, false));

                actions.Add(new GOAPActionBlock1(GOAPActionType1.BLOCK, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_COUNTER:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_BLOCK, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.ENOUGH_BERSERK, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, false, false));

                actions.Add(new GOAPActionAttackCounter(GOAPActionType1.ATTACK_COUNTER, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_BERSERK:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_WEAPON_RANGE, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.ENOUGH_BERSERK, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackBerserk(GOAPActionType1.ATTACK_BERSERK, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_CROSS:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_WEAPON_RANGE, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackCross(GOAPActionType1.ATTACK_CROSS, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.GOTO_TARGET:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.IN_WEAPON_RANGE, true, false));

                actions.Add(new GOAPActionGoToTarget(GOAPActionType1.GOTO_TARGET, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.FLASH:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_COMBAT_RANGE, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.ENOUGH_BERSERK, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.IN_WEAPON_RANGE, true, false));

                actions.Add(new GOAPActionFlash(GOAPActionType1.FLASH, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_ROLL:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.ENOUGH_BERSERK, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackRoll(GOAPActionType1.ATTACK_ROLL, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.REACT_TO_DAMAGE_BOSS:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.REACT_TO_DAMAGE, false, false));

                actions.Add(new GOAPActionReactToDamageBoss(GOAPActionType1.REACT_TO_DAMAGE_BOSS, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_MELEE_SINGLE_SWORD:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_WEAPON_RANGE, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackMeleeSingleSword(GOAPActionType1.ATTACK_MELEE_SINGLE_SWORD, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.LOOK_AT_TARGET_MOVE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.LOOKING_AT_TARGET, true, false));

                actions.Add(new GOAPActionLookAtMove(GOAPActionType1.LOOK_AT_TARGET_MOVE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.CHASE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.IN_COMBAT_RANGE, true, false));

                actions.Add(new GOAPActionChase(GOAPActionType1.CHASE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_SAMURAI:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_COMBAT_RANGE, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackSamurai(GOAPActionType1.ATTACK_SAMURAI, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_JUMP:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_COMBAT_RANGE, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.TARGET_IN_KNOCK_DOWN, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackJump(GOAPActionType1.ATTACK_JUMP, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ROLL_FOR_BACK_STRIKE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_COMBAT_RANGE, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.BEHIND_TARGET, true, false));

                actions.Add(new GOAPActionRollForBackStrike(GOAPActionType1.ROLL_FOR_BACK_STRIKE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ROLL_FOR_DODGE:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.IN_COMBAT_RANGE, false, false));

                actions.Add(new GOAPActionRollForDodge(GOAPActionType1.ROLL_FOR_DODGE, Agent, preConditionBits, effectBits));
            }
            break;

            case GOAPActionType1.ATTACK_BOW:
            {
                List <WorldStateBitData> preConditionBits = new List <WorldStateBitData>();
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.WEAPON_IN_HAND, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.IN_WEAPON_RANGE, true));
                preConditionBits.Add(new WorldStateBitData((int)WorldStatePropType.LOOKING_AT_TARGET, true));

                List <WorldStateBitDataAction> effectBits = new List <WorldStateBitDataAction>();
                effectBits.Add(new WorldStateBitDataAction((int)WorldStatePropType.ATTACK_TARGET, true, false));

                actions.Add(new GOAPActionAttackBow(GOAPActionType1.ATTACK_BOW, Agent, preConditionBits, effectBits));
            }
            break;

            default:
                break;
            }
        }
        _goap = new GOAP(new Phenix.Unity.AI.WorldState((int)GOAPActionType1.COUNT + 1),
                         goals, actions, new GOAPPlanAStar());
    }
Ejemplo n.º 8
0
    void Plan()
    {
        var initialModel = new WorldModel();

        initialModel.tomatoes    = initialTomatoes;
        initialModel.seeds       = initialSeeds;
        initialModel.money       = initialMoney;
        initialModel.item        = (int)initialitem;
        initialModel.givenAdvice = givenGradmaAdvice;

        if (initialModel.item == (int)InitialItem.DEBT_FREE)
        {
            initialModel.hasPayedTaxes = true;
        }
        else
        {
            initialModel.hasPayedTaxes = taxesPayed;
        }


        _ui.UpdateUI(initialModel);

        costCorrection(initialModel.item);

        Func <WorldModel, bool> goal = (g) => g.isPizzaMaster;

        var actions = GetActions();

        var initialState = new GoapState(actions, null, initialModel, goal, Heuristic);

        var plan = new GOAP(initialState).Execute();

        _actionQueue = new Queue <Tuple <string, WorldModel> >();

        foreach (var step in plan)
        {
            Debug.Log("Action: " + step.Item1);
            if (!step.Item1)
            {
                continue;
            }
            var path = step.Item3.Reverse();
            foreach (var state in path)
            {
                if (state.GeneratedAction != null)
                {
                    Debug.Log("No action left to do - You will starve to dead - GG");
                    _actionQueue.Enqueue(Tuple.Create(state.GeneratedAction.Name, state.CurrentWorldModel));
                }
            }
        }

        if (_actionQueue.Count == 0)
        {
            Debug.Log("No action left to do - You will starve to dead - GG");
        }
        else
        {
            ExecuteAction();
        }
    }
Ejemplo n.º 9
0
    //Aproved: true
    //knowledge : true

    void Start()
    {
        var actions = new List <GoapAction <Student> >()
        {
            new GoapAction <Student>(
                "Study",
                state => state.time && !state.tired,
                state =>
            {
                state.time      = false;
                state.tired     = true;
                state.knowledge = true;
                return(state);
            },
                2f
                ),
            new GoapAction <Student>(
                "Sleep",
                state => state.tired,
                state =>
            {
                state.tired = false;
                return(state);
            },
                1f
                ),
            new GoapAction <Student>(
                "Rending",
                state => state.knowledge && !state.tired,
                state =>
            {
                state.aproved = true;
                state.time    = true;
                return(state);
            },
                3f
                ),
            new GoapAction <Student>(
                "Dont sleep",
                state => true,
                state =>
            {
                state.tired = true;
                state.time  = true;
                return(state);
            },
                4f
                )
        };

        var actionPath = GOAP.Run(initialState, Satisfies, actions, Heuristic);

        if (actionPath == null)
        {
            Debug.Log("No podes hacer nada para llegar a tu goal.");
            return;
        }

        foreach (var action in actionPath)
        {
            Debug.Log(action.name);
        }
    }
Ejemplo n.º 10
0
    private void Start()
    {
        actions = new List <GOAPAction>()
        {
            new GOAPAction("BuildHouse").SetPreconditions
            (
                (a) =>
            {
                return
                (a.HasHammer &&
                 a.Energy >= 65f &&
                 a.Wood >= 10 &&
                 a.PatienceRate >= 2 &&
                 !a.HouseOwned);
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.Energy     = a.Energy - 65f;
                b.Wood       = a.Wood - 10;
                b.HouseOwned = true;
            }
            ).SetCost(5)
            .SetAct(a => StartCoroutine(ActionRoutines.BuildHouseCoroutine(a))),
            new GOAPAction("GatherWood").SetPreconditions
            (
                (a) =>
            {
                return
                (a.HasAxe &&
                 a.Energy >= 40f);
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.Energy = a.Energy - 35f;
                b.Wood   = a.Wood + 10;
            }
            ).SetCost(3.5f)
            .SetAct(a => StartCoroutine(ActionRoutines.GatherWoodCoroutine(a))),
            new GOAPAction("PickAxe").SetPreconditions
            (
                (a) =>
            {
                return
                (!a.HasAxe &&
                 a.PatienceRate >= 1);
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.HasAxe       = true;
                b.PatienceRate = a.PatienceRate - 1;
            }
            ).SetCost(0.5f)
            .SetAct(a => StartCoroutine(ActionRoutines.GetToolCoroutine(a, ToolType.AXE))),
            new GOAPAction("Sleep").SetPreconditions
            (
                (a) =>
            {
                return
                (a.BedBuilt &&
                 a.Energy <= 75 &&
                 a.PatienceRate >= 2);
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.Energy       = a.Energy + 50;
                b.PatienceRate = a.PatienceRate + 2;
            }
            ).SetCost(1f)
            .SetAct(a => StartCoroutine(ActionRoutines.SleepCoroutine(a))),
            new GOAPAction("PickHammer").SetPreconditions
            (
                (a) =>
            {
                return
                (!a.HasHammer &&
                 a.PatienceRate >= 1);
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.HasHammer    = true;
                b.PatienceRate = a.PatienceRate - 1;
            }
            ).SetCost(0.5f)
            .SetAct(a => StartCoroutine(ActionRoutines.GetToolCoroutine(a, ToolType.HAMMER))),
            new GOAPAction("BuildBed").SetPreconditions
            (
                (a) =>
            {
                return
                (!a.BedBuilt &&
                 a.Energy >= 40f &&
                 a.Wood >= 3 &&
                 a.PatienceRate >= 1);
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.Energy       = a.Energy - 40f;
                b.BedBuilt     = true;
                b.PatienceRate = a.PatienceRate - 1;
            }
            ).SetCost(2f)
            .SetAct(a => ActionRoutines.BuildBed(a)),
            new GOAPAction("SummonSatan").SetPreconditions
            (
                (a) =>
            {
                return
                (a.PatienceRate == 0);
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.Energy     = 100;
                b.HouseOwned = true;
            }
            ).SetCost(10f)
            .SetAct(a => StartCoroutine(ActionRoutines.SummonSatanCoroutine(a))),
            new GOAPAction("KillEnemy").SetPreconditions
            (
                (a) =>
            {
                return
                (a.PatienceRate <= 3 &&
                 a.HasAxe &&
                 a.Energy <= 50 &&
                 a.Energy >= 15);
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.Energy -= 30;
                b.Keys.Add("House 1");
                b.PatienceRate += 10;
            }
            ).SetCost(7.5f)
            .SetAct(a => StartCoroutine(ActionRoutines.KillEnemyCoroutine(a))),
            new GOAPAction("OpenHouse1").SetPreconditions
            (
                (a) =>
            {
                return
                (a.Keys.Contains("House 1"));
            }
            ).SetEffects
            (
                (a, b) =>
            {
                b.HouseOwned = true;
            }
            ).SetCost(0.5f)
            .SetAct(a => StartCoroutine(ActionRoutines.OpenHouseCoroutine(a))),
        };

        current = new GOAPState(100, 0);

        satisfies  = (a) => { return(a.Energy >= 90 && a.HouseOwned); };
        heuristics = (a) =>
        {
            float cost = 0;
            cost += Mathf.Max(a.Energy, 0) < 90f ? (90f - Mathf.Max(a.Energy, 0)) * 0.3f : 0f;
            cost += !a.HouseOwned ? 1f : 0f;
            return(cost);
        };

        sequence = GOAP.RunGOAPOld(this, current, actions);
        sequence.First().Act(this);
    }