private bool CampfireBucket() { float score; TaskScore newScore; int TaskIndex = 1; m_Scores.Clear(); m_CFBucketUI.ToggleTasks(true); // Light campfire // Only score it if the campfire isn't lit if (!m_Campfire.IsLit() && m_Inventory.QueryLog() + m_Woodstore.QueryAmount() + m_Campfire.GetLogsRemaining() > 0) { float TimeUnlit = m_Campfire.GetUnlitTime(); float MaxTime = m_Campfire.m_WolfThreatTime; score = Mathf.Min(Mathf.Pow(TimeUnlit / MaxTime, LIGHT_FIRE_EXPONENT) + LIGHT_FIRE_BASE, 1.0f); newScore = new TaskScore(score, TaskIndex, CharacterTaskDeployer.Task.Firelighting); m_Scores.Add(newScore); m_CFBucketText[TaskIndex].text = score.ToString("0.000"); } TaskIndex++; // Add logs to fire // Only if we have logs AND the campfire isn't full if (m_Inventory.QueryLog() + m_Woodstore.QueryAmount() > 0 && m_Campfire.GetLogsRemaining() < m_Campfire.m_MaxLogs) { float FireRatio = 1.0f - (m_Campfire.GetAccurateLogsRemaining() / m_Campfire.m_MaxLogs); score = Mathf.Max(FireRatio, 0.0f); newScore = new TaskScore(score, TaskIndex, CharacterTaskDeployer.Task.Firebuilding); m_Scores.Add(newScore); m_CFBucketText[TaskIndex].text = score.ToString("0.000"); } TaskIndex++; // Chop wood // Only if there's space in inventory AND if theres trees available AND if the characters stats aren't too high if (m_Inventory.QuerySpace((int)Resource.Log) > 0 && m_Forest.GetActiveCount() > 0 && AbleToWork()) { float CurrentWood = m_Woodstore.QueryAmount() + m_Inventory.QueryLog() + m_Campfire.GetLogsRemaining(); float MaxWood = m_Woodstore.m_StorageLimit + m_Campfire.m_MaxLogs; score = Mathf.Min(1.0f - (CurrentWood / MaxWood), 1.0f); newScore = new TaskScore(score, TaskIndex, CharacterTaskDeployer.Task.Chopping); m_Scores.Add(newScore); m_CFBucketText[TaskIndex].text = score.ToString("0.000"); } TaskIndex++; // Deposit logs // Only score if the character has logs and there is space in the store if (m_Inventory.QueryLog() > 0 && m_Woodstore.QuerySpace() > 0) { score = (m_Inventory.QueryLog() * m_Inventory.m_LogWeight) / m_Inventory.QueryWeight(); newScore = new TaskScore(score, TaskIndex, CharacterTaskDeployer.Task.Depositing, Resource.Log); m_Scores.Add(newScore); m_CFBucketText[TaskIndex].text = score.ToString("0.000"); } return(HandleScores(TaskIndex, m_CFBucketText)); }
// Method to attempt adding logs to campfire private void AddToFire() { // Step 1) Movement and pathing checks if (!MovementChecker()) // Check if position ready and movement finished { return; // False returned = not ready, so exit function } // Step 2) Check and set: timer, rotation and mesh if (!m_InPosition) // Use position flag to track rotation and mesh { transform.LookAt(new Vector3(m_Campfire.transform.position.x, // Look at resource transform.position.y, m_Campfire.transform.position.z)); // Ignore y component m_Mesh.SetMeshAlternate((int)m_CurrentTask, m_Alternate); // Set appropriate mesh m_InPosition = true; // Set ready flag } if (TimerChecker()) // Run timer checks and see if it's completed { if (m_Inventory.TakeAmount(1, (int)Resource.Log)) // Attempt to take a log from character inventory { if (m_Campfire.AddLogs(1)) // Attempt to add a log to campfire { m_TaskProgress += 1; // Increment task progress if (m_TaskProgress == m_TaskGoal) // Check if task goal now met { m_TaskCompleted = true; // Set success flag if (!m_Campfire.IsLit()) // Check if campfire is NOT lit { QueueNextTask(Task.Firelighting, Resource.Log); // Queue the light fire task at front of queue } return; // Exit function } m_Timer = m_TaskTimes[(int)m_CurrentTask]; // Otherwise reset timer return; // and exit function } m_Inventory.AddAmount(1, (int)Resource.Log); // Otherwise couldn't add to fire so return log to inventory } // Failed log withdrawal so quit task m_CantComplete = true; // Set failure flag return; // and exit } // Otherwise timer not complete so wait till it is } // End of AddLog() function