Esempio n. 1
0
        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);
        }
Esempio n. 2
0
    /// <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);
    }
Esempio n. 3
0
        /// <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());
            }
        }
Esempio n. 4
0
        /// <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());
            }
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        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!";
                    }
                }
            }
        }
Esempio n. 7
0
        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));
        }
Esempio n. 8
0
    /// <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);
    }
Esempio n. 9
0
        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!";
                            }
                        }
                    }
                }
            }
        }
Esempio n. 10
0
    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);
    }