public void consume(Country owner) { var needs = getRealNeeds(owner); float shortage = 0f; Storage realConsumption = Storage.EmptyProduct; foreach (var need in needs) { if (owner.countryStorageSet.has(need)) { if (need.isAbstractProduct()) { // convertToBiggestStorageProduct here are duplicated in this.getConsumptionProcent() (getBiggestStorage()) realConsumption = owner.countryStorageSet.convertToBiggestStorage(need); } else { realConsumption = need; } if (realConsumption.isNotZero()) { owner.consumeFromCountryStorage(realConsumption, owner); //owner.countryStorageSet.subtract(realConsumption); consumption.Add(realConsumption); } } else { shortage += need.get(); } } float moraleChange = getConsumptionProcent(Product.Food, owner).get() - morale.get(); moraleChange = Mathf.Clamp(moraleChange, Options.ArmyMaxMoralChangePerTic * -1f, Options.ArmyMaxMoralChangePerTic); if (morale.get() + moraleChange < 0) { morale.Set(0f); } else { morale.Add(moraleChange); } if (this.origin.Type == PopType.Soldiers && morale.isBiggerThan(origin.loyalty)) { morale.Set(origin.loyalty); } if (morale.isBiggerThan(Procent.HundredProcent)) { morale.Set(1f); } //if (getPopUnit().loyalty.isSmallerThan(Options.PopMinLoyaltyToMobilizeForGovernment)) // Country.demobilize(x => x.getPopUnit() == this); }
/// <summary> /// per level /// </summary> internal Procent getEfficiency(bool useBonuses) { //limit production by smalest factor float efficencyFactor = 0; float workforceProcent = getWorkForceFullFilling(); float inputFactor = getInputFactor(); if (inputFactor < workforceProcent) { efficencyFactor = inputFactor; } else { efficencyFactor = workforceProcent; } //float basicEff = efficencyFactor * getLevel(); //Procent result = new Procent(basicEff); Procent result = new Procent(efficencyFactor); if (useBonuses) { result.set(result.get() * (1f + modifierEfficiency.getModifier(province.owner) / 100f)); } return(result); }
/// <summary> Return in pieces basing on current prices and needs /// </summary> protected float getLocalEffectiveDemand(Product product, Procent multiplier) { // need to know how much i Consumed inside my needs Storage need = type.resourceInput.GetFirstSubstituteStorage(product).Copy(); if (need.isZero()) { return(0f); } else { Storage realNeed = need.Multiply(multiplier.get()); Storage canAfford = HowMuchCanAfford(realNeed); return(canAfford.get()); } }
/// <summary> Return in pieces basing on current prices and needs /// </summary> protected float getLocalEffectiveDemand(Product product, Procent multiplier) { // need to know how much i Consumed inside my needs Storage need = getType().resourceInput.getFirstStorage(product); if (need.isZero()) { return(0f); } else { //Storage realNeed = new Storage(need.getProduct(), need.get() * multiplier.get()); Storage realNeed = need.multiplyOutside(multiplier.get()); //Storage realNeed = new Storage(need.getProduct(), need.get() * getInputFactor()); Storage canAfford = howMuchCanAfford(realNeed); return(canAfford.get()); } }
/// <summary> /// Buying PrimitiveStorageSet, subsidizations allowed /// </summary> //internal void SellList(Consumer buyer, StorageSet buying, Country subsidizer) //{ // foreach (Storage item in buying) // if (item.isNotZero()) // buy(buyer, item, subsidizer); //} /// <summary> /// Buying needs in circle, by Procent in time /// return true if buying is zero (bought all what it wanted) /// </summary> internal bool Sell(Producer buyer, StorageSet stillHaveToBuy, Procent buyInTime, List <Storage> ofWhat) { bool buyingIsFinished = true; foreach (Storage what in ofWhat) { Storage consumeOnThisIteration = new Storage(what.Product, what.get() * buyInTime.get()); if (consumeOnThisIteration.isZero()) { return(true); } // check if consumeOnThisIteration is not bigger than stillHaveToBuy if (!stillHaveToBuy.has(consumeOnThisIteration)) { consumeOnThisIteration = stillHaveToBuy.getBiggestStorage(what.Product); } var reallyBought = Sell(buyer, consumeOnThisIteration, null); stillHaveToBuy.Subtract(reallyBought); if (stillHaveToBuy.getBiggestStorage(what.Product).isNotZero()) { buyingIsFinished = false; } } return(buyingIsFinished); }
private void refresh(bool callRebuildDropDown) { table.Refresh(); //if (Game.Player.movements != null) movementsText.text = Game.Player.movements.getString(); if (movementsText.preferredHeight > 90 && movementsText.preferredHeight < 130) { movementsText.text += "\n\n\n\n"; } movementsHorizontalScrollBar.value = 0; if (selectedReform == null) { voteButton.interactable = false; voteButton.GetComponentInChildren <Text>().text = "Select reform"; descriptionText.text = "Select reform from left"; forceDecisionButton.GetComponent <ToolTipHandler>().SetText(""); voteButton.GetComponent <ToolTipHandler>().SetText(""); } //did selected reform else { if (callRebuildDropDown) // meaning changed whole reform { rebuildDropDown(); } descriptionText.text = selectedReform + " reforms " + selectedReform.getDescription() + "\nCurrently: " + selectedReform.getValue() + " " + selectedReform.getValue().getDescription() + "\nSelected: "; //if (selectedReformValue != null) if (selectedReformValue != selectedReform.getValue()) { descriptionText.text += selectedReformValue + " " + selectedReformValue.getDescription(); } else { descriptionText.text += "current"; } //// Procent procentPopulationSayedYes = new Procent(0f); Procent procentVotersSayedYes = Game.Player.getYesVotes(selectedReformValue, ref procentPopulationSayedYes); Dictionary <PopType, int> divisionPopulationResult = new Dictionary <PopType, int>(); Dictionary <PopType, int> divisionVotersResult = Game.Player.getYesVotesByType(selectedReformValue, ref divisionPopulationResult); if (selectedReformValue != selectedReform.getValue()) { if (Game.Player.government.getValue() != Government.Despotism) { descriptionText.text += "\n" + procentVotersSayedYes + " of voters want this reform ( "; foreach (PopType type in PopType.getAllPopTypes()) { if (divisionVotersResult[type] > 0) { Procent res = new Procent(divisionVotersResult[type] / (float)Game.Player.getPopulationAmountByType(type)); descriptionText.text += res + " of " + type + "; "; } } descriptionText.text += ")"; } else { descriptionText.text += "\nNobody to vote - Despot rule everything"; } descriptionText.text += "\n" + procentPopulationSayedYes + " of population want this reform ( "; foreach (PopType type in PopType.getAllPopTypes()) { if (divisionPopulationResult[type] > 0) { Procent res = new Procent(divisionPopulationResult[type] / (float)Game.Player.getPopulationAmountByType(type)); descriptionText.text += res + " of " + type + "; "; } } descriptionText.text += ")"; } if (selectedReformValue != null)// && selectedReformValue != selectedReform.getValue()) { if (procentVotersSayedYes.get() >= Options.votingPassBillLimit || Game.Player.government.getValue() == Government.Despotism) { // has enough voters voteButton.interactable = selectedReformValue.allowed.isAllTrue(Game.Player, selectedReformValue, out voteButton.GetComponent <ToolTipHandler>().text); forceDecisionButton.GetComponent <ToolTipHandler>().SetText(voteButton.GetComponent <ToolTipHandler>().GetText()); forceDecisionButton.interactable = false; voteButton.GetComponentInChildren <Text>().text = "Vote for " + selectedReformValue; } else // not enough voters { voteButton.interactable = false; forceDecisionButton.interactable = selectedReformValue.allowed.isAllTrue(Game.Player, selectedReformValue, out forceDecisionButton.GetComponent <ToolTipHandler>().text); voteButton.GetComponent <ToolTipHandler>().SetText(forceDecisionButton.GetComponent <ToolTipHandler>().GetText()); voteButton.GetComponentInChildren <Text>().text = "Not enough votes"; forceDecisionButton.GetComponent <ToolTipHandler>().text += "\n\nForcing decision against people's desires will drop loyalty!"; } } } }
protected Procent getInputFactor(Procent multiplier) { if (multiplier.isZero()) { return(Procent.ZeroProcent); } if (getType().isResourceGathering()) { return(Procent.HundredProcent); } float inputFactor = 1; List <Storage> reallyNeedResources = new List <Storage>(); //Storage available; // how much we really want foreach (Storage input in getType().resourceInput) { reallyNeedResources.Add(input.multiplyOutside(multiplier)); } // checking if there is enough in market //old DSB //foreach (Storage input in realInput) //{ // available = Game.market.HowMuchAvailable(input); // if (available.get() < input.get()) // input.set(available); //} // check if we have enough resources foreach (Storage resource in reallyNeedResources) { Storage haveResource = getInputProductsReserve().getBiggestStorage(resource.getProduct()); //if (!getInputProductsReserve().has(resource)) if (haveResource.isSmallerThan(resource)) { // what we really have resource.set(haveResource); } } //old last turn consumption checking thing //foreach (Storage input in realInput) //{ // //if (Game.market.getDemandSupplyBalance(input.getProduct()) >= 1f) // //available = input // available = consumedLastTurn.findStorage(input.getProduct()); // if (available == null) // ;// do nothing - pretend there is 100%, it fires only on shownFactory start // else // if (!justHiredPeople && available.get() < input.get()) // input.set(available); //} // checking if there is enough money to pay for // doesn't have sense with inputReserv //foreach (Storage input in realInput) //{ // Storage howMuchCan = wallet.HowMuchCanAfford(input); // input.set(howMuchCan.get()); //} // searching lowest factor foreach (Storage need in reallyNeedResources)//todo optimize - convert into for i { float denominator = getType().resourceInput.getFirstStorage(need.getProduct()).get() * multiplier.get(); if (denominator != 0f) { float newFactor = need.get() / denominator; if (newFactor < inputFactor) { inputFactor = newFactor; } } else // no resources { inputFactor = 0f; } } return(new Procent(inputFactor)); }
/// <summary> /// return true if buying is zero /// </summary> internal bool Buy(Producer buyer, PrimitiveStorageSet buying, Procent buyInTime, PrimitiveStorageSet ofWhat) { bool buyingIsEmpty = true; foreach (Storage what in ofWhat) { Storage consumeOnThisEteration = new Storage(what.getProduct(), what.get() * buyInTime.get()); if (consumeOnThisEteration.get() == 0) { return(true); } // check if buying still have enoth to subtract consumeOnThisEteration if (!buying.has(consumeOnThisEteration)) { consumeOnThisEteration = buying.findStorage(what.getProduct()); } consumeOnThisEteration.multipleInside(Consume(buyer, consumeOnThisEteration, null)); buying.subtract(consumeOnThisEteration); if (buying.findStorage(what.getProduct()).get() > 0) { buyingIsEmpty = false; } } return(buyingIsEmpty); }
private void refresh(bool callRebuildDropDown) { table.Refresh(); movementsText.text = ToStringExtensions.ToString(Game.Player.Politics.AllMovements.OrderByDescending(x => x.getRelativeStrength(Game.Player).get())); if (movementsText.preferredHeight > 90 && movementsText.preferredHeight < 130) { movementsText.text += "\n\n\n\n"; } movementsHorizontalScrollBar.value = 0; if (ReferenceEquals(selectedReformType, null)) { voteButton.interactable = false; voteButton.GetComponentInChildren <Text>().text = "Select reform"; descriptionText.text = "Select reform from left"; forceDecisionButton.GetComponent <ToolTipHandler>().SetText(""); voteButton.GetComponent <ToolTipHandler>().SetText(""); } else //did selected reform { if (callRebuildDropDown) // meaning changed whole reform { rebuildDropDown(); } descriptionText.text = selectedReformType.ShortName + " reforms " + selectedReformType.FullName + "\nCurrently: "; // todo fix that mess in 3 places var isUnemploymentReformType = selectedReformType.Value as UnemploymentSubsidies.UnemploymentReformValue; if (isUnemploymentReformType == null) { var isUBIReform = selectedReformType.Value as UBI.UBIReformValue; if (isUBIReform == null) { var isPovertyAid = selectedReformType.Value as PovertyAid.PovertyAidReformValue; if (isPovertyAid == null) { // default text descriptionText.text += selectedReformType.Value; var isNamedReformType = selectedReformType.Value as INameable; if (isNamedReformType != null) { descriptionText.text += isNamedReformType.FullName; } } else { descriptionText.text += isPovertyAid.ToString(Game.Player.market); } } else { descriptionText.text += isUBIReform.ToString(Game.Player.market); } } else { descriptionText.text += isUnemploymentReformType.ToString(Game.Player.market); } descriptionText.text += "\nSelected: "; if (selectedReformType == selectedReformValue) { descriptionText.text += "current"; forceDecisionButton.interactable = false; voteButton.interactable = false; } else { //else { var isUnempValue = selectedReformValue as UnemploymentSubsidies.UnemploymentReformValue; if (isUnempValue != null) { descriptionText.text += isUnempValue.ToString(Game.Player.market); } else { var isPvrtREf = selectedReformValue as PovertyAid.PovertyAidReformValue; if (isPvrtREf != null) { descriptionText.text += isPvrtREf.ToString(Game.Player.market); } else { var isUBIRfr = selectedReformValue as UBI.UBIReformValue; if (isUBIRfr != null) { descriptionText.text += isUBIRfr.ToString(Game.Player.market); } else { var isNamedReformValue = selectedReformValue as INameable; if (isNamedReformValue != null) { descriptionText.text += isNamedReformValue.FullName; } else { descriptionText.text += selectedReformValue; } } } } } Procent procentPopulationSayedYes = new Procent(0f); Procent procentVotersSayedYes = Game.Player.Provinces.getYesVotes(selectedReformValue, ref procentPopulationSayedYes); Dictionary <PopType, int> divisionPopulationResult = new Dictionary <PopType, int>(); Dictionary <PopType, int> divisionVotersResult = Game.Player.Provinces.getYesVotesByType(selectedReformValue, ref divisionPopulationResult); RefreshInfoAboutVotes(procentVotersSayedYes, procentPopulationSayedYes, divisionVotersResult, divisionPopulationResult); // Control buttons interactability && tooltips if (selectedReformValue != null) { if (procentVotersSayedYes.get() >= Options.votingPassBillLimit && Game.Player.government != Government.Despotism) { // can vote for reform voteButton.interactable = selectedReformValue.IsAllowed(Game.Player, selectedReformValue, out voteButton.GetComponent <ToolTipHandler>().text); forceDecisionButton.GetComponent <ToolTipHandler>().SetText(voteButton.GetComponent <ToolTipHandler>().GetText()); forceDecisionButton.interactable = false; voteButton.GetComponentInChildren <Text>().text = "Vote for " + selectedReformValue; } else // not enough votes for reform or is despotism { voteButton.interactable = false; forceDecisionButton.interactable = selectedReformValue.IsAllowed(Game.Player, selectedReformValue, out forceDecisionButton.GetComponent <ToolTipHandler>().text); voteButton.GetComponent <ToolTipHandler>().SetText(forceDecisionButton.GetComponent <ToolTipHandler>().GetText()); voteButton.GetComponentInChildren <Text>().text = "Not enough votes"; if (Game.Player.government == Government.Despotism) { forceDecisionButton.GetComponent <ToolTipHandler>().text += "\n\nPeople wouldn't be that angry if you force decisions as Despot"; } else { forceDecisionButton.GetComponent <ToolTipHandler>().text += "\n\nForcing decision against people's desires will drop loyalty!"; } } } } } }
public void refresh(bool callRebuildDropDown) { hide(); if (selectedReform != null) { if (callRebuildDropDown) // meaning changed whole reform { rebuildDropDown(); } descriptionText.text = selectedReform + " reforms - " + selectedReform.getDescription() + "\n\nCurrently: " + selectedReform.getValue() + " - " + selectedReform.getValue().getDescription() + "\n\nSelected: "; //if (selectedReformValue != null) if (selectedReformValue != selectedReform.getValue()) { descriptionText.text += selectedReformValue + " - " + selectedReformValue.getDescription(); } else { descriptionText.text += "current"; } //// Procent procentPopulationSayedYes = new Procent(0f); Procent procentVotersSayedYes = Game.player.getYesVotes(selectedReformValue, ref procentPopulationSayedYes); Dictionary <PopType, uint> divisionPopulationResult = new Dictionary <PopType, uint>(); Dictionary <PopType, uint> divisionVotersResult = Game.player.getYesVotesByType(selectedReformValue, ref divisionPopulationResult); if (selectedReformValue != selectedReform.getValue()) { if (Game.player.government.status != Government.Despotism) { descriptionText.text += "\n\n" + procentVotersSayedYes + " of voters want this reform ( "; foreach (PopType type in PopType.allPopTypes) { if (divisionVotersResult[type] > 0) { Procent res = new Procent(divisionVotersResult[type] / (float)Game.player.FindPopulationAmountByType(type)); descriptionText.text += res + " of " + type + "; "; } } descriptionText.text += ")"; } else { descriptionText.text += "\n\nNobody to vote - Despot rule everything"; } descriptionText.text += "\n" + procentPopulationSayedYes + " of population want this reform ( "; foreach (PopType type in PopType.allPopTypes) { if (divisionPopulationResult[type] > 0) { Procent res = new Procent(divisionPopulationResult[type] / (float)Game.player.FindPopulationAmountByType(type)); descriptionText.text += res + " of " + type + "; "; } } descriptionText.text += ")"; } if (selectedReformValue != null && selectedReformValue != selectedReform.getValue()) { if (procentVotersSayedYes.get() >= Game.votingPassBillLimit || Game.player.government.status == Government.Despotism) { // has enough voters voteButton.interactable = selectedReformValue.allowed.isAllTrue(Game.player, out voteButton.GetComponentInChildren <ToolTipHandler>().tooltip); forceDecisionButton.GetComponentInChildren <ToolTipHandler>().tooltip = voteButton.GetComponentInChildren <ToolTipHandler>().tooltip; forceDecisionButton.interactable = false; voteButton.GetComponentInChildren <Text>().text = "Vote " + selectedReformValue; } else // not enough voters { voteButton.interactable = false; forceDecisionButton.interactable = selectedReformValue.allowed.isAllTrue(Game.player, out forceDecisionButton.GetComponentInChildren <ToolTipHandler>().tooltip); voteButton.GetComponentInChildren <ToolTipHandler>().tooltip = forceDecisionButton.GetComponentInChildren <ToolTipHandler>().tooltip; voteButton.GetComponentInChildren <Text>().text = "Not enough votes"; } } else // this reform already enacted { voteButton.interactable = false; forceDecisionButton.interactable = false; forceDecisionButton.GetComponentInChildren <ToolTipHandler>().tooltip = ""; voteButton.GetComponentInChildren <ToolTipHandler>().tooltip = ""; } } //didnt selected reform else { voteButton.interactable = false; voteButton.GetComponentInChildren <Text>().text = "Select reform"; descriptionText.text = "Select reform from left"; forceDecisionButton.GetComponentInChildren <ToolTipHandler>().tooltip = ""; voteButton.GetComponentInChildren <ToolTipHandler>().tooltip = ""; } show(false); }