next up previous contents
Next: About this document Up: No Title Previous: Army typesspirits, and

NPC play algorithms

Here are the algorithms that the Computer Nations use.  Note that this
assumes that NPC_PATROL is TRUE.  The only part of the algorithms
that this affects is step seven of the draft algorithm.  If NPC_PATROL
is false, no patrolling armies will be drafted.

                     Algorithm 1:  NPC MOVES

Step 1:   Allocate memory to evaluate sector desirability.

Step 2:   Perform the INITIALIZATION algorithm.

Step 3:   If the turn number is greater than one or there is a
          race-specific army type available, perform the DRAFT
          algorithm.

Step 4:   Merge armies using the MERGE algorithm.

Step 5:   Split armies using the SPLIT algorithm.

Step 6:   Summon monsters using the SUMMON algorithm.

Step 7:   Move armies using the MOVE algorithm.

Step 8:   Redesignate sectors using the REDESIGNATE algorithm.

Step 9:   Free the memory that was allocated in steps 1 and 2.


                    Algorithm 2:  INITIALIZE

Step 1:   Create lists of available armies and monsters.

Step 2:   If there is a race-specific army type available to this
          nation, store its index in a global variable,
          npc_specific.

Step 3:   Read in the diplomacy information and modify the nation's
          diplomatic status using the DIPLOMACY algorithm.  Also
          determine what sectors are visible.

Step 5:   If the nation is at war, set the optimal army size to be
          (number of soldiers * 2) / (number of sectors).  If this
          is less than 150, use 150 instead.  Then perform step 6. 
          If the nation is not at war, set the optimal army size to
          be 100 and perform step 7.

Step 6:   Set the tax rate at 25 percent.  Put 15 percent of
          monetary income into magic and technological research. 
          Do not put any metal into research.  If there are not
          enough jewels left to support a mage, do not put any into
          research.  Otherwise, spend your entire income or half of
          your storage, whichever number is lower.

Step 7:   Set the tax rate to 15 percent.  Put 25 percent of money
          and 30 percent of metal into technological research.  Put
          25 percent of money and 10 percent of jewels into magical
          research.

                       Algorithm 3:  DRAFT

Step 1:   If the nation is at war, set the maximum number of troops
          to be (aggressiveness) * (civilians) / 200.  Otherwise,
          set the maximum number of troops to be (aggressiveness)
          * (civilians) / 300.  If the nation already has the
          maximum number of troops or more, quit.

Step 2:   Calculate the number of troops to be drafted this turn as
          the average of (aggressiveness) * (net reproductive rate)
          and (maximum soldiers) - (current soldiers).  Make sure
          this number is no larger than the number of civilians in
          the capital.  Calculate the number of armies to draft
          this turn as (number of troops) / (optimal army size).

Step 3:   Create a list of all army types that can be drafted,
          eliminating those armies with special abilities.

Step 4:   For each army type in the list, find the force and the
          metal and money cost.

Step 5:   While the number of armies left to draft is greater than
          zero, perform steps 6 and 7.

Step 6:   For each army type in the list, calculate how many armies
          of that type can be drafted.  Consider money cost, metal
          cost, and the number of armies left to draft.  Then
          multiply that number by the force of that army type. 
          This gives the total force.

Step 7:   Draft one army of whatever type had the greatest total
          force in step 6.  If the percentage of patrolling troops
	  is less than npc_iso, set the status of the army to PATROL.
	  Reduce the amount of money and metal in storage by the
	  cost of the army and reduce the number of armies to be
	  drafted by one.


                       Algorithm 4:  MERGE

Step 1:   Calculate the minimum size of an army as 2/3 * (optimal
          army size).

Step 2:   For each army in the nation, if the number of troops in
          the army or the force of the army is smaller than the
          minimum size, perform steps 3 and 4.

Step 3:   Find out what sectors this army can move to using the
          LEGAL MOVES algorithm.  Find the best army in those
          sectors for this army to merge with.  The size and force
          of the two armies combined should be close to and greater
          than the minimum size.

Step 4:   Move the small army onto the same sector as the 'best'
          army and merge the two armies together.


                       Algorithm 5:  SPLIT

Step 1:   For each army in the nation, if the number of troops in
          the army or the force of the army is larger than double
          the optimal army size, perform step 2.

Step 2:   Split this army into armies of optimal size until the
          number of troops in this army is less than double the
          optimal army size.


                      Algorithm 6:  SUMMON

Step 1:   If the nation is at war and has more than one spell
          point, perform steps 2 and 3.

Step 2:   If the nation does not have a mage and the nation has
          enough jewels to afford one, initiate one in the capital. 
          If the nation cannot afford a mage, stop.

Step 3:   While the nation still has spell points left, summon the
          most expensive monster that the nation can afford and
          that has no special abilities.  Reduce the number of
          spell points left by the cost of the monster.


                       Algorithm 7:  MOVE

Step 1:   Give each sector on the map a desirability using the
          DESIRABILITY algorithm.

Step 2:   For each army in the nation with a status of ATTACK or
	  DEFEND, find all the sectors it can move to using the
	  LEGAL MOVE algorithm.  Move the army to the sector that
	  has the highest desirability and set its status to
	  'occupy'.  Divide the desirability of the sector by
	  2 * (army size) / (optimal army size)

Step 3:   For each army in the nation with a status of PATROL, find
	  all the sectors it can move to using the LEGAL MOVE
	  algorithm.  Move the army to the sector that has the
	  highest desirability. Set the status of that sector and all
	  adjacent sectors to zero.


                    Algorithm 8:  REDESIGNATE

Step 1:   If the game turn is less than six, enough food is being
          produced, or more than ten percent of the civilians are
          unemployed, perform steps 4 and 5.  Otherwise perform
          steps 2 through 5.

Step 2:   Create two lists, one of sectors used for metal mines and
          one of jewel mines.  Order the lists by how high the soil
          value is for the sectors.  Do not put sectors with a soil
          value of zero in the lists.

Step 3:   Change the sectors in the lists into farms, proceeding
          from higher to lower soil values.  Stop when enough food
          is being produced or when half of the sectors in each
          list have been changed to farms.  Also stop if the nation
          runs out of money.

Step 4:   For all the sectors in the nation that do not have a
          designation, perform step 5.

Step 5:   If the sector has no metal or jewel value and does have
          a soil value, change the sector to a farm.  Otherwise,
          change the sector to a metal or jewel mine, depending on
          whether the metal or jewel value is higher.


                     Algorithm 9:  DIPLOMACY

Step 1:   Count the number of nations that are at war with this
          nation and assign that number to atwar.

Step 2:   Calculate the effective aggressiveness as
          (aggressiveness) / (atwar + 1).

Step 3:   For each active nation in the world that has met this
          nation, perform steps 4 and 5.

Step 4:   Pick a random number between 0 and 99.  If this number is
          greater than the effective aggressiveness, increase the
          diplomatic status toward that nation.  Otherwise, lower
          the diplomatic status.

Step 5:   Do not let the diplomatic status remain lower than Jihad
          or higher than the status of the other nation toward us.

		   Algorithm 10:  DESIRABILITY

Step 1:   Count the number of friendly and unowned sectors that can
          be seen.  Double the number of enemy sectors that can be
          seen. Keep track of the maximum of these three numbers.

Step 2:   For each sector in the world, calculate the base
          desirability.  If the sector is owned by a friendly
          nation, the desirability is zero.  If the nation is not
          at war, the desirability of friendly sectors is zero.  If
          the nation is at war and the sector is friendly, perform
          steps 3 and 4.  If the nation is at war and the sector is
          owned by an enemy, perform step 5.  If the sector is
          unowned, perform step 6.  After all sectors have been
          processed, perform step 7.

Step 3:   If the sector is a farm, the desirability is 3 + (soil
          value) * (ratio of food eaten to food produced).  If the
          sector is a metal or jewel mine, the desirability is 3 +
          1.3 * (metal or jewel value).  If the sector is a city,
          university, or capital, the desirability is 11.  All
          other sectors have a desirability of 2.

Step 4:   Increase the desirability of the sector by one for each
          adjacent enemy sector.  Multiply the desirability by the
          ratio of (enemy sectors) / (maximum) and by the ratio of
          (friendly sectors) / (3 * the number of armies we have +
          1).  Divide this number by two.

Step 5:   The desirability of the sector is 12.  Increase the
          desirability by one for each adjacent friendly sector. 
          Divide this number by two.

Step 6:   The desirability of the sector is (soil value) * (ratio
          of food eaten to food produced) + (metal value) + (jewel
          value).  Increase the desirability by one for each
          adjacent friendly sector.  Divide this number by two.

Step 7:   For each sector in the world, calculate the final
          desirability of the sector as the base desirability
          squared.  If the nation is not at war and or the base
          desirability is not zero, perform step 8.  Add
          (population of the sector) / 25.  If the sector is a
          capital, double this number.  Then perform step 8.

Step 8:   If the sector is visible to this nation according to the
          rules of Dominion, increase the desirability of nearby
          sectors.  Add (base desirability) - 1 to immediately
          adjacent sectors, (base desirability) -2 to the sectors
          just beyond those, and so on.

		    Algorithm 11:  LEGAL MOVES

Step 1:   Initialize a two dimensional array of odd side length to
          contain negative ones.  Let the center of the array
          represent the sector that the army is on.  Change the
          value of this location to the number of movement points
          the army in question has.  Place the x and y of this
          location, along with the number of movement points the
          army has, into a list.

Step 2:   Take the element off the top of the list.  For all
          adjacent sectors with a value of negative one and a
          movement cost less than the movement points in the
          element, perform step 3.  If there are any elements left
          in the list, repeat step 2.

Step 3:   Calculate the number of movement points left upon
          entering the sector as (movement left) - (movement cost). 
          If this movement left is not zero, store it in the list,
          along with the x and y coordinates of this sector.  Keep
          the list in sorted order, with the highest movement left
          first.



Mark Galassi
Fri Aug 23 14:28:05 MDT 1996