|
|
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 g
Length: 3458 (0xd82)
Types: TextFile
Names: »gen.f«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Empire/gen.f«
C
C RANDOM MAP GENERATION SUBROUTINES
C
SUBROUTINE GEN
IMPLICIT INTEGER(A-Z)
PARAMETER (WIDTH=100,HEIGHT=60)
character MAP(WIDTH,HEIGHT)
character OWNED(WIDTH,HEIGHT)
INTEGER SIZES(128)
include 'common.h'
EQUIVALENCE (MAP(1,1),OMAP(1)),(OWNED(1,1),RMAP(1))
100 DO 200 I=1,WIDTH
DO 200 J=1,HEIGHT
200 MAP(I,J)='.'
HSECTS=3+irand(4)
VSECTS=3+irand(3)
HSPACE=WIDTH/HSECTS
VSPACE=HEIGHT/VSECTS
DO 400 I=1,HSECTS
DO 400 J=1,VSECTS
DO 400 K=1,irand(2)+irand(3)
CALL MAKELAND
YPOS=(J-1)*VSPACE+irand(VSPACE)
XPOS=(I-1)*HSPACE+irand(HSPACE)
DO 300 L=1,39
DO 300 M=1,39
IF (SUBMAP(L,M).EQ.' ') GOTO 300
IF (((XPOS+L-20).LE.0).OR.((XPOS+L-20).GT.100)) GOTO 300
IF (((YPOS+M-20).LE.0).OR.((YPOS+M-20).GT.60)) GOTO 300
MAP(XPOS+L-20,YPOS+M-20)=SUBMAP(L,M)
300 CONTINUE
400 CONTINUE
COUNT=0
DO 500 I=1,100
DO 500 J=1,60
IF (MAP(I,J).EQ.'.') COUNT=COUNT+1
500 CONTINUE
IF (COUNT.LT.4000.AND.COUNT.GT.2500) GOTO 600
c PRINT 999,COUNT
C WRITE (1,999) COUNT
c999 FORMAT(' FAILED SEA CHECK, COUNT=',I5)
GOTO 100
c600 PRINT 998,COUNT
C WRITE (1,998) COUNT
c998 FORMAT(' COUNT=',I5)
600 continue
DO 800 I=1,100
DO 800 J=1,60
OWNED(I,J)='\0'
800 CONTINUE
LAREA=1
WAREA=33
DO 1000 I=2,99
DO 1000 J=2,59
IF (OWNED(I,J).NE.'\0') GOTO 1000
IF (MAP(I,J).EQ.'.') THEN
IF (SET(I,J,CHAR(WAREA),'.',12000).EQ.0) GOTO 100
WAREA=WAREA+1
GOTO 1000
ELSE
IF (SET(I,J,CHAR(LAREA),'+',1200).EQ.1) GOTO 900
c PRINT 997
C WRITE (1,997)
c997 FORMAT(' FAILED SINGLE LAND MASS TEST')
C GOTO 100
goto 1000
ENDIF
900 LAREA=LAREA+1
1000 CONTINUE
IF (LAREA.GE.10.AND.LAREA.LE.30) GOTO 1100
c PRINT 996, LAREA
C WRITE(1,996)
c996 FORMAT('FAILED SEPARATION TEST -- land areas = ', i4)
c PRINT 103,((MAP(I,J),I=1,100),J=1,60)
C WRITE(1,103) ((MAP(I,J),I=1,100),J=1,60)
c103 FORMAT(1X,100A1)
GOTO 100
c1100 PRINT 995,((int('@')+int(OWNED(I,J)),I=1,100),J=1,60)
C WRITE(1,995) (('@'+OWNED(I,J),I=1,100),J=1,60)
c995 FORMAT(1X,100A1)
1100 DO 1300 I=1,128
1300 SIZES(I)=0
DO 1400 I=2,99
DO 1400 J=2,59
SIZES(int(OWNED(I,J)))=SIZES(int(OWNED(I,J)))+1
1400 CONTINUE
SCOUNT=COUNT*40/50
DO 1500 SEA=33,WAREA
1500 IF (SIZES(SEA).GE.SCOUNT) GOTO 1600
c PRINT 994
C WRITE (1,994)
c994 FORMAT(' FAILURE- OCEANS ARE SEPARATED')
GOTO 100
1600 CITS=(6000-COUNT)/50+1
CITS=MAX(52,CITS)
CITS=MIN(70,CITS)
SEACITS=CITS*60/100+irand(12)
LANDCITS=CITS-SEACITS
DO 2100 K=1,SEACITS
1700 I=irand(98)+2
J=irand(58)+2
IF (MAP(I,J).NE.'+') GOTO 1700
DO 1800 L=MAX(2,I-1),MIN(99,I+1)
DO 1800 M=MAX(2,J-1),MIN(59,J+1)
IF (int(OWNED(L,M)).EQ.SEA) GOTO 1900
1800 CONTINUE
GOTO 1700
1900 DO 2000 L=MAX(2,I-3),MIN(99,I+3)
DO 2000 M=MAX(2,J-3),MIN(59,J+3)
IF (OWNED(L,M).NE.OWNED(I,J)) GOTO 2000
IF (MAP(L,M).EQ.'*') GOTO 1700
2000 CONTINUE
MAP(I,J)='*'
CITIES(int(OWNED(I,J)))=CITIES(int(OWNED(I,J)))+100
2100 CONTINUE
DO 2500 K=1,LANDCITS
2200 I=irand(98)+2
J=irand(58)+2
IF (MAP(I,J).NE.'+') GOTO 2200
DO 2300 L=MAX(2,I-1),MIN(99,I+1)
DO 2300 M=MAX(2,J-1),MIN(59,J+1)
IF (MAP(L,M).EQ.'.') GOTO 2200
2300 CONTINUE
DO 2400 L=MAX(2,I-2),MIN(99,I+2)
DO 2400 M=MAX(2,J-2),MIN(59,J+2)
IF (OWNED(L,M).NE.OWNED(I,J)) GOTO 2400
IF (MAP(L,M).EQ.'*') GOTO 2200
2400 CONTINUE
MAP(I,J)='*'
CITIES(int(OWNED(I,J)))=CITIES(int(OWNED(I,J)))+1
2500 CONTINUE
c PRINT 993,((MAP(I,J),I=1,100),J=1,60)
C WRITE(1,993) ((MAP(I,J),I=1,100),J=1,60)
c993 FORMAT(1X,100A1)
END