ensiferum888

FSM

Jan 16th, 2015
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.36 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Pathfinding;
  5. using AI.States;
  6.  
  7. public class StateMachine{
  8.     public List<AIState> Tasks;
  9.     public CitizenAI cScript;
  10.    
  11.     public StateMachine(CitizenAI owner){
  12.         this.Tasks = new List<AIState>(15);
  13.         cScript = owner;
  14.     }
  15.    
  16.     public void DoCurrent(){
  17.         if(Tasks.Count > 0){
  18.             Tasks[0].StateUpdate();
  19.         }
  20.         else{
  21.             AssessNeeds ();
  22.         }
  23.     }
  24.    
  25.     public void AddAction(AIState _task){
  26.         if(Tasks.Count == 0){
  27.             Tasks.Add(_task);
  28.             Tasks[0].SetUp();
  29.         }
  30.         else{
  31.             Tasks.Add(_task);
  32.         }
  33.     }
  34.    
  35.     public void AddActionPriority(AIState _task){
  36.         Tasks.Insert(0, _task);
  37.     }
  38.    
  39.     public void DeQueue(){
  40.         if(Tasks.Count > 0){
  41.             Tasks.RemoveAt(0);
  42.             if(Tasks.Count > 0){
  43.                 Tasks[0].SetUp();
  44.             }
  45.             else{
  46.                 AssessNeeds();
  47.             }
  48.         }
  49.         else{
  50.             AssessNeeds();
  51.         }
  52.     }
  53.    
  54.     public void ClearTasks(){
  55.         if(Tasks.Count > 0){
  56.             Tasks[0].Exit();
  57.         }
  58.         Tasks.Clear();
  59.     }
  60.    
  61.    
  62.     public void AssessNeeds(){ 
  63.         if(cScript.ShouldLookForHome()){
  64.             LookForSuitableHome();
  65.         }
  66.         else if(cScript.ShouldWork()){
  67.             RegisterForWorkPlace();
  68.         }  
  69.         else if(cScript.CanWorkOnField()){
  70.             RegisterForFieldWork();
  71.         }
  72.         else if(cScript.ShouldBuild()){
  73.             RegisterForConstructionSite();
  74.         }
  75.         else if(cScript.CanClearField()){
  76.             RegisterForClearingField();
  77.         }
  78.         else if(cScript.roadNeedsClearing()){
  79.             RegisterForClearingRoad();
  80.         }
  81.         else if(cScript.areaNeedsClearing()){
  82.             RegisterForHarvestingArea();
  83.         }
  84.         else{
  85.             MoveToRandomPoint();
  86.         }
  87.     }
  88.    
  89.     #region State Bundles
  90.    
  91.     public void LookForSuitableHome(){
  92.         AddAction(new LookForHome(cScript));
  93.     }
  94.    
  95.     /// <summary>
  96.     /// Sends the agent to cut a tree.
  97.     /// </summary>
  98.     /// <param name="treePos">Tree position.</param>
  99.     /// <param name="autoDeliver">If set to <c>true</c> brings the logs back to the nearest storage</param>
  100.     public void CutTreeAtPosition(Vector3 treePos, bool autoDeliver){
  101.         WalkToLocation(treePos);
  102.         AddAction(new PlayAnim("Cut_Tree", cScript));
  103.         AddAction(new CutTreeAtPosition(treePos, cScript));
  104.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  105.         AddAction(new TakeItem(AllRessources.WOOD, 20, cScript));
  106.         AddAction(new WaitTimer(2f, cScript));
  107.         AddAction(new PlayAnimAndWait("Get_up", cScript));
  108.        
  109.         if(autoDeliver){
  110.             int[] arr = new int[] {AllRessources.WOOD};
  111.             DropItemsAtNearestStorage(arr);
  112.         }
  113.     }
  114.    
  115.     public void PlantTreeAtPosition(Vector3 treePos, TreePlanter tp){
  116.         WalkToLocation(treePos);       
  117.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  118.         AddAction(new WaitTimer(2f, cScript));
  119.         AddAction(new PlantTree(treePos, tp, cScript));
  120.         AddAction(new PlayAnimAndWait("Get_up", cScript));
  121.     }
  122.    
  123.     /// <summary>
  124.     /// Sends the agent to pick up a rock
  125.     /// </summary>
  126.     /// <param name="rockPos">Rock position.</param>
  127.     /// <param name="autoDeliver">If set to <c>true</c> brings the stone back to the nearest storage</param>
  128.     public void PickUpRockAtPosition(Vector3 rockPos, bool autoDeliver){
  129.         WalkToLocation(rockPos);
  130.         AddAction(new PlayAnim("Cut_Tree", cScript));
  131.         AddAction(new CutTreeAtPosition(rockPos, cScript));
  132.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  133.         AddAction(new TakeItem(AllRessources.STONE, 8, cScript));
  134.         AddAction(new WaitTimer(2f, cScript));
  135.         AddAction(new PlayAnimAndWait("Get_up", cScript));
  136.        
  137.         if(autoDeliver){
  138.             int[] arr = new int[] {AllRessources.STONE};
  139.             DropItemsAtNearestStorage(arr);
  140.         }
  141.     }
  142.    
  143.     public void PickUpItemsFromWorkAndBringThemToStorage(){    
  144.         int[] itemToPickUp = cScript.workScript.GetTakeResources();
  145.         AddAction(new SetCurrentString(cScript, "Going to get items from work."));
  146.         WalkToLocation(cScript.workScript.workWayPoint.position);
  147.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  148.         AddAction(new TakeItemsFromInventoryLocation(itemToPickUp, cScript.workScript, cScript));
  149.         AddAction(new PlayAnimAndWait("Get_up", cScript)); 
  150.         AddAction(new SetCurrentString(cScript, "Bringing items to storage."));
  151.         AddAction(new PerformAction(cScript, BringItemsFromWorkToNearestStorage));
  152.     }
  153.    
  154.     public void PickUpItemsAtNearestStorage(int[] itemsToPickUp){
  155.         Storeage store = cScript.getNearestStoreage(cScript._myTransform.position).parent.GetComponent<Storeage>();
  156.         AddAction(new PlayAnim("Walk_001", cScript));
  157.         AddAction(new MoveToLocation(store.storeTransform.position, cScript));
  158.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  159.         AddAction(new TakeItemsFromInventoryLocation(itemsToPickUp, store, cScript));
  160.         AddAction(new WaitTimer(2f, cScript));
  161.         AddAction(new PlayAnimAndWait("Get_up", cScript));
  162.     }
  163.    
  164.     public void DropItemsAtNearestStorage(int[] itemsToDrop){
  165.         Storeage store = cScript.getNearestStoreage(cScript._myTransform.position).parent.GetComponent<Storeage>();
  166.         AddAction(new PlayAnim("Walk_001", cScript));
  167.         AddAction(new MoveToLocation(store.storeTransform.position, cScript));
  168.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  169.         AddAction(new DropItemAtInventoryLocation(itemsToDrop, store, cScript));
  170.         AddAction(new WaitTimer(2f, cScript));
  171.         AddAction(new PlayAnimAndWait("Get_up", cScript));
  172.     }
  173.    
  174.     public void DropItemsAtConstructionSite(){
  175.         Vector3 constructionLocation = cScript.buildScript.transform.position;
  176.         WalkToLocation(constructionLocation);
  177.         int[] itemsToDrop = new int[] {AllRessources.STONE, AllRessources.WOOD, AllRessources.TOOLS};
  178.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  179.         AddAction(new DropItemAtInventoryLocation(itemsToDrop, cScript.buildScript, cScript));
  180.         AddAction(new WaitTimer(2f, cScript));
  181.         AddAction(new PlayAnimAndWait("Get_up", cScript));     
  182.     }
  183.    
  184.     public void DropItemsAtWorkPlace(){
  185.         Vector3 workLocation = cScript.workScript.workWayPoint.position;
  186.         WalkToLocation(workLocation);
  187.         int[] resourcesToDrop = cScript.workScript.ressourcesRequired;
  188.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  189.         AddAction(new DropItemAtInventoryLocation(resourcesToDrop, cScript.workScript, cScript));
  190.         AddAction(new WaitTimer(2f, cScript));
  191.         AddAction(new PlayAnimAndWait("Get_up", cScript));
  192.     }
  193.    
  194.     public void BringItemsFromWorkToNearestStorage(){
  195.         int[] resourcesToDrop = cScript.workScript.GetDropResources();
  196.         DropItemsAtNearestStorage(resourcesToDrop);
  197.     }
  198.    
  199.     public void WalkToLocation(Vector3 worldPos){
  200.         AddAction(new PlayAnim("Walk_001", cScript));
  201.         AddAction(new MoveToLocation(worldPos, cScript));      
  202.     }
  203.    
  204.     public void RegisterForWorkPlace(){
  205.         WorkScript ws = cScript.workScript;
  206.         if(cScript.WorkNeedsItems()){
  207.             int[] itemNeeded = cScript.workScript.GetMissingItemsForOperaions();
  208.             PickUpItemsAtNearestStorage(itemNeeded);
  209.             AddAction(new SetCurrentString(cScript, "Bringing items to work place."));
  210.             AddAction(new PerformAction(cScript, DropItemsAtWorkPlace));
  211.         }
  212.         else if(cScript.isRunner & cScript.workScript.storageFull){
  213.             PickUpItemsFromWorkAndBringThemToStorage();            
  214.         }
  215.         else{
  216.             cScript.workScript.WorkTasks.SetupNextTasks(this);
  217.         }
  218.     }
  219.    
  220.     /// <summary>
  221.     /// Perform any work related with construction location.
  222.     /// </summary>
  223.     public void RegisterForConstructionSite(){
  224.         if(cScript.buildScript == null){
  225.             Building bs = SaveManager.Instance.constructionNeeded[0];
  226.             if(bs.volounteerForWork(cScript.gameObject)){
  227.                 cScript.buildScript = bs;
  228.             }
  229.             else{
  230.                 return;
  231.             }
  232.         }
  233.         if(cScript.buildScript.treesToCut.Count > 0){
  234.             Vector3 tree = cScript.buildScript.treesToCut[0];
  235.             cScript.buildScript.treesToCut.RemoveAt(0);
  236.             CutTreeAtPosition(tree, true);
  237.             return;
  238.         }
  239.         if(cScript.buildScript.rocks.Count > 0){
  240.             Vector3 rock = cScript.buildScript.rocks[0].transform.position;
  241.             cScript.buildScript.rocks.RemoveAt(0);
  242.             PickUpRockAtPosition(rock, true);
  243.             return;
  244.         }
  245.        
  246.         if(!cScript.buildScript.checkRessourcesCommitted()){
  247.             int[] resourcesNeeded = cScript.buildScript.getMissingResources(cScript);
  248.             PickUpItemsAtNearestStorage(resourcesNeeded);
  249.             AddAction(new PerformAction(cScript, DropItemsAtConstructionSite));
  250.         }
  251.         else{
  252.             if(cScript.buildScript.allRessourcesGathered && cScript.buildScript.builder == null){
  253.                 cScript.buildScript.commitForWork(cScript.gameObject);
  254.                 AddAction(new PlayAnimAndWait("BendDown", cScript));
  255.                 AddAction(new PlayAnim("Build", cScript));
  256.                 AddAction(new WaitTimer(cScript.buildScript.timeToBuild, cScript));
  257.                 AddAction(new PlayAnimAndWait("Get_up", cScript));
  258.             }
  259.             else if(!cScript.buildScript.allRessourcesGathered){
  260.                 cScript.buildScript = null;
  261.                 ClearTasks ();
  262.                 DeQueue ();
  263.             }
  264.         }
  265.     }
  266.    
  267.     public void RegisterForClearingField(){
  268.         FieldScript fs;
  269.         for(int i = 0 ; i < SaveManager.Instance.FieldsNeedingWork.Count ; i++){
  270.             fs = SaveManager.Instance.FieldsNeedingWork[i];
  271.             if(fs.treesToCut.Count > 0){
  272.                 Vector3 tree = fs.treesToCut[0];
  273.                 fs.treesToCut.RemoveAt(0);
  274.                 CutTreeAtPosition(tree, true);
  275.                 return;
  276.             }
  277.             else if(fs.rocks.Count > 0){
  278.                 Vector3 rock = fs.rocks[0].transform.position;
  279.                 fs.rocks.RemoveAt(0);
  280.                 PickUpRockAtPosition(rock, true);
  281.                 return;
  282.             }
  283.         }
  284.     }
  285.    
  286.     public void RegisterForFieldWork(){
  287.         if(cScript.fieldScript == null){
  288.             FieldScript fs = SaveManager.Instance.FieldsNeedingWork[0];
  289.             if(fs.applyForWork(cScript.gameObject)){
  290.                 cScript.fieldScript = fs;
  291.             }
  292.             else{
  293.                 return;
  294.             }
  295.         }
  296.        
  297.         cScript.isWorking = cScript.fieldScript.commitForWork();
  298.         if(cScript.isWorking){
  299.             if(cScript.fieldScript.state == FieldScript.State.Grown){
  300.                 HarvestFieldCrops();
  301.             }
  302.             else{
  303.                 TendToFieldCrops();
  304.             }
  305.         }
  306.        
  307.     }
  308.    
  309.     public void TendToFieldCrops(){
  310.         Transform[] cropList = cScript.fieldScript.getWorkableCrops(cScript.gameObject);
  311.         WalkToLocation(cropList[0].position);
  312.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  313.         AddAction(new TendToCrop(cropList, 0, cScript));
  314.         AddAction(new PlayAnimAndWait("Get_up", cScript));
  315.     }
  316.    
  317.     public void HarvestFieldCrops(){
  318.         CropScript[] cropList = cScript.fieldScript.GetHarvestableCrops(cScript.gameObject);
  319.         WalkToLocation(cropList[0].transform.position);
  320.         AddAction(new PlayAnimAndWait("BendDown", cScript));
  321.         AddAction(new HarvestCrops(cropList, 0, cScript));
  322.         AddAction(new PlayAnimAndWait("Get_up", cScript));
  323.        
  324.     }
  325.    
  326.     public void RegisterForClearingRoad(){
  327.         RoadScript rs = UpdateNearbyRoads.Instance.RoadsThatNeedClearing[0];
  328.         if(rs.treesToCut.Count > 0){
  329.             Vector3 tree = rs.treesToCut[0];
  330.             rs.treesToCut.RemoveAt(0);
  331.             rs.CheckIfClearingIsDone();
  332.             CutTreeAtPosition(tree, true);
  333.             return;
  334.         }
  335.         if(rs.rocks.Count > 0){
  336.             Vector3 rock = rs.rocks[0].transform.position;
  337.             rs.rocks.RemoveAt(0);
  338.             PickUpRockAtPosition(rock, true);
  339.             rs.CheckIfClearingIsDone();
  340.             return;        
  341.         }
  342.     }
  343.    
  344.     public void RegisterForHarvestingArea(){       
  345.         HarvestArea rs = SaveManager.Instance.harvestingAreas[0];
  346.         if(rs.treesToCut.Count > 0){
  347.             Vector3 tree = rs.getNextTree();
  348.             CutTreeAtPosition(tree, true);             
  349.             return;            
  350.         }
  351.         if(rs.rocks.Count > 0){
  352.             Vector3 rock = rs.getNextRock().transform.position;
  353.             PickUpRockAtPosition(rock, true);
  354.             return;
  355.         }
  356.     }
  357.    
  358.     public void MoveToRandomPoint(){       
  359.         Vector3 rand = getRandomPosition(cScript._myTransform);
  360.         if(rand != Vector3.zero){
  361.             AddAction(new PlayAnim("Walk_001", cScript));
  362.             AddAction(new MoveToLocation(rand, cScript));
  363.             AddAction(new PlayAnimAndWait("BendDown", cScript));
  364.             AddAction(new WaitTimer(5f, cScript));
  365.             AddAction(new PlayAnimAndWait("Get_up", cScript));
  366.         }
  367.     }
  368.    
  369.     #endregion
  370.     public void Test(){
  371.         Debug.Log("This has been called");
  372.     }
  373.    
  374.     public void DisableMesh(){
  375.         cScript.citizenMesh.enabled = false;
  376.     }
  377.    
  378.     public void EnableMesh(){
  379.         cScript.citizenMesh.enabled = true;
  380.     }
  381.    
  382.     public void CommitForWork(){
  383.         cScript.isWorking = cScript.workScript.commitForWork();
  384.     }
  385.    
  386.     public void LeaveWork(){
  387.         cScript.workScript.leaveWork();
  388.         cScript.workScript.WorkTasks.OnExit();
  389.         cScript.isWorking = false;
  390.     }
  391.    
  392.     public Vector3 getRandomPosition(Transform origin){
  393.         Vector3 pos = new Vector3(origin.position.x + Random.Range (-15, 15),
  394.                                   origin.position.y + 50.0f, origin.position.z + Random.Range (-15, 15));
  395.         //Ray ray;
  396.         RaycastHit hit;
  397.         if(Physics.Raycast (pos, Vector3.down, out hit, 100)){
  398.             Node node = AstarPath.active.GetNearest (hit.point).node;
  399.             if(node.walkable){
  400.                 return  new Vector3(node.position.x, node.position.y, node.position.z) * Int3.PrecisionFactor;
  401.             }
  402.         }
  403.         return Vector3.zero;
  404.     }
  405.    
  406. }
Advertisement
Add Comment
Please, Sign In to add comment