// Update is called once per frame public override void Update() { base.Update(); bool bWasInDangerOfStarving = AmInDangerOfStarving(); bool bWasInDangerOfBreaking = AmInDangerOfBreaking(); afNeeds[(int)Need.FOOD] -= 0.005f * Time.deltaTime; afNeeds[(int)Need.HUMAN_FOOD] -= 0.0025f * Time.deltaTime; afNeeds[(int)Need.ENTERTAINMENT] -= 0.0025f * Time.deltaTime; float minNeed = 0.0f; if (state == State.WORKING) { minNeed = 0.1f; } for (int i = 0; i < 3; i++) { afNeeds[i] = Mathf.Clamp(afNeeds[i], minNeed, 1.0f); } if (currentTask == null || currentTask.type != Task.Type.GO_MAD) { if (!bWasInDangerOfStarving && AmInDangerOfStarving()) { TextTicker.AddLine("<color=orange>" + lizardName + " is starving. Get them some food</color>"); AbandonTask(); if (state != State.IDLE) { SetState(State.IDLE); } } if (!bWasInDangerOfBreaking && AmInDangerOfBreaking()) { TextTicker.AddLine("<color=orange>" + lizardName + " is going mad. Get them some TV or fancy human food</color>"); AbandonTask(); if (state != State.IDLE) { SetState(State.IDLE); } } if (ShouldDie()) { AbandonTask(); TextTicker.AddLine("<color=red>" + lizardName + " died of starvation</color>"); Core.theTM.lizards[assignment].Remove(this); Destroy(); } if (ShouldGoMad()) { if (currentTask == null || currentTask.type != Task.Type.GO_MAD) { AbandonTask(); TextTicker.AddLine("<color=red>" + lizardName + " has gone mad and is trying to leave</color>"); SetAndLockAnim(climbAnim); currentTask = new Task(Task.Type.GO_MAD); DoTask(); } } } switch (state) { case State.IDLE: if (ShouldEat()) { // Check to see if there are reachable storerooms TileManager.TestTile del = delegate(TileBase tile) { return(tile.FindResource(Resource.ResourceType.MUSHROOMS) != null || tile.FindResource(Resource.ResourceType.HUMAN_FOOD) != null); }; var pathToFoods = Path.GetPath(currentTile.GetKVPair(), mgr.GetTiles(del)); if (pathToFoods != null) { TileBase targetTile = mgr.GetTileBase(pathToFoods.endX, pathToFoods.endY); foreach (Resource res in targetTile.clutteredResources) { if (!res.isClaimed && (res.type == Resource.ResourceType.MUSHROOMS || res.type == Resource.ResourceType.HUMAN_FOOD)) { res.Claim(this); break; } } if (claimed == null) { foreach (Resource res in targetTile.tidyResources) { if (res != null && !res.isClaimed && (res.type == Resource.ResourceType.MUSHROOMS || res.type == Resource.ResourceType.HUMAN_FOOD)) { res.Claim(this); break; } } } if (claimed != null) { AbandonTask(); SetState(State.RETRIEVING_RESOURCE); currentTask = new Task(Task.Type.EAT); SetPath(pathToFoods); break; } } } if (ShouldFindEntertainment()) { // Check to see if there are reachable storerooms TileManager.TestTile del = delegate(TileBase tile) { return(tile.Type() == TileBase.TileType.TVROOM); }; var pathToTV = Path.GetPath(currentTile.GetKVPair(), mgr.GetTiles(del)); if (pathToTV != null) { TileBase targetTile = mgr.GetTileBase(pathToTV.endX, pathToTV.endY); SetState(State.TRAVELLING_TO_TASK); currentTask = new Task(Task.Type.RELAX); currentTask.associatedTile = targetTile; currentTask.assignedLizard = this; SetPath(pathToTV); break; } } if (!AmInDangerOfStarving() && !AmInDangerOfBreaking()) { if (Player.thePlayer.pendingTasks[(int)assignment].Count != 0) { foreach (Task task in Player.thePlayer.pendingTasks[(int)assignment]) { // Check to see if this lizard can reach the task if (Path.GetPath(currentTile.GetKVPair(), task.associatedTile) != null) { currentTask = task; break; } } if (currentTask != null) { currentTask.assignedLizard = this; Player.thePlayer.pendingTasks[(int)assignment].Remove(currentTask); DoTask(); } break; } //Debug.Log("Calling GetPath to find dropped resources!"); var clutterPath = Path.GetPath(currentTile.GetKVPair(), mgr.GetClutteredTiles()); if (clutterPath != null) { // Check to see if there are reachable storerooms TileManager.TestTile del = delegate(TileBase tile) { return(tile.isConstructed && tile.Type() == TileBase.TileType.STORAGE && tile.NEmptyResourceSlots() > 0); }; //Debug.Log("Calling GetPath to check for a store room"); var storeroomPath = Path.GetPath(currentTile.GetKVPair(), mgr.GetTiles(del)); if (storeroomPath == null) { break; } SetState(State.RETRIEVING_RESOURCE); TileBase targetTile = mgr.GetTileBase(clutterPath.endX, clutterPath.endY); foreach (Resource res in targetTile.clutteredResources) { if (!res.isClaimed) { res.Claim(this); break; } } SetPath(clutterPath); break; } fIdleTime -= Time.deltaTime; if (!targetSet) { if (!currentTile.IsLizardy()) { TileManager.TestTile del = delegate(TileBase tile) { return(tile.IsLizardy()); }; if (!SetPath(Path.GetPath(currentTile.GetKVPair(), currentTile.GetAdjacentTiles(del)))) { AbandonTask(); TextTicker.AddLine("<color=red>" + lizardName + " was crushed</color>"); Core.theTM.lizards[assignment].Remove(this); Destroy(); } } else if (fIdleTime < 0) { SetTarget(GetTileCenter(currentTile) + new Vector3(Random.Range(-0.35f, 0.35f), 0.0f, 0.0f)); } } else if (Move()) { // Set a cooldown timer fIdleTime = Random.Range(1.0f, 5.0f); } } break; case State.TRAVELLING_TO_TASK: if (Move()) { if (currentTask.type == Task.Type.GO_MAD) { TextTicker.AddLine("<color=red>" + lizardName + " went mad and escaped!</color>"); Core.theTM.lizards[assignment].Remove(this); Player.thePlayer.AddSuspicion(25.0f); deathClip = null; Destroy(); } else { if (currentTask.associatedTile != null) { currentTask.associatedTile.SetTaskActive(true); } SetState(State.WORKING); } } break; case State.WORKING: switch (currentTask.type) { case Task.Type.BUILD: currentTask.UseResources(); if (currentTile.Build(this)) { FinishTask(); UI_HUD.instance.PlansFinished(currentTile.x, currentTile.y); if (currentTile.Type() == TileBase.TileType.FILLED) { } SetState(State.IDLE); } break; case Task.Type.BREED: if (currentTile is Hatchery) { if ((currentTile as Hatchery).Breed(this)) { FinishTask(); SetState(State.IDLE); } } break; case Task.Type.FARM: if (currentTile is MushroomFarm) { if ((currentTile as MushroomFarm).Farm()) { FinishTask(); SetState(State.IDLE); } } break; case Task.Type.TRAP: if (currentTile is Trap) { if ((currentTile as Trap).Farm()) { FinishTask(); SetState(State.IDLE); } } break; case Task.Type.TAILOR: if (currentTile is Tailor) { if ((currentTile as Tailor).Farm()) { FinishTask(); SetState(State.IDLE); } } break; case Task.Type.RELAX: if (currentTile is TVRoom) { afNeeds[(int)Need.ENTERTAINMENT] += 0.1f * Time.deltaTime; (currentTile as TVRoom).IncrementTVBill(0.1f * Time.deltaTime); if (afNeeds[(int)Need.ENTERTAINMENT] > 0.9f) { FinishTask(); SetState(State.IDLE); } } break; case Task.Type.SELL_RESOURCE: currentTask.UseResources(); int value = 0; foreach (KeyValuePair <Resource.ResourceType, int> count in currentTask.requiredResources) { value += Player.thePlayer.GetValue(count.Key) * count.Value; } Player.thePlayer.money += value; FinishTask(); // Maybe put in some animation stuff in time? James? // e.g. transport the resource up to the actual hut SetState(State.IDLE); break; case Task.Type.EAT: case Task.Type.WORK_ROOM: case Task.Type.GO_MAD: FinishTask(); break; } break; case State.RETRIEVING_RESOURCE: if (Move()) { if (currentTask == null) { // Find a storeroom with an empty slot TileManager.TestTile del = delegate(TileBase tile) { return(tile.Type() == TileBase.TileType.STORAGE && tile.NEmptyResourceSlots() > 0); }; //Debug.Log("Calling GetPath to go to a storeroom"); var storePath = Path.GetPath(currentTile.GetKVPair(), mgr.GetTiles(del)); if (storePath == null) { SetState(State.IDLE); break; } else { SetPath(storePath); } } else if (currentTask.associatedTile == null) { // No tile. Must be a self task switch (currentTask.type) { case Task.Type.EAT: Consume(claimed); break; default: Debug.Assert(false, "This task should have an associated tile"); break; } SetState(State.IDLE); return; } else { // Debug.Log("Calling GetPath to go to the target tile"); var tilePath = Path.GetPath(currentTile.GetKVPair(), currentTask.associatedTile); if (tilePath == null) { AbandonTask(); } else { SetPath(tilePath); } } if (claimed != null) { claimed.GiveToLizard(this); SetState(State.RETURNING_RESOURCE); } else { // Someone nicked it! SetState(State.IDLE); } } break; case State.RETURNING_RESOURCE: if (Move()) { if (currentTask == null) { //Debug.Log("Calling StoreResource"); carrying.PutInRoom(currentTile); SetState(State.IDLE); } else { currentTask.AddResource(carrying); DoTask(); } } break; } }