// Update is called once per frame void Update() { if (m_status == TraderStatus.Idle) { M_FindTrade(); } else if (m_status == TraderStatus.MovingToSupplier) { if (m_unit.m_destinationReached) { m_supplyCityObj.GetComponent <City>().m_resourceStockpiles[m_resource].M_TransferAllResourcesTo(ref m_stockpile); m_unit.M_SetDestination(m_demandCityObj.transform.position); m_status = TraderStatus.MovingToDemander; } } else if (m_status == TraderStatus.MovingToDemander) { if (m_unit.m_destinationReached) { ResourceStockpile targetStockpile = m_demandCityObj.GetComponent <City>().m_resourceStockpiles[m_resource]; // I really wish I had pointers to make this explicit... m_stockpile.M_TransferAllResourcesTo(ref targetStockpile); m_supplyCityObj.GetComponent <City>().m_resourceStockpiles[m_resource].M_TransferAllResourcesTo(ref m_stockpile); m_status = TraderStatus.Idle; } } }
// Calculates a trade route private void M_FindTrade() { float value = 0; foreach (GameObject demandCityObj in m_world.m_cities) { City demandCity = demandCityObj.GetComponent <City>(); // Iterate for demand foreach (KeyValuePair <Resource, float> kvp in demandCity.m_resourceDemands) { Resource resource = kvp.Key; float demand = kvp.Value; foreach (GameObject supplyCityObj in m_world.m_cities) { City supplyCity = supplyCityObj.GetComponent <City>(); if (supplyCityObj.GetInstanceID() == demandCityObj.GetInstanceID()) { continue; } //foreach(KeyValuePair<Resource, ResourceStockpile> supplyStockpiles in supplyCity.m_resourceStockpiles) //{ float supply = supplyCity.m_resourceStockpiles[kvp.Key].m_amount; float distanceToSupply = (transform.position - supplyCity.transform.position).magnitude; float distanceSupplyToDemand = (supplyCity.transform.position - demandCity.transform.position).magnitude; float totalDistance = distanceToSupply + distanceSupplyToDemand; float newValue = M_CalculateTradeValue(demand, supply, totalDistance); if (newValue > m_demandThreshold) { if (newValue > value) { value = newValue; m_resource = resource; m_supplyCityObj = supplyCityObj; m_demandCityObj = demandCityObj; // Start moving to supply city m_status = TraderStatus.MovingToSupplier; m_unit.M_SetDestination(m_supplyCityObj.transform.position); } } } } } }