Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| outpost_2:concepts:population_and_morale [2023/10/31 07:41] – blackbox222 | outpost_2:concepts:population_and_morale [2026/05/22 01:14] (current) – Fixed formatting and added more info BlackBox | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| There are three classes of colonists in OP2: | There are three classes of colonists in OP2: | ||
| - | * Kids: All colonists start out as Children born at the Nursery. | + | |
| - | * Workers: Workers are required for operation of most structures, and can be trained into up to 10 Scientists at a time at any active University. | + | |
| - | * Scientists: Scientists are also required to operate certain structures, and can also do [[Outpost 2:Outpost 2 Manual: | + | |
| - | ===== Population | + | **Morale** is a " |
| + | |||
| + | ^ Morale Level ^ `morale.txt` Name ^ Min Morale ^ Research Modifier ^ Production Modifier ^ Food Modifier ^ Fertility Modifier ^ Death Modifier ^ | ||
| + | | Excellent | ||
| + | | Good | `GROOVY` | ||
| + | | Fair | `OKAYFINE` | ||
| + | | Poor | `UPSET` | ||
| + | | Terrible | ||
| + | |||
| + | Numerous constants governing morale calculations are defined in `morale.txt`. For example, the morale levels and associated modifiers are defined at the top of `morale.txt` as `M_PTS_TOT`, | ||
| + | |||
| + | In " | ||
| + | |||
| + | ==== Strategy | ||
| + | |||
| + | * Despite there being a " | ||
| + | * Veteran OP2 players strive for 30-40% demand to give a decent reduction to death rate. | ||
| + | * There is limited value in having more than 1 Nursery and University: | ||
| + | * Multiple nurseries do not increase birth rate, only decreasing kid death rate by providing 40 capacity for kids, but this is quickly obsoleted when Med Centers become available as they have a base capacity of 50, upgradeable to 75 (and apply to all colonists). | ||
| + | * Multiple universities do not increase worker training rate (though later in the game, multiple universities can be built in order to train more than 10 scientists at a time). | ||
| + | * Birth rate and death rate are affected favorably by high morale, so it's in your best interest to keep morale reasonably high. | ||
| + | * There is no value in researching Leisure Studies / Public Performance (to build Recreation Facilities or Forums). As described below, this does not factor into Morale at all until the tech is researched, at which point it only hurts you due to the Morale penalty from not building any rec centers (which require Workers and Power to run without providing any other benefit). Since it's not a prerequisite for any other techs besides Multitainment Console Upgrade (which increases the capacity of rec centers) there is zero useful reason to research it. | ||
| + | * When playing as Eden, spamming Impulse Items from Consumer Goods Factories is one of the most effective ways to artificially boost morale in the late game by keeping event morale high (so long as you can spare the resources): | ||
| + | * Despite Wares and Luxury Wares giving a larger morale bonus, Impulse Items are more time- and cost-effective due to having a build time of 800 and only requiring 150 common metal. | ||
| + | * Destroying " | ||
| + | |||
| + | ==== Morale | ||
| + | |||
| + | There are two kinds of morale, Base Conditions, and Events. These are handled separately. | ||
| + | |||
| + | Base conditions are derived from colony conditions such as unemployed workers, disabled buildings, food production, etc. Events are temporary morale adjustments that happen which are computed into a single value that decays over time such as kid births, disasters, structures destroyed, etc. | ||
| + | |||
| + | While many of the values in morale.txt are stored as a percentage out of 100, internally the game scales these values to be a fraction out of 256. The calculations described below use the game's scaled value as such, e.g.: | ||
| + | |||
| + | < | ||
| + | Internal Value = ((Percent * 256) + 50) / 100 | ||
| + | </ | ||
| + | |||
| + | The game also stores various ratios described below in terms of hundredths of a percent (i.e. 100% = 10000) to avoid floating point rounding errors in calculation. | ||
| + | |||
| + | The following calculations are (roughly) shown in the order the game computes them during a morale update. | ||
| + | |||
| + | === Event Morale Decay === | ||
| + | |||
| + | First, event morale decays according to the following formula: | ||
| + | < | ||
| + | Event Morale = (Event Morale * EVENT_DEC_RATE + (255 if Event Morale is negative)) / 256 | ||
| + | </ | ||
| + | |||
| + | Adding 255 in the case that event morale is negative ensures that it will get back to 0 given enough time. `EVENT_DEC_RATE` is a value from `morale.txt` used to adjust the decay rate. | ||
| + | |||
| + | === Base Conditions === | ||
| + | |||
| + | Next, base conditions are calculated, determining how current colony conditions affect morale. | ||
| + | |||
| + | ** Residence Demand ** | ||
| + | |||
| + | First, if residence capacity is nonzero, residence demand is computed using the following formula: | ||
| + | |||
| + | < | ||
| + | Residence Demand = ((Kids + Workers + Scientists)) * 100 / Total Residence Capacity | ||
| + | </ | ||
| + | |||
| + | Total residence capacity is the sum of `Production_Capacity` (as defined in `building.txt`, | ||
| + | |||
| + | As mentioned before, this (and all ratios in this section) is essentially a percentage stored in terms of hundredths of a percent, to avoid rounding errors (in other words, 100% = 10000). | ||
| + | |||
| + | If residence capacity is 0, this gets set to 100%. | ||
| + | |||
| + | ** Food Supply ** | ||
| + | |||
| + | A food supply level is calculated based on the following logic: | ||
| + | |||
| + | * Surplus if Food Production > Food Consumption | ||
| + | * Starving if there is a food deficit | ||
| + | * Deficit (Big Supply) if (Scientists + Workers + Kids) * 15 < Food Stored otherwise Deficit | ||
| + | |||
| + | ** Disabled Building Ratio ** | ||
| + | |||
| + | This ratio is computed based on: | ||
| + | |||
| + | < | ||
| + | Disabled Building Ratio = (Num Buildings - Num Idle Buildings - Num Active Buildings) * 100 / Num Buildings | ||
| + | </ | ||
| + | |||
| + | In the cases of no buildings (or all buildings idle), or all buildings disabled, the ratio gets set to 0 or 100% respectively. | ||
| + | |||
| + | ** Rec Center / Forum Demand ** | ||
| + | |||
| + | This defaults to 100% if rec center and forum capacity are both 0, otherwise: | ||
| + | |||
| + | < | ||
| + | Rec and Forum Demand = (Total Population * 100) / (Total Forum Capacity + Total Rec Center Capacity) | ||
| + | </ | ||
| + | |||
| + | ** Operational Building Checks ** | ||
| + | |||
| + | The game records whether there are any active Nursery, University, and GORF (storing this as a boolean separately for each building type). | ||
| + | |||
| + | ** DIRT Average Damage Prevention ** | ||
| + | |||
| + | ** TODO: ** This part needs some more analysis to determine how the game figures out DIRT damage prevention | ||
| + | |||
| + | ** Unoccupied Colonists ** | ||
| + | |||
| + | Unless the population solely consists of Kids (in which case this value defaults to 0), unoccupied colonist percentage is determined: | ||
| + | |||
| + | < | ||
| + | Unoccupied Colonist Ratio = ((Available Workers + Available Scientists) * 100) / (Workers + Scientists) | ||
| + | </ | ||
| + | |||
| + | ** Scientists as Workers ** | ||
| + | |||
| + | This is set to 0 if the player has no scientists, otherwise: | ||
| + | |||
| + | < | ||
| + | Scientists as Workers Ratio = ((Scientists As Workers * 100) / Scientists | ||
| + | </ | ||
| + | |||
| + | ** Overcrowding Multiplier ** | ||
| + | |||
| + | An overcrowding multiplier is determined from residence demand, based on the `CROWDED_*` constants in morale.txt. | ||
| + | |||
| + | ^ Residence Demand ^ Modifier ^ Total ^ | ||
| + | | <= 100% (None) | ||
| + | | <= 133% (Low) | -1 | -1 | | ||
| + | | <= 166% (Med) | -1 | -2 | | ||
| + | | <= 200% (High) | ||
| + | | > 200% (Max) | -2 | -6 | | ||
| + | |||
| + | ** Food Modifier ** | ||
| + | |||
| + | This also comes from morale.txt (`FOOD_*`) and is based on the food supply level computed earlier, stacking as follows: | ||
| + | |||
| + | ^ Food Supply | ||
| + | | Surplus | ||
| + | | Deficit (Big Supply) | 1 | 3 | | ||
| + | | Deficit | ||
| + | | Starving | ||
| + | |||
| + | ** Disabled Building Modifier ** | ||
| + | |||
| + | Based on `DIS_BLD_*` in morale.txt, this corresponds to the disabled building ratio, stacking as follows: | ||
| + | |||
| + | ^ Ratio ^ Modifier ^ Total ^ | ||
| + | | 0% (Low) | 2 | 2 | | ||
| + | | <33% (Med) | -1 | 1 | | ||
| + | | <66% (High) | ||
| + | | 66%+ (Max) | -2 | -2 | | ||
| + | | 10000 (default) | Same as Low | | | ||
| + | |||
| + | ** Rec/Forum Demand Modifier ** | ||
| + | |||
| + | This stacks similarly to the previous modifiers, defined as 1 in morale.txt (via `REC_UT_*` and `FORUM_UT_*`): | ||
| + | |||
| + | ^ Demand | ||
| + | | <= 100% (Low) | 1 | 1 | | ||
| + | | <= 150% (Med) | 1 | 2 | | ||
| + | | <= 200% (High) | 1 | 3 | | ||
| + | | > 200% (Max) | 1 | 3 | | ||
| + | |||
| + | As stated previously, this modifier *does not apply* if the corresponding tech is not researched (thus there is no point in researching these techs or building these). | ||
| + | |||
| + | ** Med Center Demand Modifier ** | ||
| + | |||
| + | These stack and come from `MED_UT_*` in morale.txt. | ||
| + | |||
| + | ^ Demand | ||
| + | | <= 100% (Low) | 1 | 1 | | ||
| + | | <= 150% (Med) | 1 | 2 | | ||
| + | | <= 200% (High) | ||
| + | | > 200% (Max) | 1 | 3 | | ||
| + | | 10000 (default) | 0 | | | ||
| + | |||
| + | ** Operational Modifiers ** | ||
| + | |||
| + | ^ Description | ||
| + | | At least one active Nursery: | ||
| + | | At least one active University: | `UNIV_ON` | ||
| + | |||
| + | These are `NURSERY_ON` and `UNIV_ON` in morale.txt. | ||
| + | |||
| + | ** Disaster Warning Systems ** | ||
| + | |||
| + | This checks if the " | ||
| + | |||
| + | ^ Disaster | ||
| + | | Quake | Seismology | ||
| + | | Electrical Storm | Meteorology | ||
| + | | Vortex | ||
| + | | Volcanic Eruption | Vulcanology | ||
| + | | Meteor | ||
| + | |||
| + | All of these are additive (i.e. add 2 if the tech is researched, 0 otherwise) | ||
| + | |||
| + | ** DIRT Damage Prevention Modifiers ** | ||
| + | |||
| + | These are cumulative as before, based on the `DIRT_*` morale.txt constants. | ||
| + | |||
| + | ^ Avg Damage Prevention ^ Modifier ^ Total ^ | ||
| + | | < 625 (Low) | 1 | 1 | | ||
| + | | >= 625 (Med) | 1 | 2 | | ||
| + | | >= 1250 (High) | ||
| + | | >= 1775 (Max) | 1 | 4 | | ||
| + | |||
| + | ** Unoccupied Colonists Modifiers ** | ||
| + | |||
| + | From `UNOC_*` in morale.txt. | ||
| + | |||
| + | ^ Unoccupied Colonist % ^ Modifier ^ Total ^ | ||
| + | | >= 10% (Low) | -1 | -1 | | ||
| + | | >= 30% (Med) | -2 | -3 | | ||
| + | | >= 50% (High) | ||
| + | |||
| + | ** Scientists as Workers Modifiers ** | ||
| + | |||
| + | From `PHD_WHINE_*` in morale.txt. | ||
| + | |||
| + | ^ Scientists as Workers % ^ Modifier ^ Total ^ | ||
| + | | >= 5% (Low) | -1 | -1 | | ||
| + | | >= 20% (Med) | -1 | -2 | | ||
| + | | >= 40% (High) | ||
| + | | >= 65% (Max) | -3 | -7 | | ||
| + | |||
| + | ** Difficulty Scaling ** | ||
| + | |||
| + | **TODO**: Look into this more (`DIFF_*` in morale.txt). | ||
| + | |||
| + | === Event Morale === | ||
| + | |||
| + | As discussed above, as certain events happen in game, this will adjust the event morale accordingly: | ||
| + | |||
| + | ^ Event ^ `morale.txt` variable ^ Value ^ | ||
| + | | Kid dies | `KID_DIES` | ||
| + | | Adult dies | `ADULT_DIES` | ||
| + | | Kid born | `KID_BORN` | ||
| + | | " | ||
| + | | Regular structure dies | `REG_BUILD_DIES` | ||
| + | | Research completed | ||
| + | | Disaster spawns (tech unresearched) | `DISASTER_NO_WARN` | ||
| + | | Disaster spawns (tech researched) | ||
| + | | Impulse Items produced | ||
| + | | Wares produced | ||
| + | | Luxury Wares produced | ||
| + | | " | ||
| + | | " | ||
| + | | Worker trained | ||
| + | | Scientist trained | ||
| + | | Command Center built | `CC_BORN` | ||
| + | |||
| + | Notes on the above: | ||
| + | * Which disaster modifier gets applied is based on which of the early-warning techs are researched (as described above) | ||
| + | * " | ||
| + | * **TODO**: is this an exhaustive list? | ||
| + | * " | ||
| + | * **TODO**: Are the worker and scientist trained events per-colonist or per-training? | ||
| + | * The event morale is updated at the time the game processes the event, but the actual morale update is deferred until a morale processing cycle (every 256 ticks). | ||
| + | * For this reason, morale changes from events stack without any limit. | ||
| + | |||
| + | ==== Population Model ==== | ||
| The colony population is updated every 32nd processing tick (256 ticks) for each human player. | The colony population is updated every 32nd processing tick (256 ticks) for each human player. | ||
| - | The following discussion makes use of M_FERT_RATE and M_DIE_RATE from morale.txt. M_FERT_RATE determines the rate at which new kids are born. A higher | + | The following discussion makes use of `M_FERT_RATE` and `M_DIE_RATE` from morale.txt. |
| - | In addition, the "total med center capacity" | + | === Medical Center |
| - | ==== New Kids and Workers | + | In addition, the "total med center capacity" |
| + | |||
| + | === New Kids and Workers === | ||
| First, new workers are trained from kids, if there are any to train, and the player has an active University (having more than 1 university has no effect here), the worker count is increased (and kid count decreased) based on the following formula: | First, new workers are trained from kids, if there are any to train, and the player has an active University (having more than 1 university has no effect here), the worker count is increased (and kid count decreased) based on the following formula: | ||
| Line 30: | Line 291: | ||
| </ | </ | ||
| - | As before, the remainder is stored and used in the next update to allow for fractional kid growth over time. M_FERT_RATE is a value defined | + | As before, the remainder is stored and used in the next update to allow for fractional kid growth over time. `M_FERT_RATE` is a value defined |
| - | ==== Kid, Worker, and Scientist Deaths | + | === Kid, Worker, and Scientist Deaths === |
| Kid deaths are computed next, if the number of kids is greater than 0, according to the following formula: | Kid deaths are computed next, if the number of kids is greater than 0, according to the following formula: | ||
| Line 39: | Line 300: | ||
| </ | </ | ||
| - | The remainder is stored for use in the next update, and total med center capacity is a previously computed value for each player. | + | The remainder is stored for use in the next update, and total med center capacity is a previously computed value for each player. |
| Worker and Scientist deaths (assuming there are any) are separately computed similarly using the formula below: | Worker and Scientist deaths (assuming there are any) are separately computed similarly using the formula below: | ||
| < | < | ||
| - | Dead Workers | + | Worker |
| </ | </ | ||
| As before, the remainder is stored and used in the next update (separately for scientists and workers). | As before, the remainder is stored and used in the next update (separately for scientists and workers). | ||
| + | |||
| + | Scientist training is not handled here, because that is something that is manually initiated at the University by the player. | ||