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()); }
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); }
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); } }
public Planner(Preferences <WorldState> preferences, Action <IEnumerable <WorldState> > callback) { _goap = new GOAP <WorldState>( GOAPDefaults.DefaultWorldState, GOAPDefaults.ActionList, GOAPDefaults.Heuristic, preferences, GOAPDefaults.Expand, callback ); }
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(); }
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); }
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()); }
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(); } }
//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); } }
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); }