#!/bin/sh /usr/local/bin/lminsh
;
; hamurabi
;
; Originally written by Doug Dyment in FOCAL in 1968.
; Translated to BASIC in 1971 by David Ahl.
; And now it's in LISP.

(defun setc () (setq! c (+ (random 5) 1)))

(define tty (open "/dev/tty" "r"))

; Intro.
(printf "                                HAMURABI\n")
(printf "               CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n")
(printf "\n")
(printf "\n")
(printf "\n")
(printf "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA\n")
(printf "FOR A TEN-YEAR TERM OF OFFICE.\n")
(printf "\n")

; Initialize.
(setq! d1 0)
(setq! p1 0)
(setq! z 0)
(setq! p 95)
(setq! s 2800)
(setq! h 3000)
(setq! e (- h s))
(setq! y 3)
(setq! a (int (/ h y)))
(setq! i 5)
(setq! q 1)
(setq! d 0)
(setq! c 0)
(setq! ok ())

(defun fink
    (progn
	(printf "DUE TO THIS EXTREME MISMANAGEMENT YOU HAVE NOT ONLY\n")
	(printf "BEEN IMPEACHED AND THROWN OUT OF OFFICE BUT YOU HAVE\n")
	(printf "ALSO BEEN DECLARED NATIONAL FINK!!!!\n")
    )
)

; Main loop.
(until
    (setq! z (+ z 1))
    (printf "HAMURABI:  I BEG TO REPORT TO YOU,\n")
    (printf "IN YEAR %d, %d PEOPLE STARVED, %d CAME TO THE CITY,\n" z d i)
    (setq! p (+ p i))
    (if (<= q 0)
	(progn
	    (setq! p (int (/ p 2)))
	    (printf "A HORRIBLE PLAGUE STRUCK!  HALF THE PEOPLE DIED.\n")
	)
    )
    (printf "POPULATION IS NOW %d\n" p)
    (printf "THE CITY NOW OWNS %d ACRES.\n" a)
    (printf "YOU HARVESTED %d BUSHELS PER ACRE.\n" y)
    (printf "THE RATS ATE %d BUSHELS.\n" e)
    (printf "YOU NOW HAVE %d BUSHELS IN STORE.\n" s)
    (printf "\n")
    (setq! c (random 10))
    (setq! y (+ c 17))
    (printf "LAND IS TRADING AT %d BUSHELS PER ACRE.\n" y)

    (setq! ok ())
    (until
	(printf "HOW MANY ACRES DO YOU WISH TO BUY")
	(setq! q (read tty))
	(cond
	    ((not (integer? q)) (printf "HAMURABI:  THAT IS NOT A NUMBER!\n"))
	    ((< q 0) (printf "HAMURABI:  I CANNOT DO WHAT YOU WISH.\n"))
	    ((> (* y q) s) (printf "HAMURABI:  THINK AGAIN.  YOU HAVE ONLY\n%d BUSHELS OF GRAIN.  NOW THEN,\n" s))
	    (t (setq! ok t))
	)
	ok
    )

    (if (!= q 0)
	(progn
	    (setq! a (+ a q))
	    (setq! s (- s (* y q)))
	    (setq! c 0)
	)
	(progn

	    (setq! ok ())
	    (until
		(printf "HOW MANY ACRES DO YOU WISH TO SELL")
		(setq! q (read tty))
		(cond
		    ((not (integer? q)) (printf "HAMURABI:  THAT IS NOT A NUMBER!\n"))
		    ((< q 0) (printf "HAMURABI:  I CANNOT DO WHAT YOU WISH.\n"))
		    ((> q a) (printf "HAMURABI:  THINK AGAIN.  YOU OWN ONLY %d ACRES.  NOW THEN,\n" a))
		    (t (setq! ok t))
		)
		ok
	    )

	    (setq! a (- a q))
	    (setq! s (+ s (* y q)))
	    (setq! c 0)
	)
    )
    (printf "\n")

    (setq! ok ())
    (until
	(printf "HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE")
	(setq! q (read tty))
	(cond
	    ((not (integer? q)) (printf "HAMURABI:  THAT IS NOT A NUMBER!\n"))
	    ((< q 0) (printf "HAMURABI:  I CANNOT DO WHAT YOU WISH.\n"))
	    ((> q s) (printf "HAMURABI:  THINK AGAIN.  YOU HAVE ONLY\n%d BUSHELS OF GRAIN.  NOW THEN,\n" s))
	    (t (setq! ok t))
	)
	ok
    )

    (setq! s (- s q))
    (setq! c 1)
    (printf "\n")

    (setq! ok ())
    (until
	(printf "HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED? ")
	(setq! d (read tty))
	(cond
	    ((not (integer? d)) (printf "HAMURABI:  THAT IS NOT A NUMBER!\n"))
	    ((< d 0) (printf "HAMURABI:  I CANNOT DO WHAT YOU WISH.\n"))
	    ((> d a) (printf "HAMURABI:  THINK AGAIN.  YOU OWN ONLY %d ACRES.  NOW THEN,\n" a))
	    ((> (int (/ d 2)) s) (printf "HAMURABI:  THINK AGAIN.  YOU HAVE ONLY\n%d BUSHELS OF GRAIN.  NOW THEN,\n" s))
	    ((>= d (* 10 p)) (printf "BUT YOU HAVE ONLY %d PEOPLE TO TEND THE FIELDS!  NOW THEN,\n" p))
	    (t (setq! ok t))
	)
	ok
    )

    (setq! s (- s (int (/ d 2))))
    (setc)
    (setq! y c)
    (setq! h (* d y))
    (setq! e 0)
    (setc)
    (if (odd c)
	(setq! e (int (/ s c)))
    )
    (setq! s (- s (+ e h)))
    (setc)
    (setq! i (int (+ (/ (* c (+ (* 20 a) s)) p 100) 1)))
    (setq! c (int (/ q 20)))
    (setq! q (- (random 20) 3))
    (if (< p c)
	(setq! d 0)
	(progn
	    (setq! d (- p c))
	    (if (> d (* 0.45 p))
		(progn
		    (printf "\n")
		    (printf "YOU STARVED %d PEOPLE IN ONE YEAR!!!\n" d )
		    (fink)
		    (setq! z 10)
		)
	    )
	    (setq! p1 (/ (+ (* (- z 1) p1) (/ (* d 100) p)) z))
	    (setq! p c)
	    (setq! d1 (+ d1 d))
	)
    )
    (>= z 10)
)

; Game over.
(printf "\n")
(printf "IN YOUR 10-YEAR TERM OF OFFICE, %d PERCENT OF THE\n" p1)
(printf "POPULATION STARVED PER YEAR ON THE AVERAGE, I.E. A TOTAL OF\n")
(printf "%d PEOPLE DIED!!\n" d1)
(if ( > p 0)
    (progn
	(setq! l (/ a p))
	(printf "YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH\n")
	(printf "%d ACRES PER PERSON.\n" l)
    )
)
(printf "\n")
(cond
    ((or (> p1 33) (< l 7)) (fink))
    ((or (> p1 10) (< l 9))
	(progn
	    (printf "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV.\n")
	    (printf "THE PEOPLE (REMIANING) FIND YOU AN UNPLEASANT RULER, AND,\n")
	    (printf "FRANKLY, HATE YOUR GUTS!!\n")
	)
    )
    ((or (> p1 3) (< l 10))
	(progn
	    (printf "YOUR PERFORMANCE COULD HAVE BEEN SOMEWHAT BETTER, BUT\n")
	    (printf "REALLY WASN'T TOO BAD AT ALL. %d PEOPLE\n" (random (int (* p 0.8))))
	    (printf "WOULD DEARLY LIKE TO SEE YOU ASSASSINATED BUT WE ALL HAVE OUR\n")
	    (printf "TRIVIAL PROBLEMS.\n")
	)
    )
    (t
	(progn
	    (printf "A FANTASTIC PERFORMANCE!!!  CHARLEMANGE, DISRAELI, AND\n")
	    (printf "JEFFERSON COMBINED COULD NOT HAVE DONE BETTER!\n")
	)
    )
)
(printf "\n\n\n\n\n\n\n\n\n\n")
(printf "SO LONG FOR NOW.\n")
(printf "\n")

(close tty)
