-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ X`20 XH: Display Help text (hit any character to continue editing). X XI: Give piece (or city) the function 'direction', enter the key X specifying the direction following the 'I'. X`20 XK: Wake up piece (or cancel city fighter path). X`20 XM: Put piece (or city) in 'move' function. Type M over piece (or city), X then move the cursor to where you want it to go, and type 'N'. X You may select an end point on another portion of the map by using X the 'P' command before typing N. X Assigning a 'move' to a city, effects any fighters that land there. X`20 XN: Specify the end point of a move (see M command). X XO: Exit from editing mode. X`20 XP: Display new sector. Each sector represents a 20*70 area of the map,`20 X arranged as follows: X 0 5 X 1 6 X 2 7 X 3 8 X 4 9 `20 X the sectors overlap by 10 vertically, and 40 horizontally. X`20 XR: Put army in 'random'. X`20 XS: Put piece in Sentry mode. X`20 XY: Change phase of city that cursor is on top of. When program asks for X production demands, key in the letter corresponding to what you want X produced. You are reprompted if you enter an illegal type. X`20 X?: Display information about piece or city. For pieces, displays X function, range, hits left, any pieces aboard. Cities display`20 X production, fighter paths, and any pieces in the city. X`0C XEMPIRE Playing Instructions Page 9 X X XNOTES: X X You can give cities functions. This doesn't affect the city any, but any Xfighter landing in that city will pick up the specified function. This is Xuseful for setting up automatic fighter movements. X X Note that you cannot assign movement to a piece inside a city with the Xeditor. X X After the exploration stage use of automatic piece movement will make Xyour play easier. When being prompted for piece movement the command Xsequence 'JMNO' is very useful. X X X DIFFERENCES In Version 5.00 from earlier versions. X X There is no save game command (once 'V'). This is now automatically X done. X X The data file EMSAVE.DAT is a different format, old games cannot be X continued. X X There is VT125 and GIGI support for fancy map output. X X You can select the difficulty level at the start of the game. X X Armies will automatically wake up if a troop transport that can carry X them becomes adjacent. X X Transports can load armies within cities and can carry armies into X cities. X X Map output now uses forward/reverse scrolling on appropriate terminals. X X The computer strategy is significantly improved. X X Several bugs have been fixed. $ CALL UNPACK EMPIRE.DOC;1 522002193 $ create 'f' XC `09PROGRAM EMPIRE XC XC This program is a war game simulation for video terminals. XC The game was originally written outside of Digital, probably a university. XC This version of the game was made runnable on Digital Equipment VAX/VMS XC FORTRAN by conversion from the TOPS-10/20 sources available around fall 19 V79. XC After debugging it, numerous changes have been made. XC XC Now that you are the proud owner of the source and you are all gung ho XC to do things right, there are a few things you should be aware of. XC There are many magic numbers controlling how many different kinds of XC units can exist and how many of each, so it is unfortunately not easy XC to add another unit type. Also, "slight changes" to the way the units XC work will typically have a fairly devastating affect on the computers XC strategy. If you are interested in really hacking this, there is a plenty XC of room for enhanced computer strategy. As you'll see, there are some XC very good debugging tools tucked inside, and you will soon discover weak XC points and bugs, that up until you, have remained problems (all the previo Vus XC programmers got lazy or lost interest). Finally, please be careful with XC the version number and identification at start up to avoid confusion of XC ongoing versions with private copies. If you make a change don't remove XC the major version id, but rather add something like (V4.0 site.1 20-JUL-80 V). XC X`09INCLUDE 'EMPIRE.INC/LIST' X`09BYTE ODOR(2) X`09EQUIVALENCE (ODOR(1),ORDERS) XC`20 X`09INTEGER*4 BDESC(2),BUFFER(3) X`09EXTERNAL IO$_SETMODE,TT$M_WRAP XC X`09WIN=0`09`09`09`09!** X`09NCYCLE=1 X`09LOGFLAG=0 X`09PASS=.FALSE. X`09AUTOMV=.FALSE. XC XC TEMPORARILY FORCE PROGRAM INTO NOWRAP MODE BECAUSE OF BUG IN TERMINAL DRI VVER XC X`09CALL SYS$ASSIGN('TT',CHAN,,) X`09BDESC(1)=12 X`09BDESC(2)=%LOC(BUFFER(1)) X`09CALL SYS$GETCHN(%VAL(CHAN),,BDESC(1),,) X`09I=%LOC(TT$M_WRAP) X`09BUFFER(3)=(BUFFER(3).OR.I)-I X`09CALL SYS$QIOW(,%VAL(CHAN),%VAL(%LOC(IO$_SETMODE)),,,,BUFFER(2),,,,,) XC XC X`09CALL ERASE_PAGE(1,1) X`09TYPE 999 X999`09FORMAT(1X,//////////////) X`09TYPE 998 X998`09FORMAT(' EMPIRE, Version 4.7 18-Oct-81'/) X`09TYPE 997 X997`09FORMAT(' Please send bug reports to GAMEUTIL'/) XC`09TYPE 996 XC996`09FORMAT(' Known bugs/restrictions'/ XC`091' None'/ XC`099) X X`09CALL STROUT('Detailed directions are in EMPIRE.DOC',1) XC XC`09-1/0/1 = RESTORE/START/SAVE GAME XC X`09CALL GAME(-1,0)`09`09!Try to restore a previous game X`09LASTSAVE=MDATE XC`20 XC COMMAND LOOP STARTS HERE. XC X100`09IF (AUTOMV) GOTO 4200`09!Don't ask if in auto move X`09CALL LIB$SET_CURSOR(2,1) X`09IF (LASTSAVE.NE.MDATE) THEN X`09 CALL GAME(+1,0) X`09 LASTSAVE=MDATE X`09 CALL STROUT('Game saved.',1) X`09ENDIF X`09CALL LIB$SET_CURSOR(1,1) X`09CALL STROUT('Your orders? ',13) X`09ACCEPT 995, ORDERS X995`09FORMAT(A2) XC XC `09`09SPECIAL HACK FOR JE COMMAND X`09IF ((ODOR(1).GE.'a').AND.(ODOR(1).LE.'z')) ODOR(1)=ODOR(1)-32 X`09IF ((ODOR(2).GE.'a').AND.(ODOR(2).LE.'z')) ODOR(2)=ODOR(2)-32 X`09IF ((SPECAL).AND.(ORDERS.EQ.'JE')) GOTO 3900 XC LOOKUP COMMAND X`09DO 200 I=1,20 X200`09IF (ORDERS.EQ.COMSCN(I)) GOTO 300 X`09IF (PASS) GOTO 2200 X`09GOTO 100 XC`09 M,N,O,S,T,V,P,Y,C, L, H, J, G, R, x, Q , +, A X300`09GOTO (400,500,600,700,800,900,1000,1100,1200,1300, X`091 1400,1500,1600,1700,1800,1900,2000,2100) I X`09GOTO 100 X X400`09GOTO 4200`09`09`09!M - MOVE MODE X X500`09CALL LIB$SET_CURSOR(2,1)`09!N - FREE ENEMY MOVES X`09CALL STROUT('Number of free enemy moves:',12) X`09ACCEPT 993,NCYCLE X`09GOTO 5300 X X600`09continue`09`09`09!O - unused X1100`09continue`09`09`09!Y - unused X`09call direc X`09GOTO 100 X X700`09CALL ERASE_PAGE(1,1)`09`09!S - CLEAR THE SCREEN X`09ISEC=-1 X`09GOTO 100 X X800`09CALL BLOCK(PMAP(1))`09`09!T - PRINT OUT MAP X`09GOTO 100 X X1000`09CALL SECTOR(PMAP(1))`09`09!P - PRINT OUT A SECTOR X`09GOTO 100 X X900`09IF (GIGI.EQ.0) THEN X`09 GIGI=-1`09`09`09!V - SET VT125 DISPLAY MODE X`09 CALL VT125_ON X`09 CALL STROUT('VT125 mode enabled.',1) X`09 GOTO 100 X`09ENDIF X`09IF (GIGI.EQ.1) THEN X`09 CALL DIREC`09`09`09!ERROR MSG X`09 GOTO 100 X`09ENDIF X`09GIGI=0`09`09`09`09!DISABLE VT125 MODE X`09ISEC=-1 X`09CALL VT125_OFF X`09CALL STROUT('VT125 mode disabled.',1) X`09GOTO 100 X X1200`09GOTO 5200`09`09`09!C - GIVE ONE FREE ENEMY MOVE X X1300`09LOGFLAG=.NOT.LOGFLAG`09`09!L - TURN ON/OFF GAME LOG X`09GOTO 100 X X1400`09CALL HELP`09`09`09!H - HELP X`09ISEC=-1 X`09GOTO 100 X X1500`09MODE=1`09`09`09`09!J - EDIT MODE X`09Z6=0 X`09CALL EDIT(Z6) X`09GOTO 100 X X1600`09IF (GIGI.EQ.0) THEN`09`09!G - GIGI ENABLE/DISABLE X`09 GIGI=1 X`09 SWIDTH=56 X`09 CALL GIGI_ON X`09 CALL STROUT('GIGI mode enabled.',1) X`09 GOTO 100 X`09ENDIF X`09IF (GIGI.EQ.-1) THEN X`09 CALL DIREC X`09 GOTO 100 X`09ENDIF X`09GIGI=0 X`09SWIDTH=70 X`09ISEC=-1 X`09CALL GIGI_OFF X`09CALL STROUT('GIGI mode disabled.',1) X`09GOTO 100 X X1700`09CALL LIB$SET_CURSOR(3,40)`09`09!R - DISPLAY ROUND NUMBER X`09CALL STROUT(' Round #',2) X`09TYPE 994,MDATE X994`09FORMAT('+',I4,1X,$) X`09GOTO 100 X X1800`09GOTO 100 X X1900`09CALL LIB$SET_CURSOR(2,1)`09`09!Q - QUIT X`09CALL STROUT(' QUIT- Are you sure? ',2) X`09E=GETCHX() X`09IF (E.NE.'Y' .AND. E.NE.'y') GOTO 100 X`09CALL ERASE_PAGE(1,1) X`09CALL EXIT X X2000`09E=GETCHX()`09`09`09!+ - TURN ON PASS X`09IF (E.EQ.'+') PASS=.TRUE. X`09IF (E.EQ.'-') PASS=.FALSE.`09! OR OFF X`09GOTO 100 X X2100`09AUTOMV=.TRUE.`09`09`09!A - TURN ON AUTO MOVE MODE X`09GOTO 4200 X XC`20 X2200`09DO 2300 I=21,40`09`09`09!DEBUGGING COMMANDS X2300`09IF (ORDERS.EQ.COMSCN(I)) GOTO 2400 X`09GOTO 100 XC`09 LO,NU,LI,TR,AR,TA,PA,A1,T3,A0,CO,CH,Q0, Q1,JE,CY,EX X2400`09GOTO (2500,2600,2700,2800,2900,3000,3100,3200,3300, X`091 3400,3500,3600,3700,3800,3900,4000,4100) I-20 X`09GOTO 100 X X2500`09TYPE 986, ((LOCI(I,J),J=1,11),I=1,10) !LO - X`09GOTO 100 X X2600`09TYPE 989,NUMBER`09`09!NU - X`09GOTO 100 X X2700`09TYPE 991, LIMIT`09`09!LI - X`09GOTO 100 X X2800`09TYPE 990,TROOPT`09`09!TR - X`09GOTO 100 X X2900`09TYPE 989,ARMTOT`09`09!AR - X`09GOTO 100 X X3000`09TYPE 989,TARGET`09`09!TA - X`09ISEC=-1 X`09GOTO 100 X X3100`09TYPE 988, SUCCES,FAILUR`09!PA - X`09GOTO 100 X X3200`09CALL BLOCK(RMAP(1))`09`09!A1 - PRINT REFERENCE MAP X`09GOTO 100 X X3300`09GOTO 100`09`09`09!T3 - IGNORED X X3400`09CALL BLOCK(EMAP(1))`09`09!A0 - PRINT COMPUTER'S MAP X`09GOTO 100 X X3500`09ACCEPT 993,I1`09`09`09!CO - X`09ACCEPT 993,I2 X993`09FORMAT(I) X`09TYPE 987, (CODEFU(J),CODELA(J),J=I1,I1+I2) X`09GOTO 100 X X3600`09ACCEPT 985,CODER`09`09!CH - SET CODER VARIABLE X`09GOTO 100 X X3700`09ISEC=-1`09`09`09`09!Q0 - DISPLAY ENEMY MAP SECTOR X`09CALL LIB$SET_CURSOR(1,40) X`09CALL STROUT('Sector?',12) X`09JECTOR=IPHASE(GETCHX()) X`09CALL SECTOR(EMAP(1)) X`09GOTO 100 X X3800`09ISEC=-1`09`09`09`09!Q1 - DISPLAY REFERENCE MAP SECTOR X`09CALL LIB$SET_CURSOR(1,40) X`09CALL STROUT('Sector?',12) X`09JECTOR=IPHASE(GETCHX()) X`09CALL SECTOR(RMAP(1)) X`09GOTO 100 X X3900`09ISEC=-1 X`09JECTOR=IPHASE(GETCHX())`09`09!JE - DISPLAY ENEMY SECTOR OF CHOICE X`09IF (JECTOR.LT.0.OR.JECTOR.GT.9) GOTO 3900 X`09CALL SECTOR(EMAP(1)) X`09ISEC=-1 X`09GOTO 100 X X4000`09type *,'total player city rounds=',pcityrounds X`09type *,'total computer city rounds=',ccityrounds X`09p=0 X`09c=0 X`09do 4010 i=1,8 X`09p=p+producedunits(1,i)*ph(i) X`09c=c+producedunits(2,i)*ph(i) X4010`09continue X`09type *,'total player production',p X`09type *,'total computer production',c X`09type 991,((producedunits(i,j),j=1,8),i=1,2) X`09ISEC=-1 X`09GOTO 100`09`09`09!CY - show running production totals X X4100`09EX=EXPL()`09`09`09!EX - DISPLY EXPLORE FUNCTION VALUE X`09TYPE 992,EX X`09GOTO 100 XC`20 X992`09FORMAT('+EXP VALUE:',I5$) X991`09FORMAT(1X,8I4) X990`09FORMAT(1X,5I6) X989`09FORMAT(1X,10I5) X988`09FORMAT(' SUCCESS:',I6,' FAILURE:',I6) X987`09FORMAT(1X,10I7) X986`09FORMAT(11I5) X985`09FORMAT(I) XC`20 XC BEGIN MOVEMENT XC`20 XC USER MOVE XC`20 X4200`09IF (MODE.EQ.0) GOTO 4400 X`09IF (JECTOR.NE.-1) GOTO 4300 X`09CALL ERASE_PAGE(1,1) X`09JECTOR=0 X`09ISEC=-1 X4300`09ISTART=ISEC X`09IF (ISEC.LT.0) ISTART=0 X4400`09DO 4500 I=1,1500 X4500`09MOVEDFLAG(I)=0 X`09DO 4550 Y=1,70 X`09IF (OWNER(Y).eq.1) CALL SENSOR(X(Y)) X4550`09continue X`09DO 4700 JECT=ISTART,ISTART+9 X`09IF (MODE.EQ.0) GOTO 4600 X`09JECTOR=JECT X`09IF (JECT.GT.9) JECTOR=JECT-10 X`09LINE=KLINE(KI,JECTOR) X`09IADJST=LINE+KI-300 X4600`09CALL SHIPMV(ITT,ITTH,5,'T',3) X`09CALL SHIPMV(ICA,ICAH,7,'C',8) X`09CALL SHIPMV(IBA,IBAH,8,'B',12) X`09CALL SHIPMV(ICR,ICRH,6,'R',8) X`09CALL SHIPMV(ISU,ISUH,4,'S',2) X`09CALL SHIPMV(IDE,IDEH,3,'D',3) X`09CALL ARMYMV X`09CALL FIGHMV X`09IF (MODE.EQ.0) GOTO 4800 X4700`09CONTINUE X4800`09CONTINUE XC`20 XC HARDWARE PRODUCTION XC X`09DO 5100 Y=1,70 X`09IF (OWNER(Y).NE.1) GOTO 5100 Xc`09CALL SENSOR(X(Y)) X`09IF (PHASE(Y).EQ.8) GOTO 4900 X`09IF ((PHASE(Y).LT.1).OR.(PHASE(Y).GT.15)) GOTO 4900 X`09IF (MOD(PHASE(Y),2).EQ.0) GOTO 5000 X`09IF (MOD(PHASE(Y),5).EQ.0) GOTO 5000 X`09IF (PHASE(Y).EQ.1) GOTO 5000 XC XC CITY PHASE INCORRECT OR WE JUST TOOK IT XC X4900`09CALL ERASE_PAGE(1,1) X`09ISEC=-1 X`09TYPE 984,X(Y) X984`09FORMAT(' Readout around city at',I5) X`09I1=MODE X`09MODE=0 X`09CALL LTR(X(Y),0) X`09MODE=I1 X`09CALL STROUT('What are your production demands for this city? ',13) X`09CALL PHASIN(Y,E) X`09TYPE 977,E X977`09FORMAT ('+',A1,$) X`09GOTO 5100 X5000`09pcityrounds=pcityrounds+1 X`09IF (MDATE.LT.FOUND(Y)) GOTO 5100 X`09FOUND(Y)=MDATE+PHASE(Y)*5 X`09CALL LIB$SET_CURSOR(3,1) X`09CALL STROUT('City #',10) X`09CALL DECPRT(Y) X`09CALL STROUT(' at',10) X`09CALL DECPRT(X(Y)) X`09CALL STROUT(' has completed a',0) X`09K=PHASE(Y) XCD`09TYPE 983, HITS(K),X(Y),TIPE(K),CRAHIT(K),CRALOC(K), XCD`091 LOPMAX(K),K XCD983`09FORMAT(' HITS:',I5,' X(Y):',I5,' TIPE(K):',I5,' CRAHIT(K):',I5,/ XCD`091 ,' CRALOC(K):',I5,' LOPMAX(K):',I5,' K:',I) X`09CALL PROD(HITS(K),X(Y),LIMIT(TIPE(K)),CRAHIT(K),CRALOC(K), X`091`09LOPMAX(K),AR2S,TIPE(K)+1,RANGE) X`09producedunits(1,tipe(k))=producedunits(1,tipe(k))+1 X5100`09CONTINUE X5200`09CONTINUE XC`20 XC COMPUTER MOVE XC`20 X5300`09CONTINUE XD`09CALL PME_INIT X`09DO 5500 I=1,NCYCLE XC X`09CALL ARMCNT X`09CALL TROOPM XC X`09CALL LIB$SET_CURSOR(1,1) X`09CALL STROUT('... My turn, thinking ...',3) XC X`09CALL ARMYEN XC`20 X`09CALL LIB$ERASE_LINE(1,1)`09!BLANK THE THINKING XC X`09CALL CARIER X`09CALL ENEMYM('b',12,IBA2H,IBA2,8) X`09CALL ENEMYM('r',8,ICR2H,ICR2,6) X`09CALL ENEMYM('s',2,ISU2H,ISU2,4) X`09CALL ENEMYM('d',3,IDE2H,IDE2,3) XC`20 X`09CALL LIB$SET_CURSOR(1,1) X`09CALL STROUT('... My turn, thinking ...',3) X`09CALL FIGHTR XC XC AGE KNOWN ENEMY ARMY LOCATIONS XC X`09DO 5350 K=1,10 X`09IF (LOCI(K,1)+17.GT.MDATE) GOTO 5350`09!IF DATA IS NOT OLD X`09DO 5340 J=1,11 X5340`09LOCI(K,J)=0`09`09`09`09!ZERO THAT LINE X5350`09CONTINUE XC`20 XC PRODUCTION OF ENEMY HARDWARE XC X`09CALL CITYCT X`09DO 5400 Y=1,70 X`09IF ((X(Y).EQ.0).OR.(OWNER(Y).NE.2)) GOTO 5400 X`09ccityrounds=ccityrounds+1 X`09CALL SONAR(X(Y)) X`09IF ((PHASE(Y).LE.0).OR.(MDATE.LT.FOUND(Y))) GOTO 5380 X`09K=PHASE(Y) X`09J=0 X`09IF (K.EQ.1) J=1 X`09CALL PROD(HITS(K),X(Y),LIMIT(TIPE(K)+8),CRAHIT(K)+IDE2H, X`091`09CRALOC(K)+1500,LOPMAX(K),AR2S,J,RANG) X`09producedunits(2,tipe(k))=producedunits(2,tipe(k))+1 X5380`09IF ((PHASE(Y).LE.0).OR.(MDATE.GE.FOUND(Y))) CALL CITYPH(Y) X5400`09CONTINUE X`09MDATE=MDATE+1 X`09NEWRND=1 X`09IF (MOD(MDATE,4).EQ.0.OR.(MDATE.GT.160)) THEN X`09 CALL GAME (+1,0) X`09 LASTSAVE=MDATE X`09ENDIF +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-