Files
basic-computer-games/00_Alternate_Languages/43_Hammurabi/MiniScript/hammurabi.ms
2023-08-15 16:38:40 -07:00

191 lines
5.7 KiB
Plaintext

print " "*32 + "Hamurabi"
print " "*15 + "Creative Computing Morristown, New Jersey"
print; print; print
print "Try your hand at governing ancient Sumeria"
print "for a ten-year term of office."; print
eol = char(10)
game = {}
game.z = 0 // year
game.p = 95
game.s = 2800 // bushels in store
game.h = 3000
game.e = game.h - game.s // bushels eaten by rats
game.food = 0 // bushels given to people to eat
game.y = 3 // value (in bushels) per acre
game.a = game.h / game.y // acres owned
game.i = 5 // immigration/births
game.d = 0 // how many starved this year
game.d1 = 0 // total starved over the whole game
game.p1 = 0 // average % of population starved per year
game.q = 1 // if negative, then a plague strikes
startYear = function
print; print; print "Hamurabi: I beg to report to you,"
game.z += 1
print "In year " + game.z + ", " +
game.d + " people starved, " +
game.i + " came to the city,"
game.p += game.i
if game.q < 0 then
game.p = floor(game.p / 2)
print "A horrible plague struck! Half the people died."
end if
print "Population is now " + game.p + "."
print "The city now owns " + game.a + " acres."
print "You harvested " + game.y + " bushels per acre."
print "The rats ate " + game.e + " bushels."
print "You now have " + game.s + " bushels in store."; print
end function
exitGame = function
print; print char(7)*10
print "So long for now."; print
exit
end function
impeach = function
print "Due to this extreme mismanagement you have not only"
print "been impeached and thrown out of office but you have"
print "also been declared national fink!!!!"
exitGame
end function
getNumber = function(prompt, max, maxMsg)
while true
value = input(prompt + "? ").val
if value < 0 then
print; print "Hamurabi: I cannot do what you wish."
print "Get yourself another steward!"
exitGame
end if
if value <= max then return value
print "Hamurabi: Think again. " + maxMsg + " Now then,"
end while
end function
hint = function(msg)
// This was not in the original program. But if you want to make
// the game easier, uncomment this line:
print msg
end function
min = function(a, b, c)
m = [a, b, c]
m.sort
return m[0]
end function
getDecisions = function
// buy/sell land
c = floor(10 * rnd); game.y = c + 17
print "Land is trading at " + game.y + " bushels per acre."
qty = getNumber("How many acres do you wish to buy",
floor(game.s / game.y), "You have only" + eol + game.s + " bushels of grain.")
if qty > 0 then
game.a += qty
game.s -= game.y * qty
else
qty = getNumber("How many acres do you wish to sell",
game.a, "You own only" + eol + game.a + " acres.")
game.a -= qty
game.s += game.y * qty
end if
// feed the people
hint "Your people want " + (game.p * 20) + " bushels of food."
game.food = getNumber("How many bushels do you wish to feed your people",
game.s, "You have only" + eol + game.s + " bushels of grain.")
game.s -= game.food
// planting (a little more complicate because there are THREE limits)
hint "You can plant up to " +
min(game.a, floor(game.s * 2), floor(game.p*10-1)) + " acres."
game.d = 0
while game.a > 0 and game.s > 2
game.d = getNumber("How many acres do you wish to plant with seed",
game.a, "You own only " + game.a + " acres.")
// enough grain for seed? (each bushel can plant 2 acres)
if floor(game.d / 2) > game.s then
print "Hamurabi: Think again. You have only" + eol + game.s +
" bushels of grain. Now then,"
continue
end if
// enough people to tend the crops? (each person can tend 10 acres)
if game.d >= game.p * 10 then
print "But you have only " + game.p + " people to tend the fields! Now then,"
continue
end if
break
end while
game.s -= floor(game.d / 2)
end function
simulateYear = function
// A bountiful harvest!
c = floor(rnd * 5) + 1
game.y = c; game.h = game.d * game.y; game.e = 0
c = floor(rnd * 5) + 1
if c % 2 == 0 then
// rats are running wild!!
game.e = floor(game.s / c)
end if
game.s += game.h - game.e
// Let's have some babies
c = floor(rnd * 5) + 1
game.i = floor(c * (20 * game.a + game.s) / game.p / 100 + 1)
// How many people had full tummies?
c = floor(game.food / 20)
// Horros, a 15% chance of plague
game.q = floor(10 * (2 * rnd - 0.3))
if game.p < c then
game.d = 0
else
// starve enough for impeachment?
game.d = game.p - c
if game.d > 0.45 * game.p then
print; print "You starved " + game.d + " people in one year!!!"
impeach
end if
game.p1 = ((game.z - 1) * game.p1 + game.d * 100 / game.p) / game.z
game.p = c
game.d1 += game.d
end if
end function
printFinalResult = function
print "In your 10-year term of office, " + game.p1 + " percent of the"
print "population starved per year on the average, i.e., a total of"
print game.d1 + " people died!!"
acresPer = game.a / game.p
print "You started with 10 acres per person and ended with"
print acresPer + " acres per person."; print
if game.p1 > 33 or acresPer < 7 then impeach
if game.p1 > 10 or acresPer < 9 then
print "Your heavy-handed performance smacks of Nero and Ivan IV."
print "The people (remaining) find you an unpleasant ruler, and,"
print "frankly, hate your guts!!"
else if game.p1 > 3 or acresPer < 10 then
print "Your performance could have been somewhat better, but"
print "really wasn't too bad at all. " + floor(game.p * 0.8 * rnd) + " people"
print "would dearly like to see you assassinated but we all have our"
print "trivial problems."
else
print "A fantastic performance!! Charlemange, Disraeli, and"
print "Jefferson combined could not have done better!"
end if
end function
// Main loop
while true
startYear
if game.z == 11 then break
getDecisions
simulateYear
end while
printFinalResult
exitGame