|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T e
Length: 11913 (0x2e89)
Types: TextFile
Names: »empire.f«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Empire/empire.f«
program empire
c
c This program is a war game simulation for video terminals.
c The game was originally written outside of Digital, probably a university.
c This version of the game was made runnable on Digital Equipment VAX/VMS
c FORTRAN by conversion from the TOPS-10/20 sources available around fall 1979.
c After debugging it, numerous changes have been made.
c
c Now that you are the proud owner of the source and you are all gung ho
c to do things right, there are a few things you should be aware of.
c Unfortunately, there are many magic numbers controlling how many different
c kinds of units can exist and how many of each, so think well before you
c attempt to add another unit type. Also, "slight changes" to the way the units
c work will typically have a fairly devastating affect on the computers
c strategy. If you are interested in really hacking this, there is a plenty
c of room for enhanced computer strategy. As you'll see, there are some
c very good debugging tools tucked inside, and you will soon discover weak
c points and bugs, that up until you, have remained problems (all the previous
c programmers got lazy or lost interest). Finally, please be careful with
c the version number and identification at start up to avoid confusion of
c ongoing versions with private copies. If you make a change don't remove
c the major version id, but rather add something like (V4.0 site.1 20-JUL-80).
c
IMPLICIT INTEGER(A-Z)
include 'common.h'
C
character orders
character odor ( 2 )
equivalence ( odor ( 1 ), orders )
integer i, count, status
call ttinit
CC call initst
CC call gaminit ( 'empire' )
call rndini
win = 0
ncycle = 1
pass = .false.
automv = .false.
call clear
call topini
call tpos ( 7, 1 )
call ver
comment Special message
cc call strpos ( 8, 1, 'Detailed directions are in EMPIRE.DOC' )
cc call cr
call cflush
c
c -1/0/1 = restore/start/save game
c
call game ( -1, num )
comment Try to restore a previous game
c
c Command loop starts here
c
100 continue
call round ( mdate )
if ( automv ) goto 4200
comment Don't ask if in auto move
call bell
comment Wake up sleepy commanders
call topmsg ( 1, 'Your orders? ' )
call cflush
call getstr ( jnkbuf, 80, count )
call addcnt ( 1, count )
if ( count .gt. 2 ) goto 100
orders = ' '
call tupper ( jnkbuf, count )
odor ( 1 ) = jnkbuf ( 1 )
if ( odor ( 1 ) .eq. '\26' ) goto 1900
comment Quit command?
if ( count .eq. 2 ) odor ( 2 ) = jnkbuf ( 2 )
c
c Special hack for je command
c
if ((specal) .and. (orders .eq. 'JE')) goto 3900
c
c Lookup command
c
do 200 i = 1,20
200 if ( orders .eq. char(comscn ( i ))) goto 300
if ( pass ) goto 2200
call bell
goto 100
c
c m, n, o, s, t, v, p, y, c, l, h, j, 1, r, @, q , +, a
c
300 goto ( 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300,
* 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100 ) i
goto 100
400 goto 4200
comment m - move mode
500 continue
comment n - free enemy moves
call topmsg ( 2, 'Number of free enemy moves: ' )
call addcnt ( 2, 5 )
call cflush
call readi(ncycle)
goto 5300
600 goto 4200
comment o - move mode (synomn for m)
700 call clear
comment s - clear the screen
call topini
isec = -1
goto 100
800 call block ( pmap ( 1 ))
comment t - print out map
goto 100
900 call game ( +1, 0 )
comment v - save game
call topmsg ( 3, 'Game Saved.' )
goto 100
1000 call sector ( pmap ( 1 ))
comment p - print out a sector
goto 100
1100 call direc
comment y - error msg
goto 100
1200 goto 5200
comment c - give one free enemy move
1300 call direc
comment l - error msg
goto 100
1400 call help
comment h - help
isec = -1
goto 100
1500 mode = 1
comment j - edit mode
z6 = 0
call edit ( z6 )
goto 100
1600 mode = 0
comment 1 - set mode=0
jector = -1
goto 100
1700 continue
comment r - display round number
ptr = 0
call addstr ( 'Round # ', jnkbuf, ptr )
call addint ( mdate, jnkbuf, ptr )
jnkbuf ( ptr + 1 ) = '\0'
call topmsg ( 2, jnkbuf )
call cflush
goto 100
1800 continue
comment @ - restore game
jector = -1
call clear
call topini
call game ( -1, num )
if ( num .ne. 0 ) goto 5200
comment **
goto 100
1900 continue
comment q - quit
call topmsg ( 3, 0 )
comment clear line
call topmsg ( 2, 'QUIT - Are you sure? ' )
call cflush
e = char(getchx())
call putc ( e )
call cflush
call addcnt ( 2, 1 )
if ( e .ne. 'y' .and. e .ne. 'Y' ) goto 100
call clear
call topini
call cflush
call empend
2000 e = char(getchx())
comment + - turn on pass
if ( e .eq. '+' ) pass = .true.
if ( e .eq. '-' ) pass = .false.
comment or off
goto 100
2100 automv = .true.
c call topmsg(2, 'Now in Auto-Mode')
comment a - turn on auto move mode
goto 4200
2200 do 2300 i=21,40
comment debugging commands
2300 if (orders.eq.char(comscn(i))) goto 2400
goto 100
c
c lo,nu,li,tr,ar,ta,pa,a1,t3,a0,co,ch,q0, q1,je,cy,ex
c
2400 goto (2500,2600,2700,2800,2900,3000,3100,3200,3300,
1 3400,3500,3600,3700,3800,3900,4000,4100) i-20
goto 100
2500 print 986, ((loci(i,j),j=1,11),i=1,10)
comment lo -
goto 100
2600 print 989, number
comment nu -
goto 100
2700 print 991, limit
comment li -
goto 100
2800 print 990, troopt
comment tr -
goto 100
2900 print 989, armtot
comment ar -
goto 100
3000 print 989, target
comment ta -
goto 100
3100 print 988, succes,failur
comment pa -
goto 100
3200 call block(rmap(1))
comment a1 - print reference map
goto 100
3300 goto 100
comment t3 - ignored
3400 call block(emap(1))
comment a0 - print computer's map
goto 100
3500 call readi(i1)
comment co -
call readi(i2)
993 format(i)
print 987, (codefu(j),codela(j),j=i1,i1+i2)
goto 100
3600 call readi(coder)
comment ch - set coder variable
goto 100
3700 isec = -1
comment q0 - display enemy map sector
call topmsg ( 2, 'Sector? ' )
call cflush
call addcnt ( 2, 1 )
jector = iphase ( getchx())
call sector ( emap ( 1 ))
goto 100
3800 isec=-1
comment q1 - display reference map sector
call topmsg ( 2, 'Sector? ' )
call cflush
call addcnt ( 2, 1 )
jector = iphase ( getchx())
call sector(rmap(1))
goto 100
3900 isec=-1
call topmsg ( 2, 'Sector? ' )
call cflush
jector=iphase(getchx())
comment je - display enemy sector of choice
if (jector.lt.0.or.jector.gt.9) goto 3900
call sector(emap(1))
isec=-1
goto 100
4000 goto 100
comment cy - ignored
4100 ex=expl()
comment ex - disply explore function value
print 992,ex
goto 100
992 FORMAT('+EXP VALUE:',I5$)
991 FORMAT(1X,8I4)
990 FORMAT(1X,5I6)
989 FORMAT(1X,10I5)
988 FORMAT(' SUCCESS:',I6,' FAILURE:',I6)
987 FORMAT(1X,10I7)
986 FORMAT(11I5)
985 format(i)
c
c Begin movement
c
c User move
c
4200 if ( mode .eq. 0 ) goto 4400
if ( jector .ne. -1 ) goto 4300
call clear
call topini
jector = 0
isec = -1
4300 istart = isec
if ( isec .lt. 0 ) istart = 0
4400 do 4500 i = 1, 1500
4500 movedflag ( i ) = 0
do 4700 ject = istart, istart + 9
if ( mode .eq. 0 ) goto 4600
jector = ject
if ( ject .gt. 9 ) jector = ject - 10
line = kline ( ki, jector )
iadjst = line + ki - 300
4600 call shipmv ( itt, itth, 5, 'T', 3 )
call shipmv ( ica, icah, 7, 'C', 8 )
call shipmv ( iba, ibah, 8, 'B', 12 )
call shipmv ( icr, icrh, 6, 'R', 8 )
call shipmv ( isu, isuh, 4, 'S', 2 )
call shipmv ( ide, ideh, 3, 'D', 3 )
call armymv
call fighmv
if ( mode .eq. 0 ) goto 4800
4700 continue
4800 continue
c
c Hardware production
c
do 5100 y = 1, 70
if ( owner ( y ) .ne. 1 ) goto 5100
if ( phase ( y ) .eq. 14 ) goto 5100
call sensor ( x ( y ))
if ( phase(y).eq.8) goto 4900
if (( phase(y) .lt. 1 ) .or. ( phase(y) .gt. 15 )) goto 4900
if ( mod ( phase ( y ), 2 ) .eq. 0 ) goto 5000
if ( mod ( phase ( y ), 5 ) .eq. 0 ) goto 5000
if ( phase ( y ) .eq. 1 ) goto 5000
c
c City phase incorrect or we just took it
c
4900 continue
call clear
call topini
isec = -1
ptr = 0
call addstr ( 'Readout around city at ', jnkbuf, ptr )
call addint ( x ( y ), jnkbuf, ptr )
call bufpos ( 4, 1, jnkbuf, ptr )
call cr
call cr
i1 = mode
mode = 0
call ltr ( x ( y ), 0 )
mode = i1
call cr
call strout ( 'What are your production demands for this city? ' )
call cflush
call phasin ( y, e )
call putc ( e )
call cflush
call delay ( 45 )
call clear
call topini
call cflush
goto 5100
5000 if ( mdate .lt. found ( y )) goto 5100
found ( y ) = mdate + phase ( y ) * 5
c
c A city has built something; build up a line
c
ptr = 0
call addstr ( 'City # ', jnkbuf, ptr )
call addint ( y, jnkbuf, ptr )
call addstr ( ' at ', jnkbuf, ptr )
call addint ( x(y), jnkbuf, ptr )
call addstr ( ' has completed a', jnkbuf, ptr )
k = phase ( y )
c print 983, hits ( k ), x ( y ), tipe ( k ), crahit ( k ), craloc ( k ),
c 1 lopmax ( k ), k
c983 format(' hits:',i5,' x(y):',i5,' tipe(k):',i5,' crahit(k):',i5,/
c 1 ,' craloc(k):',i5,' lopmax(k):',i5,' k:',i)
call prod ( hits ( k ), x ( y ), limit ( tipe ( k )),
* crahit ( k ), craloc ( k ), lopmax ( k ), ar2s,
* tipe ( k ) + 1, range, jnkbuf, ptr )
jnkbuf ( ptr + 1 ) = '\0'
call topmsg ( 3, jnkbuf )
call cflush
call delay(30)
5100 continue
5200 continue
c
c Computer move
c
5300 continue
c d call pme_init
do 5500 i=1,ncycle
call armcnt
call troopm
call topmsg ( 1, 'My turn, thinking..' )
call cflush
call armyen
call topmsg ( 1, 0 )
comment Blank the thinking
call cflush
call carier
call enemym ( 'b', 12 ,iba2h, iba2, 8 )
call enemym ( 'r', 8 ,icr2h, icr2, 6 )
call enemym ( 's', 2 ,isu2h, isu2, 4 )
call enemym ( 'd', 3 ,ide2h, ide2, 3 )
call topmsg ( 1, 'My turn, thinking...' )
call cflush
call fightr
c
c Age known enemy army locations
c
do 5350 k = 1, 10
if ( loci ( k, 1 ) + 21 .gt. mdate ) goto 5350
comment If data is not old
do 5340 j = 1, 11
5340 loci ( k, j ) = 0
comment Zero that line
5350 continue
c
c Production of enemy hardware
c
call cityct
do 5400 y = 1, 70
if ((x(y) .eq. 0) .or. (owner(y) .ne. 2)) goto 5400
call sonar ( x ( y ))
if ((phase(y) .le. 0) .or. (mdate .lt. found(y))) goto 5380
k = phase ( y )
j = 0
if ( k .eq. 1 ) j = 1
ptr = 0
comment To fake out prod
call prod(hits(k),x(y),limit(tipe(k)+8),crahit(k)+ide2h,
* craloc(k)+1500,lopmax(k),ar2s,j,rang, jnkbuf, ptr )
5380 if ((phase(y).le.0).or.(mdate.ge.found(y))) call cityph(y)
5400 continue
mdate = mdate + 1
newrnd = 1
if (mod(mdate,4).eq.0.or.(mdate.gt.160)) call game (+1,0)
5500 continue
c d call pme_exit
ncycle = 1
c
if ( win .eq. 1 ) goto 100
if ( win .eq. 2 ) goto 5700
n = 0
do 5600 j = 1, 70
5600 if (owner(j) .eq. 1) n = n + 1
if (n.lt.30) goto 5700
if (number(9).gt.n/2) goto 5700
call topmsg ( 1, 'The computer acknowledges defeat. Do' )
call topmsg ( 2, 'you wish to smash the rest of the enemy? ')
call cflush
call addcnt ( 2, 1 )
if ( char(getchx()) .ne. 'Y' ) call empend
call cr
call strout ( 'The enemy inadvertantly revealed its code used for' )
call cr
call strout ( 'receiving battle information. You can display what' )
call cr
call strout ( 'they''ve learned through the command ''JE''(cr)(lf),' )
call cr
call strout ( 'followed by the sector number.' )
call cflush
specal = .true.
win = 2
automv = .false.
goto 100
5700 if ((number(9).gt.0).or.(limit(9).gt.0)) goto 5800
call clear
call topini
call strout ( 'The enemy is incapable of defeating you.' )
call cr
call strout ( 'You are free to rape the empire as you wish.' )
call cr
call strout ( 'There may be, however, remnants of the enemy fleet' )
call cr
call strout ( 'to be routed out and destroyed.' )
win = 1
automv = .false.
goto 100
5800 do 5900 i=1,70
5900 if (owner(i).eq.1) goto 100
do 6000 i=1,limit(1)
6000 if (rlmap(i).ne.0) goto 100
call clear
call topini
win = 1
call strout ( 'You have been rendered incapable of' )
call cr
call strout ( 'defeating the rampaging enemy fascists! The' )
call cr
call strout ( 'empire is lost. If you have any ships left, you may' )
call cr
call strout ( 'attempt to harass enemy shipping.' )
automv = .false.
goto 100
end