Home | History | Annotate | Line # | Download | only in warp
bang.c revision 1.1
      1  1.1  kamil /* $Header: /tank/opengrok/rsync2/NetBSD/src/games/warp/bang.c,v 1.1 2020/11/09 23:37:05 kamil Exp $ */
      2  1.1  kamil 
      3  1.1  kamil /* $Log: bang.c,v $
      4  1.1  kamil /* Revision 1.1  2020/11/09 23:37:05  kamil
      5  1.1  kamil /* Add Warp Kit, Version 7.0 by Larry Wall
      6  1.1  kamil /*
      7  1.1  kamil /* Warp is a real-time space war game that doesn't get boring very quickly.
      8  1.1  kamil /* Read warp.doc and the manual page for more information.
      9  1.1  kamil /*
     10  1.1  kamil /* games/warp originally distributed with 4.3BSD-Reno, is back to the BSD
     11  1.1  kamil /* world via NetBSD. Its remnants were still mentioned in games/Makefile.
     12  1.1  kamil /*
     13  1.1  kamil /* Larry Wall, the original author and the copyright holder, generously
     14  1.1  kamil /* donated the game and copyright to The NetBSD Foundation, Inc.
     15  1.1  kamil /*
     16  1.1  kamil /* Import the game sources as-is from 4.3BSD-Reno, with the cession
     17  1.1  kamil /* of the copyright and license to BSD-2-clause NetBSD-style.
     18  1.1  kamil /*
     19  1.1  kamil /* Signed-off-by: Larry Wall <larry (at) wall.org>
     20  1.1  kamil /* Signed-off-by: Kamil Rytarowski <kamil (at) netbsd.org>
     21  1.1  kamil /*
     22  1.1  kamil  * Revision 7.0.1.3  86/12/12  16:57:00  lwall
     23  1.1  kamil  * Made circular explosions.
     24  1.1  kamil  *
     25  1.1  kamil  * Revision 7.0.1.2  86/10/20  14:36:02  lwall
     26  1.1  kamil  * Picked some lint.
     27  1.1  kamil  *
     28  1.1  kamil  * Revision 7.0.1.1  86/10/16  10:49:45  lwall
     29  1.1  kamil  * Added Damage.  Fixed random bugs.
     30  1.1  kamil  *
     31  1.1  kamil  * Revision 7.0  86/10/08  15:11:57  lwall
     32  1.1  kamil  * Split into separate files.  Added amoebas and pirates.
     33  1.1  kamil  *
     34  1.1  kamil  */
     35  1.1  kamil 
     36  1.1  kamil #include "EXTERN.h"
     37  1.1  kamil #include "warp.h"
     38  1.1  kamil #include "object.h"
     39  1.1  kamil #include "move.h"
     40  1.1  kamil #include "sig.h"
     41  1.1  kamil #include "term.h"
     42  1.1  kamil #include "them.h"
     43  1.1  kamil #include "INTERN.h"
     44  1.1  kamil #include "bang.h"
     45  1.1  kamil 
     46  1.1  kamil void
     47  1.1  kamil bang_init()
     48  1.1  kamil {
     49  1.1  kamil     ;
     50  1.1  kamil }
     51  1.1  kamil 
     52  1.1  kamil void
     53  1.1  kamil make_plink(y,x)
     54  1.1  kamil Reg1 int x;
     55  1.1  kamil Reg2 int y;
     56  1.1  kamil {
     57  1.1  kamil     Reg3 OBJECT *obj;
     58  1.1  kamil 
     59  1.1  kamil     move(y+1,x*2,0);
     60  1.1  kamil     beg_qwrite();
     61  1.1  kamil     *filler = '@';
     62  1.1  kamil     qwrite();
     63  1.1  kamil     obj = occupant[y][x];
     64  1.1  kamil     if (obj) {
     65  1.1  kamil 	if (numamoebas && obj->image == ' ')
     66  1.1  kamil 	    qaddc(amb[y][x]);
     67  1.1  kamil 	else
     68  1.1  kamil 	    qaddc(obj->image);
     69  1.1  kamil     }
     70  1.1  kamil     else if (numamoebas)
     71  1.1  kamil 	qaddc(amb[y][x]);
     72  1.1  kamil     else
     73  1.1  kamil 	qaddspace();
     74  1.1  kamil     end_qwrite();
     75  1.1  kamil }
     76  1.1  kamil 
     77  1.1  kamil void
     78  1.1  kamil make_blast(y,x,mass,size)
     79  1.1  kamil Reg1 int x;
     80  1.1  kamil Reg2 int y;
     81  1.1  kamil int size;
     82  1.1  kamil long mass;
     83  1.1  kamil {
     84  1.1  kamil     bangy[nxtbang] = y;
     85  1.1  kamil     bangx[nxtbang] = x;
     86  1.1  kamil     bangm[nxtbang] = mass;
     87  1.1  kamil     bangs[nxtbang++] = size;
     88  1.1  kamil     assert(nxtbang <= XSIZE * YSIZE);
     89  1.1  kamil     if (numamoebas && amb[y][x] == '~') {
     90  1.1  kamil 	if (mass > 10000)
     91  1.1  kamil 	    modify_amoeba(y,x,1,'~', 10);
     92  1.1  kamil 	else if (mass > 100)
     93  1.1  kamil 	    modify_amoeba(y,x,1,'~', 5);
     94  1.1  kamil 	bangs[nxtbang-1] = 0;		/* don't propagate */
     95  1.1  kamil 	return;
     96  1.1  kamil     }
     97  1.1  kamil     else if (mass >= 0) {
     98  1.1  kamil 	Reg3 OBJECT *obj;
     99  1.1  kamil 
    100  1.1  kamil 	move(y+1,x*2,0);
    101  1.1  kamil 	beg_qwrite();
    102  1.1  kamil 	*filler = '@';
    103  1.1  kamil 	qwrite();
    104  1.1  kamil 	*filler = '#';
    105  1.1  kamil 	qwrite();
    106  1.1  kamil 	*filler = '@';
    107  1.1  kamil 	qwrite();
    108  1.1  kamil 	*filler = '#';
    109  1.1  kamil 	qwrite();
    110  1.1  kamil 	*filler = '@';
    111  1.1  kamil 	qwrite();
    112  1.1  kamil 	obj = occupant[y][x];
    113  1.1  kamil 	if (obj) {
    114  1.1  kamil 	    if (numamoebas && obj->image == ' ')
    115  1.1  kamil 		qaddc(amb[y][x]);
    116  1.1  kamil 	    else
    117  1.1  kamil 		qaddc(obj->image);
    118  1.1  kamil 	}
    119  1.1  kamil 	else if (numamoebas)
    120  1.1  kamil 	    qaddc(amb[y][x]);
    121  1.1  kamil 	else
    122  1.1  kamil 	    qaddspace();
    123  1.1  kamil 	end_qwrite();
    124  1.1  kamil     }
    125  1.1  kamil }
    126  1.1  kamil 
    127  1.1  kamil void
    128  1.1  kamil do_bangs()
    129  1.1  kamil {
    130  1.1  kamil     Reg1 int x;
    131  1.1  kamil     Reg2 int y;
    132  1.1  kamil     Reg3 int i;
    133  1.1  kamil     Reg4 int j;
    134  1.1  kamil     Reg7 int k;
    135  1.1  kamil     Reg5 int lastxy;
    136  1.1  kamil     Reg6 OBJECT *obj;
    137  1.1  kamil 
    138  1.1  kamil     /* read blast list and update blast array */
    139  1.1  kamil     assert(nxtbang >= 0 && nxtbang <= XSIZE * YSIZE);
    140  1.1  kamil     for (i=0; i<nxtbang; i++) {
    141  1.1  kamil 	if (bangm[i] != 32767)
    142  1.1  kamil 	    bangm[i] *= 4;
    143  1.1  kamil 	lastxy = bangs[i] << 1;
    144  1.1  kamil 	if (lastxy >= MAXBDIST)
    145  1.1  kamil 	    lastxy = MAXBDIST - 1;
    146  1.1  kamil 	for (y=bangy[i]-bangs[i],x=bangx[i]-bangs[i],j=lastxy;
    147  1.1  kamil 	  j>=0;
    148  1.1  kamil 	  y++,x++,--j) {
    149  1.1  kamil 	    yblasted[yy[j] = (y+YSIZE00) % YSIZE] |= 1;
    150  1.1  kamil 	    xblasted[xx[j] = (x+XSIZE00) % XSIZE] |= 1;
    151  1.1  kamil 	}
    152  1.1  kamil 	blasted = TRUE;
    153  1.1  kamil 	for (y=lastxy;y>=0;--y) {
    154             	    for (x=lastxy;x>=0;--x) {
    155             		if (lastxy > 2) {
    156             		    j = abs(y-bangs[i]);
    157             		    k = abs(x-bangs[i]);
    158             		    if (j < k)		/* distance is long + 1/2 short */
    159             			j += k + k;
    160             		    else
    161             			j += j + k;
    162             		    if (--j > lastxy)
    163             			continue;
    164             		}
    165             		if (bangm[i] != 32767 ||
    166             		  !(obj=occupant[yy[y]][xx[x]]) || obj->type != Web)
    167             		    blast[yy[y]][xx[x]] += bangm[i];
    168             	    }
    169             	}
    170                 }
    171             }
    172