Opinions differ on how to pluralize acronyms[*], but let's be consistent: say "BTUs", not "BTU's". [*] https://en.wikipedia.org/wiki/Acronym#Representing_plurals_and_possessives Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
246 lines
8 KiB
Perl
246 lines
8 KiB
Perl
.TH Concept Innards
|
|
.NA Innards "Some details about the inner workings of the server"
|
|
.LV Obsolete
|
|
.s1
|
|
Much of this file is now out-of-date. Correct information may be found
|
|
in the files Update-sequence and build.
|
|
.s1
|
|
This topic contains fairly nitty-gritty descriptions of
|
|
some of the underlying mechanisms in the Empire system.
|
|
It is not meant for the weak-of-heart or casual reader.
|
|
(And it's usually out of date.)
|
|
.s1
|
|
Sector Updates
|
|
.s1
|
|
Several characteristics of the Empire game are dependent on
|
|
sector updates --
|
|
mobility, efficiency, mining of ore, generation
|
|
of production units, etc.
|
|
.s1
|
|
An understanding of the calculations
|
|
involved is often helpful in planning the timing of various
|
|
actions
|
|
and although it is unlikely that this description
|
|
is strictly up to date,
|
|
it should provide a feel for the overall philosophy.
|
|
.s1
|
|
All commodities in a sector are kept as \*Qshort integers\*U.
|
|
The program cannot have \*Qnegative commodity values\*U, so the
|
|
theoretical capacity of a sector is 32767, while in practice
|
|
it is actually 9999 (for formatting reasons).
|
|
While it is possible to move more commodities than 9999 into
|
|
sectors, production of commodities will not go
|
|
above the level of 999.
|
|
So, an update that produces 450 units of iron in a sector that already
|
|
has 800 units can at most add 199 units.
|
|
.s1
|
|
Here is an approximate description of the algorithm that is
|
|
called whenever an update occurs:
|
|
.s1
|
|
Variables used are:
|
|
.in \w'workforce\0\0'u
|
|
.L etus
|
|
the # of Empire time units in this update
|
|
.L civ
|
|
civilians in the sector
|
|
.L mil
|
|
military in the sector
|
|
.L uw
|
|
uncompensated workers in the sector
|
|
.L desig
|
|
designation of the sector
|
|
.L effic
|
|
efficiency of the sector
|
|
.L miner
|
|
iron mineral content of the sector
|
|
.L gold
|
|
gold mineral content of the sector
|
|
.L t_level
|
|
technology level of the country
|
|
.L r_level
|
|
research level of the country
|
|
.L p_stage
|
|
plague stage in the sector
|
|
.L p_time
|
|
plague stage duration
|
|
.L workforce
|
|
an intermediate variable that represents work potential
|
|
.L work
|
|
the amount of work done in the sector
|
|
.in
|
|
.s1
|
|
Parameters used are (see the \*Qversion\*U command for actual values):
|
|
.in \w'uwbrate\0\0'u
|
|
.L fgrate
|
|
the food growth rate
|
|
.L fcrate
|
|
the food cultivation rate
|
|
.L eatrate
|
|
how much food people eat
|
|
.L obrate
|
|
birth rate
|
|
.L uwbrate
|
|
uncompensated worker birth rate
|
|
.L babyeat
|
|
how much babies eat growing up
|
|
.L bankint
|
|
bank interest rate in $/bar
|
|
.in
|
|
.nf
|
|
.s1
|
|
workforce = (civ*work/100 + uw + mil * 0.4) / 100.
|
|
If workforce = 0 go away and don't update anything
|
|
|
|
/* increase sector efficiency */
|
|
If the weather is good enough for construction and we're not broke then
|
|
effic becomes effic + work (if possible) and costs $1 for each
|
|
percentage point gained.
|
|
Otherwise charge the $1 for each percentage point that would have been
|
|
gained, (pay for workers to play cards).
|
|
|
|
/* grow some food */
|
|
Set dd = etu * sector_fertility * fgrate
|
|
(this is the amount of food that can be grown in etu time units)
|
|
Set dtemp = work * 100. * fcrate
|
|
(this is the amount of food that the people there can harvest)
|
|
If (dtemp < dd) (if there aren't enough people to harvest it all)
|
|
set dd = dtemp
|
|
Set foodtmp to the amount of food in the sector plus dd
|
|
|
|
/* feed the masses */
|
|
If desig is sanctuary then
|
|
set dd equal to 0.
|
|
Else
|
|
set dd equal to etu * (civ + mil) * eatrate
|
|
(this is the amount of food the people need to eat)
|
|
If (dd > foodtmp) then some people will starve
|
|
figure out what percentage of the population can be fed,
|
|
and kill the rest (up to a maximum of 1/2 the populace)
|
|
set food = 0
|
|
Otherwise
|
|
set food = foodtmp - dd (with a maximum of 999)
|
|
|
|
/* population growth */
|
|
set q = etu * civ * obrate
|
|
the number of births possible in other sectors
|
|
If q is bigger than food / (2 * babyeat) set q to food / (2 * babyeat)
|
|
food available to mature this many babies into civilians
|
|
If q is bigger than 999 - civ set q to 999 - civ
|
|
enough room for that many
|
|
Set food = food - q * babyeat
|
|
Set civ = civ + q
|
|
|
|
/* mobility */
|
|
Add etu to mobil (to a max of 127)
|
|
|
|
/* pay taxes */
|
|
Collect the taxes, pay the military
|
|
civ_tax = (int) (.5 + (civs * eff * etu * civtaxrate / 100.));
|
|
if (conquered) civ_tax /= 4.;
|
|
uw_tax = (int) (.5 + (uws * eff * etu * uwtaxrate / 100.));
|
|
mil_pay = (int) (mil * etu * milpayrate);
|
|
|
|
nat_money -= mil_pay
|
|
nat_money += civ_tax + uw_tax
|
|
|
|
/* plague */
|
|
If p_stage = \*Qthird\*U kill off a bunch of people,
|
|
alert the owner and the news and decrement p_time by dt.
|
|
If p_time \(<= 0 set p_stage = zero (plague has burned itself out).
|
|
If p_stage = \*Qsecond\*U report
|
|
to the owner and the news and decrement p_time by dt.
|
|
If p_time \(<= 0 set p_stage = \*Qthird\*U
|
|
and randomly reset p_time in the range of etu_per_update to
|
|
(etu_per_update * 2).
|
|
If p_stage = \*Qfirst\*U decrement p_time by dt.
|
|
If p_time \(<= 0 set p_stage = \*Qsecond\*U
|
|
and randomly reset p_time in the range of etu_per_update to
|
|
(etu_per_update * 2).
|
|
If p_stage = zero and a random number in the range 0-99
|
|
is less than the figure generated by the equation in \*Qinfo plague\*U
|
|
then set p_stage = \*Qfirst\*U
|
|
and set p_time to a random number in the range of etu_per_update to
|
|
(etu_per_update * 2).
|
|
.s1
|
|
/* delivery & distribution */
|
|
If anything is being delivered from this sector and there is
|
|
more of it than the delivery threshold (always a multiple of 8)
|
|
and the country is not broke
|
|
deliver as much of the excess as mobility allows.
|
|
If plague_stage is \*Qsecond\*U (the infectious stage)
|
|
set plague_stage and plague_time in the destination sector.
|
|
If there is a \*Qdistribution threshold\*U for this sector, and
|
|
if the sector isn't at this threshold,
|
|
import or export as necessary from the distribution warehouse
|
|
the number of commodities, mobility permitting.
|
|
|
|
/* production */
|
|
If effic is less than 60 skip the rest.
|
|
.in +3
|
|
.s1
|
|
.ti -3
|
|
If desig is bank then accrue etu * bankint interest per gold bar
|
|
.ti -3
|
|
If desig is capital pay etu * $1 for government salaries
|
|
.ti -3
|
|
If desig is enlistment sector, then convert civilians to military
|
|
newmil = (etu * (mil + 10) * 0.05);
|
|
nat_money -= newmil * 3;
|
|
.ti -3
|
|
If this sector produces something (mines, research labs, etc.)
|
|
calculate how much can be produced (see \*Qinfo Products\*U)
|
|
(Note that the amount that can be produced is limited by \*Qwork\*U)
|
|
produce it
|
|
pay for it (money, iron, gold mineral, oil, etc.)
|
|
.fi
|
|
.in
|
|
.s1
|
|
Several points are noteworthy:
|
|
.s1
|
|
\(bu The work done in a sector (ore dug up, efficiency growth,
|
|
population growth, products generated, etc) is dependent on the
|
|
product of time since last update and work force (\*Qwork\*U above)
|
|
while the accumulation of mobility is independent of work force.
|
|
.s1
|
|
\(bu If the population of a sector is very low it may never generate
|
|
any work at all due to conversion to integer truncation.
|
|
.s1
|
|
Ship Updates
|
|
.s1
|
|
Ships are also updated only when accessed however the mechanism is simpler.
|
|
The only characteristics that are changed by ship updates are
|
|
the mobility,
|
|
the efficiency, (if less than 100%).
|
|
the food, (and therefore the crew if starvation occurs),
|
|
the amount of oil,
|
|
and
|
|
plague status, (which can also change the size of the crew).
|
|
.s1
|
|
The algorithm is essentially:
|
|
.in +3
|
|
.nf
|
|
add etu to mobility (with a maximum of 127)
|
|
add etu to efficiency (with a maximum of 100)
|
|
add etu * civil * sector_oil / 10000. to oil if ship type is oil derrick
|
|
add etu * civil * sector_fertil / 10000. to food if ship type is fishing boat
|
|
feed the crew and passengers
|
|
starve a few if not enough food
|
|
check for plague progress,
|
|
(the same as in sectors except each stage lasts twice as long on a ship)
|
|
.fi
|
|
.in
|
|
.s1
|
|
Bureaucratic Time Units
|
|
.s1
|
|
There is one further update that is not handled in the sector
|
|
update routine; that is the update of bureaucracy time units (BTUs).
|
|
These are the numbers printed in brackets before the command
|
|
prompt.
|
|
Most commands given use BTUs, some use 1, some use 2 and some use
|
|
more, making BTUs a vital commodity.
|
|
The generation of BTUs is
|
|
dependent on the efficiency and the work force in the capital sector.
|
|
(see info BTU).
|
|
.s1
|
|
.s1
|
|
.SA "Education, Happiness, Products, Research, Technology, Time, BTU, Server"
|