home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume2 / traveller < prev    next >
Internet Message Format  |  1991-08-07  |  43KB

  1. From: everson@compsci.bristol.ac.uk (Phill Everson)
  2. Newsgroups: comp.sources.misc
  3. Subject: v02i020: Traveller (FRP) programs
  4. Message-ID: <7131@ncoast.UUCP>
  5. Date: 26 Jan 88 04:10:58 GMT
  6. Approved: allbery@ncoast.UUCP
  7.  
  8. Comp.sources.misc: Volume 2, Issue 20
  9. Submitted-By: Phill Everson <everson@compsci.bristol.ac.uk>
  10. Archive-Name: traveller
  11.  
  12. I don't know which newsgroup would be appropriate for the following,
  13. perhaps it should go in comp.sources.misc with some cross-postings?
  14. We are unable to post into rec.games.frp at present, so could you
  15. post it in the most suitable place please?  [Here.  Most non-source
  16. groups frown on sources the way source groups frown on binaries.  ++bsa]
  17.  
  18. # To unbundle, sh this file
  19.  echo README 1>&2
  20. cat >README<<'End of README'
  21. Usage of Traveller Programs
  22. ===========================
  23.  
  24. Create Two subdirectories sysgen & sysprint : Then unbundle the files.
  25. The directories will contain :
  26.  
  27. sysgen:
  28. Makefile const.h glob.c glob.h init.c main.c planets.c print.c rnd.c sats.c st.c
  29. stuff.h sub.c support.c system.c types.h
  30.  
  31. sysprint:
  32. Makefile mass stars.ps tr22 trconv trmult trmult.c ts
  33.  
  34. To generate complete listings of star systems (an allegedly complete
  35. implementation of Single-Star Systems according to the rules in Book 6)
  36. it is necessary to compile the files in sysgen (by typing make) and then
  37. running the program st. Be warned this produces voluminous output.
  38.  
  39. To generate a postscript file representing the star system, run st with
  40. the -m option. This produces a file which lists the major features in the
  41. system.
  42.  
  43. The command trconv file in the sysprint directory will then
  44. produce a postscript file. Trading routes can be added to the system
  45. description file by the DM as required.
  46.  
  47. Multiple systems can be printed using the trmult command. For example
  48.  
  49. trmult 2 2 stars.ps file1 file2 file3 file4
  50.  
  51. will place 4 systems on a piece of paper. But be warned: the order is not
  52. the most obvious imaginable.
  53.  
  54.  
  55. NOTE: the st command takes an argument which is an integer defining the
  56. system. This allows the st program to be run many times with predictable
  57. results.
  58.  
  59. tr22 & mass are historical examples of using trmult.
  60. End of README
  61.  echo sysgen/Makefile 1>&2
  62. cat >sysgen/Makefile <<'End of sysgen/Makefile'
  63. CFLAGS=
  64. PRFLAGS=-l60
  65. OBJS   =rnd.o init.o print.o glob.o st.o system.o support.o planets.o sats.o main.o sub.o
  66. SOURCES=rnd.c init.c print.c glob.c st.c system.c support.c planets.c sats.c main.c sub.c
  67. HDRS=const.h types.h glob.h
  68. PRG=st
  69. LIBS=-lm
  70.  
  71. $(PRG): $(OBJS)
  72.     cc $(CFLAGS) $(OBJS) $(LIBS) -o $(PRG)
  73.  
  74. $(OBJS) : stuff.h
  75.  
  76. stuff.h: $(HDRS)
  77.     @touch stuff.h
  78.  
  79. wc:
  80.     @wc $(SOURCES) $(HDRS)
  81.  
  82. lint:
  83.     @lint $(HDRS) $(SOURCES)
  84.  
  85. pr:
  86.     @pr $(PRFLAGS) $(HDRS) $(SOURCES)
  87.  
  88. objs:
  89.     @echo $(SOURCES)
  90.     @echo $(HDRS)
  91. End of sysgen/Makefile
  92.  echo sysgen/const.h 1>&2
  93. cat >sysgen/const.h <<'End of sysgen/const.h'
  94. #define DIE 6
  95. End of sysgen/const.h
  96.  echo sysgen/glob.c 1>&2
  97. cat >sysgen/glob.c <<'End of sysgen/glob.c'
  98. #include "stuff.h"
  99.  
  100. int orbits[]={ 0.2, 0.4, 0.7, 1.0, 1.6, 2.8, 5.2, 10.0, 19.6, 38.8,
  101.            77.2, 154.0, 307.6, 614.8, 1229.2, 2458.0, 4915.6, 9830.6,
  102.            19661.2, 39322.0 };
  103. char lt[]="aeioubcdfghjklmnpqrstvwxyz";
  104. int freq[]={ 82, 209, 278, 353, 380, 395, 422, 466, 488, 508, 569,
  105.              572, 580, 620, 644, 712, 731, 734, 792, 855, 947, 957,
  106.              980, 981, 1000, 1001 };
  107. int vowel=380;
  108. SYSDATA syst;
  109. char nature[]="SSSSSSSSBBBBTT";
  110. char ptypet[]="BBAMMMMMKGFFFF";
  111. int psizet[]={ 0, 1, 2, 3, 4, 5, 5,
  112.            5, 5, 5, 5, 6, 7, 7 };
  113. char ctypet[]="BBAFFGGKKMMMMM";
  114. int csizet[]={ 0, 1, 2, 3, 4, 7, 7,
  115.            5, 5, 6, 7, 7, 7, 7 };
  116. int natDM= -1;
  117. int typeDM=0;
  118. int sizeDM=0;
  119. char zones[][13][16]={ "--------IIIIIHO",
  120.                        "-------IIIIIHOO",
  121.                        "-------IIIIIHOO",
  122.                        "-------IIIIIHOO",
  123.                        "------IIIIIIHOO",
  124.                        "------IIIIIHOOO",
  125.                        "-------IIIIIHOO",
  126.                        "-------IIIIIHOO",
  127.                        "-------IIIIIHOO",
  128.                        "-------IIIIIHOO",
  129.                        "-------IIIIIHOO",
  130.                        "--------IIIIHOO",
  131.                        "--------IIIIHOO",
  132.  
  133.                        "--------IIIIIHO",
  134.                        "------IIIIIHOOO",
  135.                        "-----IIIIIIHOOO",
  136.                        "-----IIIIIHOOOO",
  137.                        "-----IIIIIHOOOO",
  138.                        "----IIIIIIHOOOO",
  139.                        "----IIIIIIHOOOO",
  140.                        "-----IIIIIHOOOO",
  141.                        "-----IIIIIHOOOO",
  142.                        "------IIIIIHOOO",
  143.                        "------IIIIIHOOO",
  144.                        "-------IIIIIHOO",
  145.                        "--------IIIIHOO",
  146.  
  147.                        "-------IIIIIHOO",
  148.                        "-----IIIIIIHOOO",
  149.                        "---IIIIIIHOOOOO",
  150.                        "--IIIIIIHOOOOOO",
  151.                        "--IIIIIIHOOOOOO",
  152.                        "--IIIIIIHOOOOOO",
  153.                        "--IIIIIIHOOOOOO",
  154.                        "--IIIIIIHOOOOOO",
  155.                        "--IIIIIIIHOOOOO",
  156.                        "---IIIIIIHOOOOO",
  157.                        "----IIIIIIHOOOO",
  158.                        "------IIIIIHOOO",
  159.                        "------IIIIIHOOO",
  160.  
  161.                        "-------IIIIIHOO",
  162.                        "-----IIIIIHOOOO",
  163.                        "-IIIIIIIHOOOOOO",
  164.                        "-IIIIIIHOOOOOOO",
  165.                        "-IIIIIHOOOOOOOO",
  166.                        "-IIIIIHOOOOOOOO",
  167.                        "-IIIIIHOOOOOOOO",
  168.                        "-IIIIIIHOOOOOOO",
  169.                        "-IIIIIIHOOOOOOO",
  170.                        "-IIIIIIIHOOOOOO",
  171.                        "--IIIIIIHOOOOOO",
  172.                        "----IIIIIHOOOOO",
  173.                        "-----IIIIHOOOOO",
  174.  
  175.                        "-------IIIIIHOO",
  176.                        "---IIIIIIHOOOOO",
  177.                        "-IIIIIIHOOOOOOO",
  178.                        "IIIIIIHOOOOOOOO",
  179.                        "IIIIIIHOOOOOOOO",
  180.                        "IIIIIHOOOOOOOOO",
  181.                        "IIIIIHOOOOOOOOO",
  182.                        "IIIIIHOOOOOOOOO",
  183.                        "IIIIHOOOOOOOOOO",
  184.                        "---------------",
  185.                        "---------------",
  186.                        "---------------",
  187.                        "---------------",
  188.  
  189.                        "------IIIIIIHOO",
  190.                        "---IIIIIIHOOOOO",
  191.                        "IIIIIIIHOOOOOOO",
  192.                        "IIIIIIHOOOOOOOO",
  193.                        "IIIIIHOOOOOOOOO",
  194.                        "IIIIHOOOOOOOOOO",
  195.                        "IIIHOOOOOOOOOOO",
  196.                        "IIHOOOOOOOOOOOO",
  197.                        "IIHOOOOOOOOOOOO",
  198.                        "HOOOOOOOOOOOOOO",
  199.                        "HOOOOOOOOOOOOOO",
  200.                        "OOOOOOOOOOOOOOO",
  201.                        "OOOOOOOOOOOOOOO",
  202.  
  203.                        "---------------",
  204.                        "---------------",
  205.                        "---------------",
  206.                        "---------------",
  207.                        "---------------",
  208.                        "IIIHOOOOOOOOOOO",
  209.                        "IIHOOOOOOOOOOOO",
  210.                        "IHOOOOOOOOOOOOO",
  211.                        "IHOOOOOOOOOOOOO",
  212.                        "OOOOOOOOOOOOOOO",
  213.                        "OOOOOOOOOOOOOOO",
  214.                        "OOOOOOOOOOOOOOO",
  215.                        "OOOOOOOOOOOOOOO",
  216.  
  217.                        "HOOOOOOOOOOOOOO",
  218.                        "HOOOOOOOOOOOOOO",
  219.                        "OOOOOOOOOOOOOOO",
  220.                        "OOOOOOOOOOOOOOO",
  221.                        "OOOOOOOOOOOOOOO",
  222.                        "OOOOOOOOOOOOOOO",
  223.                        "OOOOOOOOOOOOOOO",
  224.                        "OOOOOOOOOOOOOOO",
  225.                        "OOOOOOOOOOOOOOO",
  226.                        "OOOOOOOOOOOOOOO",
  227.                        "OOOOOOOOOOOOOOO",
  228.                        "OOOOOOOOOOOOOOO",
  229.                        "OOOOOOOOOOOOOOO" };
  230. int ggno[]={ 0, 1, 1, 1, 2, 2, 3,
  231.              3, 4, 4, 4, 5, 5, 5 };
  232. int plno[]={ 3, 2, 2, 2, 2, 2, 2,
  233.              1, 1, 1, 1, 1, 1, 1 };
  234. int ggDM, plDM;
  235. int ring[]={ 1, 1, 1, 1, 2, 2, 3 };
  236. int clos[]={ 1, 2, 3, 4, 5, 6, 7,
  237.               8, 9, 10, 11, 12, 13 };
  238. int far[]={ 5, 10, 15, 20, 25, 30, 35,
  239.            40, 45, 50, 55, 60, 65 };
  240. int extreme[]={ 75, 100, 125, 150, 175, 200,
  241.                225, 250, 275, 300, 325 };
  242. char starport[]="AAAAABBCCDEEX";
  243. char spaceport[]="YYYHGGF";
  244. int tech[][17]={0,0,0,0,0,0,0,0,0,0,6,4,2,0,0,0,-4,
  245.                 2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
  246.                 1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,
  247.                 0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,
  248.                 0,1,1,1,1,1,0,0,0,2,4,0,0,0,0,0,0,
  249.                 1,0,0,0,0,1,0,0,0,0,0,0,0,-2,0,0,0 };
  250. int mwatm,mwpop,mwgov,mwlaw,mwtech,mwind,mwpoor;
  251. int base;
  252. SUBDATA *subsect,*css;
  253. int grtab[]={ 0,0,0,0,5,5,10,10,
  254.               15,15,40,50,60,15,10,0 };
  255. int cloud[]={ 0,0,10,10,20,30,40,50,60,70,70 };
  256. double lumtab[][13]={ 560000,204000,107000,81000,61000,51000,67000,89000,
  257.                      97000,107000,117000,129000,141000,
  258.                   270000,46700,15000,11700,7400,5100,6100,8100,11700,
  259.                      20400,46000,89000,117000,
  260.                   170000,18600,2200,850,600,510,560,740,890,2450,4600,
  261.                      14900,16200,
  262.                   107000,6700,280,90,53,43,50,75,95,320,470,2280,2690,
  263.                   81000,2000,156,37,19,12,6.5,4.9,4.67,0,0,0,0,
  264.                   56000,1400,90,16,8.1,3.5,1.21,.67,.42,.08,.04,.007,.001,
  265.                   0,0,0,0,0,.977,.322,.186,.117,.025,.011,.002,.00006,
  266.                   .046,.01,.005,.0009,.0003,.00015,.00006,.00005,.00004,
  267.                      .00004,.00003,.00003,.00003 };
  268. double dtab[]={ .2,.4,.7,1,1.6,2.8,5.2,10,19.6,38.8,77.2,154,307.6,614.8,
  269.                      1229.2,2458,4915.6,9380.8,19661.2,39322 };
  270. char spa[50][50];
  271. int mapflag;
  272. End of sysgen/glob.c
  273.  echo sysgen/glob.h 1>&2
  274. cat >sysgen/glob.h <<'End of sysgen/glob.h'
  275. extern int orbits[];
  276. extern char lt[];
  277. extern int freq[];
  278. extern int vowel;
  279. extern SYSDATA syst;
  280. extern char nature[], ptypet[], ctypet[];
  281. extern int psizet[], csizet[], natDM, typeDM, sizeDM;
  282. extern char zones[][13][16];
  283. extern int ggno[], plno[];
  284. extern int ggDM, plDM;
  285. extern int ring[], clos[], far[], extreme[];
  286. extern char starport[],spaceport[];
  287. extern int tech[][17];
  288. extern int mwatm,mwpop,mwgov,mwlaw,mwtech,mwind,mwpoor;
  289. extern int base;
  290. extern SUBDATA *subsect,*css;
  291. extern int grtab[],cloud[];
  292. extern double lumtab[][13], dtab[];
  293. extern char spa[][50];
  294. extern int mapflag;
  295. End of sysgen/glob.h
  296.  echo sysgen/init.c 1>&2
  297. cat >sysgen/init.c <<'End of sysgen/init.c'
  298. #include "stuff.h"
  299.  
  300. init(argc,argv,maxx,maxy)
  301. char **argv;
  302. int *maxx,*maxy;
  303. {
  304.     subsect=(SUBDATA *)malloc(sizeof(SUBDATA));
  305.     subsect->next=NULL;
  306.     css=subsect;
  307.     if (argc>1 && argv[1][0]=='-')
  308.     {
  309.         if (argv[1][1]=='m')
  310.             mapflag=1;
  311.         argv++;
  312.         argc--;
  313.     }
  314.     switch(argc)
  315.     {
  316.     case 1:
  317.         iseed(42);
  318.         *maxx=8;
  319.         *maxy=10;
  320.         break;
  321.     case 2:
  322.         iseed(atoi(argv[1]));
  323.         *maxx=8;
  324.         *maxy=10;
  325.         break;
  326.     case 3:
  327.         iseed(atoi(argv[1]));
  328.         *maxx=8;
  329.         *maxy=atoi(argv[2]);
  330.         break;
  331.     case 4:
  332.         iseed(atoi(argv[1]));
  333.         *maxx=atoi(argv[3]);
  334.         *maxy=atoi(argv[2]);
  335.         break;
  336.     }
  337. }
  338. End of sysgen/init.c
  339.  echo sysgen/main.c 1>&2
  340. cat >sysgen/main.c <<'End of sysgen/main.c'
  341. #include "stuff.h"
  342.  
  343. mworld(s)
  344. SYSDATA *s;
  345. {
  346. int pop;
  347. PLANDATA *p,*mp;
  348. SATDATA *sat,*ms;
  349.  
  350.     pop=0;
  351.     mp=NULL;
  352.     for (p=s->orb0; p; p=p->next)
  353.     {
  354.         if (p->type=='P' || p->type=='W')
  355.         {
  356.             if (p->pop>pop || p->pop==pop && p->zone=='H')
  357.             {
  358.                 pop=p->pop;
  359.                 mp=p;
  360.                 ms=NULL;
  361.             }
  362.         }
  363.         for (sat=p->sats; sat; sat=sat->next)
  364.              if (sat->pop>pop || sat->pop==pop && p->zone=='H') 
  365.              {
  366.                  pop=sat->pop;
  367.                  mp=p;
  368.                  ms=sat;
  369.              }
  370.     }
  371.     if (mp==NULL)
  372.         return;
  373.     for (p=s->orb0; p && p!=mp; p=p->next)
  374.         ;
  375.     if (ms==NULL)
  376.     {
  377.         p->main=1;
  378.         p->gov=gov(p->pop);
  379.         p->law=law(p->gov);
  380.         if (p->pop>0) p->sport=starport[die(2)]; else p->sport='X';
  381.         p->tech=die(1)+tech[0][p->sport]+tech[1][p->size+1]+tech[2][p->atm]
  382.                        +tech[3][p->hyd]+tech[4][p->pop]+tech[5][p->gov];
  383.         if (p->tech<0) p->tech=0;
  384.         else if (p->tech>15) p->tech=15;
  385.         trade(&p->notes,p->size,p->atm,p->hyd,p->pop,p->gov,p->law,p->tech);
  386.         if (die(2)>7 && (p->sport=='A' || p->sport=='B'))
  387.             addstr(&p->notes,"Naval");
  388.         if (scb(p->sport)) addstr(&p->notes,"Scout");
  389.         mwatm=p->atm;
  390.         mwpop=p->pop;
  391.         mwgov=p->gov;
  392.         mwlaw=p->law;
  393.         mwtech=p->tech;
  394.         return;
  395.     }
  396.     for (sat=p->sats; sat && sat!=ms; sat=sat->next)
  397.         ;
  398.     sat->main=1;
  399.     sat->gov=gov(sat->pop);
  400.     sat->law=law(sat->gov);
  401.     sat->sport=starport[die(2)];
  402.     sat->tech=die(1)+tech[0][sat->size]+tech[1][sat->atm]+tech[2][sat->hyd]
  403.                    +tech[3][sat->pop]+tech[4][sat->gov];
  404.     if (sat->tech<0) sat->tech=0;
  405.     else if (sat->tech>15) sat->tech=15;
  406.     trade(&sat->notes,sat->size,sat->atm,sat->hyd,sat->pop,sat->gov,
  407.             sat->law,sat->tech);
  408.     if (die(2)>7 && (sat->sport=='A' || sat->sport=='B'))
  409.         addstr(&sat->notes,"Naval");
  410.     if (scb(sat->sport)) addstr(&sat->notes,"Scout");
  411.     mwgov=sat->gov;
  412.     mwlaw=sat->law;
  413.     mwtech=sat->tech;
  414. }
  415.  
  416. gov(pop)
  417. {
  418. int g;
  419.  
  420.     g=die(2)-7+pop;
  421.     if (g<0) return 0;
  422.     else if (g>15) return 15;
  423.     else return g;
  424. }
  425.  
  426. law(gov)
  427. {
  428. int l;
  429.  
  430.     l=die(2)-7+gov;
  431.     if (l<0) return 0;
  432.     else if (l>9) return 9;
  433.     else return l;
  434. }
  435.  
  436. scb(sp)
  437. char sp;
  438. {
  439. int DM;
  440.  
  441.    switch(sp)
  442.    {
  443.    case 'C':
  444.        DM= -1;
  445.        break;
  446.    case 'B':
  447.        DM= -2;
  448.        break;
  449.    case 'A':
  450.        DM= -3;
  451.        break;
  452.    }
  453.    if (sp!='E' && sp!='X')
  454.        return (die(2)+DM>6);
  455.    else
  456.        return 0;
  457. }
  458.  
  459. trade(notes,size,atm,hyd,pop,gov,law)
  460. char **notes;
  461. {
  462.     mwind=mwpoor=0;
  463.     if (atm>=4 && atm<=9 && hyd>=4 && hyd<=8 && pop>=5 && pop<=7)
  464.         addstr(notes,"Agr");
  465.     if (atm<=3 && hyd<=3 && pop>=6)
  466.         addstr(notes,"Non-Agr");
  467.     if ((atm>=0 && atm<=2 || atm==4 || atm==7 || atm==9) && pop>=9)
  468.     {
  469.         addstr(notes,"Ind");
  470.         mwind=1;
  471.     }
  472.     if (pop<=6)
  473.         addstr(notes,"Non-Ind");
  474.     if ((atm==6 || atm==9) && gov>=4 && gov<=9 && pop>=6 && pop<=8)
  475.         addstr(notes,"Rich");
  476.     if (atm>=2 && atm<=5 && hyd<=3)
  477.     {
  478.         addstr(notes,"Poor");
  479.         mwpoor=1;
  480.     }
  481.     if (hyd==10)
  482.         addstr(notes,"Water");
  483.     if (atm>=2 && hyd==0)
  484.         addstr(notes,"Desert");
  485.     if (atm==0)
  486.         addstr(notes,"Vacuum");
  487.     if (size==0)
  488.         addstr(notes,"Asteroid");
  489.     if (atm>=0 && atm<=1 && hyd>=1)
  490.         addstr(notes,"Ice-Capped");
  491. }
  492. End of sysgen/main.c
  493.  echo sysgen/planets.c 1>&2
  494. cat >sysgen/planets.c <<'End of sysgen/planets.c'
  495. #include "stuff.h"
  496.  
  497. new_planets(p,n,size,type,dec)
  498. PLANDATA **p;
  499. char type;
  500. {
  501. PLANDATA *q,*r;
  502. int z1,z2;
  503. char *name();
  504.  
  505.     switch(type)
  506.     {
  507.     case 'B':
  508.         z1=0;
  509.     case 'A':
  510.         z1=2;
  511.     case 'F':
  512.         z1=4;
  513.     case 'G':
  514.         z1=6;
  515.     case 'K':
  516.         z1=8;
  517.     case 'M':
  518.         z1=10;
  519.     }
  520.     if (dec>=5)
  521.         z1++;
  522.     if (type=='M' && dec==9)
  523.         z1++;
  524.     z2=size;
  525.     for (r=NULL,n--;n>=0;n--,r=q)
  526.     {
  527.         q=(PLANDATA *)malloc(sizeof(PLANDATA));
  528.         strcpy(q->name,name());
  529.         q->type=' ';
  530.         q->orbit=n;
  531.         q->zone=zones[z2][z1][(n<15)?n:14];
  532.         q->main=0;
  533.         q->sats=NULL;
  534.         q->notes=NULL;
  535.         q->next=r;
  536.     }
  537.     *p=r;
  538. }
  539.  
  540. empty(s)
  541. SYSDATA *s;
  542. {
  543. int n;
  544. PLANDATA *p;
  545.  
  546.     if (die(1)>=5)
  547.     {
  548.         n=die(1);
  549.         switch (n)
  550.         {
  551.         case 1:
  552.         case 2:
  553.             n=1;
  554.             break;
  555.         case 3:
  556.             n=2;
  557.             break;
  558.         default:
  559.             n=3;
  560.             break;
  561.         }
  562.         if (n>s->free)
  563.             n=s->free;
  564.         while (n>0)
  565.             for (p=s->orb0; p!=NULL && n>0; p=p->next)
  566.                 if (die(1)==6)
  567.                 {
  568.                     p->type='E';
  569.                     n--;
  570.                     s->free--;
  571.                 }
  572.     }
  573. }
  574.  
  575. capt(s)
  576. SYSDATA *s;
  577. {
  578. int n;
  579. PLANDATA *p;
  580.  
  581.     if (die(1)>=5)
  582.     {
  583.         n=(die(1)+1)/2;
  584.         if (n>s->orbits)
  585.             n=s->orbits;
  586.         while (n>0)
  587.             for (p=s->orb0; p!=NULL && n>0; p=p->next)
  588.                 if (die(1)==6)
  589.                 {
  590.                     p->capt=die(2)-7;
  591.                     n--;
  592.                 }
  593.     }
  594. }
  595.  
  596. gasgiants(s)
  597. SYSDATA *s;
  598. {
  599. int n;
  600. PLANDATA *p;
  601.  
  602.     if (die(2)<10)
  603.     {
  604.         n=ggno[die(2)+ggDM];
  605.         if (n>s->free)
  606.             n=s->free;
  607.         if (n==0)
  608.         {
  609.             n=1;
  610.             s->orbits++;
  611.             s->free++;
  612.             for (p=s->orb0; p->next; p=p->next)
  613.                 ;
  614.             p->next=(PLANDATA *)malloc(sizeof(PLANDATA));
  615.             if (p->zone=='I')
  616.                 p->next->zone='I';
  617.             else
  618.                 p->next->zone='O';
  619.             strcpy(p->next->name,name());
  620.             p->next->type=' ';
  621.             p->next->orbit=p->orbit+1;
  622.             p->next->main=0;
  623.             p->next->sats=NULL;
  624.             p->next->notes=NULL;
  625.             p->next->next=NULL;
  626.         }
  627.         s->gg=n;
  628.         while (n>0)
  629.             for (p=s->orb0; p && n>0;p=p->next)
  630.                 if (p->type==' ' && die(1)==6)
  631.                 {
  632.                     p->type=(die(1)<4)?'L':'S';
  633.                     n--;
  634.                     s->free--;
  635.                 }
  636.     }
  637.  
  638. planetoids(s)
  639. SYSDATA *s;
  640. {
  641. int n;
  642. PLANDATA *p;
  643.  
  644.     if (die(2)-s->gg<=6)
  645.     {
  646.         n=die(2)-s->gg;
  647.         n=plno[(n<0)?0:n];
  648.         if (n>s->free)
  649.             n=s->free;
  650.         if (n!=0)
  651.         {
  652.             for (p=s->orb0;p && n>0;p=p->next)
  653.                 if (p->type==' ' &&  p->next && (p->next->type=='S' || p->next->type=='L'))
  654.                 {
  655.                     p->type='P';
  656.                     n--;
  657.                     s->free--;
  658.                 }
  659.             while (n>0)
  660.                 for (p=s->orb0;p && n>0; p=p->next)
  661.                     if (p->type==' ' && die(1)==6)
  662.                     {
  663.                         p->type='P';
  664.                         n--;
  665.                         s->free--;
  666.                     }
  667.         }
  668.     }
  669. }
  670.  
  671. wsize(s)
  672. SYSDATA *s;
  673. {
  674. PLANDATA *p;
  675.  
  676.     for (p=s->orb0; p; p=p->next)
  677.     {
  678.         if (p->type=='P')
  679.             p->size=0;
  680.         if (p->type!=' ')
  681.             continue;
  682.         p->type='W';
  683.         p->size=die(2)-2;
  684.         if (p->orbit==0) p->size-=5;
  685.         if (p->orbit==1) p->size-=4;
  686.         if (p->orbit==2) p->size-=2;
  687.         if (s->ptype=='M') p->size-=2;
  688.         if (p->size<=0) p->size= -1;
  689.     }
  690. }
  691.  
  692. watm(s)
  693. SYSDATA *s;
  694. {
  695. PLANDATA *p;
  696.  
  697.     for (p=s->orb0; p; p=p->next)
  698.     {
  699.          if (p->type!='W' && p->type!='P')
  700.              continue;
  701.          p->atm=die(2)-7+p->size;
  702.          if (p->zone=='I') p->atm-=2;
  703.          if (p->zone=='O') p->atm-=4;
  704.          if (p->size==0) p->atm=0;
  705.          if (p->atm<0) p->atm=0;
  706.          if (p->atm>15) p->atm=15;
  707.     }
  708. }
  709.  
  710.  
  711. whyd(s)
  712. SYSDATA *s;
  713. {
  714. PLANDATA *p;
  715.  
  716.     for (p=s->orb0; p; p=p->next)
  717.     {
  718.          if (p->type!='W' && p->type!='P')
  719.              continue;
  720.          p->hyd=die(2)-7+p->size;
  721.          if (p->zone=='I') p->hyd=0;
  722.          if (p->zone=='O') p->hyd-=2;
  723.          if (p->size<2) p->hyd=0;
  724.          if (p->atm<2 || p->atm>9) p->hyd-=4;
  725.          if (p->hyd<0) p->hyd=0;
  726.          if (p->hyd>10) p->hyd=10;
  727.     }
  728. }
  729.  
  730. wpop(s)
  731. SYSDATA *s;
  732. {
  733. PLANDATA *p;
  734.  
  735.     for (p=s->orb0; p; p=p->next)
  736.     {
  737.          if (p->type!='W' && p->type!='P')
  738.              continue;
  739.          p->pop=die(2)-2;
  740.          if (p->zone=='I') p->pop-=5;
  741.          if (p->zone=='O') p->pop-=3;
  742.          if (p->atm!=0 && p->atm!=5 && p->atm!=6 && p->atm!=8) p->pop-=2;
  743.          if (p->pop<0) p->pop=0;
  744.     }
  745. }
  746. End of sysgen/planets.c
  747.  echo sysgen/print.c 1>&2
  748. cat >sysgen/print.c <<'End of sysgen/print.c'
  749. #include "stuff.h"
  750.  
  751. print(s)
  752. SYSDATA *s;
  753. {
  754. PLANDATA *p;
  755. SATDATA *sat;
  756. char *prss();
  757.  
  758.     if (mapflag) return;
  759.     printf("         %-15s   %c%d %-2s\n",s->name,s->ptype,
  760.                  s->pdec,prss(s->psize));
  761.     for (p=s->orb0; p; p=p->next)
  762.     {
  763.         putchar(' ');
  764.         if (p->zone=='H') putchar('*'); else putchar(' ');
  765.         printf(" %2d   ",p->orbit);
  766.         if (p->type=='L')
  767.             printf(" %-15s  Large GG\n",p->name);
  768.         else if (p->type=='S')
  769.             printf(" %-15s  Small GG\n",p->name);
  770.         else if (p->type!='E')
  771.             prpl(p,s);
  772.         else
  773.         {
  774.             printf("  Orbit Empty \n");
  775.             continue;
  776.         }
  777.         for (sat=p->sats; sat; sat=sat->next)
  778.         {
  779.             printf("     %3d", sat->orbit);
  780.             prsat(sat);
  781.         }
  782.     }
  783. }
  784.  
  785. prpl(p,s)
  786. PLANDATA *p;
  787. SYSDATA *s;
  788. {
  789. char hex(),pshex(),sshex();
  790.  
  791.     if (mapflag) return;
  792.     printf(" %-15s ",p->name);
  793.     printf(" %c",p->sport);
  794.     if (p->type=='P') putchar('0'); else putchar(pshex(p->size));
  795.     printf("%c%c%c%c%c  %c  ",hex(p->atm),hex(p->hyd),hex(p->pop),
  796.                 hex(p->gov),hex(p->law),hex(p->tech));
  797.     if (s!=0) plfacts(p,s);
  798.     if (p->notes)
  799.         printf(" %s",p->notes);
  800.     putchar('\n');
  801. }
  802.  
  803. prsat(p)
  804. SATDATA *p;
  805. {
  806. char hex(),pshex(),sshex();
  807.  
  808.     if (mapflag) return;
  809.     printf(" %-15s ",p->name);
  810.     printf(" %c",p->sport);
  811.     putchar(sshex(p->size));
  812.     printf("%c%c%c%c%c  %c  ",hex(p->atm),hex(p->hyd),hex(p->pop),
  813.                 hex(p->gov),hex(p->law),hex(p->tech));
  814.     if (p->notes)
  815.         printf(" %s",p->notes);
  816.     putchar('\n');
  817. }
  818.  
  819. char *prss(n)
  820. {
  821.     switch(n)
  822.     {
  823.     case 0:
  824.         return "Ia";
  825.         break;
  826.     case 1:
  827.         return "Ib";
  828.         break;
  829.     case 2:
  830.         return "II";
  831.         break;
  832.     case 3:
  833.         return "III";
  834.         break;
  835.     case 4:
  836.         return "IV";
  837.         break;
  838.     case 5:
  839.         return "V";
  840.         break;
  841.     case 6:
  842.         return "VI";
  843.         break;
  844.     case 7:
  845.         return "D";
  846.         break;
  847.     }
  848. }
  849.  
  850. char hex(n)
  851. {
  852.     if (n<0) return '0';
  853.     if (n<10) return '0'+n;
  854.     return n-10+'A';
  855. }
  856.  
  857. char pshex(n)
  858. {
  859.     if (n<=0) return 'S';
  860.     else return hex(n);
  861. }
  862.  
  863. char sshex(n)
  864. {
  865.     if (n<0) return 'S'; 
  866.     else if (n==0) return 'R';
  867.     else return hex(n);
  868. }
  869.  
  870. plfacts(p,s)
  871. PLANDATA *p;
  872. SYSDATA *s;
  873. {
  874. FACDATA f;
  875. int w,l,i,cl,z1;
  876. double lum,dist;
  877. double sqrt();
  878.  
  879.     f.green=grtab[p->atm];
  880.     f.cloud=cloud[p->hyd];
  881.     if (p->atm>=10) f.cloud+=4;
  882.     if (p->atm<=3) f.cloud-=2;
  883.     if (p->atm==14) f.cloud=(f.cloud-4)/2;
  884.     w=p->hyd*10;
  885.     l=100-p->hyd;
  886.     i=l/10;
  887.     l-=i/2;
  888.     w-=i/2;
  889.     f.land=l;
  890.     f.water=w;
  891.     f.ice=i;
  892.     cl=100-f.cloud;
  893.     l=l*cl/100;
  894.     w=w*cl/100;
  895.     i=i*cl/100;
  896.     f.albedo=l*15+w*2+f.cloud*60+i*55;
  897.     switch(s->ptype)
  898.     {
  899.     case 'B':
  900.         z1=0;
  901.     case 'A':
  902.         z1=2;
  903.     case 'F':
  904.         z1=4;
  905.     case 'G':
  906.         z1=6;
  907.     case 'K':
  908.         z1=8;
  909.     case 'M':
  910.         z1=10;
  911.     }
  912.     if (s->pdec>=5)
  913.         z1++;
  914.     if (s->ptype=='M' && s->pdec==9)
  915.         z1++;
  916.     lum=lumtab[s->psize][z1];
  917.     dist=dtab[p->orbit];
  918.     f.temp=374.025*f.green*(100-f.albedo)*sqrt(sqrt(lum))/sqrt(dist);
  919. }
  920. End of sysgen/print.c
  921.  echo sysgen/rnd.c 1>&2
  922. cat >sysgen/rnd.c <<'End of sysgen/rnd.c'
  923. #include "stuff.h"
  924.  
  925. static s;
  926.  
  927. rand(n)
  928. {
  929. double rnd();
  930.  
  931.     return (random()%n+1);
  932. }
  933.  
  934. iseed(q)
  935. int q;
  936. {
  937.     srandom(q);
  938. }
  939.  
  940. char *name()
  941. {
  942. static char st[20];
  943. int i,j,l;
  944.  
  945.     l=rand(7)+3;
  946.     st[l+1]='\0';
  947.     i=rand(1000);
  948.     for (j=0;freq[j]<i;j++)
  949.         ;
  950.     st[l--]=lt[j];
  951.     while (l>=0)
  952.     {
  953.         if (i<vowel)
  954.             i=rand(1000-vowel)+vowel;
  955.         else
  956.             i=rand(vowel);
  957.         for (j=0;freq[j]<i;j++)
  958.             ;
  959.         st[l--]=lt[j];
  960.     }
  961.     st[0]=toupper(st[0]);
  962.     return st;
  963. }
  964.  
  965. die(n)
  966. {
  967. int i,j;
  968.  
  969.     j=0;
  970.     for (i=0;i<n;i++)
  971.         j+=rand(DIE);
  972.     return j;
  973. }
  974. End of sysgen/rnd.c
  975.  echo sysgen/sats.c 1>&2
  976. cat >sysgen/sats.c <<'End of sysgen/sats.c'
  977. #include "stuff.h"
  978.  
  979. sats(s)
  980. SYSDATA *s;
  981. {
  982. PLANDATA *p;
  983.  
  984.     for (p=s->orb0; p; p=p->next)
  985.         switch(p->type)
  986.         {
  987.         case 'L':
  988.             new_sats(&p->sats,die(2));
  989.             break;
  990.         case 'S':
  991.             new_sats(&p->sats,die(2)-4);
  992.             break;
  993.         case 'W':
  994.             new_sats(&p->sats,die(1)-3);
  995.             break;
  996.         default:
  997.             p->sats=NULL;
  998.         }
  999. }
  1000.  
  1001. new_sats(p,n)
  1002. SATDATA **p;
  1003. {
  1004. SATDATA *r, *q;
  1005. char *name();
  1006.  
  1007.     if (n<=0)
  1008.         *p=NULL;
  1009.     else
  1010.     {
  1011.         for (r=NULL;n;r=q,n--)
  1012.         {
  1013.             q=(SATDATA *)malloc(sizeof(SATDATA));
  1014.             strcpy(q->name,name());
  1015.             q->main=0;
  1016.             q->notes=NULL;
  1017.             q->next=r;
  1018.         }
  1019.         *p=r;
  1020.     }
  1021. }
  1022.  
  1023. satwsize(s)
  1024. SYSDATA *s;
  1025. {
  1026. PLANDATA *p;
  1027.  
  1028.     for (p=s->orb0; p; p=p->next)
  1029.         satsize(p);
  1030. }
  1031.  
  1032. satsize(p)
  1033. PLANDATA *p;
  1034. {
  1035. SATDATA *s;
  1036.  
  1037.     for (s=p->sats; s; s=s->next)
  1038.     {
  1039.         switch(p->type)
  1040.         {
  1041.         case 'L':
  1042.             s->size=die(2)-4;
  1043.             break;
  1044.         case 'S':
  1045.             s->size=die(2)-6;
  1046.             break;
  1047.         case 'W':
  1048.             s->size=p->size-die(1);
  1049.             break;
  1050.         }
  1051.         if (s->size<0) s->size= -1; /*SMALL*/
  1052.         if (s->size>10) s->size= 10;
  1053.     }
  1054. }
  1055.  
  1056. satworbit(s)
  1057. SYSDATA *s;
  1058. {
  1059. PLANDATA *p;
  1060.  
  1061.     for (p=s->orb0; p; p=p->next)
  1062.         satorbit(p);
  1063. }
  1064.  
  1065. satorbit(p)
  1066. PLANDATA *p;
  1067. {
  1068. SATDATA *s,*r;
  1069. int otype,swap;
  1070. int DM;
  1071.  
  1072.     DM=0;
  1073.     for (s=p->sats; s; s=s->next,DM++)
  1074.     {
  1075.         otype=die(2)-DM;
  1076.         if (s->size==0) s->orbit=ring[die(1)];
  1077.         else if (otype<8) s->orbit=clos[die(2)];
  1078.         else if (otype==12 && (p->type=='L' || p->type=='S'))
  1079.             s->orbit=extreme[die(2)];
  1080.         else if (otype>7) s->orbit=far[die(2)];
  1081.     }
  1082.     swap=1;
  1083.     s=p->sats;
  1084.     while (s && s->next && swap)
  1085.     {
  1086.         s=p->sats;
  1087.         swap=0;
  1088.         if (s->orbit>s->next->orbit)
  1089.         {
  1090.             p->sats=s->next;
  1091.             s->next=p->sats->next;
  1092.             p->sats->next=s;
  1093.             swap=1;
  1094.         }
  1095.         for (s=p->sats; s->next->next; s=s->next)
  1096.         {
  1097.             r=s->next;
  1098.             if (r->orbit>r->next->orbit)
  1099.             {
  1100.                 s->next=r->next;
  1101.                 r->next=r->next->next;
  1102.                 s->next->next=r;
  1103.                 swap=1;
  1104.             }
  1105.         }
  1106.     }
  1107.     for (s=p->sats; s && s->next;)
  1108.         if (s->orbit==s->next->orbit)
  1109.         {
  1110.             r=s->next;
  1111.             s->next=r->next;
  1112.             free(r);
  1113.         }
  1114.         else
  1115.             s=s->next;
  1116. }
  1117.  
  1118. satwatm(s)
  1119. SYSDATA *s;
  1120. {
  1121. PLANDATA *p;
  1122.  
  1123.     for (p=s->orb0; p; p=p->next)
  1124.         satatm(p);
  1125. }
  1126.  
  1127. satatm(p)
  1128. PLANDATA *p;
  1129. {
  1130. SATDATA *s;
  1131.  
  1132.     for (s=p->sats; s; s=s->next)
  1133.     {
  1134.          s->atm=die(2)-7+s->size;
  1135.          if (p->zone=='I') s->atm-=4;
  1136.          if (p->zone=='O') s->atm-=4;
  1137.          if (s->size<2) s->atm=0;
  1138.          if (s->atm<0) s->atm=0;
  1139.          if (s->atm>15) s->atm=15;
  1140.     }
  1141. }
  1142.  
  1143. satwhyd(s)
  1144. SYSDATA *s;
  1145. {
  1146. PLANDATA *p;
  1147.  
  1148.     for (p=s->orb0; p; p=p->next)
  1149.         sathyd(p);
  1150. }
  1151.  
  1152. sathyd(p)
  1153. PLANDATA *p;
  1154. {
  1155. SATDATA *s;
  1156.  
  1157.     for (s=p->sats; s; s=s->next)
  1158.     {
  1159.         s->hyd=die(2)-7+s->size;
  1160.         if (p->zone=='I') s->hyd=0;
  1161.         if (p->zone=='O') s->hyd-=4;
  1162.         if (s->size<=0) s->hyd=0;
  1163.         if (s->atm<2 || s->atm>9) s->hyd-=4;
  1164.         if (s->hyd<0) s->hyd=0;
  1165.         if (s->hyd>10) s->hyd=10;
  1166.     }
  1167. }
  1168.  
  1169. satwpop(s)
  1170. SYSDATA *s;
  1171. {
  1172. PLANDATA *p;
  1173.  
  1174.     for (p=s->orb0; p; p=p->next)
  1175.         satpop(p);
  1176. }
  1177.  
  1178. satpop(p)
  1179. PLANDATA *p;
  1180. {
  1181. SATDATA *s;
  1182.  
  1183.     for (s=p->sats; s; s=s->next)
  1184.     {
  1185.         s->pop=die(2)-2;
  1186.         if (p->zone=='I') s->pop-=5;
  1187.         if (p->zone=='O') s->pop-=4;
  1188.         if (s->atm!=5 && s->atm!=6 && s->atm!=8) s->pop-=2;
  1189.         if (s->size<5) s->pop-=2;
  1190.         if (s->size==0) s->pop=0;
  1191.         if (s->pop<0) s->pop=0;
  1192.         if (s->pop>10) s->pop=10;
  1193.     }
  1194. }
  1195. End of sysgen/sats.c
  1196.  echo sysgen/st.c 1>&2
  1197. cat >sysgen/st.c <<'End of sysgen/st.c'
  1198. #include "stuff.h"
  1199.  
  1200. main(argc,argv)
  1201. char **argv;
  1202. {
  1203. int i,j,mxi,mxj;
  1204. char sysnat(), stype();
  1205.  
  1206.     init(argc,argv,&mxi,&mxj);
  1207.     for (i=1;i<=mxi;i++)
  1208.     {
  1209.         for (j=1;j<=mxj;j++)
  1210.         {
  1211.             spa[i][j]=' ';
  1212.             if (syspres(0))
  1213.             {
  1214.                 if (!mapflag) printf("\fSystem At (%02d%02d)\n\n",i,j);
  1215.                 strcpy(syst.name,name());
  1216.                 syst.nature=sysnat();
  1217.                 syst.ptype=stype(0);
  1218.                 syst.psize=ssize(0,syst.ptype);
  1219.                 syst.pdec=rand(10)-1;
  1220.                 if (syst.nature!='S')
  1221.                 {
  1222.                     syst.ctype=stype(1);
  1223.                     syst.csize=ssize(1,syst.ctype);
  1224.                     syst.cdec=rand(10)-1;
  1225.                 }
  1226.                 syst.orbits=nbrorbs(syst.psize,syst.ptype);
  1227.                 syst.free=syst.orbits;
  1228.                 new_planets(&syst.orb0,syst.orbits,syst.psize,syst.ptype,
  1229.                              syst.pdec);
  1230.                 syst.notes=NULL;
  1231.                 empty(&syst);
  1232.                 capt(&syst);
  1233.                 gasgiants(&syst);
  1234.                 planetoids(&syst);
  1235.                 wsize(&syst);
  1236.                 watm(&syst);
  1237.                 whyd(&syst);
  1238.                 wpop(&syst);
  1239.                 sats(&syst);
  1240.                 satwsize(&syst);
  1241.                 satworbit(&syst);
  1242.                 satwatm(&syst);
  1243.                 satwhyd(&syst);
  1244.                 satwpop(&syst);
  1245.                 mworld(&syst);
  1246.                 sub(&syst);
  1247.     
  1248.                 print(&syst);
  1249.                 css->x=i;
  1250.                 css->y=j;
  1251.                 spa[i][j]=freeup(&syst);
  1252.             }
  1253.         }
  1254.     }
  1255.     if (!mapflag)
  1256.     {
  1257.         putchar('\f');
  1258.         for (css=subsect; css->next; css=css->next)
  1259.         {
  1260.             printf("%02d%02d  ",css->x,css->y);
  1261.             if (!css->planet && !css->sat) printf(" %s system UNINHABITED\n",css->name);
  1262.             if (css->planet) prpl(css->planet,0);
  1263.             if (css->sat) prsat(css->sat,0);
  1264.         }
  1265.         printf("\f       ");
  1266.         for (i=1;i<=mxi;i++)
  1267.             printf("%02dxx ",i);
  1268.         putchar('\n');
  1269.         for (j=1;j<=mxj;j++)
  1270.         {
  1271.             printf(" xx%02d ",j);
  1272.             for (i=1;i<=mxi;i+=2)
  1273.                 printf("  %2c      ",spa[i][j]);
  1274.             printf("\n      ");
  1275.             for (i=2;i<=mxi;i+=2)
  1276.                 printf("       %2c ",spa[i][j]);
  1277.             putchar('\n');
  1278.         }
  1279.     }
  1280.     else
  1281.     {
  1282.         for (css=subsect;css->next;css=css->next)
  1283.         {
  1284.             printf("%d %d ",css->x-1,css->y-1);
  1285.             if (!css->planet && !css->sat) printf("%s %c\n",css->name,spa[css->x][css->y]);
  1286.             if (css->planet) printf("%s %c\n",css->planet->name,css->planet->sport);
  1287.             if (css->sat)  printf("%s %c\n",css->sat->name,css->sat->sport);
  1288.         }
  1289.         printf("99\n");
  1290.     }
  1291. }
  1292. End of sysgen/st.c
  1293.  echo sysgen/stuff.h 1>&2
  1294. cat >sysgen/stuff.h <<'End of sysgen/stuff.h'
  1295. #include <stdio.h>
  1296. #include <ctype.h>
  1297. #include "const.h"
  1298. #include "types.h"
  1299. #include "glob.h"
  1300. End of sysgen/stuff.h
  1301.  echo sysgen/sub.c 1>&2
  1302. cat >sysgen/sub.c <<'End of sysgen/sub.c'
  1303. #include "stuff.h"
  1304.  
  1305. sub(s)
  1306. SYSDATA *s;
  1307. {
  1308. PLANDATA *p;
  1309. SATDATA *sat;
  1310. int sp;
  1311.  
  1312.     for (p=s->orb0; p; p=p->next)
  1313.     {
  1314.         if (!p->main && p->type!='L' && p->type!='S')
  1315.         {
  1316.             p->gov=die(1);
  1317.             if (mwgov==6) p->gov=6;
  1318.             if (mwgov>=7) p->gov+=2;
  1319.             if (p->pop==0) p->gov=0;
  1320.             p->law=die(1)-3+mwlaw;
  1321.             if (p->gov==0) p->law=0;
  1322.             p->tech=mwtech-1+facility(&p->notes,p->zone,p->size,p->atm,p->hyd,
  1323.                       p->pop,p->gov,p->law);
  1324.             if (p->pop==0) p->tech=0;
  1325.             sp=die(1);
  1326.             if (p->pop>=6) sp+=2;
  1327.             if (p->pop<2) sp-=2;
  1328.             if (sp<1) sp=1;
  1329.             if (sp>6) sp=6;
  1330.             if (p->pop>0) p->sport=spaceport[sp]; else p->sport='Y';
  1331.         }
  1332.         for (sat=p->sats; sat; sat=sat->next)
  1333.         {
  1334.             if (!sat->main)
  1335.             {
  1336.                 sat->gov=die(1);
  1337.                 if (mwgov==6) sat->gov=6;
  1338.                 if (mwgov>=7) sat->gov+=2;
  1339.                 if (sat->pop==0) sat->gov=0;
  1340.                 sat->law=die(1)-3+mwlaw;
  1341.                 if (sat->gov==0) sat->law=0;
  1342.                 sat->tech=mwtech-1+facility(&sat->notes,p->zone,sat->size,
  1343.                            sat->atm,sat->hyd,sat->pop,sat->gov,sat->law);
  1344.                 if (sat->pop==0) sat->tech=0;
  1345.                 sp=die(1);
  1346.                 if (sat->pop>=6) sp+=2;
  1347.                 if (sat->pop<2) sp-=2;
  1348.                 if (sp<1) sp=1;
  1349.                 if (sp>6) sp=6;
  1350.                 if (sat->pop>0) sat->sport=spaceport[sp]; else sat->sport='Y';
  1351.             }
  1352.         }
  1353.     }
  1354. }
  1355.  
  1356. facility(notes,zone,size,atm,hyd,pop,gov,law)
  1357. char **notes;
  1358. char zone;
  1359. {
  1360. int bonus; /* TL bonus for lab or base */
  1361.  
  1362.     bonus=0;
  1363.     if (zone=='H' && atm>=4 && atm<=9 && hyd>=4 && hyd<=8 && pop>=2)
  1364.         addstr(notes,"Farming");
  1365.     if (mwind && pop>=2)
  1366.         addstr(notes,"Mining");
  1367.     if (gov==6  && pop>=5)
  1368.         addstr(notes,"Colony");
  1369.     if ((die(2)+((mwtech>=10)?2:0)>=11) && mwtech>8 && pop>0)
  1370.     {
  1371.         addstr(notes,"Lab.");
  1372.         bonus=1;
  1373.     }
  1374.     if (die(2)+((mwpop>=8)?1:0)+((atm==mwatm)?2:0)+(base?1:0)>=12 && pop>0 &&
  1375.            !mwpoor)
  1376.     {
  1377.         addstr(notes,"Mil. Base");
  1378.         bonus=1;
  1379.     }
  1380.     return bonus;
  1381. }
  1382. End of sysgen/sub.c
  1383.  echo sysgen/support.c 1>&2
  1384. cat >sysgen/support.c <<'End of sysgen/support.c'
  1385. #include "stuff.h"
  1386. char *malloc(), *realloc(), *strcpy(), *strcat();
  1387.  
  1388. addstr(p,q)
  1389. char **p,*q;
  1390. {
  1391.     if (*p==NULL)
  1392.         *p=strcpy(malloc(strlen(q)+1),q);
  1393.     else
  1394.         *p=strcat(strcat(realloc(*p,strlen(*p)+strlen(q)+2)," "),q);
  1395. }
  1396.  
  1397. freeup(s)
  1398. SYSDATA *s;
  1399. {
  1400. PLANDATA *p;
  1401. SATDATA *sat;
  1402. char sp;
  1403.  
  1404.     sp='X';
  1405.     css->planet=NULL;
  1406.     css->sat=NULL;
  1407.     css->name=strcpy(malloc(strlen(s->name)+1),s->name);
  1408.     for (p=s->orb0; p; p=p->next)
  1409.     {
  1410.         for (sat=p->sats; sat; sat=sat->next)
  1411.             if (sat->main)
  1412.             {
  1413.                 css->sat=sat;
  1414.                 sp=sat->sport;
  1415.             }
  1416.             else
  1417.                 free(sat);
  1418.         if (p->main)
  1419.         {
  1420.             p->sats=NULL;
  1421.             css->planet=p;
  1422.             sp=p->sport;
  1423.         }
  1424.         else
  1425.             free(p);
  1426.     }
  1427.     css->next=(SUBDATA *)malloc(sizeof(SUBDATA));
  1428.     css=css->next;
  1429.     css->planet=NULL;
  1430.     css->sat=NULL;
  1431.     css->next=NULL;
  1432.     return sp;
  1433. }
  1434. End of sysgen/support.c
  1435.  echo sysgen/system.c 1>&2
  1436. cat >sysgen/system.c <<'End of sysgen/system.c'
  1437. #include "stuff.h"
  1438.  
  1439. syspres(fudge)
  1440. {
  1441.     if (die(1)+fudge>=4)
  1442.         return 1;
  1443.     else
  1444.         return 0;
  1445. }
  1446.  
  1447. char sysnat()
  1448. {
  1449.     return nature[die(2)+natDM];
  1450. }
  1451.  
  1452. char stype(f)
  1453. {
  1454.     if (f==0)
  1455.         return ptypet[die(2)+typeDM];
  1456.     else
  1457.         return ctypet[die(2)+typeDM];
  1458. }
  1459.  
  1460. ssize(f,t)
  1461. char t;
  1462. {
  1463. int s;
  1464.  
  1465.     if (f==0)
  1466.         s=psizet[die(2)+sizeDM];
  1467.     else
  1468.         s=csizet[die(2)+sizeDM];
  1469.     if (s==4 && (t=='K' || t=='M'))
  1470.         s=5;
  1471.     if (s==6 && (t=='B' || t=='A' || t=='F'))
  1472.         s=5;
  1473.     return s;
  1474. }
  1475.  
  1476. nbrorbs(s,t)
  1477. char t;
  1478. {
  1479. int o;
  1480.  
  1481.     o=die(2);
  1482.     if (s==3) o+=4;
  1483.     if (s<=2) o+=8;
  1484.     if (t=='M') o-=4;
  1485.     if (t=='K') o-=2;
  1486.     if (o<1) o=1;
  1487.     return o;
  1488. }
  1489. End of sysgen/system.c
  1490.  echo sysgen/types.h 1>&2
  1491. cat >sysgen/types.h <<'End of sysgen/types.h'
  1492. typedef struct factors {
  1493.     int cloud;
  1494.     int albedo;
  1495.     int green;
  1496.     int land;
  1497.     int water;
  1498.     int ice;
  1499.     int temp;
  1500.     int tilt;
  1501.     int ecc;
  1502. } FACDATA;
  1503.  
  1504. typedef struct subsector {
  1505.     int x;
  1506.     int y;
  1507.     struct planet *planet;
  1508.     struct sat *sat;
  1509.     char *name;
  1510.     struct subsector *next;
  1511. } SUBDATA;
  1512.  
  1513. typedef struct system {
  1514.     char name[20];
  1515.     char nature;
  1516.     char ptype;
  1517.     int pdec;
  1518.     int psize;
  1519.     char ctype;
  1520.     int cdec;
  1521.     int csize;
  1522.     int orbits;
  1523.     int free;
  1524.     int gg;
  1525.     char *notes;
  1526.     struct planet *orb0;
  1527. } SYSDATA;
  1528.  
  1529. typedef struct planet {
  1530.     char name[20];
  1531.     int orbit;
  1532.     char zone;
  1533.     char type;
  1534.     int capt;
  1535.     char sport;
  1536.     int size;
  1537.     int atm;
  1538.     int hyd;
  1539.     int pop;
  1540.     int gov;
  1541.     int law;
  1542.     int tech;
  1543.     int main;
  1544.     char *notes;
  1545.     struct sat *sats;
  1546.     struct planet *next;
  1547. } PLANDATA;
  1548.  
  1549. typedef struct sat {
  1550.     char name[20];
  1551.     int orbit;
  1552.     char sport;
  1553.     int size;
  1554.     int atm;
  1555.     int hyd;
  1556.     int pop;
  1557.     int gov;
  1558.     int law;
  1559.     int tech;
  1560.     int main;
  1561.     char *notes;
  1562.     struct sat *next;
  1563. } SATDATA;
  1564. End of sysgen/types.h
  1565.  echo sysprint/Makefile 1>&2
  1566. cat >sysprint/Makefile <<'End of sysprint/Makefile'
  1567. all: trmult
  1568.  
  1569. trmult: trmult.o
  1570.     cc -o trmult trmult.o
  1571. End of sysprint/Makefile
  1572.  echo sysprint/mass 1>&2
  1573. cat >sysprint/mass <<'End of sysprint/mass'
  1574. trmult 4 4 stars.ps m1[3456]00 m900 m1[012]00 m[5678]00 m[1234]00
  1575. End of sysprint/mass
  1576.  echo sysprint/stars.ps 1>&2
  1577. cat >sysprint/stars.ps <<'End of sysprint/stars.ps'
  1578. /incx { 126 } def
  1579. /incy {  72 } def
  1580. /offset { 15 } def
  1581. /coffset { 35 } def
  1582. /stdfont { /Times-Roman findfont } def
  1583. /add36 { 36 sub } def
  1584. /setgrey { setgray } def
  1585. /grey4 { 0.1 setgrey 6 setlinewidth} def
  1586. /black1 {0 setgrey 1 setlinewidth} def
  1587. /grid {            % - GRID -
  1588. -21  36 rmoveto
  1589. -21 -36 rlineto
  1590.  21 -36 rlineto
  1591.  42   0 rlineto
  1592.  21  36 rlineto
  1593. -21  36 rlineto
  1594.  21 -36 rmoveto
  1595.  42   0 rlineto
  1596. } def
  1597. /top {            % - TOP -
  1598. -21  36 rmoveto
  1599.  42   0 rlineto
  1600. } def
  1601. /right {        % - RIGHT -
  1602.  84   0 rmoveto
  1603.  21 -36 rlineto
  1604. -21 -36 rlineto
  1605. } def
  1606. /bottom {        % - BOTTOM -
  1607.  21 -36 rmoveto
  1608.  21 -36 rlineto
  1609.  42   0 rlineto
  1610.  21  36 rlineto
  1611. } def
  1612. /coords {        % string COORDS -
  1613.   0 24 rmoveto
  1614.   dup            % duplicate string
  1615.   stringwidth
  1616.   pop
  1617.   2 div neg
  1618.   0
  1619.   rmoveto
  1620.   show            % second copy of string
  1621. } def
  1622. /starport {        % string STARPORT -
  1623.   dup
  1624.   stringwidth
  1625.   offset add exch
  1626.   2 div neg exch
  1627.   rmoveto
  1628.   show
  1629. } def
  1630. /name {            % string NAME -
  1631.   dup
  1632.   stringwidth
  1633.   pop offset neg exch
  1634.   2 div neg exch
  1635.   rmoveto
  1636.   show
  1637. } def
  1638. /conv2 {            % x (0:7) y (0:9) CONV2 x (minx:maxx) y (miny:maxy)
  1639.   9 exch sub    % 9-y
  1640.   incy mul        % (9-y)*incy
  1641.   miny add        % (9-y)*incy+miny
  1642.   exch            % stack: y x
  1643.   dup            % dup to give us second value for test
  1644.   2 mod 0 ne    % test for even column
  1645.   exch            % stack: y bool x
  1646.   incx 2 div mul% x*incx
  1647.   minx add        % x*incx+minx
  1648.   3 1 roll        % stack: x y bool
  1649.   {add36} if    % make y correction
  1650. } def
  1651. /conv {                % x (0:7) y (0:9) CONV -
  1652.   conv2
  1653.   moveto
  1654. } def
  1655. /pname {        % string x y PNAME -
  1656.   conv
  1657.   name
  1658. } def
  1659. /pport {        % string x y PNAME -
  1660.   conv
  1661.   starport
  1662. } def
  1663. /ccord {        % string x y CCORD -
  1664.   conv
  1665.   coords
  1666. } def
  1667. /route {        % x y x y ROUTE -
  1668.   4 setlinewidth
  1669.   conv
  1670.   conv2
  1671.   lineto
  1672.   stroke
  1673. } def
  1674. /Nbord {        % 0 Nbord -
  1675.   pop
  1676.   -21 36 rmoveto
  1677.   42 0 rlineto
  1678.   grey4
  1679.   stroke
  1680.   black1
  1681. } def
  1682. /NEbord {        % - NEbord -
  1683.   21 36 rmoveto
  1684.   21 -36 rlineto
  1685.   grey4
  1686.   stroke
  1687.   black1
  1688. } def
  1689. /SEbord {        % - SEbord -
  1690.   42 0 rmoveto
  1691.   -21 -36 rlineto
  1692.   grey4
  1693.   stroke
  1694.   black1
  1695. } def
  1696. /NSEbord {        % side NSEBORD -
  1697.   1 eq {NEbord} {SEbord} ifelse
  1698. } def
  1699. /border {        % side x y BORDER -
  1700.   conv
  1701.   dup
  1702.   0 eq {Nbord} {NSEbord} ifelse
  1703. } def
  1704. /planet {        % x y PLANET -
  1705.   conv2
  1706.   2 copy
  1707.   moveto
  1708.   -6 -10 rmoveto
  1709.   stdfont 30 scalefont setfont
  1710.   1 setgray
  1711.   (\267) show
  1712.   moveto
  1713.   -4 -7 rmoveto
  1714.   stdfont 20 scalefont setfont
  1715.   0 setgray
  1716.   (\267) show
  1717.   stdfont 10 scalefont setfont
  1718. } def
  1719. /grid2 {        % horiz vert GRID2 horiz
  1720.   2 copy
  1721.   moveto
  1722.   grid
  1723.   pop
  1724. } def
  1725. /grid1 {        % horiz GRID1 -
  1726.   maxy incy neg miny {grid2} for
  1727.   dup
  1728.   maxy moveto top
  1729.   miny moveto bottom
  1730. } def
  1731. /dogrid {        % - DOGRID -
  1732.   minx incx maxx {grid1} for
  1733. } def
  1734. /right1 {        % horiz vert RIGHT1 horiz
  1735.   2 copy
  1736.   moveto
  1737.   right
  1738.   pop
  1739. } def
  1740. /doright {        % - DORIGHT -
  1741.   maxx
  1742.   maxy incy neg miny {right1} for
  1743.   pop
  1744. } def
  1745. End of sysprint/stars.ps
  1746.  echo sysprint/tr22 1>&2
  1747. cat >sysprint/tr22 <<'End of sysprint/tr22'
  1748. trmult 2 2 stars.ps m${1}00 m${2}00 m${3}00 m${4}00
  1749. End of sysprint/tr22
  1750.  echo sysprint/trconv 1>&2
  1751. cat >sysprint/trconv <<'End of sysprint/trconv'
  1752. trmult 1 1 stars.ps $*
  1753. End of sysprint/trconv
  1754.  echo sysprint/trmult.c 1>&2
  1755. cat >sysprint/trmult.c <<'End of sysprint/trmult.c'
  1756. #include <stdio.h>
  1757. #define MAX        80
  1758. #define MAXC    30
  1759.  
  1760. #define MAXX    396
  1761. #define MINX    18
  1762. #define MAXY    702
  1763. #define MINY    54
  1764. #define INCX    126
  1765. #define INCY    72
  1766.  
  1767. main(argc,argv)
  1768. char **argv;
  1769. {
  1770. char name[MAXC],sport[MAXC];
  1771. FILE *fp;
  1772. int c;
  1773. int x,y,dx,dy,xa[MAX],ya[MAX];
  1774. int i,k;
  1775. int xsiz,ysiz;
  1776. int xl,yl;
  1777.  
  1778.     if (argc<5)
  1779.     {
  1780.         fprintf(stderr,"Usage: %s x y psfile starsfile ...\n",argv[0]);
  1781.         exit(-1);
  1782.     }
  1783.     xsiz=atoi(argv[1]);
  1784.     ysiz=atoi(argv[2]);
  1785.     if (argc!=xsiz*ysiz+4)
  1786.     {
  1787.         fprintf(stderr,"You must specify %d stars files\n",xsiz*ysiz);
  1788.         exit(-1);
  1789.     }
  1790.     printf("36 36 translate\n");
  1791.     printf("1 %d div 1 %d div scale\n",xsiz,ysiz);
  1792.     printf("/maxx { %d } def\n",MAXX);
  1793.     printf("/minx { %d } def\n",MINX);
  1794.     printf("/maxy { %d } def\n",MAXY);
  1795.     printf("/miny { %d } def\n",MINY);
  1796.     if (!(fp=fopen(argv[3],"r")))
  1797.     {
  1798.         fprintf(stderr,"Could not open %s\n",argv[3]);
  1799.         exit(-1);
  1800.     }
  1801.     printf("36 36 translate\n");
  1802.     while ((c=getc(fp))!=EOF)
  1803.         putchar(c);
  1804.     fclose(fp);
  1805.     for (yl=0,argv+=4;yl<ysiz;yl++)
  1806.     {
  1807.         if (yl!=0) printf("%d %d translate\n",(1-xsiz)*(MAXX-MINX+INCX),MAXY-MINY+INCY);
  1808.         for (xl=0;xl<xsiz;xl++,argv++)
  1809.         {
  1810.             if (xl!=0) printf("%d 0 translate\n",MAXX-MINX+INCX);
  1811.             printf("stdfont 10 scalefont setfont\n");
  1812.             printf("dogrid\n");
  1813.             printf("doright\n");
  1814.             printf("1 setlinewidth\n");
  1815.             printf("stroke\n");
  1816.             if (!(fp=fopen(*argv,"r")))
  1817.             {
  1818.                 fprintf(stderr,"Could not open %s\n",*argv);
  1819.                 exit(-1);
  1820.             }
  1821.             for (i=0;;i++)
  1822.             {
  1823.                 if ((c=fscanf(fp,"%d",&x))!=1)
  1824.                 {
  1825.                     if (c==EOF)
  1826.                         break;
  1827.                     fprintf(stderr,"Data Format Error! File %s Line %d\n",*argv,i);
  1828.                     exit(-1);
  1829.                 }
  1830.                 if (x==99)
  1831.                     break;
  1832.                 if ((c=fscanf(fp,"%d %s %s",&y,name,sport))!=3)
  1833.                 {
  1834.                     fprintf(stderr,"Data Format Error! File %s Line %d\n",*argv,i);
  1835.                     exit(-1);
  1836.                 }
  1837.                 xa[i]=x;
  1838.                 ya[i]=y;
  1839.                 printf("(%s) %d %d pname\n",name,x,y);
  1840.                 printf("(%s) %d %d pport\n",sport,x,y);
  1841.             }
  1842.             for (k=i++;;i++)
  1843.             {
  1844.                 if ((c=fscanf(fp,"%d",&x))!=1)
  1845.                 {    
  1846.                     if (c==EOF)
  1847.                         break;
  1848.                     fprintf(stderr,"Border Format Error! Line %d\n",i);
  1849.                     exit(-1);
  1850.                 }
  1851.                 if (x==99)
  1852.                     break;
  1853.                 if ((c=fscanf(fp,"%d %d",&y,&dx))!=2)
  1854.                 {
  1855.                     fprintf(stderr,"Border Format Error! Line %d\n",i);
  1856.                     exit (-1);
  1857.                 }
  1858.                 printf("%d %d %d border\n",dx,x-1,y-1);
  1859.             }
  1860.             for (i++;;i++)
  1861.             {
  1862.                 if ((c=fscanf(fp,"%d",&x))!=1)
  1863.                 {
  1864.                     if (c==EOF)
  1865.                         break;
  1866.                     fprintf(stderr,"Route Format Error! Line %d\n",i);
  1867.                     exit(-1);
  1868.                 }
  1869.                 if (x==99)
  1870.                     break;
  1871.                 if ((c=fscanf(fp,"%d %d %d",&y,&dx,&dy))!=3)
  1872.                 {
  1873.                     fprintf(stderr,"Route Format Error! File %s Line %d\n",*argv,i);
  1874.                     exit(-1);
  1875.                 }
  1876.                 printf("%d %d %d %d route\n",x-1,y-1,dx-1,dy-1);
  1877.             }
  1878.             for (i=0;i<k;i++)
  1879.                 printf("%d %d planet\n",xa[i],ya[i]);
  1880.             for (k=0;k<10;k++)
  1881.                 for (i=0;i<8;i++)
  1882.                     printf("(%02d%02d) %d %d ccord\n",i+1,k+1,i,k);
  1883.         }
  1884.     }
  1885.     printf("showpage\n");
  1886. }
  1887. End of sysprint/trmult.c
  1888.  echo sysprint/ts 1>&2
  1889. cat >sysprint/ts <<'End of sysprint/ts'
  1890. #Csh
  1891. foreach i (`nbrs $1 $2 $3`)
  1892.     st -m $i >m$i
  1893. end
  1894. End of sysprint/ts
  1895.