Noble Master Games
Noble Master Games
Navigation
Categories:

Search:

Meta:

Archives:
Dev. Blog
Forums
 

Noble Master Developer's Blog

July 29, 2010

Age of Conquest: Income & Expenses

Filed under: Development — noblemaster @ 10:38

Due to numerous requests, below is a description of income & expenses in Age of Conquest III. The system is up and running on Android already and will come to PC, Macintosh & Linux soon.

The income and expenses for each turn are calculated as follows:

World world = ... // the world including everything
Entity entity = ... // the empire we are doing the calculations for

// assets
long money = entity.getMoney();

// income: tax
long taxIncome = getTaxIncome(world.getProduction(entity), 
                              entity.getTaxRate(), 
                              entity.getMorale()); 
money += taxIncome;

// income: vassals
for (Entity vassal: vassals) {
  long vassalIncome = getTaxIncome(world.getProduction(vassal),
                                   vassal.getTaxRate(), 
                                   vassal.getMorale());
  money += getVassalPay(taxIncome);
}

// expenses: economy and military spending
money -= getEconomySpending(taxIncome, entity.getSpendingEconomy()));
money -= getMilitarySpending(world.getMilitary(entity), 
                             entity.getSpendingMilitary()));

// expenses: tributes to vassal masters
for (Entity master: masters) {
  money -= getVassalPay(taxIncome);
} 

Please note, production is a factor of economy x population.

Utility functions to calculate costs as well as economy, population and military increases/decreases depending on the spending settings chosen.

  /** The percent the vassal pays. */
  public static final int VASSAL_PAY_PERCENTAGE = 10;

  /** The standard economy spending in percent [0, 100]. */
  public static final int STANDARD_SPENDING_ECONOMY = 80;
  /** The standard military spending in percent [0, 100]. */
  public static final int STANDARD_SPENDING_MILITARY = 80;

  /**
   * Returns the tax for the given number of people.
   *
   * @param production  The production.
   * @param taxRate  The tax rate in percent [0, 100].
   * @param morale  The morale in percent [0, 100].
   * @return  The tax.
   */
  public long getTaxIncome(long production, int taxRate, int morale) {
    return Math.round(Math.pow(production * 0.08d, 0.96d) * taxRate/10*morale/100);
  }

  /**
   * Returns the payment a vassal slave has to pay to 
   * his master based on his production.
   *
   * @param taxIncome  The tax income of the vassal slave.
   * @return  The pay a vassal slave has to pay to his master.
   */
  public long getVassalPay(long taxIncome) {
    return taxIncome * VASSAL_PAY_PERCENTAGE / 100;
  }

  /**
   * Returns the investment spending for the given tax income.
   *
   * @param taxIncome  The tax income.
   * @param economySpending  The economy spending.
   * @return  The expenses.
   */
  public long getEconomySpending(long taxIncome, int economySpending) {
    return (taxIncome / 10) * economySpending / STANDARD_SPENDING_ECONOMY;
  }

  /**
   * Returns the economy increase for the given spending rate.
   *
   * @param economySpending  The spending.
   * @return  The increase factor. Stays stable for 1, decreases 
   * or less than 1 and increases for more than 1.
   */
  public float getEconomyIncrease(int economySpending) {
    return 1.03f + ((economySpending - Market.STANDARD_SPENDING_ECONOMY) * 0.03f / 100);
  }

  /**
   * Returns the population increase for the given spending rate.
   *
   * @param economySpending  The spending.
   * @return  The increase factor. Stays stable for 1, decreases 
   * for less than 1 and increases for more than 1.
   */
  public float getPopulationIncrease(int economySpending) {
    return 1.01f + (economySpending * 0.001f);
  }

  /**
   * Returns the upkeep cost for the given number of military units.
   *
   * @param military  The military units.
   * @param militarySpending  The military spending.
   * @return  The upkeep cost.
   */
  public long getMilitarySpending(long military, int militarySpending) {
    return (military / 5) * militarySpending / STANDARD_SPENDING_MILITARY;
  }

  /**
   * Returns the military increase for the given spending rate.
   *
   * @param militarySpending  The spending.
   * @return  The increase factor. Stays stable for 1, decreases 
   * for less than 1 and increases for more than 1.
   */
  public float getMilitaryIncrease(int militarySpending) {
    return 1.0f + ((militarySpending - Market.STANDARD_SPENDING_MILITARY) * 0.5f / 100);
  }

No Comments »

No comments yet.

Leave a comment