private void DecomposeTechs(SerializableCivilizationData civData, ICivilization newCiv) { if (civData.TechQueue != null) { for (int i = 0; i < civData.TechQueue.Count; i++) { var techName = civData.TechQueue[i]; var techOfName = AvailableTechs.Where(tech => tech.Name.Equals(techName)).FirstOrDefault(); if (techOfName == null) { throw new InvalidOperationException(string.Format("CivData.TechQueue had invalid tech name {0} in it", techName)); } newCiv.TechQueue.Enqueue(techOfName); } } if (civData.DiscoveredTechs != null) { foreach (var discoveredTechName in civData.DiscoveredTechs) { var techOfName = AvailableTechs.Where(tech => tech.Name.Equals(discoveredTechName)).FirstOrDefault(); if (techOfName == null) { throw new InvalidOperationException( string.Format("CivData.DiscoveredTechs had invalid tech name {0} in it", discoveredTechName) ); } TechCanon.SetTechAsDiscoveredForCiv(techOfName, newCiv); } } if (civData.ProgressOnTechs != null) { foreach (var techInProgressName in civData.ProgressOnTechs.Keys) { var techOfName = AvailableTechs.Where(tech => tech.Name.Equals(techInProgressName)).FirstOrDefault(); if (techOfName == null) { throw new InvalidOperationException( string.Format("CivData.ProgressOnTechs had invalid tech name {0} in it", techInProgressName) ); } TechCanon.SetProgressOnTechByCiv(techOfName, newCiv, civData.ProgressOnTechs[techInProgressName]); } } }
public void PerformResearch() { if (TechQueue.Count > 0) { var activeTech = TechQueue.Peek(); int techProgress = TechCanon.GetProgressOnTechByCiv(activeTech, this); techProgress += LastScienceYield; if (techProgress >= activeTech.Cost && TechCanon.IsTechAvailableToCiv(activeTech, this)) { TechCanon.SetTechAsDiscoveredForCiv(activeTech, this); TechQueue.Dequeue(); } else { TechCanon.SetProgressOnTechByCiv(activeTech, this, techProgress); } } }