SUBROUTINE MVE(OWN1,XXXMDATE,RELNUM,NUM,N2,Z6,Z7,DISAS,JURSOR) C C INPUTS: C OWN1 = CHAR OF PIECE (IE: 'A' FOR ARMY) C XXXMDATE = ROUND NUMBER C RELNUM = RELATIVE PIECE NUMBER TO TYPE C NUM = PIECE INDEX TO RLMAP C N2 = PIECE INDEX TO HITS C Z6 = LOCATION, RETURN NEW LOCATION C Z7 = OLD LOCATION C DISAS = 0:OK, -2:STASIS C JURSOR = CURRENT CURSOR C INCLUDE 'EMPIRE.INC/NOLIST' C C HANDLE PLAYER MOVE MODE C DISAS=0 C GET COMMAND CHARACTER WITH NO ECHO 100 CALL MAP(5) CALL SECTOR(PMAP(1)) CALL MAP(8) IB=J1TS(N2) CALL HEAD(OWN1,RELNUM,NUM,Z6,IB) !DISPLAY HEADER CALL CURSOR(JURSOR) 200 E=GETCHX() CALL LIBLIN(2,1) CALL LIBLIN(3,1) C C LOOK AT THE COMMAND C Z7=Z6 DO 300 I=1,9 IND=I 300 IF (E.EQ.KBTBL(IND)) GOTO 400 GOTO 500 !COMMAND IS NOT A DIRECTION 400 Z6=Z6+KBFUDG(IND) GOTO 4200 C 500 END=15 C IF (PASS) END=20 DO 600 I=1,END 600 IF (E.EQ.COMMAN(I)) GOTO 700 I=0 C S,R,I,K,O,L,F,G,P, H, Y, T, V, J, ?, 0, 0, U, N, + C700 GOTO (900,1000,1100,1500,1900,2000,2900,2400,2500,2600, C 1 2700,2800,2900,3200,3300,800,800,3800,3900,2600) I 700 GOTO (900,1000,1100,1500,1900,2000,2800,2400,2500,2600, 1 2700,2800,2900,3200,3300) I 800 GOTO 100 C C S: PUT TO SLEEP C 900 CALL MAP(2) IF (RMAP(Z6).EQ.'O') RETURN CALL MAP(7) MYCODE(NUM)=50 RETURN C C R: RANDOM MOVEMENT C 1000 IF (OWN1.NE.'A') GOTO 100 !ONLY FOR ARMIES CALL MAP(7) MYCODE(NUM)=100 Z6=Z6+IARROW(JIGGLE(Z6,NUM)+1) !** RETURN C C I: PUT IN DIRECTIONAL STASIS C 1100 CALL CURSOR(JURSOR) !CUZ OF CLEAR LINES ABOVE E=GETCHX() CALL MAP(7) DO 1200 I=1,9 IF (E .EQ. KBTBL(I)) GOTO 1300 1200 CONTINUE GOTO 1400 1300 MYCODE(NUM)=CMYTBL(I) 1400 IF (MYCODE(NUM).EQ.0) GOTO 100 DISAS=-2 RETURN C C K: KILL STASIS NUMBER ON PIECE C 1500 CALL MAP(7) MYCODE(NUM)=0 !ZERO FUNCTION CODE FOR ANYTHING IF (OWN1.NE.'T') GOTO 1700 !IF TRANSPORT, WAKE ARMIES ABOARD DO 1600 J=1,500 CALL MAP(4) IF (RLMAP(J).NE.Z6) GOTO 1600 CALL MAP(7) MYCODE(J) = 0 1600 CONTINUE C1600 IF (RLMAP(J).EQ.Z6) MYCODE(J)=0 GOTO 100 1700 IF (OWN1.NE.'C') GOTO 100 !IF CARRIER, WAKE FIGHTERS ABOARD DO 1800 J=501,700 CALL MAP(4) IF (RLMAP(J).NE.Z6) GOTO 1800 CALL MAP(7) MYCODE(J)=0 1800 CONTINUE C1800 IF (RLMAP(J).EQ.Z6) MYCODE(J)=0 GOTO 100 C C O: CANCEL AUTO MOVE MODE C 1900 AUTOMV=.FALSE. CALL LIBCUR(3,1) CALL STROUT(' Auto move mode canceled.',3) GOTO 100 C C L: SET UP CITY STASIS NUMBERS C 2000 CALL MAP(3) IF (OMAP(Z6).NE.'*') GOTO 2900 !BETTER BE A CITY E=GETCHX() DO 2100 I=1,9 IF (E .EQ. KBTBL(I)) GOTO 2200 2100 CONTINUE GOTO 4100 2200 FIPATH(CITFND(Z6))=CMYTBL(I) !SET STASIS NUMBER DISAS=-2 RETURN C C F: C C2300 CALL DIREC C GOTO 4100 C C G: PUT T/C TO SLEEP C 2400 IF ((OWN1.NE.'T').AND.(OWN1.NE.'C')) GOTO 100 CALL MAP(7) MYCODE(NUM)=9997 DISAS=-2 RETURN C C P: SECTOR PRINTOUT C 2500 ISEC=-1 CALL MAP(5) CALL SECTOR(PMAP(1)) GOTO 4100 C C H: GET HELP C 2600 CALL HELP E=GETCHX() ISEC=-1 GOTO 4100 C C Y: CHANGE PHASE OF A CITY C 2700 CONTINUE C2700 CALL DIREC C GOTO 4100 C C T: BLOCK PRINTOUT C C2800 CALL CLEAR C CALL BLOCK(PMAP(1)) C ISEC=-1 C GOTO 4100 C C V: SAVE GAME C C2900 CALL GAME(1,NUM) !NOT SURE THIS WILL WORK AS PLAYERS EXPECT 2800 CONTINUE 2900 CALL DIREC GOTO 100 C C J: PUT IN EDIT MODE C 3200 CALL EDIT(Z6) CALL MAP(7) IF (MYCODE(NUM).EQ.0) GOTO 100 DISAS=-2 RETURN C C ?: HOW MANY HITS? LOADED? C 3300 IF ((OWN1.EQ.'A').OR.(OWN1.EQ.'F')) GOTO 100 C IB=J1TS(N2) !DISPLAY HITS LEFT C IF (MODE.EQ.1) CALL LIBCUR(2,1) C CALL STROUT(' Hits left:',10) C CALL DECPRT(IB) CALL LIBLIN(2,1) C CALL LIBLIN N=0 !COUNT ARMIES CALL MAP(4) IF (OWN1.NE.'T') GOTO 3500 DO 3400 I=1,500 3400 IF (RLMAP(I).EQ.Z6) N=N+1 IF (N.EQ.0) GOTO 3700 IF (MODE.EQ.1) CALL LIBCUR(3,1) CALL DECPRT(N) CALL STROUT(' armies aboard.',1) GOTO 4100 3500 IF (OWN1.NE.'C') GOTO 4100 DO 3600 I=1,200 !COUNT FIGHTERS 3600 IF (RLMAP(I+500).EQ.Z6) N=N+1 IF (N.EQ.0) GOTO 3700 IF (MODE.EQ.1) CALL LIBCUR(3,1) CALL DECPRT(N) CALL STROUT(' fighters aboard.',1) GOTO 4100 3700 IF (MODE.EQ.1) CALL LIBCUR(3,1) !NOTHING ABOARD CALL STROUT('Nothing aboard.',1) GOTO 4100 C C U: CALL REFERENCE MAP C C3800 ISEC=-1 C CALL SECTOR(RMAP(1)) C GOTO 4100 C C N: CALL ENEMY MAP C C3900 ISEC=-1 C CALL SECTOR(EMAP(1)) C GOTO 4100 CC C +: BLOCK PRINT REF. MAP C C4000 CALL LIBPGE(1,1) C ISEC=-1 C CALL BLOCK(RMAP(1)) C E=GETCHX() C GOTO 4100 C 4100 CALL LTR(Z6,2) GOTO 100 4200 IF (ORDER(Z6).EQ.0) GOTO 4300 IF (MODE.EQ.1) CALL LIBCUR(3,1) CALL STROUT('You cannot move onto the edge of the world.',1) Z6=Z7 GOTO 4100 4300 RETURN END SUBROUTINE HELP C C HELP - PRINT HELP FILE C CALL LIBPGE(1,1) CALL STROUT('EMPIRE.HLP (see EMPIRE.DOC for more detail)',1) CALL STROUT('ORDERS MODE----------- 1 MOVE MODE------------- EDIT MODE-------------',0) CALL LIBCUR(8,1) CALL STROUT('A: Stay in Move mode',1) CALL STROUT('C: Give 1 free move',1) CALL STROUT('H: This text',1) CALL STROUT('J: Enter Edit mode',1) CALL STROUT('M: Enter Move mode',1) CALL STROUT('N: Give n free moves',1) CALL STROUT('P: Refresh sector',1) CALL STROUT('Q: Quit game',1) CALL STROUT('R: Display round #',1) CALL STROUT('S: Clear screen',1) CALL STROUT('T: Print out map',1) CALL STROUT('V: Save game',0) C CALL LIBCUR(4,25) CALL STROUT('789: Movement',0) CALL LIBCUR(5,25) CALL STROUT('4 6 direction',0) CALL LIBCUR(6,25) CALL STROUT('123',0) CALL LIBCUR(7,25) CALL STROUT('5: Sit',0) CALL LIBCUR(8,25) CALL STROUT('G: Sleep till full T,C',0) CALL LIBCUR(9,25) CALL STROUT('H: This text',0) CALL LIBCUR(10,25) CALL STROUT('I: Set direction',0) CALL LIBCUR(11,25) CALL STROUT('J: Enter Edit mode',0) CALL LIBCUR(12,25) CALL STROUT('K: Wake piece',0) CALL LIBCUR(13,25) CALL STROUT('L: Set city direction',0) CALL LIBCUR(14,25) CALL STROUT('O: Cancel Auto moves',0) CALL LIBCUR(15,25) CALL STROUT('P: Refresh screen',0) CALL LIBCUR(16,25) CALL STROUT('R: Random for Armies',0) CALL LIBCUR(17,25) CALL STROUT('S: Sentry',0) CALL LIBCUR(18,25) CALL STROUT('?: Display function',0) C CALL LIBCUR(4,49) CALL STROUT('789: Cursor',0) CALL LIBCUR(5,49) CALL STROUT('4 6 direction',0) CALL LIBCUR(6,49) CALL STROUT('123',0) C CALL LIB$SET_CURSOR(8,49) C CALL STROUT('G: Sleep til full T,C',0) CALL LIBCUR(9,49) CALL STROUT('H: This text',0) CALL LIBCUR(10,49) CALL STROUT('I: Set direction',0) CALL LIBCUR(11,49) CALL STROUT('K: Wake anything',0) CALL LIBCUR(12,49) CALL STROUT('M: Set path start',0) CALL LIBCUR(13,49) CALL STROUT('N: Set path end',0) CALL LIBCUR(14,49) CALL STROUT('O: Exit Edit mode',0) CALL LIBCUR(15,49) CALL STROUT('P: Change sector',0) CALL LIBCUR(16,49) CALL STROUT('R: Random for armies',0) CALL LIBCUR(17,49) CALL STROUT('S: Sentry ',0) CALL LIBCUR(18,49) CALL STROUT('Y: Set city production',0) CALL LIBCUR(19,49) CALL STROUT('?: Display function',1) CALL STROUT('Piece---Yours-Enemy-Moves-Hits-Cost 1 Piece---Yours-Enemy-Moves-Hits-Cost',1) CALL STROUT('Army A a 1 1 5 1 Transport T t 2 3 30',1) CALL STROUT('Fighter F f 4 1 10 1 Cruiser R r 2 8 50',1) CALL STROUT('Destroyer D d 2 3 20 1 Carrier C c 2 8 60',1) CALL STROUT('Submarine S s 2 2 25 1 Battleship B b 2 12 75',0) C RETURN END LOGICAL FUNCTION FATAL(DUMMY) C C ASK PLAYER IF WANTS TO RECONSIDER C IMPLICIT INTEGER(A-Z) BYTE YES(2) DATA YES/'Y','y'/ CALL LIBCUR(2,1) GOTO (100,200,300,400,500,600,650) DUMMY 100 CALL STROUT('The troops cannot swim too well, Commander! 1 Are you SURE you want to goto sea?',13) GOTO 700 200 CALL STROUT('Those are our men, Commander! Do you really want to 1 attack them?',13) GOTO 700 300 CALL STROUT('That''s never worked before, Commander! Are sure you 1 want to try?',13) GOTO 700 400 CALL STROUT('Ships need water to float, Commander! Do you really 1 want to go on shore?',13) GOTO 700 500 CALL STROUT('That''s our city, Commander! Do you really want to 1 attack the garrison?',13) GOTO 700 600 CALL STROUT('Sorry, Commander, there is no room left on the 1 transport. Do you insist?',13) GOTO 700 650 CALL STROUT('Sorry, Commander, there is no room left on the 1 carrier. Do you insist?',13) 700 E=GETCHX() CALL LIBLIN(2,1) IF (E.EQ.YES(1) .OR. E.EQ.YES(2)) THEN FATAL=.TRUE. ELSE FATAL=.FALSE. ENDIF RETURN END SUBROUTINE STASIS(Z6,LOC) C C CHECK IF ARMY #LOC, AT Z6, IS NEAR THE ENEMY, IF SO WAKE HIM UP C INCLUDE 'EMPIRE.INC/NOLIST' C CALL MAP(2) DO 200 I=1,8 AB=RMAP(Z6+IARROW(I+1)) !** IF ((AB.GE.'a').AND.(AB.LE.'t')) GOTO 100 IF (AB.EQ.'X') GOTO 100 IF (AB.NE.'*') GOTO 200 IF (RMAP(Z6).EQ.'F') GOTO 200 100 CALL MAP(7) MYCODE(LOC)=0 GOTO 300 200 CONTINUE 300 RETURN END FUNCTION POSCHK(Z6,OWN) C C DETERMINES IF Z6 IS IN CURRENT UPDATE SECTOR SHOWING C 0=NO, 1=YES C INCLUDE 'EMPIRE.INC/NOLIST' INTEGER LOWSCRS(5),HIGHSCRS(5) DATA LOWSCRS/1,14,24,34,44/ DATA HIGHSCRS/15,25,35,45,58/ C IF (MODE.EQ.1) GOTO 100 POSCHK=1 GOTO 400 100 JECT=JECTOR POSCHK=0 IY=(Z6-1)/100 IX=Z6-IY*100 ADJUST=1 IF (OWN.EQ.'F') ADJUST=0 IF (JECT.GT.4) GOTO 200 IF (IX.GT.(64+ADJUST)) GOTO 400 GOTO 300 200 IF (IX.LT.(36-ADJUST)) GOTO 400 JECT=JECT-5 300 IF ((IY.LT.(LOWSCRS(JECT+1)-ADJUST)).OR. 1 (IY.GT.(HIGHSCRS(JECT+1)+ADJUST))) GOTO 400 POSCHK=1 400 RETURN END FUNCTION JIGGLE(Z6,NUM) C C DO RANDOM MOVE FOR PLAYER'S ARMY C INCLUDE 'EMPIRE.INC/NOLIST' C CALL MAP(2) DO 100 I=1,9 100 AB9(I)=RMAP(Z6+IARROW(I+1)) !** IF (AB9(9).NE.'T') GOTO 200 JIGGLE=0 CALL MAP(7) MYCODE(NUM)=0 RETURN C 200 DO 300 I1=1,9 300 IF ((AB9(I1).EQ.'*').OR.(AB9(I1).EQ.'X')) GOTO 400 I1=9 400 DO 500 I2=1,9 500 IF ((AB9(I2).GE.'a').AND.(AB9(I2).LE.'t')) GOTO 600 I2=9 600 DO 700 I3=1,9 700 IF (AB9(I3).EQ.'T') GOTO 800 I3=9 800 M1=RND(8)+1 !** M2=M1+7 DO 900 I4=M1,M2 I5=ICORR(I4) I=Z6+IARROW(I5+1) !** 900 IF ((ORDER(I).EQ.0).AND.(AB9(I5).EQ.'+')) GOTO 1000 I4=0 1000 M=I1 IF (M.EQ.9) M=I3 IF (M.EQ.9) M=I2 IF (M.EQ.9) M=I5 IF (I4.EQ.0) M=9 JIGGLE=M RETURN END