Amiga Empire by Chris Gray - Updating This section is quite detailed. The details are provided so that those who want to run their country optimally can see what they need to see. Others (especially beginners) should just ignore this section until they have played for a while, at which point they should scan it to get a feel for how things happen. The sector update algorithm is central to Empire. It is based on steady change over Empire Time Units. It can be summarized as follows (values are either for the sector being updated or for the owner country of the sector; all calculations are integral): NOTE: A deity can change most of the magic numbers. proc makeProduction(): q := min(work * efficiency / 100, ore); if then if money > 0 then q := min(q, 127 - production); production := production + q; fi; else q2 := q * priceInNickels / 20; money := money + q2; fi; ore := ore - q; corp; /* in an urban center, people are lazy, so every 10 counts as 1 here */ workForce := civilians + military / 5; if lastUpdate = 0 or lastUpdate > CurrentTime then lastUpdate := CurrentTime; fi; deltaTime := CurrentTime - lastUpdate; if deltaTime > 256 then deltaTime := 256; fi; work := deltaTime * workForce; if work >= 100 and ( or work > 48 * 2 * 100) then if weather <= -9 then /* hurricane */ damageSector(random(21) + 70); elif weather <= -8 then /* no construction happens */ else q := 0; if weather <= -7 then if money > 0 then q := min(work / 200, 100 - efficiency); fi; mobility := min(127, mobility + deltaTime / 2); else if money > 0 then q := min(work / 100, 100 - efficiency); fi; mobility := min(127, mobility + deltaTime); fi; efficiency := efficiency + q; money := money - q; fi; /* civilian growth */ q := deltaTime * civilians; if designation = then q := min(127, civilians + min(q / 100, ore)) - civilians; civilians := civilians + q; ore := ore - q; elif designation = then civilians := civilians - q / 400; elif civilians > 31 and civilians < 97 then civilians := min(127, civilians + q / 200); else civilians := min(127, civilians + q / 400); fi; /* mobility increase */ mobility := min(127, mobility + deltaTime); lastUpdate := lastUpdate + deltaTime; /* NOTE THIS!!! */ /* military supplies */ q := military / 32 * deltaTime / 8; money := money - q; if then BTUs := min(96, BTUs + deltaTime * civilians * efficiency / 5000); researchLevel := researchLevel - researchLevel * deltaTime / 4800; techLevel := techLevel - techLevel * deltaTime / 4800; fi; case plague_stage: incase 3: /* terminal plague stage */ ; ; if plague_time <= deltaTime then plague_stage := 0; else plague_time := plague_time - deltaTime; fi; incase 2: /* infectious stage */ if plague_time <= deltaTime then plague_stage := 3; plague_time := random(33) + 32; else plague_time := plague_time - deltaTime; fi; incase 1: /* gestatory stage */ if plague_time <= deltaTime then plague_stage := 2; plague_time := random(33) + 32; ; else plague_time := plague_time - deltaTime; fi; incase 0: /* not infected - see if it should become so */ plagueFactor := ((civilians + military) / 254) * ((techLevel + ore + 100) / (researchLevel + efficiency + mobility + 100)); if random(100) < plagueFactor then plague_stage := 1; plague_time := random(33) + 32; fi; esac; /* note that 'move', and deliveries will pass the plague when it is in the infectious stage */ if efficiency >= 60 then /* NOTE THIS!!! */ case designation incase : /* interest */ money := money + deltaTime * goldBars / 2; incase : incase : incase : /* utilities */ money := money - deltaTime; incase : incase : /* utilities */ money := money - deltaTime; if money > 0 then q := production / 25; production := production - q * 25; if designation = then techLevel := techLevel + q; else researchLevel := researchLevel + q; fi; fi; makeProduction(); incase : if money > 0 then q := min(production / 10, 127 - guns); production := production - q * 10; guns := guns + q; fi; makeProduction(); incase : if money > 0 then q := min(production / 2, 127 - shells); production := production - q * 2; shells := shells + q; fi; makeProduction(); incase : if money > 0 then q := min(production / 25, 127 - planes); production := production - q * 25; planes := planes + q; fi; makeProduction(); incase : incase : makeProduction(); incase : q := min(production / 5, 127 - goldBars); production := production - q * 5; goldBars := goldBars + q; q := min(goldSample * work * effic / 1000000, goldSample); if then if money > 0 then q := min(q, (127 - production) / 2); production := production + q * 2; fi; else q2 := q * 2 * priceInNickels / 20; money := money + q2; fi; goldSample := goldSample - q; incase : q := mineralSample * efficiency * work / 10000; if then if money > 0 then ore := min(127, ore + q); fi; else q2 := q * priceInNickels / 20; money := money + q2; fi; esac; fi; fi; Ship updates are much simpler: if lastUpdate = 0 or lastUpdate > CurrentTime then lastUpdate := CurrentTime; fi; deltaTime := CurrentTime - lastUpdate; if deltaTime >= 3 then lastUpdate := lastUpdate + deltaTime; if weather <= -9 and shipType ~= 's' then damageShip((random(21) + 10) * shipDamageFactor(shipType)); elif weather <= -8 and shipType ~= 's' then /* bad weather halts construction */ else if weather <= -7 and shipType ~= 's' then /* bad weather delays construction */ deltaTime := deltaTime / 2; fi; mobility := min(127, mobility + deltaTime); efficiency := min(100, efficiency + deltaTime); techLevel := techLevel - techLevel * dt * shipTechDecreaser / 480000; fi; fi;