home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume2
/
traveller
< prev
next >
Wrap
Internet Message Format
|
1991-08-07
|
43KB
From: everson@compsci.bristol.ac.uk (Phill Everson)
Newsgroups: comp.sources.misc
Subject: v02i020: Traveller (FRP) programs
Message-ID: <7131@ncoast.UUCP>
Date: 26 Jan 88 04:10:58 GMT
Approved: allbery@ncoast.UUCP
Comp.sources.misc: Volume 2, Issue 20
Submitted-By: Phill Everson <everson@compsci.bristol.ac.uk>
Archive-Name: traveller
I don't know which newsgroup would be appropriate for the following,
perhaps it should go in comp.sources.misc with some cross-postings?
We are unable to post into rec.games.frp at present, so could you
post it in the most suitable place please? [Here. Most non-source
groups frown on sources the way source groups frown on binaries. ++bsa]
# To unbundle, sh this file
echo README 1>&2
cat >README<<'End of README'
Usage of Traveller Programs
===========================
Create Two subdirectories sysgen & sysprint : Then unbundle the files.
The directories will contain :
sysgen:
Makefile const.h glob.c glob.h init.c main.c planets.c print.c rnd.c sats.c st.c
stuff.h sub.c support.c system.c types.h
sysprint:
Makefile mass stars.ps tr22 trconv trmult trmult.c ts
To generate complete listings of star systems (an allegedly complete
implementation of Single-Star Systems according to the rules in Book 6)
it is necessary to compile the files in sysgen (by typing make) and then
running the program st. Be warned this produces voluminous output.
To generate a postscript file representing the star system, run st with
the -m option. This produces a file which lists the major features in the
system.
The command trconv file in the sysprint directory will then
produce a postscript file. Trading routes can be added to the system
description file by the DM as required.
Multiple systems can be printed using the trmult command. For example
trmult 2 2 stars.ps file1 file2 file3 file4
will place 4 systems on a piece of paper. But be warned: the order is not
the most obvious imaginable.
NOTE: the st command takes an argument which is an integer defining the
system. This allows the st program to be run many times with predictable
results.
tr22 & mass are historical examples of using trmult.
End of README
echo sysgen/Makefile 1>&2
cat >sysgen/Makefile <<'End of sysgen/Makefile'
CFLAGS=
PRFLAGS=-l60
OBJS =rnd.o init.o print.o glob.o st.o system.o support.o planets.o sats.o main.o sub.o
SOURCES=rnd.c init.c print.c glob.c st.c system.c support.c planets.c sats.c main.c sub.c
HDRS=const.h types.h glob.h
PRG=st
LIBS=-lm
$(PRG): $(OBJS)
cc $(CFLAGS) $(OBJS) $(LIBS) -o $(PRG)
$(OBJS) : stuff.h
stuff.h: $(HDRS)
@touch stuff.h
wc:
@wc $(SOURCES) $(HDRS)
lint:
@lint $(HDRS) $(SOURCES)
pr:
@pr $(PRFLAGS) $(HDRS) $(SOURCES)
objs:
@echo $(SOURCES)
@echo $(HDRS)
End of sysgen/Makefile
echo sysgen/const.h 1>&2
cat >sysgen/const.h <<'End of sysgen/const.h'
#define DIE 6
End of sysgen/const.h
echo sysgen/glob.c 1>&2
cat >sysgen/glob.c <<'End of sysgen/glob.c'
#include "stuff.h"
int orbits[]={ 0.2, 0.4, 0.7, 1.0, 1.6, 2.8, 5.2, 10.0, 19.6, 38.8,
77.2, 154.0, 307.6, 614.8, 1229.2, 2458.0, 4915.6, 9830.6,
19661.2, 39322.0 };
char lt[]="aeioubcdfghjklmnpqrstvwxyz";
int freq[]={ 82, 209, 278, 353, 380, 395, 422, 466, 488, 508, 569,
572, 580, 620, 644, 712, 731, 734, 792, 855, 947, 957,
980, 981, 1000, 1001 };
int vowel=380;
SYSDATA syst;
char nature[]="SSSSSSSSBBBBTT";
char ptypet[]="BBAMMMMMKGFFFF";
int psizet[]={ 0, 1, 2, 3, 4, 5, 5,
5, 5, 5, 5, 6, 7, 7 };
char ctypet[]="BBAFFGGKKMMMMM";
int csizet[]={ 0, 1, 2, 3, 4, 7, 7,
5, 5, 6, 7, 7, 7, 7 };
int natDM= -1;
int typeDM=0;
int sizeDM=0;
char zones[][13][16]={ "--------IIIIIHO",
"-------IIIIIHOO",
"-------IIIIIHOO",
"-------IIIIIHOO",
"------IIIIIIHOO",
"------IIIIIHOOO",
"-------IIIIIHOO",
"-------IIIIIHOO",
"-------IIIIIHOO",
"-------IIIIIHOO",
"-------IIIIIHOO",
"--------IIIIHOO",
"--------IIIIHOO",
"--------IIIIIHO",
"------IIIIIHOOO",
"-----IIIIIIHOOO",
"-----IIIIIHOOOO",
"-----IIIIIHOOOO",
"----IIIIIIHOOOO",
"----IIIIIIHOOOO",
"-----IIIIIHOOOO",
"-----IIIIIHOOOO",
"------IIIIIHOOO",
"------IIIIIHOOO",
"-------IIIIIHOO",
"--------IIIIHOO",
"-------IIIIIHOO",
"-----IIIIIIHOOO",
"---IIIIIIHOOOOO",
"--IIIIIIHOOOOOO",
"--IIIIIIHOOOOOO",
"--IIIIIIHOOOOOO",
"--IIIIIIHOOOOOO",
"--IIIIIIHOOOOOO",
"--IIIIIIIHOOOOO",
"---IIIIIIHOOOOO",
"----IIIIIIHOOOO",
"------IIIIIHOOO",
"------IIIIIHOOO",
"-------IIIIIHOO",
"-----IIIIIHOOOO",
"-IIIIIIIHOOOOOO",
"-IIIIIIHOOOOOOO",
"-IIIIIHOOOOOOOO",
"-IIIIIHOOOOOOOO",
"-IIIIIHOOOOOOOO",
"-IIIIIIHOOOOOOO",
"-IIIIIIHOOOOOOO",
"-IIIIIIIHOOOOOO",
"--IIIIIIHOOOOOO",
"----IIIIIHOOOOO",
"-----IIIIHOOOOO",
"-------IIIIIHOO",
"---IIIIIIHOOOOO",
"-IIIIIIHOOOOOOO",
"IIIIIIHOOOOOOOO",
"IIIIIIHOOOOOOOO",
"IIIIIHOOOOOOOOO",
"IIIIIHOOOOOOOOO",
"IIIIIHOOOOOOOOO",
"IIIIHOOOOOOOOOO",
"---------------",
"---------------",
"---------------",
"---------------",
"------IIIIIIHOO",
"---IIIIIIHOOOOO",
"IIIIIIIHOOOOOOO",
"IIIIIIHOOOOOOOO",
"IIIIIHOOOOOOOOO",
"IIIIHOOOOOOOOOO",
"IIIHOOOOOOOOOOO",
"IIHOOOOOOOOOOOO",
"IIHOOOOOOOOOOOO",
"HOOOOOOOOOOOOOO",
"HOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"---------------",
"---------------",
"---------------",
"---------------",
"---------------",
"IIIHOOOOOOOOOOO",
"IIHOOOOOOOOOOOO",
"IHOOOOOOOOOOOOO",
"IHOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"HOOOOOOOOOOOOOO",
"HOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO" };
int ggno[]={ 0, 1, 1, 1, 2, 2, 3,
3, 4, 4, 4, 5, 5, 5 };
int plno[]={ 3, 2, 2, 2, 2, 2, 2,
1, 1, 1, 1, 1, 1, 1 };
int ggDM, plDM;
int ring[]={ 1, 1, 1, 1, 2, 2, 3 };
int clos[]={ 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13 };
int far[]={ 5, 10, 15, 20, 25, 30, 35,
40, 45, 50, 55, 60, 65 };
int extreme[]={ 75, 100, 125, 150, 175, 200,
225, 250, 275, 300, 325 };
char starport[]="AAAAABBCCDEEX";
char spaceport[]="YYYHGGF";
int tech[][17]={0,0,0,0,0,0,0,0,0,0,6,4,2,0,0,0,-4,
2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,0,2,4,0,0,0,0,0,0,
1,0,0,0,0,1,0,0,0,0,0,0,0,-2,0,0,0 };
int mwatm,mwpop,mwgov,mwlaw,mwtech,mwind,mwpoor;
int base;
SUBDATA *subsect,*css;
int grtab[]={ 0,0,0,0,5,5,10,10,
15,15,40,50,60,15,10,0 };
int cloud[]={ 0,0,10,10,20,30,40,50,60,70,70 };
double lumtab[][13]={ 560000,204000,107000,81000,61000,51000,67000,89000,
97000,107000,117000,129000,141000,
270000,46700,15000,11700,7400,5100,6100,8100,11700,
20400,46000,89000,117000,
170000,18600,2200,850,600,510,560,740,890,2450,4600,
14900,16200,
107000,6700,280,90,53,43,50,75,95,320,470,2280,2690,
81000,2000,156,37,19,12,6.5,4.9,4.67,0,0,0,0,
56000,1400,90,16,8.1,3.5,1.21,.67,.42,.08,.04,.007,.001,
0,0,0,0,0,.977,.322,.186,.117,.025,.011,.002,.00006,
.046,.01,.005,.0009,.0003,.00015,.00006,.00005,.00004,
.00004,.00003,.00003,.00003 };
double dtab[]={ .2,.4,.7,1,1.6,2.8,5.2,10,19.6,38.8,77.2,154,307.6,614.8,
1229.2,2458,4915.6,9380.8,19661.2,39322 };
char spa[50][50];
int mapflag;
End of sysgen/glob.c
echo sysgen/glob.h 1>&2
cat >sysgen/glob.h <<'End of sysgen/glob.h'
extern int orbits[];
extern char lt[];
extern int freq[];
extern int vowel;
extern SYSDATA syst;
extern char nature[], ptypet[], ctypet[];
extern int psizet[], csizet[], natDM, typeDM, sizeDM;
extern char zones[][13][16];
extern int ggno[], plno[];
extern int ggDM, plDM;
extern int ring[], clos[], far[], extreme[];
extern char starport[],spaceport[];
extern int tech[][17];
extern int mwatm,mwpop,mwgov,mwlaw,mwtech,mwind,mwpoor;
extern int base;
extern SUBDATA *subsect,*css;
extern int grtab[],cloud[];
extern double lumtab[][13], dtab[];
extern char spa[][50];
extern int mapflag;
End of sysgen/glob.h
echo sysgen/init.c 1>&2
cat >sysgen/init.c <<'End of sysgen/init.c'
#include "stuff.h"
init(argc,argv,maxx,maxy)
char **argv;
int *maxx,*maxy;
{
subsect=(SUBDATA *)malloc(sizeof(SUBDATA));
subsect->next=NULL;
css=subsect;
if (argc>1 && argv[1][0]=='-')
{
if (argv[1][1]=='m')
mapflag=1;
argv++;
argc--;
}
switch(argc)
{
case 1:
iseed(42);
*maxx=8;
*maxy=10;
break;
case 2:
iseed(atoi(argv[1]));
*maxx=8;
*maxy=10;
break;
case 3:
iseed(atoi(argv[1]));
*maxx=8;
*maxy=atoi(argv[2]);
break;
case 4:
iseed(atoi(argv[1]));
*maxx=atoi(argv[3]);
*maxy=atoi(argv[2]);
break;
}
}
End of sysgen/init.c
echo sysgen/main.c 1>&2
cat >sysgen/main.c <<'End of sysgen/main.c'
#include "stuff.h"
mworld(s)
SYSDATA *s;
{
int pop;
PLANDATA *p,*mp;
SATDATA *sat,*ms;
pop=0;
mp=NULL;
for (p=s->orb0; p; p=p->next)
{
if (p->type=='P' || p->type=='W')
{
if (p->pop>pop || p->pop==pop && p->zone=='H')
{
pop=p->pop;
mp=p;
ms=NULL;
}
}
for (sat=p->sats; sat; sat=sat->next)
if (sat->pop>pop || sat->pop==pop && p->zone=='H')
{
pop=sat->pop;
mp=p;
ms=sat;
}
}
if (mp==NULL)
return;
for (p=s->orb0; p && p!=mp; p=p->next)
;
if (ms==NULL)
{
p->main=1;
p->gov=gov(p->pop);
p->law=law(p->gov);
if (p->pop>0) p->sport=starport[die(2)]; else p->sport='X';
p->tech=die(1)+tech[0][p->sport]+tech[1][p->size+1]+tech[2][p->atm]
+tech[3][p->hyd]+tech[4][p->pop]+tech[5][p->gov];
if (p->tech<0) p->tech=0;
else if (p->tech>15) p->tech=15;
trade(&p->notes,p->size,p->atm,p->hyd,p->pop,p->gov,p->law,p->tech);
if (die(2)>7 && (p->sport=='A' || p->sport=='B'))
addstr(&p->notes,"Naval");
if (scb(p->sport)) addstr(&p->notes,"Scout");
mwatm=p->atm;
mwpop=p->pop;
mwgov=p->gov;
mwlaw=p->law;
mwtech=p->tech;
return;
}
for (sat=p->sats; sat && sat!=ms; sat=sat->next)
;
sat->main=1;
sat->gov=gov(sat->pop);
sat->law=law(sat->gov);
sat->sport=starport[die(2)];
sat->tech=die(1)+tech[0][sat->size]+tech[1][sat->atm]+tech[2][sat->hyd]
+tech[3][sat->pop]+tech[4][sat->gov];
if (sat->tech<0) sat->tech=0;
else if (sat->tech>15) sat->tech=15;
trade(&sat->notes,sat->size,sat->atm,sat->hyd,sat->pop,sat->gov,
sat->law,sat->tech);
if (die(2)>7 && (sat->sport=='A' || sat->sport=='B'))
addstr(&sat->notes,"Naval");
if (scb(sat->sport)) addstr(&sat->notes,"Scout");
mwgov=sat->gov;
mwlaw=sat->law;
mwtech=sat->tech;
}
gov(pop)
{
int g;
g=die(2)-7+pop;
if (g<0) return 0;
else if (g>15) return 15;
else return g;
}
law(gov)
{
int l;
l=die(2)-7+gov;
if (l<0) return 0;
else if (l>9) return 9;
else return l;
}
scb(sp)
char sp;
{
int DM;
switch(sp)
{
case 'C':
DM= -1;
break;
case 'B':
DM= -2;
break;
case 'A':
DM= -3;
break;
}
if (sp!='E' && sp!='X')
return (die(2)+DM>6);
else
return 0;
}
trade(notes,size,atm,hyd,pop,gov,law)
char **notes;
{
mwind=mwpoor=0;
if (atm>=4 && atm<=9 && hyd>=4 && hyd<=8 && pop>=5 && pop<=7)
addstr(notes,"Agr");
if (atm<=3 && hyd<=3 && pop>=6)
addstr(notes,"Non-Agr");
if ((atm>=0 && atm<=2 || atm==4 || atm==7 || atm==9) && pop>=9)
{
addstr(notes,"Ind");
mwind=1;
}
if (pop<=6)
addstr(notes,"Non-Ind");
if ((atm==6 || atm==9) && gov>=4 && gov<=9 && pop>=6 && pop<=8)
addstr(notes,"Rich");
if (atm>=2 && atm<=5 && hyd<=3)
{
addstr(notes,"Poor");
mwpoor=1;
}
if (hyd==10)
addstr(notes,"Water");
if (atm>=2 && hyd==0)
addstr(notes,"Desert");
if (atm==0)
addstr(notes,"Vacuum");
if (size==0)
addstr(notes,"Asteroid");
if (atm>=0 && atm<=1 && hyd>=1)
addstr(notes,"Ice-Capped");
}
End of sysgen/main.c
echo sysgen/planets.c 1>&2
cat >sysgen/planets.c <<'End of sysgen/planets.c'
#include "stuff.h"
new_planets(p,n,size,type,dec)
PLANDATA **p;
char type;
{
PLANDATA *q,*r;
int z1,z2;
char *name();
switch(type)
{
case 'B':
z1=0;
case 'A':
z1=2;
case 'F':
z1=4;
case 'G':
z1=6;
case 'K':
z1=8;
case 'M':
z1=10;
}
if (dec>=5)
z1++;
if (type=='M' && dec==9)
z1++;
z2=size;
for (r=NULL,n--;n>=0;n--,r=q)
{
q=(PLANDATA *)malloc(sizeof(PLANDATA));
strcpy(q->name,name());
q->type=' ';
q->orbit=n;
q->zone=zones[z2][z1][(n<15)?n:14];
q->main=0;
q->sats=NULL;
q->notes=NULL;
q->next=r;
}
*p=r;
}
empty(s)
SYSDATA *s;
{
int n;
PLANDATA *p;
if (die(1)>=5)
{
n=die(1);
switch (n)
{
case 1:
case 2:
n=1;
break;
case 3:
n=2;
break;
default:
n=3;
break;
}
if (n>s->free)
n=s->free;
while (n>0)
for (p=s->orb0; p!=NULL && n>0; p=p->next)
if (die(1)==6)
{
p->type='E';
n--;
s->free--;
}
}
}
capt(s)
SYSDATA *s;
{
int n;
PLANDATA *p;
if (die(1)>=5)
{
n=(die(1)+1)/2;
if (n>s->orbits)
n=s->orbits;
while (n>0)
for (p=s->orb0; p!=NULL && n>0; p=p->next)
if (die(1)==6)
{
p->capt=die(2)-7;
n--;
}
}
}
gasgiants(s)
SYSDATA *s;
{
int n;
PLANDATA *p;
if (die(2)<10)
{
n=ggno[die(2)+ggDM];
if (n>s->free)
n=s->free;
if (n==0)
{
n=1;
s->orbits++;
s->free++;
for (p=s->orb0; p->next; p=p->next)
;
p->next=(PLANDATA *)malloc(sizeof(PLANDATA));
if (p->zone=='I')
p->next->zone='I';
else
p->next->zone='O';
strcpy(p->next->name,name());
p->next->type=' ';
p->next->orbit=p->orbit+1;
p->next->main=0;
p->next->sats=NULL;
p->next->notes=NULL;
p->next->next=NULL;
}
s->gg=n;
while (n>0)
for (p=s->orb0; p && n>0;p=p->next)
if (p->type==' ' && die(1)==6)
{
p->type=(die(1)<4)?'L':'S';
n--;
s->free--;
}
}
}
planetoids(s)
SYSDATA *s;
{
int n;
PLANDATA *p;
if (die(2)-s->gg<=6)
{
n=die(2)-s->gg;
n=plno[(n<0)?0:n];
if (n>s->free)
n=s->free;
if (n!=0)
{
for (p=s->orb0;p && n>0;p=p->next)
if (p->type==' ' && p->next && (p->next->type=='S' || p->next->type=='L'))
{
p->type='P';
n--;
s->free--;
}
while (n>0)
for (p=s->orb0;p && n>0; p=p->next)
if (p->type==' ' && die(1)==6)
{
p->type='P';
n--;
s->free--;
}
}
}
}
wsize(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
{
if (p->type=='P')
p->size=0;
if (p->type!=' ')
continue;
p->type='W';
p->size=die(2)-2;
if (p->orbit==0) p->size-=5;
if (p->orbit==1) p->size-=4;
if (p->orbit==2) p->size-=2;
if (s->ptype=='M') p->size-=2;
if (p->size<=0) p->size= -1;
}
}
watm(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
{
if (p->type!='W' && p->type!='P')
continue;
p->atm=die(2)-7+p->size;
if (p->zone=='I') p->atm-=2;
if (p->zone=='O') p->atm-=4;
if (p->size==0) p->atm=0;
if (p->atm<0) p->atm=0;
if (p->atm>15) p->atm=15;
}
}
whyd(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
{
if (p->type!='W' && p->type!='P')
continue;
p->hyd=die(2)-7+p->size;
if (p->zone=='I') p->hyd=0;
if (p->zone=='O') p->hyd-=2;
if (p->size<2) p->hyd=0;
if (p->atm<2 || p->atm>9) p->hyd-=4;
if (p->hyd<0) p->hyd=0;
if (p->hyd>10) p->hyd=10;
}
}
wpop(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
{
if (p->type!='W' && p->type!='P')
continue;
p->pop=die(2)-2;
if (p->zone=='I') p->pop-=5;
if (p->zone=='O') p->pop-=3;
if (p->atm!=0 && p->atm!=5 && p->atm!=6 && p->atm!=8) p->pop-=2;
if (p->pop<0) p->pop=0;
}
}
End of sysgen/planets.c
echo sysgen/print.c 1>&2
cat >sysgen/print.c <<'End of sysgen/print.c'
#include "stuff.h"
print(s)
SYSDATA *s;
{
PLANDATA *p;
SATDATA *sat;
char *prss();
if (mapflag) return;
printf(" %-15s %c%d %-2s\n",s->name,s->ptype,
s->pdec,prss(s->psize));
for (p=s->orb0; p; p=p->next)
{
putchar(' ');
if (p->zone=='H') putchar('*'); else putchar(' ');
printf(" %2d ",p->orbit);
if (p->type=='L')
printf(" %-15s Large GG\n",p->name);
else if (p->type=='S')
printf(" %-15s Small GG\n",p->name);
else if (p->type!='E')
prpl(p,s);
else
{
printf(" Orbit Empty \n");
continue;
}
for (sat=p->sats; sat; sat=sat->next)
{
printf(" %3d", sat->orbit);
prsat(sat);
}
}
}
prpl(p,s)
PLANDATA *p;
SYSDATA *s;
{
char hex(),pshex(),sshex();
if (mapflag) return;
printf(" %-15s ",p->name);
printf(" %c",p->sport);
if (p->type=='P') putchar('0'); else putchar(pshex(p->size));
printf("%c%c%c%c%c %c ",hex(p->atm),hex(p->hyd),hex(p->pop),
hex(p->gov),hex(p->law),hex(p->tech));
if (s!=0) plfacts(p,s);
if (p->notes)
printf(" %s",p->notes);
putchar('\n');
}
prsat(p)
SATDATA *p;
{
char hex(),pshex(),sshex();
if (mapflag) return;
printf(" %-15s ",p->name);
printf(" %c",p->sport);
putchar(sshex(p->size));
printf("%c%c%c%c%c %c ",hex(p->atm),hex(p->hyd),hex(p->pop),
hex(p->gov),hex(p->law),hex(p->tech));
if (p->notes)
printf(" %s",p->notes);
putchar('\n');
}
char *prss(n)
{
switch(n)
{
case 0:
return "Ia";
break;
case 1:
return "Ib";
break;
case 2:
return "II";
break;
case 3:
return "III";
break;
case 4:
return "IV";
break;
case 5:
return "V";
break;
case 6:
return "VI";
break;
case 7:
return "D";
break;
}
}
char hex(n)
{
if (n<0) return '0';
if (n<10) return '0'+n;
return n-10+'A';
}
char pshex(n)
{
if (n<=0) return 'S';
else return hex(n);
}
char sshex(n)
{
if (n<0) return 'S';
else if (n==0) return 'R';
else return hex(n);
}
plfacts(p,s)
PLANDATA *p;
SYSDATA *s;
{
FACDATA f;
int w,l,i,cl,z1;
double lum,dist;
double sqrt();
f.green=grtab[p->atm];
f.cloud=cloud[p->hyd];
if (p->atm>=10) f.cloud+=4;
if (p->atm<=3) f.cloud-=2;
if (p->atm==14) f.cloud=(f.cloud-4)/2;
w=p->hyd*10;
l=100-p->hyd;
i=l/10;
l-=i/2;
w-=i/2;
f.land=l;
f.water=w;
f.ice=i;
cl=100-f.cloud;
l=l*cl/100;
w=w*cl/100;
i=i*cl/100;
f.albedo=l*15+w*2+f.cloud*60+i*55;
switch(s->ptype)
{
case 'B':
z1=0;
case 'A':
z1=2;
case 'F':
z1=4;
case 'G':
z1=6;
case 'K':
z1=8;
case 'M':
z1=10;
}
if (s->pdec>=5)
z1++;
if (s->ptype=='M' && s->pdec==9)
z1++;
lum=lumtab[s->psize][z1];
dist=dtab[p->orbit];
f.temp=374.025*f.green*(100-f.albedo)*sqrt(sqrt(lum))/sqrt(dist);
}
End of sysgen/print.c
echo sysgen/rnd.c 1>&2
cat >sysgen/rnd.c <<'End of sysgen/rnd.c'
#include "stuff.h"
static s;
rand(n)
{
double rnd();
return (random()%n+1);
}
iseed(q)
int q;
{
srandom(q);
}
char *name()
{
static char st[20];
int i,j,l;
l=rand(7)+3;
st[l+1]='\0';
i=rand(1000);
for (j=0;freq[j]<i;j++)
;
st[l--]=lt[j];
while (l>=0)
{
if (i<vowel)
i=rand(1000-vowel)+vowel;
else
i=rand(vowel);
for (j=0;freq[j]<i;j++)
;
st[l--]=lt[j];
}
st[0]=toupper(st[0]);
return st;
}
die(n)
{
int i,j;
j=0;
for (i=0;i<n;i++)
j+=rand(DIE);
return j;
}
End of sysgen/rnd.c
echo sysgen/sats.c 1>&2
cat >sysgen/sats.c <<'End of sysgen/sats.c'
#include "stuff.h"
sats(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
switch(p->type)
{
case 'L':
new_sats(&p->sats,die(2));
break;
case 'S':
new_sats(&p->sats,die(2)-4);
break;
case 'W':
new_sats(&p->sats,die(1)-3);
break;
default:
p->sats=NULL;
}
}
new_sats(p,n)
SATDATA **p;
{
SATDATA *r, *q;
char *name();
if (n<=0)
*p=NULL;
else
{
for (r=NULL;n;r=q,n--)
{
q=(SATDATA *)malloc(sizeof(SATDATA));
strcpy(q->name,name());
q->main=0;
q->notes=NULL;
q->next=r;
}
*p=r;
}
}
satwsize(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
satsize(p);
}
satsize(p)
PLANDATA *p;
{
SATDATA *s;
for (s=p->sats; s; s=s->next)
{
switch(p->type)
{
case 'L':
s->size=die(2)-4;
break;
case 'S':
s->size=die(2)-6;
break;
case 'W':
s->size=p->size-die(1);
break;
}
if (s->size<0) s->size= -1; /*SMALL*/
if (s->size>10) s->size= 10;
}
}
satworbit(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
satorbit(p);
}
satorbit(p)
PLANDATA *p;
{
SATDATA *s,*r;
int otype,swap;
int DM;
DM=0;
for (s=p->sats; s; s=s->next,DM++)
{
otype=die(2)-DM;
if (s->size==0) s->orbit=ring[die(1)];
else if (otype<8) s->orbit=clos[die(2)];
else if (otype==12 && (p->type=='L' || p->type=='S'))
s->orbit=extreme[die(2)];
else if (otype>7) s->orbit=far[die(2)];
}
swap=1;
s=p->sats;
while (s && s->next && swap)
{
s=p->sats;
swap=0;
if (s->orbit>s->next->orbit)
{
p->sats=s->next;
s->next=p->sats->next;
p->sats->next=s;
swap=1;
}
for (s=p->sats; s->next->next; s=s->next)
{
r=s->next;
if (r->orbit>r->next->orbit)
{
s->next=r->next;
r->next=r->next->next;
s->next->next=r;
swap=1;
}
}
}
for (s=p->sats; s && s->next;)
if (s->orbit==s->next->orbit)
{
r=s->next;
s->next=r->next;
free(r);
}
else
s=s->next;
}
satwatm(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
satatm(p);
}
satatm(p)
PLANDATA *p;
{
SATDATA *s;
for (s=p->sats; s; s=s->next)
{
s->atm=die(2)-7+s->size;
if (p->zone=='I') s->atm-=4;
if (p->zone=='O') s->atm-=4;
if (s->size<2) s->atm=0;
if (s->atm<0) s->atm=0;
if (s->atm>15) s->atm=15;
}
}
satwhyd(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
sathyd(p);
}
sathyd(p)
PLANDATA *p;
{
SATDATA *s;
for (s=p->sats; s; s=s->next)
{
s->hyd=die(2)-7+s->size;
if (p->zone=='I') s->hyd=0;
if (p->zone=='O') s->hyd-=4;
if (s->size<=0) s->hyd=0;
if (s->atm<2 || s->atm>9) s->hyd-=4;
if (s->hyd<0) s->hyd=0;
if (s->hyd>10) s->hyd=10;
}
}
satwpop(s)
SYSDATA *s;
{
PLANDATA *p;
for (p=s->orb0; p; p=p->next)
satpop(p);
}
satpop(p)
PLANDATA *p;
{
SATDATA *s;
for (s=p->sats; s; s=s->next)
{
s->pop=die(2)-2;
if (p->zone=='I') s->pop-=5;
if (p->zone=='O') s->pop-=4;
if (s->atm!=5 && s->atm!=6 && s->atm!=8) s->pop-=2;
if (s->size<5) s->pop-=2;
if (s->size==0) s->pop=0;
if (s->pop<0) s->pop=0;
if (s->pop>10) s->pop=10;
}
}
End of sysgen/sats.c
echo sysgen/st.c 1>&2
cat >sysgen/st.c <<'End of sysgen/st.c'
#include "stuff.h"
main(argc,argv)
char **argv;
{
int i,j,mxi,mxj;
char sysnat(), stype();
init(argc,argv,&mxi,&mxj);
for (i=1;i<=mxi;i++)
{
for (j=1;j<=mxj;j++)
{
spa[i][j]=' ';
if (syspres(0))
{
if (!mapflag) printf("\fSystem At (%02d%02d)\n\n",i,j);
strcpy(syst.name,name());
syst.nature=sysnat();
syst.ptype=stype(0);
syst.psize=ssize(0,syst.ptype);
syst.pdec=rand(10)-1;
if (syst.nature!='S')
{
syst.ctype=stype(1);
syst.csize=ssize(1,syst.ctype);
syst.cdec=rand(10)-1;
}
syst.orbits=nbrorbs(syst.psize,syst.ptype);
syst.free=syst.orbits;
new_planets(&syst.orb0,syst.orbits,syst.psize,syst.ptype,
syst.pdec);
syst.notes=NULL;
empty(&syst);
capt(&syst);
gasgiants(&syst);
planetoids(&syst);
wsize(&syst);
watm(&syst);
whyd(&syst);
wpop(&syst);
sats(&syst);
satwsize(&syst);
satworbit(&syst);
satwatm(&syst);
satwhyd(&syst);
satwpop(&syst);
mworld(&syst);
sub(&syst);
print(&syst);
css->x=i;
css->y=j;
spa[i][j]=freeup(&syst);
}
}
}
if (!mapflag)
{
putchar('\f');
for (css=subsect; css->next; css=css->next)
{
printf("%02d%02d ",css->x,css->y);
if (!css->planet && !css->sat) printf(" %s system UNINHABITED\n",css->name);
if (css->planet) prpl(css->planet,0);
if (css->sat) prsat(css->sat,0);
}
printf("\f ");
for (i=1;i<=mxi;i++)
printf("%02dxx ",i);
putchar('\n');
for (j=1;j<=mxj;j++)
{
printf(" xx%02d ",j);
for (i=1;i<=mxi;i+=2)
printf(" %2c ",spa[i][j]);
printf("\n ");
for (i=2;i<=mxi;i+=2)
printf(" %2c ",spa[i][j]);
putchar('\n');
}
}
else
{
for (css=subsect;css->next;css=css->next)
{
printf("%d %d ",css->x-1,css->y-1);
if (!css->planet && !css->sat) printf("%s %c\n",css->name,spa[css->x][css->y]);
if (css->planet) printf("%s %c\n",css->planet->name,css->planet->sport);
if (css->sat) printf("%s %c\n",css->sat->name,css->sat->sport);
}
printf("99\n");
}
}
End of sysgen/st.c
echo sysgen/stuff.h 1>&2
cat >sysgen/stuff.h <<'End of sysgen/stuff.h'
#include <stdio.h>
#include <ctype.h>
#include "const.h"
#include "types.h"
#include "glob.h"
End of sysgen/stuff.h
echo sysgen/sub.c 1>&2
cat >sysgen/sub.c <<'End of sysgen/sub.c'
#include "stuff.h"
sub(s)
SYSDATA *s;
{
PLANDATA *p;
SATDATA *sat;
int sp;
for (p=s->orb0; p; p=p->next)
{
if (!p->main && p->type!='L' && p->type!='S')
{
p->gov=die(1);
if (mwgov==6) p->gov=6;
if (mwgov>=7) p->gov+=2;
if (p->pop==0) p->gov=0;
p->law=die(1)-3+mwlaw;
if (p->gov==0) p->law=0;
p->tech=mwtech-1+facility(&p->notes,p->zone,p->size,p->atm,p->hyd,
p->pop,p->gov,p->law);
if (p->pop==0) p->tech=0;
sp=die(1);
if (p->pop>=6) sp+=2;
if (p->pop<2) sp-=2;
if (sp<1) sp=1;
if (sp>6) sp=6;
if (p->pop>0) p->sport=spaceport[sp]; else p->sport='Y';
}
for (sat=p->sats; sat; sat=sat->next)
{
if (!sat->main)
{
sat->gov=die(1);
if (mwgov==6) sat->gov=6;
if (mwgov>=7) sat->gov+=2;
if (sat->pop==0) sat->gov=0;
sat->law=die(1)-3+mwlaw;
if (sat->gov==0) sat->law=0;
sat->tech=mwtech-1+facility(&sat->notes,p->zone,sat->size,
sat->atm,sat->hyd,sat->pop,sat->gov,sat->law);
if (sat->pop==0) sat->tech=0;
sp=die(1);
if (sat->pop>=6) sp+=2;
if (sat->pop<2) sp-=2;
if (sp<1) sp=1;
if (sp>6) sp=6;
if (sat->pop>0) sat->sport=spaceport[sp]; else sat->sport='Y';
}
}
}
}
facility(notes,zone,size,atm,hyd,pop,gov,law)
char **notes;
char zone;
{
int bonus; /* TL bonus for lab or base */
bonus=0;
if (zone=='H' && atm>=4 && atm<=9 && hyd>=4 && hyd<=8 && pop>=2)
addstr(notes,"Farming");
if (mwind && pop>=2)
addstr(notes,"Mining");
if (gov==6 && pop>=5)
addstr(notes,"Colony");
if ((die(2)+((mwtech>=10)?2:0)>=11) && mwtech>8 && pop>0)
{
addstr(notes,"Lab.");
bonus=1;
}
if (die(2)+((mwpop>=8)?1:0)+((atm==mwatm)?2:0)+(base?1:0)>=12 && pop>0 &&
!mwpoor)
{
addstr(notes,"Mil. Base");
bonus=1;
}
return bonus;
}
End of sysgen/sub.c
echo sysgen/support.c 1>&2
cat >sysgen/support.c <<'End of sysgen/support.c'
#include "stuff.h"
char *malloc(), *realloc(), *strcpy(), *strcat();
addstr(p,q)
char **p,*q;
{
if (*p==NULL)
*p=strcpy(malloc(strlen(q)+1),q);
else
*p=strcat(strcat(realloc(*p,strlen(*p)+strlen(q)+2)," "),q);
}
freeup(s)
SYSDATA *s;
{
PLANDATA *p;
SATDATA *sat;
char sp;
sp='X';
css->planet=NULL;
css->sat=NULL;
css->name=strcpy(malloc(strlen(s->name)+1),s->name);
for (p=s->orb0; p; p=p->next)
{
for (sat=p->sats; sat; sat=sat->next)
if (sat->main)
{
css->sat=sat;
sp=sat->sport;
}
else
free(sat);
if (p->main)
{
p->sats=NULL;
css->planet=p;
sp=p->sport;
}
else
free(p);
}
css->next=(SUBDATA *)malloc(sizeof(SUBDATA));
css=css->next;
css->planet=NULL;
css->sat=NULL;
css->next=NULL;
return sp;
}
End of sysgen/support.c
echo sysgen/system.c 1>&2
cat >sysgen/system.c <<'End of sysgen/system.c'
#include "stuff.h"
syspres(fudge)
{
if (die(1)+fudge>=4)
return 1;
else
return 0;
}
char sysnat()
{
return nature[die(2)+natDM];
}
char stype(f)
{
if (f==0)
return ptypet[die(2)+typeDM];
else
return ctypet[die(2)+typeDM];
}
ssize(f,t)
char t;
{
int s;
if (f==0)
s=psizet[die(2)+sizeDM];
else
s=csizet[die(2)+sizeDM];
if (s==4 && (t=='K' || t=='M'))
s=5;
if (s==6 && (t=='B' || t=='A' || t=='F'))
s=5;
return s;
}
nbrorbs(s,t)
char t;
{
int o;
o=die(2);
if (s==3) o+=4;
if (s<=2) o+=8;
if (t=='M') o-=4;
if (t=='K') o-=2;
if (o<1) o=1;
return o;
}
End of sysgen/system.c
echo sysgen/types.h 1>&2
cat >sysgen/types.h <<'End of sysgen/types.h'
typedef struct factors {
int cloud;
int albedo;
int green;
int land;
int water;
int ice;
int temp;
int tilt;
int ecc;
} FACDATA;
typedef struct subsector {
int x;
int y;
struct planet *planet;
struct sat *sat;
char *name;
struct subsector *next;
} SUBDATA;
typedef struct system {
char name[20];
char nature;
char ptype;
int pdec;
int psize;
char ctype;
int cdec;
int csize;
int orbits;
int free;
int gg;
char *notes;
struct planet *orb0;
} SYSDATA;
typedef struct planet {
char name[20];
int orbit;
char zone;
char type;
int capt;
char sport;
int size;
int atm;
int hyd;
int pop;
int gov;
int law;
int tech;
int main;
char *notes;
struct sat *sats;
struct planet *next;
} PLANDATA;
typedef struct sat {
char name[20];
int orbit;
char sport;
int size;
int atm;
int hyd;
int pop;
int gov;
int law;
int tech;
int main;
char *notes;
struct sat *next;
} SATDATA;
End of sysgen/types.h
echo sysprint/Makefile 1>&2
cat >sysprint/Makefile <<'End of sysprint/Makefile'
all: trmult
trmult: trmult.o
cc -o trmult trmult.o
End of sysprint/Makefile
echo sysprint/mass 1>&2
cat >sysprint/mass <<'End of sysprint/mass'
trmult 4 4 stars.ps m1[3456]00 m900 m1[012]00 m[5678]00 m[1234]00
End of sysprint/mass
echo sysprint/stars.ps 1>&2
cat >sysprint/stars.ps <<'End of sysprint/stars.ps'
/incx { 126 } def
/incy { 72 } def
/offset { 15 } def
/coffset { 35 } def
/stdfont { /Times-Roman findfont } def
/add36 { 36 sub } def
/setgrey { setgray } def
/grey4 { 0.1 setgrey 6 setlinewidth} def
/black1 {0 setgrey 1 setlinewidth} def
/grid { % - GRID -
-21 36 rmoveto
-21 -36 rlineto
21 -36 rlineto
42 0 rlineto
21 36 rlineto
-21 36 rlineto
21 -36 rmoveto
42 0 rlineto
} def
/top { % - TOP -
-21 36 rmoveto
42 0 rlineto
} def
/right { % - RIGHT -
84 0 rmoveto
21 -36 rlineto
-21 -36 rlineto
} def
/bottom { % - BOTTOM -
21 -36 rmoveto
21 -36 rlineto
42 0 rlineto
21 36 rlineto
} def
/coords { % string COORDS -
0 24 rmoveto
dup % duplicate string
stringwidth
pop
2 div neg
0
rmoveto
show % second copy of string
} def
/starport { % string STARPORT -
dup
stringwidth
offset add exch
2 div neg exch
rmoveto
show
} def
/name { % string NAME -
dup
stringwidth
pop offset neg exch
2 div neg exch
rmoveto
show
} def
/conv2 { % x (0:7) y (0:9) CONV2 x (minx:maxx) y (miny:maxy)
9 exch sub % 9-y
incy mul % (9-y)*incy
miny add % (9-y)*incy+miny
exch % stack: y x
dup % dup to give us second value for test
2 mod 0 ne % test for even column
exch % stack: y bool x
incx 2 div mul% x*incx
minx add % x*incx+minx
3 1 roll % stack: x y bool
{add36} if % make y correction
} def
/conv { % x (0:7) y (0:9) CONV -
conv2
moveto
} def
/pname { % string x y PNAME -
conv
name
} def
/pport { % string x y PNAME -
conv
starport
} def
/ccord { % string x y CCORD -
conv
coords
} def
/route { % x y x y ROUTE -
4 setlinewidth
conv
conv2
lineto
stroke
} def
/Nbord { % 0 Nbord -
pop
-21 36 rmoveto
42 0 rlineto
grey4
stroke
black1
} def
/NEbord { % - NEbord -
21 36 rmoveto
21 -36 rlineto
grey4
stroke
black1
} def
/SEbord { % - SEbord -
42 0 rmoveto
-21 -36 rlineto
grey4
stroke
black1
} def
/NSEbord { % side NSEBORD -
1 eq {NEbord} {SEbord} ifelse
} def
/border { % side x y BORDER -
conv
dup
0 eq {Nbord} {NSEbord} ifelse
} def
/planet { % x y PLANET -
conv2
2 copy
moveto
-6 -10 rmoveto
stdfont 30 scalefont setfont
1 setgray
(\267) show
moveto
-4 -7 rmoveto
stdfont 20 scalefont setfont
0 setgray
(\267) show
stdfont 10 scalefont setfont
} def
/grid2 { % horiz vert GRID2 horiz
2 copy
moveto
grid
pop
} def
/grid1 { % horiz GRID1 -
maxy incy neg miny {grid2} for
dup
maxy moveto top
miny moveto bottom
} def
/dogrid { % - DOGRID -
minx incx maxx {grid1} for
} def
/right1 { % horiz vert RIGHT1 horiz
2 copy
moveto
right
pop
} def
/doright { % - DORIGHT -
maxx
maxy incy neg miny {right1} for
pop
} def
End of sysprint/stars.ps
echo sysprint/tr22 1>&2
cat >sysprint/tr22 <<'End of sysprint/tr22'
trmult 2 2 stars.ps m${1}00 m${2}00 m${3}00 m${4}00
End of sysprint/tr22
echo sysprint/trconv 1>&2
cat >sysprint/trconv <<'End of sysprint/trconv'
trmult 1 1 stars.ps $*
End of sysprint/trconv
echo sysprint/trmult.c 1>&2
cat >sysprint/trmult.c <<'End of sysprint/trmult.c'
#include <stdio.h>
#define MAX 80
#define MAXC 30
#define MAXX 396
#define MINX 18
#define MAXY 702
#define MINY 54
#define INCX 126
#define INCY 72
main(argc,argv)
char **argv;
{
char name[MAXC],sport[MAXC];
FILE *fp;
int c;
int x,y,dx,dy,xa[MAX],ya[MAX];
int i,k;
int xsiz,ysiz;
int xl,yl;
if (argc<5)
{
fprintf(stderr,"Usage: %s x y psfile starsfile ...\n",argv[0]);
exit(-1);
}
xsiz=atoi(argv[1]);
ysiz=atoi(argv[2]);
if (argc!=xsiz*ysiz+4)
{
fprintf(stderr,"You must specify %d stars files\n",xsiz*ysiz);
exit(-1);
}
printf("36 36 translate\n");
printf("1 %d div 1 %d div scale\n",xsiz,ysiz);
printf("/maxx { %d } def\n",MAXX);
printf("/minx { %d } def\n",MINX);
printf("/maxy { %d } def\n",MAXY);
printf("/miny { %d } def\n",MINY);
if (!(fp=fopen(argv[3],"r")))
{
fprintf(stderr,"Could not open %s\n",argv[3]);
exit(-1);
}
printf("36 36 translate\n");
while ((c=getc(fp))!=EOF)
putchar(c);
fclose(fp);
for (yl=0,argv+=4;yl<ysiz;yl++)
{
if (yl!=0) printf("%d %d translate\n",(1-xsiz)*(MAXX-MINX+INCX),MAXY-MINY+INCY);
for (xl=0;xl<xsiz;xl++,argv++)
{
if (xl!=0) printf("%d 0 translate\n",MAXX-MINX+INCX);
printf("stdfont 10 scalefont setfont\n");
printf("dogrid\n");
printf("doright\n");
printf("1 setlinewidth\n");
printf("stroke\n");
if (!(fp=fopen(*argv,"r")))
{
fprintf(stderr,"Could not open %s\n",*argv);
exit(-1);
}
for (i=0;;i++)
{
if ((c=fscanf(fp,"%d",&x))!=1)
{
if (c==EOF)
break;
fprintf(stderr,"Data Format Error! File %s Line %d\n",*argv,i);
exit(-1);
}
if (x==99)
break;
if ((c=fscanf(fp,"%d %s %s",&y,name,sport))!=3)
{
fprintf(stderr,"Data Format Error! File %s Line %d\n",*argv,i);
exit(-1);
}
xa[i]=x;
ya[i]=y;
printf("(%s) %d %d pname\n",name,x,y);
printf("(%s) %d %d pport\n",sport,x,y);
}
for (k=i++;;i++)
{
if ((c=fscanf(fp,"%d",&x))!=1)
{
if (c==EOF)
break;
fprintf(stderr,"Border Format Error! Line %d\n",i);
exit(-1);
}
if (x==99)
break;
if ((c=fscanf(fp,"%d %d",&y,&dx))!=2)
{
fprintf(stderr,"Border Format Error! Line %d\n",i);
exit (-1);
}
printf("%d %d %d border\n",dx,x-1,y-1);
}
for (i++;;i++)
{
if ((c=fscanf(fp,"%d",&x))!=1)
{
if (c==EOF)
break;
fprintf(stderr,"Route Format Error! Line %d\n",i);
exit(-1);
}
if (x==99)
break;
if ((c=fscanf(fp,"%d %d %d",&y,&dx,&dy))!=3)
{
fprintf(stderr,"Route Format Error! File %s Line %d\n",*argv,i);
exit(-1);
}
printf("%d %d %d %d route\n",x-1,y-1,dx-1,dy-1);
}
for (i=0;i<k;i++)
printf("%d %d planet\n",xa[i],ya[i]);
for (k=0;k<10;k++)
for (i=0;i<8;i++)
printf("(%02d%02d) %d %d ccord\n",i+1,k+1,i,k);
}
}
printf("showpage\n");
}
End of sysprint/trmult.c
echo sysprint/ts 1>&2
cat >sysprint/ts <<'End of sysprint/ts'
#Csh
foreach i (`nbrs $1 $2 $3`)
st -m $i >m$i
end
End of sysprint/ts