trainor@ucla-cs.UUCP (06/15/87)
#!/bin/sh
# to extract, remove the header and type "sh filename"
if `test ! -s ./README`
then
echo "writing ./README"
cat > ./README << '\X\X\'
Xbob.
\X\X\
else
echo "will not over write ./README"
fi
if `test ! -s ./Makefile`
then
echo "writing ./Makefile"
cat > ./Makefile << '\X\X\'
INCLUDES =
XLIB = /usr/lib/libX.a
CFLAGS = $(INCLUDES)
CLIBS =
.SUFFIXES: .o .h .c .a
OBJS = xbob.o
all: xbob
xbob: $(OBJS)
cc $(CFLAGS) -o xbob $(OBJS) $(XLIB) $(CLIBS)
\X\X\
else
echo "will not over write ./Makefile"
fi
if `test ! -s ./xbob.c`
then
echo "writing ./xbob.c"
cat > ./xbob.c << '\X\X\'
/*
* xbob.c - serves ``Bob's'' purpose... -- Vulture of Light
*
* resembling a program by John H. Bradley, bradley@cis.upenn.edu, March, 1987.
*/
#include <stdio.h>
#include <math.h>
#include <strings.h>
#include <signal.h>
#include <X/Xlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/timeb.h>
/* handy-dandy functions */
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
#define abs(a) ((a) < 0 ? -(a) : (a))
#define sigmask(s) (1L << ((s)-1))
/* colors */
int ForeColor, BackColor;
/* objects */
Window theWindow;
Bitmap bobBMask,bobrBMask,stipB;
Pixmap stipP;
Cursor curs;
#define cross_width 16
#define cross_height 16
#define cross_x_hot 7
#define cross_y_hot 7
static short cross_bits[] = { /* ``Bob''-zappin' cursor */
0x0000, 0x03e0, 0x0c98, 0x1084, 0x1414, 0x2082, 0x2082, 0x3b6e,
0x2082, 0x2082, 0x1414, 0x1084, 0x0c98, 0x03e0, 0x0000, 0x0000};
static short cross_mask_bits[] = {
0x07e0, 0x0ff8, 0x1ffc, 0x3ffe, 0x3ffe, 0x7fff, 0x7fff, 0x7fff,
0x7fff, 0x7fff, 0x3ffe, 0x3ffe, 0x1ffc, 0x0ff8, 0x03e0, 0x0000};
#define bob_width 61
#define bob_height 75
static short bobr_bits[] = { /* a right-going ``Bob'' */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x07ff, 0x0000,
0x0000, 0xfffe, 0x1fff, 0x0000, 0x8000, 0xffff, 0xfbff, 0x0000,
0xc000, 0xcfff, 0xd19f, 0x0003, 0xf000, 0x8c7f, 0x9133, 0x0007,
0xf800, 0x18a7, 0xb127, 0x0006, 0xfc00, 0x3147, 0xa64e, 0x000e,
0xfe00, 0x214f, 0xae4c, 0x003d, 0xff00, 0x23df, 0xbe8d, 0x007d,
0xff80, 0x67ff, 0xfebd, 0x01ff, 0xff80, 0x7fff, 0xffbf, 0x03ff,
0xffc0, 0xffff, 0xffbf, 0x07f8, 0xffc0, 0xffff, 0x3fbf, 0x07f8,
0xffc0, 0xffff, 0x07ff, 0x0ff8, 0xffc0, 0xffff, 0x003f, 0x0ff8,
0x7fe0, 0xf800, 0x0007, 0x0ff0, 0x3fe0, 0x0000, 0x0000, 0x07f0,
0x3fe0, 0x0000, 0x0000, 0x07f0, 0x3fe0, 0x0000, 0x0000, 0x07f4,
0x3fe0, 0x0000, 0x0000, 0x07e4, 0x3fe0, 0x0000, 0x0000, 0x07e4,
0x3fe0, 0x0000, 0x0000, 0x07e6, 0x3fe0, 0x0000, 0x0000, 0x07e7,
0x3fe0, 0x0000, 0x0000, 0x07e6, 0x3fe0, 0x0000, 0x0000, 0x07e6,
0x3fe0, 0x0000, 0x0000, 0x07e6, 0x3fc0, 0x0000, 0x7800, 0x07f6,
0xbfa0, 0x00ff, 0xff00, 0x07f7, 0x9f70, 0x01ff, 0xff80, 0x07ef,
0x1cf0, 0x0380, 0x01e0, 0x07ef, 0x1ff0, 0x07be, 0x3ff0, 0x07ee,
0x9de0, 0x1f83, 0xe1f8, 0x07dc, 0xc1e0, 0x1f7f, 0xfffc, 0x07c8,
0xc1e0, 0x1e69, 0xca7e, 0x03c0, 0x81e0, 0x1fb8, 0x0ec0, 0x03c0,
0x01e0, 0x1bc0, 0xcfc0, 0x03c1, 0x03c0, 0x11f7, 0x7f00, 0x03c0,
0x03c0, 0x187c, 0x1c00, 0x02c0, 0x02c0, 0x0830, 0x0000, 0x0340,
0x0340, 0x0800, 0x0000, 0x0240, 0x1340, 0x0c00, 0x0000, 0x0260,
0x1240, 0x0e00, 0x0000, 0x03c0, 0x3380, 0x0e80, 0x0000, 0x01a8,
0x3300, 0x0f40, 0x03a0, 0x002c, 0x7400, 0x0f30, 0x0738, 0x002e,
0x7400, 0x1f98, 0x1e1e, 0x002f, 0xfc00, 0xff8f, 0xfc0f, 0x002f,
0xf800, 0xffe3, 0xf803, 0x002f, 0xf800, 0xfffd, 0xff81, 0x003f,
0xb800, 0x1ff9, 0x0ff8, 0x001e, 0x3000, 0xf0f1, 0x030f, 0x000e,
0x3000, 0x01f1, 0x0180, 0x000f, 0x2000, 0xf7f1, 0x00ff, 0x0007,
0x6000, 0x01e3, 0x8060, 0x0007, 0x6000, 0xefc3, 0x803f, 0x0003,
0x4000, 0xffc2, 0xc00f, 0x0003, 0xc000, 0x1fe6, 0xc000, 0x0001,
0x8000, 0xfef4, 0xe03f, 0x0000, 0x8000, 0xfe79, 0xe01f, 0x0000,
0x01c0, 0x3e3d, 0x7000, 0x0000, 0x0630, 0x0f3e, 0x3800, 0x0000,
0x8cc8, 0x071f, 0x3800, 0x0000, 0xccf4, 0x078f, 0x1c00, 0x0000,
0xee72, 0x07f7, 0x0e00, 0x0000, 0xff02, 0x07e3, 0x0700, 0x0000,
0xfe32, 0xffc1, 0x038f, 0x0000, 0xfe3e, 0xff80, 0x01ff, 0x0000,
0x7c7e, 0x0000, 0x007e, 0x0000, 0x3c7c, 0x0000, 0x0000, 0x0000,
0x1cfc, 0x0000, 0x0000, 0x0000, 0x1cf8, 0x0000, 0x0000, 0x0000,
0x0ff0, 0x0000, 0x0000, 0x0000, 0x07e0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000};
static short bob_bits[] = { /* a left-going ``Bob'' */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x07ff, 0x0000,
0x0000, 0xfffe, 0x1fff, 0x0000, 0x8000, 0xffff, 0xfbff, 0x0000,
0xc000, 0xcfff, 0xd19f, 0x0003, 0xf000, 0x8c7f, 0x9133, 0x0007,
0xf800, 0x18a7, 0xb127, 0x0006, 0xfc00, 0x3147, 0xa64e, 0x000e,
0xfe00, 0x214f, 0xae4c, 0x003d, 0xff00, 0x23df, 0xbe8d, 0x007d,
0xff80, 0x67ff, 0xfebd, 0x01ff, 0xff80, 0x7fff, 0xffbf, 0x03ff,
0xffc0, 0xffff, 0xffbf, 0x07f8, 0xffc0, 0xffff, 0x3fbf, 0x07f8,
0xffc0, 0xffff, 0x07ff, 0x0ff8, 0xffc0, 0xffff, 0x003f, 0x0ff8,
0x7fe0, 0xf800, 0x0007, 0x0ff0, 0x3fe0, 0x0000, 0x0000, 0x07f0,
0x3fe0, 0x0000, 0x0000, 0x07f0, 0x3fe0, 0x0000, 0x0000, 0x07f4,
0x3fe0, 0x0000, 0x0000, 0x07e4, 0x3fe0, 0x0000, 0x0000, 0x07e4,
0x3fe0, 0x0000, 0x0000, 0x07e6, 0x3fe0, 0x0000, 0x0000, 0x07e7,
0x3fe0, 0x0000, 0x0000, 0x07e6, 0x3fe0, 0x0000, 0x0000, 0x07e6,
0x3fe0, 0x0000, 0x0000, 0x07e6, 0x3fc0, 0x0000, 0x7800, 0x07f6,
0xbfa0, 0x00ff, 0xff00, 0x07f7, 0x9f70, 0x01ff, 0xff80, 0x07ef,
0x1cf0, 0x0380, 0x01e0, 0x07ef, 0x1ff0, 0x07be, 0x3ff0, 0x07ee,
0x9de0, 0x1f83, 0xe1f8, 0x07dc, 0xc1e0, 0x1f7f, 0xfffc, 0x07c8,
0xc1e0, 0x1e69, 0xca7e, 0x03c0, 0x81e0, 0x1fb8, 0x0ec0, 0x03c0,
0x01e0, 0x1bc0, 0xcfc0, 0x03c1, 0x03c0, 0x11f7, 0x7f00, 0x03c0,
0x03c0, 0x187c, 0x1c00, 0x02c0, 0x02c0, 0x0830, 0x0000, 0x0340,
0x0340, 0x0800, 0x0000, 0x0240, 0x1340, 0x0c00, 0x0000, 0x0260,
0x1240, 0x0e00, 0x0000, 0x03c0, 0x3380, 0x0e80, 0x0000, 0x01a8,
0x3300, 0x0f40, 0x03a0, 0x002c, 0x7400, 0x0f30, 0x0738, 0x002e,
0x7400, 0x1f98, 0x1e1e, 0x002f, 0xfc00, 0xff8f, 0xfc0f, 0x002f,
0xf800, 0xffe3, 0xf803, 0x002f, 0xf800, 0xfffd, 0xff81, 0x003f,
0xb800, 0x1ff9, 0x0ff8, 0x001e, 0x3000, 0xf0f1, 0x030f, 0x000e,
0x3000, 0x01f1, 0x0180, 0x000f, 0x2000, 0xf7f1, 0x00ff, 0x0007,
0x6000, 0x01e3, 0x8060, 0x0007, 0x6000, 0xefc3, 0x803f, 0x0003,
0x4000, 0xffc2, 0xc00f, 0x0003, 0xc000, 0x1fe6, 0xc000, 0x0001,
0x8000, 0xfef4, 0xe03f, 0x0000, 0x8000, 0xfe79, 0xe01f, 0x0000,
0x01c0, 0x3e3d, 0x7000, 0x0000, 0x0630, 0x0f3e, 0x3800, 0x0000,
0x8cc8, 0x071f, 0x3800, 0x0000, 0xccf4, 0x078f, 0x1c00, 0x0000,
0xee72, 0x07f7, 0x0e00, 0x0000, 0xff02, 0x07e3, 0x0700, 0x0000,
0xfe32, 0xffc1, 0x038f, 0x0000, 0xfe3e, 0xff80, 0x01ff, 0x0000,
0x7c7e, 0x0000, 0x007e, 0x0000, 0x3c7c, 0x0000, 0x0000, 0x0000,
0x1cfc, 0x0000, 0x0000, 0x0000, 0x1cf8, 0x0000, 0x0000, 0x0000,
0x0ff0, 0x0000, 0x0000, 0x0000, 0x07e0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000};
static short bob_mask_bits[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x07ff, 0x0000,
0x0000, 0xfffe, 0x1fff, 0x0000, 0x8000, 0xffff, 0xffff, 0x0000,
0xc000, 0xffff, 0xffff, 0x0003, 0xf000, 0xffff, 0xffff, 0x0007,
0xf800, 0xffff, 0xffff, 0x0007, 0xfc00, 0xffff, 0xffff, 0x000f,
0xfe00, 0xffff, 0xffff, 0x003f, 0xff00, 0xffff, 0xffff, 0x007f,
0xff80, 0xffff, 0xffff, 0x01ff, 0xff80, 0xffff, 0xffff, 0x03ff,
0xffc0, 0xffff, 0xffff, 0x07ff, 0xffc0, 0xffff, 0xffff, 0x07ff,
0xffc0, 0xffff, 0xffff, 0x0fff, 0xffc0, 0xffff, 0xffff, 0x0fff,
0xffe0, 0xffff, 0xffff, 0x0fff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffc0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xfff0, 0xffff, 0xffff, 0x07ff,
0xfff0, 0xffff, 0xffff, 0x07ff, 0xfff0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x03ff, 0xffe0, 0xffff, 0xffff, 0x03ff,
0xffe0, 0xffff, 0xffff, 0x03ff, 0xffc0, 0xffff, 0xffff, 0x03ff,
0xffc0, 0xffff, 0xffff, 0x03ff, 0xffc0, 0xffff, 0xffff, 0x03ff,
0xffc0, 0xffff, 0xffff, 0x03ff, 0xffc0, 0xffff, 0xffff, 0x03ff,
0xffc0, 0xffff, 0xffff, 0x03ff, 0xff80, 0xffff, 0xffff, 0x01bf,
0xff00, 0xffff, 0xffff, 0x003f, 0xfc00, 0xffff, 0xffff, 0x003f,
0xfc00, 0xffff, 0xffff, 0x003f, 0xfc00, 0xffff, 0xffff, 0x003f,
0xf800, 0xffff, 0xffff, 0x003f, 0xf800, 0xffff, 0xffff, 0x003f,
0xf800, 0xffff, 0xffff, 0x001f, 0xf000, 0xffff, 0xffff, 0x000f,
0xf000, 0xffff, 0xffff, 0x000f, 0xe000, 0xffff, 0xffff, 0x0007,
0xe000, 0xffff, 0xffff, 0x0007, 0xe000, 0xffff, 0xffff, 0x0003,
0xc000, 0xffff, 0xffff, 0x0003, 0xc000, 0xffff, 0xffff, 0x0001,
0x8000, 0xffff, 0xffff, 0x0000, 0x8000, 0xffff, 0xffff, 0x0000,
0x01c0, 0xffff, 0x7fff, 0x0000, 0x07f0, 0xfffe, 0x3fff, 0x0000,
0x8ff8, 0xffff, 0x3fff, 0x0000, 0xcffc, 0xffff, 0x1fff, 0x0000,
0xeffe, 0xfff7, 0x0fff, 0x0000, 0xfffe, 0xffe3, 0x07ff, 0x0000,
0xfffe, 0xffc1, 0x03ff, 0x0000, 0xfffe, 0xff80, 0x01ff, 0x0000,
0x7ffe, 0x0000, 0x007e, 0x0000, 0x3ffc, 0x0000, 0x0000, 0x0000,
0x1ffc, 0x0000, 0x0000, 0x0000, 0x1ff8, 0x0000, 0x0000, 0x0000,
0x0ff0, 0x0000, 0x0000, 0x0000, 0x07e0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000};
static short bobr_mask_bits[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x07ff, 0x0000,
0x0000, 0xfffe, 0x1fff, 0x0000, 0x8000, 0xffff, 0xffff, 0x0000,
0xc000, 0xffff, 0xffff, 0x0003, 0xf000, 0xffff, 0xffff, 0x0007,
0xf800, 0xffff, 0xffff, 0x0007, 0xfc00, 0xffff, 0xffff, 0x000f,
0xfe00, 0xffff, 0xffff, 0x003f, 0xff00, 0xffff, 0xffff, 0x007f,
0xff80, 0xffff, 0xffff, 0x01ff, 0xff80, 0xffff, 0xffff, 0x03ff,
0xffc0, 0xffff, 0xffff, 0x07ff, 0xffc0, 0xffff, 0xffff, 0x07ff,
0xffc0, 0xffff, 0xffff, 0x0fff, 0xffc0, 0xffff, 0xffff, 0x0fff,
0xffe0, 0xffff, 0xffff, 0x0fff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffc0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xfff0, 0xffff, 0xffff, 0x07ff,
0xfff0, 0xffff, 0xffff, 0x07ff, 0xfff0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x07ff, 0xffe0, 0xffff, 0xffff, 0x07ff,
0xffe0, 0xffff, 0xffff, 0x03ff, 0xffe0, 0xffff, 0xffff, 0x03ff,
0xffe0, 0xffff, 0xffff, 0x03ff, 0xffc0, 0xffff, 0xffff, 0x03ff,
0xffc0, 0xffff, 0xffff, 0x03ff, 0xffc0, 0xffff, 0xffff, 0x03ff,
0xffc0, 0xffff, 0xffff, 0x03ff, 0xffc0, 0xffff, 0xffff, 0x03ff,
0xffc0, 0xffff, 0xffff, 0x03ff, 0xff80, 0xffff, 0xffff, 0x01bf,
0xff00, 0xffff, 0xffff, 0x003f, 0xfc00, 0xffff, 0xffff, 0x003f,
0xfc00, 0xffff, 0xffff, 0x003f, 0xfc00, 0xffff, 0xffff, 0x003f,
0xf800, 0xffff, 0xffff, 0x003f, 0xf800, 0xffff, 0xffff, 0x003f,
0xf800, 0xffff, 0xffff, 0x001f, 0xf000, 0xffff, 0xffff, 0x000f,
0xf000, 0xffff, 0xffff, 0x000f, 0xe000, 0xffff, 0xffff, 0x0007,
0xe000, 0xffff, 0xffff, 0x0007, 0xe000, 0xffff, 0xffff, 0x0003,
0xc000, 0xffff, 0xffff, 0x0003, 0xc000, 0xffff, 0xffff, 0x0001,
0x8000, 0xffff, 0xffff, 0x0000, 0x8000, 0xffff, 0xffff, 0x0000,
0x01c0, 0xffff, 0x7fff, 0x0000, 0x07f0, 0xfffe, 0x3fff, 0x0000,
0x8ff8, 0xffff, 0x3fff, 0x0000, 0xcffc, 0xffff, 0x1fff, 0x0000,
0xeffe, 0xfff7, 0x0fff, 0x0000, 0xfffe, 0xffe3, 0x07ff, 0x0000,
0xfffe, 0xffc1, 0x03ff, 0x0000, 0xfffe, 0xff80, 0x01ff, 0x0000,
0x7ffe, 0x0000, 0x007e, 0x0000, 0x3ffc, 0x0000, 0x0000, 0x0000,
0x1ffc, 0x0000, 0x0000, 0x0000, 0x1ff8, 0x0000, 0x0000, 0x0000,
0x0ff0, 0x0000, 0x0000, 0x0000, 0x07e0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000};
#define MAXBOBS 1000
struct bobstr { short x,y,dx,dy,fnum; } bob[MAXBOBS];
int NUMBOBS=20, startnbob=20, shots=0;
/* checkerboard pattern (theoretically the same as the Root Window pattern) */
static short check_bits[] = {
0xeeee, 0xdddd, 0x7777, 0xbbbb, 0xeeee, 0xdddd, 0x7777, 0xbbbb,
0xeeee, 0xdddd, 0x7777, 0xbbbb, 0xeeee, 0xdddd, 0x7777, 0xbbbb};
long starttime;
/**************/
main(argc, argv)
int argc;
char *argv[];
/**************/
{
int i,dpcs,n;
char *strind;
char *fc, *bc;
char *display = NULL;
int rvflag = 0; /* don't use reverse video as a default */
Color cdef;
WindowInfo winfo;
char *def;
short bot,right;
/*********************Defaults*********************/
if ((def=XGetDefault(argv[0],"ReverseVideo"))!=NULL)
if (strcmp(def,"on")==0) rvflag=1;
fc = XGetDefault(argv[0], "Foreground");
bc = XGetDefault(argv[0], "Background");
/*********************Options*********************/
for (i = 1; i < argc; i++) {
strind = index(argv[i], ':'); /* is it display address? */
if(strind != NULL) {
display = argv[i];
continue;
}
if (strcmp(argv [i], "-rv") == 0) {
rvflag++;
continue;
}
if (n=atoi(argv[i])) {
if (n<1) n=1;
if (n>1000) n=1000;
NUMBOBS=startnbob=n;
continue;
}
Syntax(argv[0]);
}
/*****************************************************/
/* Open up the display. */
if (XOpenDisplay(display) == NULL) {
fprintf(stderr, "%s: Can't open display '%s'\n",
argv[0], DisplayName());
exit(1);
}
/* Set normal default colors */
if (!rvflag) { ForeColor=BlackPixel; BackColor=WhitePixel; }
else { ForeColor=WhitePixel; BackColor=BlackPixel; }
/* Set up colors and pixmaps. */
dpcs=DisplayCells();
if (dpcs>2&&(fc !=NULL)&&XParseColor(fc ,&cdef)&&XGetHardwareColor(&cdef))
ForeColor=cdef.pixel;
if (dpcs>2&&(bc !=NULL)&&XParseColor(bc ,&cdef)&&XGetHardwareColor(&cdef))
BackColor=cdef.pixel;
/* Open the main window. */
{
int min_width, min_height;
char default_geom[20];
OpaqueFrame frame;
min_width = DisplayWidth();
min_height = DisplayHeight();
sprintf (default_geom, "%dx%d+0+0", min_width, min_height);
stipB = XStoreBitmap(16,16,check_bits);
stipP = XMakePixmap(stipB,ForeColor,BackColor);
frame.bdrwidth = 2;
frame.border = XMakeTile(ForeColor);
frame.background = stipP;
theWindow = XCreate("``Bobs''",argv[0],default_geom,default_geom,
&frame,min_width,min_height);
if (!theWindow) XbobError("Can't open ``Bob'' window");
}
XQueryWindow(theWindow,&winfo);
bot=winfo.height; right=winfo.width;
XMapWindow (theWindow);
XLowerWindow (theWindow);
bobBMask =XStoreBitmap(bob_width,bob_height,bob_mask_bits);
bobrBMask=XStoreBitmap(bob_width,bob_height,bobr_mask_bits);
/* init ``Bob'' */
for (i=0; i<NUMBOBS; i++) {
bob[i].x=rand()%(right-100)+50;
bob[i].y=rand()%(bot-100)+50;
/* bob[i].dx = (abs(rand()%4)+3);*/
bob[i].dx = (abs(rand()%20)+3);
if ((rand()%5)==0) bob[i].dx += 5; /* hyper ``Bob'' */
/* pull the wool over your own eyes */
/* switch direction based on a higher-order bit. the low-order bit
tended to be useless */
if (rand()&0x10) bob[i].dx = -bob[i].dx;
bob[i].dy=rand()%7-3; if (bob[i].dy==0) bob[i].dy=1;
}
XSelectInput(theWindow,ButtonPressed);
curs = XCreateCursor(cross_width,cross_height,cross_bits,
cross_mask_bits, cross_x_hot, cross_y_hot,
ForeColor, BackColor, GXcopy);
XDefineCursor(theWindow,curs);
starttime=time(0);
/**************** Main loop *****************/
while (1) {
XEvent event;
short x,y,bnum;
if (XPending()) {
XNextEvent(&event);
/* everything you know is true */
if (event.type == ButtonPressed) {
XButtonEvent *butevent = (XButtonEvent *) &event;
bnum = butevent->detail & 0xff;
if ((bnum == LeftButton) || (bnum == RightButton)) {
if (bnum == RightButton) shots++;
/* find out what ``Bob'' was hit */
x = butevent->x; y = butevent->y;
for (i=0; i<NUMBOBS; i++) {
/* defy the sinister star forces which mock us all */
if ( (x >= bob[i].x) &&
(x <= bob[i].x+bob_width) &&
(y >= bob[i].y) &&
(y <= bob[i].y+bob_height) ) break;
}
if (i!=NUMBOBS) { /* found one */
XFeep(0);
Erasebob(i);
/* a self-perpetuating fascist state that will */
/* last to the end of humanity */
if (bnum == LeftButton) { /* bounce ``Bob'' */
bob[i].dx = -bob[i].dx;
bob[i].dy = -bob[i].dy;
Drawbob(i);
}
else { /* destroy ``Bob'' */
/* at the mere sight of milk or cheese */
if (NUMBOBS==1) Stats();
bcopy(&bob[NUMBOBS-1],&bob[i],
sizeof(struct bobstr)); /* ``Bob'' is a sex god!! */
NUMBOBS--;
}
}
}
}
}
/* move ``Bob'' */
for (i=0; i<NUMBOBS; i++) {
Erasebob(i);
bob[i].x += bob[i].dx;
bob[i].y += bob[i].dy;
/* adding up column after column of meaningless numbers */
if (bob[i].x < -50 || bob[i].x > (right+50))
bob[i].dx = -bob[i].dx;
if (bob[i].y < 0 || bob[i].y > (bot-16))
bob[i].dy = -bob[i].dy;
Drawbob(i);
}
Timer(100000L);
} /* end main loop */
}
/*****************/
Erasebob(i)
int i;
{
/* burn the candle at both ends */
if (bob[i].dx<0)
XTileFill(theWindow,bob[i].x,bob[i].y,bob_width,bob_height,
/* an inherently bogus religion */
stipP,bobBMask,GXcopy,AllPlanes);
/* avert the rupture ofthe equilibrium
else
XTileFill(theWindow,bob[i].x,bob[i].y,bob_width,bob_height,
stipP,bobrBMask,GXcopy,AllPlanes);
}
/*****************/
Drawbob(i)
int i;
{
if (bob[i].dx<0)
/* instant instructions for those who follow no master!! */
XBitmapBitsPut(theWindow,bob[i].x,bob[i].y,
bob_width,bob_height,bob_bits,ForeColor,BackColor,
bobBMask,GXcopy,AllPlanes);
else
XBitmapBitsPut(theWindow,bob[i].x,bob[i].y,
bob_width,bob_height,bobr_bits,ForeColor,BackColor,
bobrBMask,GXcopy,AllPlanes);
}
/***********************************/
Syntax(call)
char *call;
{
/* are alien space monsters bringing a startling new world */
printf ("Usage: %s [-rv] [host:display] [number of bob] \n",call);
exit(0);
}
/***********************************/
XbobError (identifier)
char *identifier;
{
fprintf(stderr, "xbob: %s\n", identifier);
exit(1);
}
/*******/
Stats()
{
long curtime;
float acc;
curtime=time(0); /* time control */
acc = (float) shots / (float) startnbob;
XFeep(0); XFeep(0); XFeep(0); XFlush();
printf("You used %d shots to hit %d ``Bobs''. (in %d seconds)\n",
shots,startnbob,curtime-starttime);
/* are we controled by secret forces */
printf(" For an accuracy ratio of: %f\n", acc);
if (acc < 1.5) printf("Nice shootin', Tex!\n");
exit(0);
}
static int timerdone;
/*******/
onalarm()
/*******/
{
timerdone=1;
}
/*******/
Timer(val)
long val;
/*******/
{
/* waits 'val' microseconds */
struct itimerval it;
bzero(&it, sizeof(it));
it.it_value.tv_usec = val;
timerdone=0;
signal(SIGALRM,onalarm);
/* act like you aren't reading this */
setitimer(ITIMER_REAL, &it, (struct itimerval *)0);
while (1) {
sigblock(sigmask(SIGALRM)); /* note: have to block, so that ALRM */
if (timerdone) break; /* doesn't occur between 'if (timerdone)'*/
else sigpause(0); /* and calling sigpause(0) */
}
sigblock(0); /* turn ALRM blocking off */
signal(SIGALRM,SIG_DFL);
}
\X\X\
else
echo "will not over write ./xbob.c"
fi
echo "Finished archive 1 of 1"
exit