home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
games
/
volume1
/
warp7
/
part03
< prev
next >
Wrap
Internet Message Format
|
1987-06-10
|
50KB
Path: seismo!rutgers!ames!ucbcad!ucbvax!decvax!tektronix!tekgen!tekred!games-request
From: games-request@tekred.TEK.COM
Newsgroups: comp.sources.games
Subject: v01i047: warp7 - space war game, Part03/07
Message-ID: <1296@tekred.TEK.COM>
Date: 10 Jun 87 20:40:33 GMT
Sender: billr@tekred.TEK.COM
Lines: 1964
Approved: billr@tekred.TEK.COM
Submitted by: Larry Wall <lwall%sdcrdcf.UUCP@jove.cam.unisys.com>
Comp.sources.games: Volume 1, Issue 47
Archive-name: warp7/Part03
#! /bin/sh
# Make a new directory for the warp sources, cd to it, and run kits 1
# thru 7 through sh. When all 7 kits have been run, read README.
echo "This is warp 7.0 kit 3 (of 7). If kit 3 is complete, the line"
echo '"'"End of kit 3 (of 7)"'" will echo at the end.'
echo ""
export PATH || (echo "You didn't use sh, you clunch." ; kill $$)
echo Extracting move.c
sed >move.c <<'!STUFFY!FUNK!' -e 's/X//'
X/* $Header: move.c,v 7.0.1.2 86/10/20 14:37:06 lwall Exp $ */
X
X/* $Log: move.c,v $
X * Revision 7.0.1.2 86/10/20 14:37:06 lwall
X * Picked some lint.
X *
X * Revision 7.0.1.1 86/10/16 10:52:09 lwall
X * Added Damage. Fixed random bugs.
X *
X * Revision 7.0 86/10/08 15:12:40 lwall
X * Split into separate files. Added amoebas and pirates.
X *
X */
X
X#include "EXTERN.h"
X#include "warp.h"
X#include "bang.h"
X#include "object.h"
X#include "move.h"
X#include "play.h"
X#include "score.h"
X#include "term.h"
X#include "them.h"
X#include "us.h"
X#include "util.h"
X#include "weapon.h"
X#include "INTERN.h"
X#include "move.h"
X
Xvoid
Xmove_init()
X{
X ;
X}
X
Xvoid
Xbounce(obj)
XReg4 OBJECT *obj;
X{
X Reg1 int x;
X Reg2 int y;
X Reg3 int count=0;
X
X y = (obj->posy - sgn(obj->vely) + YSIZE00) % YSIZE;
X x = (obj->posx - sgn(obj->velx) + XSIZE00) % XSIZE;
X while (occupant[y][x]) {
X y = (y + rand_mod(3) - 1 + YSIZE00) % YSIZE;
X x = (x + rand_mod(3) - 1 + XSIZE00) % XSIZE;
X if (++count > 10000) { /* if universe full, get out of it fast */
X unmake_object(obj);
X if (ent) unmake_object(ent);
X if (base) unmake_object(base);
X finish = 1;
X return;
X }
X }
X obj->posy = y;
X obj->posx = x;
X obj->vely = 0;
X obj->velx = 0;
X occupant[y][x] = obj;
X if (numamoebas && obj->image == ' ')
X mvaddc(y+1, x*2, amb[y][x]);
X else
X mvaddc(y+1, x*2, obj->image);
X}
X
Xvoid
Xmove_universe()
X{
X Reg1 OBJECT *curobj;
X Reg2 int x;
X Reg3 int y;
X Reg4 OBJECT *temp;
X OBJECT *thenext;
X
X for (curobj = movers; curobj != &root; curobj = curobj->next) {
X x = curobj->posx;
X y = curobj->posy;
X if (curobj == occupant[y][x]) {
X occupant[y][x] = 0;
X }
X else if (curobj->type != Torp && curobj->type != Web) {
X resetty();
X abort();
X }
X }
X for (curobj = movers; curobj != &root; curobj = thenext) {
X thenext = curobj->next;
X if (curobj->vely || curobj->velx) {
X y = curobj->posy;
X x = curobj->posx;
X if (curobj->image != ' ' &&
X (!(temp=occupant[y][x]) || temp->image==' ') ) {
X move(y+1, x*2, numamoebas ? amb[y][x] : ' ');
X }
X y = (y + curobj->vely + YSIZE00) % YSIZE;
X x = (x + curobj->velx + XSIZE00) % XSIZE;
X if (!(temp=occupant[y][x]) || temp->type != Star ||
X curobj->type != Torp || curobj->image == '+' ||
X curobj->image == 'x') {
X curobj->posy = y;
X curobj->posx = x;
X }
X else {
X if (curobj->image == '0') {
X curobj->vely = rand_mod(3)-1;
X curobj->velx = rand_mod(3)-1;
X }
X else
X curobj->vely = curobj->velx = 0;
X y = curobj->posy;
X x = curobj->posx;
X }
X }
X else { /* not moving */
X y = curobj->posy;
X x = curobj->posx;
X if (curobj->type == Torp ||
X curobj->type == Star ||
X curobj->type == Web) {
X curobj->flags |= STATIC;
X curobj->next->prev = curobj->prev;
X curobj->prev->next = curobj->next;
X curobj->prev = movers->prev;
X curobj->next = movers;
X movers->prev->next = curobj;
X movers->prev = curobj;
X }
X }
X if (temp = occupant[y][x]) { /* already occupied? */
X if (!temp->contend) {
X if (temp->type == Torp) {
X if (temp->image == '+')
X blast[y][x] += 1250;
X else if (temp->image == 'o' && (base||ent))
X blast[y][x] += 500+super*20;
X else if (temp->image == 'O' && (base||ent))
X blast[y][x] += 5000+super*100;
X }
X }
X yblasted[y] |= 1;
X xblasted[x] |= 1;
X blasted = TRUE;
X curobj->contend = temp;
X occupant[y][x] = curobj;
X switch (curobj->type) {
X case Enemy:
X if (numamoebas && curobj == nuke && temp->image == '+')
X blast[y][x] += 80000;
X else if (temp->type == Enemy)
X blast[y][x] += 10;
X else
X goto defblast;
X break;
X case Crusher:
X if (curobj->velx)
X blast[y][x] += 100000;
X else
X goto defblast;
X break;
X case Torp:
X if (curobj->image == '+')
X blast[y][x] += (temp==nuke ? 80000 : 1250);
X else if (curobj->image == 'o')
X blast[y][x] += 500+super*20;
X else if (curobj->image == 'O')
X blast[y][x] += 5000+super*100;
X goto defblast;
X case Star:
X if (temp == ent)
X goto damshield;
X goto defblast;
X case Enterprise:
X if (temp->type == Star) {
X damshield:
X if (!rand_mod(10)) {
X if (!damflag[NOSHIELDS])
X damage++;
X if (damflag[NOSHIELDS] < 100)
X damflag[NOSHIELDS] += rand_mod(smarts)/5+2;
X }
X }
X goto defblast;
X default:
X defblast:
X blast[y][x] += rand_mod(751)+1;
X break;
X }
X }
X else {
X occupant[y][x] = curobj;
X if (curobj->image != ' ' &&
X (curobj->velx || curobj->vely ||
X curobj->type == Torp || curobj->type == Web) ) {
X mvaddc(y+1, x*2, curobj->image);
X }
X if (curobj->type == Crusher && curobj->velx) {
X blast[y][x] += 100000;
X yblasted[y] |= 1;
X xblasted[x] |= 1;
X blasted = TRUE;
X }
X }
X }
X if (blasted) {
X Reg7 int minxblast = -1;
X Reg8 int maxxblast = -2;
X Reg5 long tmpblast;
X
X blasted = numamoebas;
X for (x=0; x<XSIZE; x++) {
X if (xblasted[x]) {
X xblasted[x] = 0;
X maxxblast = x;
X if (minxblast < 0)
X minxblast = x;
X }
X }
X for (y=0; y<YSIZE; y++) {
X if (yblasted[y]) {
X yblasted[y] = 0;
X for (x=minxblast; x<=maxxblast; x++) {
X tmpblast = blast[y][x];
X if (numamoebas && amb[y][x] == '~') {
X if (temp = occupant[y][x]) {
X if (temp->image == '&')
X tmpblast >>= 1;
X else if (temp->type == Web)
X tmpblast = 100000;
X else
X tmpblast += 50 + temp->energy/100;
X if (tmpblast > 250 && !rand_mod(5+(inumstars>>4)))
X modify_amoeba(y,x,1,'~',5);
X }
X xblasted[x] = 2;
X yblasted[y] = 2;
X }
X if (tmpblast) {
X Reg6 OBJECT *biggie = 0;
X
X blast[y][x] = 0;
X temp = occupant[y][x];
X if (tmpblast < 0) {
X if (numamoebas && tmpblast < -1000000 &&
X amb[y][x] == '~' && temp != nuke) {
X amb[y][x] = ' ';
X if (!temp)
X make_plink(y,x);
X ambsize--;
X }
X tmpblast = 0;
X }
X if (temp) {
X if ((!numamoebas || amb[y][x]==' ') &&
X tmpblast < 100000)
X make_plink(y,x);
X for ( ;temp;
X temp = curobj->contend,curobj->contend = 0){
X curobj = temp;
X switch (curobj->type) {
X case Enterprise: {
X long tmp = curobj->energy;
X
X if (ent->energy>500 || apolloflag & 1)
X curobj->energy -= tmpblast /
X ((apolloflag & 1)
X ? 20
X : (5+abs(ent->velx)+abs(ent->vely))
X / ((damflag[NOSHIELDS]>>3)+1)+1);
X else
X curobj->energy -= tmpblast;
X if (rand_mod(1 + tmp - curobj->energy) > 100
X || ent->energy < (entmax>>1)) {
X if (debug & 128 ||
X (damage <= smarts/10 &&
X !rand_mod(6-smarts/20-massacre) )) {
X tmp = rand_mod(MAXDAMAGE);
X if (damflag[tmp]) {
X if (damflag[tmp] < 60)
X damflag[tmp] += rand_mod(60);
X }
X else {
X damflag[tmp] =
X rand_mod(smarts+10)+2;
X damage++;
X }
X }
X }
X break;
X }
X case Base:
X if (base->energy > 1000 || apolloflag & 2)
X curobj->energy -= tmpblast /
X ((apolloflag & 2)?20:5);
X else
X curobj->energy -= tmpblast;
X break;
X case Crusher:
X if (tmpblast > 132767)
X curobj->energy -= (tmpblast - 100000);
X else if (tmpblast >= 100000) {
X curobj->energy += (tmpblast - 100000);
X if (curobj->energy > 32767)
X curobj->energy = 32767;
X }
X else /* vulnerable while feeding */
X curobj->energy -= tmpblast;
X break;
X case Enemy:
X curobj->energy -= tmpblast*10/enemshields;
X break;
X default:
X curobj->energy -= tmpblast;
X break;
X }
X if (curobj->energy < 0) { /* killed it? */
X switch (curobj->image) {
X case 'A':
X tmpblast = 100000;
X make_blast(y,x,8192L,1);
X numapollos = apolloflag = 0;
X numstars--;
X numenemies--;
X curscore += 5000;
X deados = 0;
X break;
X case 'E': case 'e': case 'C': case 'c':
X ent = 0;
X numents--;
X if (base)
X status = 2;
X else
X status = 3;
X deados = 0;
X break;
X case 'B': case 'b':
X base = 0;
X numbases--;
X if (ent)
X status = entmode;
X else
X status = 3;
X deados = 0;
X break;
X case '&': {
X int i, xxx, yyy;
X
X for (i = 0; i < YSIZE; i++)
X yblasted[i] &= 1;
X for (i = 0; i < XSIZE; i++)
X xblasted[i] &= 1;
X numamoebas = 0; /* ignore amb[][] now */
X for (yyy = 0; yyy < YSIZE; yyy++) {
X for (xxx = 0; xxx < XSIZE; xxx++) {
X if (amb[yyy][xxx] == '~' &&
X !occupant[yyy][xxx]) {
X mvaddch(yyy+1,xxx*2,' ');
X }
X }
X }
X numenemies--;
X curscore += 10000;
X if (curobj == enemies)
X enemies = curobj->next;
X deados = 0;
X break;
X }
X case '<': case '>': {
X int i;
X
X numenemies--;
X numcrushes = 0;
X curscore += 10000;
X if (curobj == movers)
X movers = curobj->next;
X if (curobj == enemies)
X enemies = curobj->next;
X deados = 0;
X
X tmpblast = 100000;
X make_blast(y,(x+XSIZE00)%XSIZE,10000L,0);
X if (curobj->image == '<') {
X for (i=XSIZE00; i<=XSIZE01; i++)
X make_blast(y,(x+i)%XSIZE,
X 10000L,0);
X for (i=XSIZE00; i<=XSIZE02; i++)
X make_blast(y,(x+i)%XSIZE,
X 10000L,0);
X make_blast(y,(x+XSIZE03)%XSIZE,
X 10000L,1);
X for (i=XSIZE00; i<=XSIZE08; i++)
X make_blast(y,(x+i)%XSIZE,
X 10000L,0);
X }
X else {
X for (i=XSIZE00; i>=XSIZE99; i--)
X make_blast(y,(x+i)%XSIZE,
X 10000L,0);
X for (i=XSIZE00; i>=XSIZE98; i--)
X make_blast(y,(x+i)%XSIZE,
X 10000L,0);
X make_blast(y,(x+XSIZE97)%XSIZE,
X 10000L,1);
X for (i=XSIZE00; i>=XSIZE92; i--)
X make_blast(y,(x+i)%XSIZE,
X 10000L,0);
X }
X }
X break;
X case 'K':
X numenemies--;
X curscore += curobj->mass;
X if (curobj == enemies)
X enemies = curobj->next;
X deados = 0;
X break;
X case 'T':
X numenemies--;
X curscore += curobj->mass*3/2;
X if (curobj == enemies)
X enemies = curobj->next;
X deados = 0;
X break;
X case 'R': case ' ': case 'P':
X numenemies--;
X if (curobj->flags & PIRATE)
X curscore += curobj->mass;
X else
X curscore += curobj->mass*3;
X if (curobj == enemies)
X enemies = curobj->next;
X deados = 0;
X break;
X case 'G':
X numenemies--;
X numgorns--;
X tmpblast = 100000;
X if (madgorns)
X curscore += curobj->mass/2;
X else
X curscore += curobj->mass*2;
X if (curobj == enemies)
X enemies = curobj->next;
X {
X int xxx,yyy;
X
X for (xxx = -1; xxx<=1; xxx++)
X for (yyy = -1; yyy<=1; yyy++)
X if (rand_mod(2+massacre))
X fire_torp(curobj,
X yyy,xxx);
X }
X deados = 0;
X break;
X case '@':
X numinhab--;
X /* FALL THROUGH */
X case '*':
X banging = TRUE;
X numstars--;
X break;
X case '|': case '-': case '/': case '\\':
X tmpblast = 100000;
X make_blast(y,x,curobj->mass,1);
X banging = TRUE;
X deados = 0;
X break;
X case 'x':
X curscore += 10;
X deados = 0;
X break;
X case 'X':
X curscore += 100;
X numxes--;
X deados = 0;
X break;
X case '0':
X curscore += 35;
X numos--;
X deados += 3;
X break;
X case 'o':
X curscore += 100;
X numos--;
X deados++;
X break;
X case 'O':
X curscore += 200;
X numos--;
X deados += 2;
X break;
X case 'M':
X deadmudds++;
X inumfriends--;
X numfriends--;
X if (curobj == enemies)
X enemies = curobj->next;
X break;
X case 'Q': case 'W': case 'Y': case 'U':
X case 'I': case 'S': case 'D': case 'H':
X case 'J': case 'L': case 'Z': case 'V':
X case 'F':
X numfriends--;
X if (curobj == enemies)
X enemies = curobj->next;
X if (inumfriends < 10)
X madfriends += 500;
X else
X madfriends += 10000/inumfriends;
X break;
X }
X if (tmpblast < 100000)
X make_blast(y,x,curobj->mass,1);
X unmake_object(curobj);
X }
X else { /* didn't kill anything */
X if (!biggie)
X biggie = curobj;
X else {
X if (biggie->mass > curobj->mass)
X bounce(curobj);
X else {
X bounce(biggie);
X biggie = curobj;
X }
X }
X }
X }
X if (biggie) {
X occupant[y][x] = biggie;
X if (numamoebas && biggie->image == ' ')
X mvaddch(y+1,x*2, amb[y][x]);
X else
X mvaddch(y+1,x*2, biggie->image);
X }
X else {
X occupant[y][x] = 0;
X mvaddch(y+1, x*2, numamoebas ? amb[y][x] : ' ');
X }
X }
X }
X }
X }
X }
X }
X do_bangs();
X if (numcrushes && movers->type == Crusher)
X movers->vely = 0;
X if (curobj = base) {
X char ch;
X
X curobj->velx = 0;
X curobj->vely = 0;
X curobj->energy += 25*lookaround(curobj->posy,curobj->posx,Star);
X if (curobj->energy > basemax)
X curobj->energy = basemax;
X if (curobj->energy >= 1000)
X ch = 'B';
X else
X ch = 'b';
X if (ch != curobj->image) {
X setimage(curobj, ch);
X }
X }
X if (curobj = ent) {
X char ch;
X
X if (entmode == 0) {
X curobj->velx = 0;
X curobj->vely = 0;
X }
X if (base && !cloaking && !curobj->velx && !curobj->vely &&
X lookfor(curobj->posy,curobj->posx,Base)) {
X int tmp;
X
X#ifdef lint
X tmp = 0;
X#else
X tmp = (int) (base->energy - 1000 < entmax - curobj->energy ?
X base->energy - 1000 : entmax - curobj->energy);
X#endif
X if (tmp < 0)
X tmp = 0;
X curobj->energy += tmp;
X base->energy -= tmp;
X tmp = (btorp < 50 - etorp ?
X btorp : 50 - etorp);
X etorp += tmp;
X btorp -= tmp;
X if (damage) {
X tmp = rand_mod(MAXDAMAGE);
X if (damflag[tmp] > 5) {
X damflag[tmp] = rand_mod(5)+1;
X }
X }
X }
X if (curobj->energy >= 500 && (!damage || !damflag[NOSHIELDS]))
X ch = cloaked?'C':'E';
X else
X ch = cloaked?'c':'e';
X if (ch != curobj->image) {
X setimage(curobj, ch);
X }
X }
X}
X
Xint
Xlookaround(y, x, what)
XReg1 int y;
XReg2 int x;
XReg4 char what;
X{
X Reg3 OBJECT *obj;
X Reg5 int count=0;
X Reg6 int xp;
X Reg7 int xm;
X
X if ((obj=occupant[y][xp=(x+XSIZE01)%XSIZE])&&obj->type == what) /* 0, 1 */
X count++;
X if ((obj=occupant[y][xm=(x+XSIZE99)%XSIZE])&&obj->type == what) /* 0, -1 */
X count++;
X if ((obj=occupant[y=(y+YSIZE99)%YSIZE][xp])&&obj->type == what) /* -1, 1 */
X count++;
X if ((obj=occupant[y][x])&&obj->type == what) /* -1, 0 */
X count++;
X if ((obj=occupant[y][xm])&&obj->type == what) /* -1, -1 */
X count++;
X if ((obj=occupant[y=(y+2)%YSIZE][xp])&&obj->type == what) /* 1, 1 */
X count++;
X if ((obj=occupant[y][x])&&obj->type == what) /* 1, 0 */
X count++;
X if ((obj=occupant[y][xm])&&obj->type == what) /* 1, -1 */
X count++;
X return (count);
X}
X
Xint
Xlookfor(y, x, what)
XReg1 int y;
XReg2 int x;
XReg4 char what;
X{
X Reg3 OBJECT *obj;
X Reg5 int xp;
X Reg6 int xm;
X
X if ((obj=occupant[y][xp=(x+XSIZE01)%XSIZE])&&obj->type == what ||/* 0, 1 */
X (obj=occupant[y][xm=(x+XSIZE99)%XSIZE])&&obj->type == what ||/* 0, -1 */
X (obj=occupant[y=(y+YSIZE99)%YSIZE][xp])&&obj->type == what ||/* -1, 1 */
X (obj=occupant[y][x])&&obj->type == what ||/* -1, 0 */
X (obj=occupant[y][xm])&&obj->type == what ||/* -1,-1 */
X (obj=occupant[y=(y+2)%YSIZE][xp])&&obj->type == what ||/* 1, 1 */
X (obj=occupant[y][x])&&obj->type == what ||/* 1, 0 */
X (obj=occupant[y][xm])&&obj->type == what) /* 1, -1 */
X return(1);
X return (0);
X}
X
XOBJECT*
Xlookimg(y, x, what)
XReg1 int y;
XReg2 int x;
XReg4 char what;
X{
X Reg3 OBJECT *obj;
X Reg5 int xp;
X Reg6 int xm;
X
X if ((obj=occupant[y][xp=(x+XSIZE01)%XSIZE])&&obj->image==what ||/* 0, 1 */
X (obj=occupant[y][xm=(x+XSIZE99)%XSIZE])&&obj->image==what ||/* 0, -1 */
X (obj=occupant[y=(y+YSIZE99)%YSIZE][xp])&&obj->image==what ||/* -1, 1 */
X (obj=occupant[y][x])&&obj->image==what ||/* -1, 0 */
X (obj=occupant[y][xm])&&obj->image==what ||/* -1,-1 */
X (obj=occupant[y=(y+2)%YSIZE][xp])&&obj->image==what ||/* 1, 1 */
X (obj=occupant[y][x])&&obj->image==what ||/* 1, 0 */
X (obj=occupant[y][xm])&&obj->image==what) /* 1, -1 */
X return obj;
X return Null(OBJECT*);
X}
!STUFFY!FUNK!
echo Extracting weapon.c
sed >weapon.c <<'!STUFFY!FUNK!' -e 's/X//'
X/* $Header: weapon.c,v 7.0.1.2 86/10/20 14:36:33 lwall Exp $ */
X
X/* $Log: weapon.c,v $
X * Revision 7.0.1.2 86/10/20 14:36:33 lwall
X * Picked some lint.
X *
X * Revision 7.0.1.1 86/10/16 10:54:42 lwall
X * Added Damage. Fixed random bugs.
X *
X * Revision 7.0 86/10/08 15:18:08 lwall
X * Split into separate files. Added amoebas and pirates.
X *
X */
X
X#include "EXTERN.h"
X#include "warp.h"
X#include "bang.h"
X#include "object.h"
X#include "move.h"
X#include "score.h"
X#include "sig.h"
X#include "term.h"
X#include "them.h"
X#include "us.h"
X#include "util.h"
X#include "INTERN.h"
X#include "weapon.h"
X
Xvoid
Xweapon_init()
X{
X ;
X}
X
Xvoid
Xfire_torp(from, ydir, xdir)
XReg1 OBJECT *from;
XReg3 int ydir;
XReg4 int xdir;
X{
X Reg2 OBJECT *to;
X
X if (from->type == Enemy ||
X (from == ent && etorp > 0) ||
X (from == base && btorp > 0)) {
X to = occupant[(from->posy+from->vely+ydir+YSIZE00)%YSIZE]
X [(from->posx+from->velx+xdir+XSIZE00)%XSIZE];
X if (from->type != Enemy || !to || to->vely || to->velx) {
X if (from->type != Enemy &&
X (to = isatorp[from==base][ydir+1][xdir+1])) {
X to->vely += ydir;
X to->velx += xdir;
X }
X else {
X if (from == ent) {
X to = make_object(Torp, '+', from->posy,from->posx,
X from->vely+ydir,from->velx+xdir, 0L, 1L,&root);
X aretorps++;
X isatorp[0][ydir+1][xdir+1] = to;
X etorp--;
X }
X else if (from == base) {
X to = make_object(Torp, '+', from->posy,from->posx,
X from->vely+ydir,from->velx+xdir, 0L, 1L,&root);
X aretorps++;
X isatorp[1][ydir+1][xdir+1] = to;
X btorp--;
X }
X else if (from->image == 'G') {
X numos++;
X to = make_object(Torp, 'o', from->posy,from->posx,
X from->vely+ydir,from->velx+xdir, 100L, 1L,&root);
X if (madgorns) {
X possiblescore += 35;
X to->image = '0';
X to->mass = 2000;
X to->energy = 2000;
X }
X else if (rand_mod(120)+10 > smarts)
X possiblescore += 100;
X else {
X possiblescore += 200;
X to->image = 'O';
X }
X }
X else {
X to = make_object(Torp, 'x', from->posy,from->posx,
X from->vely+ydir,from->velx+xdir, 0L, 1L,&root);
X if (rand_mod(160)+10 > smarts)
X possiblescore += 10;
X else {
X possiblescore += 100;
X to->image = 'X';
X to->mass = 1000+super*20;
X numxes++;
X }
X }
X }
X }
X }
X}
X
Xvoid
Xattack(attackee)
XReg7 OBJECT *attackee;
X{
X Reg1 int dx;
X Reg2 int dy;
X Reg3 int curx;
X Reg4 int cury;
X Reg5 int prob;
X Reg6 OBJECT *obj;
X Reg8 bool torps;
X Reg9 bool webnear = FALSE;
X Reg10 bool thru_stars;
X int nukey;
X int nukex;
X int nukedist;
X
X if (attackee) {
X if (attackee == nuke) {
X if (amb[attackee->posy][attackee->posx] != '~')
X return;
X nukey = nukex = 0;
X nukedist = 100;
X }
X for (dx= -1; dx<=1 ; dx++) {
X for (dy= -1; dy<=1; dy++) {
X if (dx||dy) {
X cury = attackee->posy;
X curx = attackee->posx;
X torps = thru_stars = FALSE;
X if (massacre || madgorns || !rand_mod(53-super) )
X webnear += rand_mod(2);
X else
X webnear = FALSE;
X for (prob = scandist;prob;prob--) {
X cury = (cury + dy + YSIZE00) % YSIZE;
X curx = (curx + dx + XSIZE00) % XSIZE;
X if (obj = occupant[cury][curx]) {
X switch (obj->image) {
X case 'P': case 'K': case 'R': case ' ':
X pot_shot:
X if (attackee == nuke) {
X if (rand_mod(2+scandist-prob) <
X rand_mod(smarts/40+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X }
X if (rand_mod(51 - sm50) <= prob) {
X switch (obj->strategy||thru_stars?0:
X rand_mod(ent?4:2)) {
X case 1: case 2:
X if (-dy + attackee->vely == obj->vely
X && -dx + attackee->velx == obj->velx)
X fire_torp(obj,
X -dy + attackee->vely,
X -dx + attackee->velx);
X else
X fire_torp(obj,
X -dy + attackee->vely - obj->vely,
X -dx + attackee->velx - obj->velx);
X if (obj->image == ' ')
X setimage(obj,
X obj->flags & PIRATE ? 'P' : 'R');
X break;
X case 3: {
X int newspeed =
X rand_mod(prob<5&&smarts>70?4:3)-1;
X
X obj->vely = -dy * newspeed;
X obj->velx = -dx * newspeed;
X if (newspeed >= 0 &&
X !rand_mod(82-sm80)) {
X obj->vely += attackee->vely;
X obj->velx += attackee->velx;
X }
X break;
X }
X case 0:
X if (!torps && obj->energy > 1000) {
X fire_phaser(obj, -dy, -dx);
X if (smarts > 40 &&
X (scandist-prob > 5
X || attackee==base) &&
X (massacre || obj->strategy ||
X rand_mod(2)))
X while (rand_mod(2))
X fire_phaser(obj, -dy, -dx);
X if (obj->image == ' ')
X setimage(obj,
X obj->flags&PIRATE ? 'P':'R');
X }
X if (obj->strategy) {
X obj->velx = obj->vely = 0;
X if (obj->energy < 1000 ||
X bvely || bvelx)
X obj->strategy = 0;
X }
X else if ((attackee==base ||
X (cloaking && attackee==ent)
X ) &&
X scandist-prob > 5 &&
X !(rand_mod(
X ent?antibase*2:antibase)) )
X obj->strategy = 1;
X break;
X }
X }
X goto bombout;
X case 'G':
X if (thru_stars && obj->strategy < 7)
X goto bombout;
X if (attackee == nuke) {
X if (rand_mod(2+scandist-prob) <
X rand_mod(smarts/40+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X goto bombout;
X }
X if (obj->strategy) {
X if (madgorns || !rand_mod(4)) {
X obj->vely = attackee->vely;
X obj->velx = attackee->velx;
X }
X obj->strategy += (!torps && deados > 10);
X if (obj->strategy > 4)
X madgorns = TRUE;
X if (!torps && obj->strategy > 5) {
X do {
X fire_phaser(obj, -dy, -dx);
X } while (rand_mod(2));
X }
X }
X else if (numgorns >= numenemies-1 &&
X deados > 15+numgorns*5)
X obj->strategy = 1;
X if (madgorns || rand_mod(51 - sm50) <= prob) {
X if (-dy + attackee->vely == obj->vely
X && -dx + attackee->velx == obj->velx)
X fire_torp(obj,
X -dy + attackee->vely,
X -dx + attackee->velx);
X else
X fire_torp(obj,
X -dy + attackee->vely - obj->vely,
X -dx + attackee->velx - obj->velx);
X }
X goto bombout;
X case 'T':
X if (attackee == nuke) {
X if (rand_mod(2+scandist-prob) <
X rand_mod(smarts/40+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X }
X if (thru_stars)
X goto bombout;
X if (webnear && scandist-prob > 5) {
X if (massacre || rand_mod(50) < super) {
X if (!torps && obj->energy > 1000) {
X fire_phaser(obj, -dy, -dx);
X while (!rand_mod(57-sm55))
X fire_phaser(obj, -dy, -dx);
X }
X }
X }
X goto bombout;
X case 'C': case 'c':
X if (thru_stars)
X goto bombout;
X break;
X case 'Q': case 'W': case 'Y': case 'U':
X case 'I': case 'S': case 'D': case 'H': case 'J':
X case 'L': case 'Z': case 'V': case 'M': case 'F':
X if (attackee == nuke) {
X if (rand_mod(2+scandist-prob) <
X rand_mod(smarts/40+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X if (rand_mod(2))
X goto pot_shot;
X }
X if (madfriends > 1000) {
X madfriends -= 200;
X goto pot_shot;
X }
X /* FALL THROUGH */
X case '+':
X if (attackee == nuke) {
X if (smarts > 70) {
X if (
X (obj->posx + obj->velx + XSIZE00)%XSIZE
X == attackee->posx &&
X (obj->posy + obj->vely + YSIZE00)%YSIZE
X == attackee->posy ) {
X Tract(nuke,dy,dx,-1);
X }
X else
X while (!rand_mod(82-sm80))
X Tract(nuke,dy,dx,-1);
X }
X else if (smarts > 60 ||
X rand_mod(2+scandist-prob) <
X rand_mod(smarts/20+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X }
X torps = FALSE;
X thru_stars = FALSE;
X break;
X case '|': case '-': case '/': case '\\':
X if (thru_stars)
X goto bombout;
X webnear = (scandist-prob < 3);
X torps = FALSE;
X break;
X case 'x':
X if (attackee == nuke) {
X if (rand_mod(2+scandist-prob) <
X rand_mod(smarts/20+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X }
X if (thru_stars)
X goto bombout;
X torps = TRUE;
X break;
X case 'o': case 'O': case '0':
X if (attackee == nuke) {
X if (rand_mod(2+scandist-prob) <
X rand_mod(smarts/20+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X }
X if (thru_stars)
X goto bombout;
X torps = TRUE;
X if (rand_mod(99+3*scandist) < smarts+3*prob) {
X obj->vely = -dy + attackee->vely;
X obj->velx = -dx + attackee->velx;
X if (obj->flags & STATIC) {/* not a mover? */
X obj->flags &= ~STATIC;
X obj->prev->next = obj->next;
X obj->next->prev = obj->prev;
X root.prev->next = obj;
X obj->prev = root.prev;
X root.prev = obj;
X obj->next = &root;
X }
X }
X if (obj->image != '0')
X break;
X /* DROP THROUGH! */
X case 'X':
X if (attackee == nuke) {
X if (rand_mod(2+scandist-prob) <
X rand_mod(smarts/20+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X }
X torps = TRUE;
X if (thru_stars)
X goto bombout;
X if (prob == scandist) {
X int y, x;
X
X blast[y=(obj->posy+obj->vely+YSIZE00)%YSIZE]
X [x=(obj->posx+obj->velx+XSIZE00)%XSIZE]
X += (obj->image == '0' ? 2000 : 200);
X yblasted[y] |= 1;
X xblasted[x] |= 1;
X blasted = TRUE;
X }
X break;
X case 'A':
X if (attackee != nuke) {
X if (scandist-prob>1 && !rand_mod(51-super))
X Tract(obj,-dy,-dx,1);
X }
X /* FALL THROUGH */
X case '*': case '@':
X if (attackee == nuke) {
X if (amb[cury][curx] != '~') {
X if (scandist-prob < nukedist) {
X nukedist = scandist-prob;
X nukey = dy; /* nearest food in */
X nukex = dx; /* this direction */
X }
X if (smarts > 55 && scandist-prob > 8) {
X if (rand_mod(30+scandist-prob) <
X rand_mod(smarts/20+1))
X Tract(nuke,dy,dx,1);
X }
X }
X else if (obj->vely || obj->velx) {
X Tract(nuke,dy,dx,1); /* for looks */
X obj->vely = obj->velx = 0;
X }
X }
X if (!thru_stars)
X if (rand_mod(97-sm95))
X goto bombout;
X else
X thru_stars = TRUE;
X break;
X case '<': case '>':
X if (attackee == nuke) {
X if ((!dy && scandist-prob < 8) ||
X rand_mod(2+scandist-prob) <
X rand_mod(smarts/20+1) ) {
X nuke->mass += 10000;
X Tract(nuke,dy,dx,-1);
X nuke->mass -= 10000;
X }
X }
X goto bombout;
X case 'E': case 'B':
X if (attackee == nuke) {
X if (rand_mod(2+scandist-prob) <
X rand_mod(smarts/40+1))
X Tract(nuke,dy,dx,rand_mod(3)?1:-1);
X }
X goto bombout;
X default:
X goto bombout;
X }
X }
X else {
X if (thru_stars)
X goto bombout;
X }
X }
Xbombout: ; /* end of loop */
X }
X }
X }
X if (attackee == nuke && nukedist < 100) {/* aim amoeba at nearest */
X if (nukey < 0) /* free star */
X nukey = 2;
X if (nukex < 0)
X nukex = 2;
X nuke->strategy = nukey + (nukex << 2);
X }
X }
X}
X
Xvoid
Xfire_phaser(obj, dy, dx)
XReg7 OBJECT *obj;
XReg5 int dy;
XReg6 int dx;
X{
X Reg1 int y;
X Reg2 int x;
X Reg3 int skipping;
X Reg4 int size=5000;
X int decr = 50, oldy, oldx;
X static char curchar[] = "@* ";
X
X if (obj == ent)
X decr = 100;
X else if (obj == base) {
X decr = 1000;
X size = 200;
X }
X if (!dy)
X curchar[2] = '-';
X else if (!dx)
X curchar[2] = '!';
X else if (dy == dx)
X curchar[2] = '\\';
X else
X curchar[2] = '/';
X if (obj->energy >= decr) {
X obj->energy -= decr;
X for (
X /* initialize */
X skipping = (obj != base),
X y = (obj->posy+(obj==base?dy*2:dy)+YSIZE00)%YSIZE,
X x = (obj->posx+(obj==base?dx*2:dx)+XSIZE00)%XSIZE;
X /* while */
X size && (!occupant[y][x]||(skipping && occupant[y][x]->type==Star));
X /* at end of loop */
X y = (y+dy+YSIZE00) % YSIZE,
X x = (x+dx+XSIZE00) % XSIZE,
X size = size * 3 / 4 ) {
X move(y+1,x*2,0);
X beg_qwrite();
X if (obj == base || obj->image == 'T') {
X *filler = '@';
X qwrite();
X *filler = '#';
X qwrite();
X *filler = '~';
X qwrite();
X *filler = '%';
X qwrite();
X *filler = ':';
X qwrite();
X *filler = '@';
X }
X else {
X *filler = size >= 500 ?
X *curchar : (size >= 50 ?
X curchar[1] :
X curchar[2]);
X }
X qwrite();
X if (occupant[y][x])
X qaddc(occupant[y][x]->image);
X else {
X if (numamoebas)
X qaddc(amb[y][x]);
X else
X qaddspace();
X if (skipping)
X skipping = 0;
X }
X end_qwrite();
X }
X if (size) {
X char img;
X
X assert(occupant[y][x]);
X img = occupant[y][x]->image;
X if (occupant[y][x]->type == Crusher) {
X if (dy)
X return;
X if (dx==(img == '<' ? 1 : -1) ) {
X occupant[y][x]->image =
X (occupant[y][x]->velx *= -1) < 0 ? '>' : '<';
X return;
X }
X }
X else if (occupant[y][x]->flags & FRIENDLY)
X madfriends += 200;
X if (numamoebas && amb[y][x] == '~' && smarts % 3 &&
X (smarts > 70 || rand_mod(smarts) > rand_mod(20)) ) {
X if (size > 10000)
X modify_amoeba(y,x,1,'~',10);
X else if (size > 1000)
X modify_amoeba(y,x,1,'~',7);
X else if (size > 50)
X modify_amoeba(y,x,1,'~',5);
X else
X modify_amoeba(y,x,1,'~',2);
X if (occupant[y][x] == nuke) {
X nuke->strategy = rand_mod(30);
X nuke->flags |= COUNTDOWN;
X }
X return;
X }
X else {
X move(y+1,x*2,0);
X beg_qwrite();
X if (img == ' ') {
X *filler = occupant[y][x]->flags & PIRATE ? 'P' : 'R';
X occupant[y][x]->image = *filler;
X occupant[y][x]->strategy = 0;
X qwrite();
X qwrite();
X }
X else if (img == 'C' || img == 'c') {
X cloaked = 0;
X img += 2;
X occupant[y][x]->image = img;
X *filler = img;
X qwrite();
X qwrite();
X }
X else if (img == 'K' && size > 50)
X occupant[y][x]->strategy = 0;
X *filler = '@';
X qwrite();
X *filler = '#';
X qwrite();
X *filler = '@';
X qwrite();
X *filler = '#';
X qwrite();
X *filler = '@';
X qwrite();
X qaddc(img);
X end_qwrite();
X oldy = y;
X oldx = x;
X y = (occupant[oldy][oldx]->posy + occupant[oldy][oldx]->vely +
X YSIZE00) % YSIZE;
X x = (occupant[oldy][oldx]->posx + occupant[oldy][oldx]->velx +
X XSIZE00) % XSIZE;
X if (occupant[y][x] && occupant[y][x]->type == Star) {
X y = occupant[oldy][oldx]->posy;
X x = occupant[oldy][oldx]->posx;
X }
X if (obj==base)
X blast[y][x] += size>50 ? 15000 : (size>15 ? 1500 : 150);
X else if (obj==ent)
X blast[y][x] += size*4;
X else if (obj->image=='T')
X blast[y][x] += 15000;
X else
X blast[y][x] += size*smarts/25;
X yblasted[y] |= 1;
X xblasted[x] |= 1;
X blasted = TRUE;
X }
X }
X }
X}
X
Xint
Xtract(obj, dy, dx, to_or_fro)
XReg7 OBJECT *obj;
XReg4 int dy;
XReg5 int dx;
Xint to_or_fro;
X{
X Reg1 int y;
X Reg2 int x;
X Reg3 int size=10;
X static char ch;
X Reg6 OBJECT *tractee;
X
X if (!dy)
X ch = '|';
X else if (!dx)
X ch = '-';
X else if (dy == dx)
X ch = '/';
X else
X ch = '\\';
X {
X for (
X y = (obj->posy+dy+YSIZE00)%YSIZE,
X x = (obj->posx+dx+XSIZE00)%XSIZE;
X size && (!occupant[y][x]);
X y = (y+dy+YSIZE00) % YSIZE, x = (x+dx+XSIZE00) % XSIZE, size--) {
X move(y+1,x*2,0);
X beg_qwrite();
X *filler = ch;
X qwrite();
X qwrite();
X if (numamoebas)
X qaddch(amb[y][x]);
X else
X qaddspace();
X end_qwrite();
X }
X tractee = occupant[y][x];
X if (size) {
X assert(tractee);
X if (numamoebas && obj != nuke && amb[y][x] == '~') {
X if (to_or_fro > 0)
X modify_amoeba(y,x,2,'~',size);
X else
X modify_amoeba(y,x,1,' ',size);
X }
X if (tractee->type != Web &&
X (tractee->mass < obj->mass * 5 ||
X (tractee->type == Crusher && !dx) ) ) {
X if (tractee == ent) {
X evely -= dy * to_or_fro;
X evelx -= dx * to_or_fro;
X }
X else if (tractee == base) {
X bvely -= dy * to_or_fro;
X bvelx -= dx * to_or_fro;
X }
X else {
X tractee->vely -= dy * to_or_fro;
X tractee->velx -= dx * to_or_fro;
X }
X if (tractee->type == Torp ||
X tractee->type == Star) {
X if (tractee->flags & STATIC) { /* not a mover? */
X tractee->flags &= ~STATIC;
X tractee->prev->next = tractee->next;
X tractee->next->prev = tractee->prev;
X root.prev->next = tractee;
X tractee->prev = root.prev;
X root.prev = tractee;
X tractee->next = &root;
X }
X }
X }
X else if (tractee->type == Crusher && !dy &&
X dx==(tractee->image == '<' ? 1 : -1) ) {
X setimage(tractee, (tractee->velx *= -1) < 0 ? '>' : '<');
X }
X if (tractee->mass * 5 > obj->mass)
X return(1);
X }
X }
X return(0);
X}
!STUFFY!FUNK!
echo Extracting init.c
sed >init.c <<'!STUFFY!FUNK!' -e 's/X//'
X/* $Header: init.c,v 7.0.1.4 86/12/12 16:58:03 lwall Exp $ */
X
X/* $Log: init.c,v $
X * Revision 7.0.1.4 86/12/12 16:58:03 lwall
X * Baseline for net release.
X *
X * Revision 7.0.1.3 86/10/20 14:35:31 lwall
X * Picked some lint.
X *
X * Revision 7.0.1.2 86/10/17 15:53:30 lwall
X * Added random walk star fields.
X *
X * Revision 7.0.1.1 86/10/16 10:51:19 lwall
X * Added Damage. Fixed random bugs.
X *
X * Revision 7.0 86/10/08 15:12:10 lwall
X * Split into separate files. Added amoebas and pirates.
X *
X */
X
X#include "EXTERN.h"
X#include "warp.h"
X#include "bang.h"
X#include "object.h"
X#include "move.h"
X#include "play.h"
X#include "score.h"
X#include "term.h"
X#include "them.h"
X#include "us.h"
X#include "util.h"
X#include "weapon.h"
X#include "INTERN.h"
X#include "init.h"
X
Xvoid
Xinitialize()
X{
X Reg1 int i;
X Reg2 int x;
X Reg3 int y;
X Reg4 int dist;
X Reg5 int ydist;
X Reg6 int xdist;
X long e;
X int yoff, xoff, ypred, xpred;
X Reg7 OBJECT *obj;
X char ch;
X FILE *mapfp = NULL;
X bool tmptholspec;
X int inhabjackpot;
X long inhenergy;
X int walksplit = 200;
X static char *distname[] =
X {" #"," -"," \\"," /",
X " |"," *"," `"," '"};
X
X cloaking = madgorns = FALSE;
X deados = madfriends = 0;
X curscore = possiblescore = 0L;
X yamblast = xamblast = ambsize = 0;
X if (smarts > 90)
X massacre = TRUE;
X scandist = (massacre?20:15);
X antibase = (smarts>60?1:(smarts>40?2:(smarts>25?4:100)));
X sm35 = (smarts>35?35:smarts);
X sm45 = (smarts>45?45:smarts);
X sm50 = (smarts>50?50:smarts);
X sm55 = (smarts>55?55:smarts);
X sm80 = (smarts>80?80:smarts);
X sm95 = (smarts>95?95:smarts);
X super = (smarts>50?smarts-50:0);
X enemshields = 10 + super/2; /* (scaled by 10) 1 @ 50 .. 3 @ 90 */
X if (smarts>90)
X enemshields += (smarts-90)*10; /* lay it on thick: ~13 @ 99 */
X entmax = (smarts>=75?5000:(smarts>=50?4000:(smarts>=40?3000:2000)));
X basemax = (smarts>=75?20000:(smarts>=50?15000:(smarts>=40?12500:10000)));
X
X clear();
X while (root.next != &root) {
X root.next = root.next->next;
X free_object(root.next->prev);
X }
X root.prev = &root;
X enemies = movers = NULL;
X numos = numxes = 0;
X#if defined(vax) && XYSIZEx4 == 3680
X asm("movc5 $0,_occupant,$0,$3680,_occupant");
X asm("movc5 $0,_blast,$0,$3680,_blast"); /* 3680 = XYSIZEx4 */
X asm("movc5 $0,_amb,$32,$920,_amb");
X#else
X for (y=0;y<YSIZE;y++)
X for (x=0;x<XSIZE;x++) {
X occupant[y][x] = 0;
X blast[y][x] = 0;
X amb[y][x] = ' ';
X }
X#endif
X for (y=0; y<YSIZE; y++)
X yblasted[y] = 0;
X for (x=0; x<XSIZE; x++)
X xblasted[x] = 0;
X blasted = FALSE;
X if (!starspec)
X if (smarts < 15)
X inumstars = 50 + rand_mod(50);
X else if (smarts < 50 || smarts > 85)
X inumstars = exdis(800) + rand_mod(100) + 1;
X else /* too few stars makes 50..85 too hard */
X inumstars = exdis(700) + rand_mod(150-super*2) + 50+super*2;
X tmptholspec = (smarts > 15 && inumstars < 450 && ! rand_mod(90-sm80));
X if (!klingspec) {
X inumenemies = rand_mod((smarts+1)/2) + 1;
X if (massacre || tmptholspec)
X inumenemies += 10;
X }
X if (!friendspec)
X inumfriends = rand_mod(smarts/8+1);
X if (!piratespec)
X inumpirates = rand_mod(inumfriends/2+1);
X if (inumfriends+inumenemies+inumstars > YSIZE*XSIZE-20)
X inumstars = YSIZE*XSIZE-20 - inumenemies - inumfriends;
X if (inumstars < 0) {
X inumfriends += inumstars;
X inumstars = 0;
X }
X if (inumfriends < 0) {
X inumenemies += inumfriends;
X inumfriends = 0;
X }
X if (inumenemies < 0)
X inumenemies = 0;
X numstars = inumstars;
X inuminhab = numinhab = 0;
X inumroms = inumthols = inumgorns = 0;
X numapollos = apolspec || massacre ? 1 :
X ((!numstars || rand_mod(2) || smarts < 10) ? 0 : 1);
X inumapollos = apolloflag = 0;
X realapollo = NULL;
X inumcrushes = numcrushes =
X crushspec||massacre?1:(rand_mod(2000) < inumstars);
X inumenemies += inumcrushes;
X inumamoebas = numamoebas = (amoebaspec ? 1 :
X !rand_mod(inumcrushes?3-massacre:8) ); /* < and & are fun together */
X inumenemies += inumamoebas;
X if (!rand_mod(40)) {
X inhabjackpot = 32767;
X inumfriends += rand_mod(10);
X inumpirates += rand_mod(10);
X }
X else
X inhabjackpot = inumpirates;
X inhenergy = 30000-super*150;
X if (!rand_mod(10))
X inhenergy = 50000;
X if (!rand_mod(4))
X inhenergy += rand_mod(3500+super*150);
X numfriends = inumfriends;
X numpirates = inumpirates;
X numenemies = inumenemies;
X deadmudds = 0;
X
X /* do stars */
X
Xstars_again:
X if (prespec)
X dist = 4;
X else if (numstars > 750)
X dist = 0;
X else
X dist = rand_mod(starspec||smarts<=5?3:5);
X if (debugging) {
X real_y = real_x = -100;
X printf("\r\n");
X }
X switch (dist) {
X case 0: /* uniform random */
X ydist = xdist = 0;
X if (inumstars < 700 && !rand_mod(3-(inumstars<50))) {
X ydist = xdist = 6; /* well, maybe not so random */
X y = rand_mod(YSIZE);
X x = rand_mod(XSIZE);
X if (rand_mod(2))
X walksplit = inumstars/(exdis(40)+1);
X }
X if (debugging)
X printf(" R\r\n");
X break;
X case 1: case 2: /* clumped, maybe skewed, maybe superposed */
X ydist = rand_mod(4);
X xdist = rand_mod(2);
X if (debugging)
X printf("%s\r\n",distname[ydist+4*xdist]);
X yoff = rand_mod(YSIZE);
X xoff = rand_mod(XSIZE);
X if (dist == 2)
X dist = numstars/2 + exdis(numstars/2) - exdis(numstars/2);
X else
X dist = 0;
X break;
X case 3: case 4: /* predefined or residual */
X scenario_again:
X if (debugging)
X printf(" P\r\n");
X dist = 0;
X Sprintf(spbuf,"smap.%d",
X (prescene>=0?prescene:rand_mod(MAPS)) );
X if ((mapfp = fopen(spbuf,"r")) != NULL &&
X fgets(spbuf,10,mapfp) != NULL ) {
X inumstars = numstars = atoi(spbuf);
X if (inumenemies+inumstars > YSIZE*XSIZE-20)
X inumstars = numstars = YSIZE*XSIZE-20 - inumenemies;
X ydist = rand_mod(2) + 4; /* flip y axis? */
X xdist = rand_mod(2) + 4; /* flip x axis? */
X yoff = rand_mod(YSIZE); /* how much to shift y */
X xoff = rand_mod(XSIZE); /* how much to shift x */
X }
X else {
X prespec = FALSE;
X prescene = -1;
X if (rand_mod(2))
X goto scenario_again;
X goto stars_again;
X }
X break;
X }
X for (i = 1; i <= numstars; i++) {
X if (dist && i == dist) { /* flip to another skewing? */
X ydist = rand_mod(4);
X xdist = rand_mod(2);
X if (!rand_mod(4)) {
X ydist = xdist = 6;
X if (debugging)
X printf("&\r\n");
X }
X else if (debugging)
X printf("%s\r\n",distname[ydist+4*xdist]);
X yoff = rand_mod(YSIZE);
X xoff = rand_mod(XSIZE);
X dist = 0;
X }
X do { /* until an open spot found */
X switch (xdist) {
X case 0:
X x = rand_mod(XSIZE); /* pick from 0..39, uniform */
X break;
X case 1: case 2: case 3:
X#ifndef lint
X x = (int)((((double)(myrand()-HALFRAND)) *
X ((double)(myrand()-HALFRAND))/RANDRAND)
X * 20.0) + xoff; /* pick from -20..20, clumped */
X#endif
X break;
X case 4:
X if (fscanf(mapfp,"%d %d\n",&ypred,&xpred) == EOF)
X ydist = xdist = 0;
X x = xpred + xoff;
X break;
X case 5:
X if (fscanf(mapfp,"%d %d\n",&ypred,&xpred) == EOF)
X ydist = xdist = 0;
X x = -xpred + xoff;
X break;
X case 6:
X x += rand_mod(3) - 1;
X break;
X }
X switch (ydist) {
X case 0:
X y = rand_mod(YSIZE);
X break;
X case 1:
X#ifndef lint
X y = (int)((((double)(myrand()-HALFRAND)) *
X ((double)(myrand()-HALFRAND))/RANDRAND)
X * 12.0) + yoff; /* pick from -12..12, clumped */
X#endif
X break;
X case 2:
X#ifndef lint
X y = (int)((((double)(myrand()-HALFRAND)) *
X ((double)(myrand()-HALFRAND))/RANDRAND)
X * 12.0) + yoff + x*YSIZE/XSIZE;
X /* clumped & skewed */
X#endif
X break;
X case 3:
X#ifndef lint
X y = (int)((((double)(myrand()-HALFRAND)) *
X ((double)(myrand()-HALFRAND))/RANDRAND)
X * 12.0) + yoff - x*YSIZE/XSIZE;
X /* clumped & skewed */
X#endif
X break;
X case 4:
X y = ypred + yoff;
X break;
X case 5:
X y = -ypred + yoff;
X break;
X case 6:
X y += rand_mod(3) - 1;
X#ifdef lint
X walksplit = walksplit;
X#endif
X if (!rand_mod(walksplit)) {
X y = rand_mod(YSIZE);
X x = rand_mod(XSIZE);
X }
X break;
X }
X while (x<0) x += XSIZE00;
X while (y<0) y += YSIZE00;
X x %= XSIZE;
X y %= YSIZE;
X } while (occupant[y][x]);
X e = rand_mod(32768);
X if (--inhabjackpot > 0 || e >= inhenergy) {
X ch = '@';
X if (inhabjackpot && e < 10000)
X e += 10000;
X inuminhab = ++numinhab;
X }
X else {
X ch = '*';
X }
X obj = make_object(Star,ch,y,x,0,0,e+rand_mod(super*100+1),e/4,&root);
X obj->flags |= STATIC;
X }
X if (inumstars > 30 && inhabjackpot <= 0 &&
X !rand_mod(3 - (inumstars > 400) - (inhenergy > 32768)) ) {
X int initx;
X int inity;
X
X x = initx = obj->posx;
X y = inity = obj->posy;
X while (rand_mod(2) && inuminhab < inumstars/2) {
X for (i=rand_mod(smarts)*2+20; i; i--) {
X if ((obj = occupant[y][x]) && obj->image == '*') {
X setimage(obj,'@');
X if (obj->energy < 10000)
X obj->energy += 20000; /* the benefits of civilization */
X inuminhab = ++numinhab;
X }
X if (i&15) {
X y = (y + rand_mod(3) + YSIZE99) % YSIZE;
X x = (x + rand_mod(3) + XSIZE99) % XSIZE;
X }
X else { /* don't wander too far */
X y = inity;
X x = initx;
X }
X }
X x = initx = rand_mod(XSIZE);
X y = inity = rand_mod(YSIZE);
X }
X }
X if (mapfp != NULL)
X Fclose(mapfp);
X if (numcrushes) {
X do {
X x = rand_mod(XSIZE);
X y = rand_mod(YSIZE);
X } while (occupant[y][x]);
X movers = make_object(Crusher,'<',y,x,0,1,32767L,32768L,&root);
X possiblescore += 10000;
X }
X ient = (numents != 0);
X if (ient) {
X do {
X x = rand_mod(XSIZE);
X y = rand_mod(YSIZE);
X } while (occupant[y][x]);
X e = entmax;
X ent = make_object(Enterprise,'E',y,x,0,0,e,e/2,&root);
X if (!movers)
X movers = ent;
X }
X ibase = (numbases != 0);
X if (ibase) {
X e = 52-super;
X do {
X x = rand_mod(XSIZE);
X y = rand_mod(YSIZE);
X } while (occupant[y][x] || lookaround(y,x,Star) * 7 < e--);
X e = basemax;
X base = make_object(Base, 'B',y,x,0,0,e,e/4,&root);
X if (!movers)
X movers = base;
X }
X if (numamoebas) {
X do {
X x = rand_mod(XSIZE);
X y = rand_mod(YSIZE);
X } while (occupant[y][x]);
X nuke = make_object(Enemy,'&',y,x,0,0,32767L,
X (long)entmax+entmax+rand_mod(entmax),&root);
X possiblescore += 10000;
X amb[y][x] = '~';
X if (rand_mod(2))
X modify_amoeba(y,x,2,'~',(int)rand_mod(smarts<<1));/* just make blob */
X else {
X for (i=smarts/10+1; i; i--) {
X nuke->strategy = rand_mod(256); /* random direction */
X modify_amoeba(y,x,2,'~',(int)rand_mod(5));
X modify_amoeba(y,x,2,'~',(int)rand_mod(5));
X modify_amoeba(y,x,2,'~',(int)rand_mod(5));
X modify_amoeba(y,x,2,'~',(int)rand_mod(5)); /* extend pseudopod */
X }
X }
X if (!enemies)
X enemies = nuke;
X if (!movers)
X movers = nuke;
X }
X if (rand_mod(27-sm50/2) && !romspec && !gornspec)
X dist = 27-sm50/2;
X else
X dist = rand_mod(4) + 1;
X for (i = 1+inumcrushes+inumamoebas; i <= numenemies; i++) {
X do {
X x = rand_mod(XSIZE);
X y = rand_mod(YSIZE);
X } while (occupant[y][x]);
X if (rand_mod(dist)) {
X if (!tholspec && !tmptholspec && rand_mod((inumstars*3)/sm50+2))
X ch = 'K';
X else {
X ch = 'T';
X inumthols++;
X }
X }
X else {
X if (romspec == gornspec)
X e = 50;
X else if (gornspec)
X e = 10;
X else
X e = 90;
X if (rand_mod(100) < e) {
X ch = 'R';
X inumroms++;
X }
X else {
X ch = 'G';
X inumgorns++;
X }
X }
X if (possiblescore > ENTBOUNDARY - 10000)
X e = (ENTBOUNDARY - possiblescore) / 5;
X else
X e = 250 + (sm50-1) * 30 * 20 / numenemies+1;
X#ifndef lint
X e = exdis((int)e) + e - exdis((int)e);
X obj = make_object(Enemy,ch,y,x,0,0,
X e + rand_mod(super*200+2) + 10000*massacre,e/4,&root);
X#endif
X e /= 4;
X switch (ch) {
X case 'K':
X possiblescore += e;
X break;
X case 'T':
X possiblescore += e*3/2;
X break;
X case 'G':
X possiblescore += e*2;
X break;
X case 'R':
X possiblescore += e*3;
X obj->flags |= CLOAKS;
X break;
X }
X if (!enemies)
X enemies = obj;
X if (!movers)
X movers = obj;
X }
X numgorns = inumgorns;
X for (i=0; i<numfriends; i++) {
X do {
X x = rand_mod(XSIZE);
X y = rand_mod(YSIZE);
X } while (occupant[y][x]);
X e = 250 + (sm50-1) * 30 * 20 / numenemies+1;
X#ifndef lint
X e = exdis((int)e) + e - exdis((int)e);
X#endif
X {
X static char let[] = "QWYUISDHJLZVMFFFFFFFFF";
X
X dist = rand_mod(20);
X ch = let[dist];
X } /* grr, venix doesn't like indexing into string */
X obj = make_object(Enemy,ch,y,x,0,0,
X e + rand_mod(super*200+2),e/4,&root);
X if (numpirates-- > 0) {
X obj->flags |= PIRATE;
X if (smarts >= 20 && !rand_mod(10-smarts/10))
X obj->flags |= CLOAKS;
X }
X obj->flags |= FRIENDLY;
X if (!enemies)
X enemies = obj;
X if (!movers)
X movers = obj;
X }
X if (!movers)
X movers = &root;
X if (!enemies)
X enemies = &root;
X if (ent)
X mvaddch(ent->posy+1, ent->posx*2, ent->image);
X if (base)
X mvaddch(base->posy+1, base->posx*2, base->image);
X sleep(2);
X {
X Reg7 OBJECT *curobj;
X
X for (curobj = root.next; curobj != &root; curobj = curobj->next) {
X mvaddch(curobj->posy+1, curobj->posx*2, curobj->image);
X }
X }
X
X for (i=0;i<2;i++) for (y=0;y<3;y++) for (x=0;x<3;x++)
X isatorp[i][y][x]=0;
X
X whenok = 0;
X timer = 0;
X finish = 0;
X bombed_out = FALSE;
X if (ent)
X entmode = status = 0;
X else
X if (base)
X status = 2;
X else
X status = 3;
X
X Sprintf(spbuf,
X "%-4s E: %4d %2d B: %5d %3d Enemies: %-3d Stars: %-3d Stardate%5d.%1d %9ld",
X " ", 0, 0, 0, 0, 0, 0, smarts * 100, 0, 0L);
X mvaddstr(0,0,spbuf);
X oldeenergy = oldbenergy = oldcurscore =
X oldstatus = oldetorp = oldbtorp = oldstrs = oldenemies = -1;
X /* force everything to fill in */
X damage = olddamage = 0;
X for (i=0; i<MAXDAMAGE; i++)
X damflag[i] = 0;
X btorp = 500;
X etorp = 50;
X}
!STUFFY!FUNK!
echo ""
echo "End of kit 3 (of 7)"
cat /dev/null >kit3isdone
config=true
for iskit in 1 2 3 4 5 6 7; do
if test -f kit${iskit}isdone; then
echo "You have run kit ${iskit}."
else
echo "You still need to run kit ${iskit}."
config=false
fi
done
case $config in
true)
echo "You have run all your kits. Please read README and then type Configure."
chmod 755 Configure
;;
esac
: Someone might mail this, so...
exit