Date: Wed, 14 Feb 2018 08:08:49 +0000 (UTC) From: =?UTF-8?Q?Romain_Tarti=c3=a8re?= <romain@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r461766 - in head/games/xroach: . files Message-ID: <201802140808.w1E88nbK032450@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: romain Date: Wed Feb 14 08:08:49 2018 New Revision: 461766 URL: https://svnweb.freebsd.org/changeset/ports/461766 Log: Resurrect, unbreak and modernize games/xroach Submitter is also taking maintainership. PR: 225867 Submitted by: kidon@posteo.de Added: head/games/xroach/ - copied from r448602, head/games/xroach/ Deleted: head/games/xroach/files/patch-Makefile Modified: head/games/xroach/Makefile head/games/xroach/distinfo head/games/xroach/files/patch-xroach.c Modified: head/games/xroach/Makefile ============================================================================== --- head/games/xroach/Makefile Wed Aug 23 11:32:37 2017 (r448602) +++ head/games/xroach/Makefile Wed Feb 14 08:08:49 2018 (r461766) @@ -5,23 +5,28 @@ PORTNAME= xroach PORTVERSION= 4.4 PORTREVISION= 2 CATEGORIES= games -MASTER_SITES= http://www.skysmurf.nl/comp/FreeBSD/distfiles/ +MASTER_SITES= https://cyber.dabamos.de/pub/distfiles/ DISTNAME= ${PORTNAME} -MAINTAINER= ports@FreeBSD.org +MAINTAINER= kidon@posteo.de COMMENT= Cockroaches hide under your windows -BROKEN= unfetchable (apparently abandoned upstream) -DEPRECATED= Broken for more than 6 months -EXPIRATION_DATE= 2017-08-23 +DPADD+= ${LOCALBASE}/lib/libX11.a ${LIBM} +CFLAGS+= -I${LOCALBASE}/include +LDADD+= -L${LOCALBASE}/lib -lX11 -lm -USE_XORG= x11 -PLIST_FILES= bin/xroach man/man6/xroach.6.gz +MANDIR= ${LOCALBASE}/man/man -WRKSRC= ${WRKDIR}/pub/bsd-sources/4.4BSD-Lite/usr/src/games/xroach +BINOWN= bin +BINDIR= ${LOCALBASE}/bin +BINMODE= 755 +USES= imake +USE_XORG= x11 xext +PLIST_FILES= bin/xroach man/man6/xroach.6.gz + do-install: ${INSTALL_PROGRAM} -s ${WRKSRC}/xroach ${STAGEDIR}${PREFIX}/bin - ${INSTALL_MAN} ${WRKSRC}/xroach.6 ${STAGEDIR}${MAN6PREFIX}/man/man6 + ${INSTALL_MAN} ${WRKSRC}/${PORTNAME}.man ${STAGEDIR}${MAN6PREFIX}/man/man6/${PORTNAME}.6 .include <bsd.port.mk> Modified: head/games/xroach/distinfo ============================================================================== --- head/games/xroach/distinfo Wed Aug 23 11:32:37 2017 (r448602) +++ head/games/xroach/distinfo Wed Feb 14 08:08:49 2018 (r461766) @@ -1,2 +1,3 @@ -SHA256 (xroach.tar.gz) = 88a4e436b7d93d34b062e548366af1eda62a1402518793b14339e9f5fde4b0da -SIZE (xroach.tar.gz) = 15404 +TIMESTAMP = 1518595646 +SHA256 (xroach.tar.gz) = 819ee19f8c333d9adaa4ab58829445112e1865b85a6ca82296d66399af344e07 +SIZE (xroach.tar.gz) = 21694 Modified: head/games/xroach/files/patch-xroach.c ============================================================================== --- head/games/xroach/files/patch-xroach.c Wed Aug 23 11:32:37 2017 (r448602) +++ head/games/xroach/files/patch-xroach.c Wed Feb 14 08:08:49 2018 (r461766) @@ -1,58 +1,1300 @@ ---- xroach.c.orig 1993-06-04 21:47:09.000000000 +0200 -+++ xroach.c 2011-12-20 19:03:53.816175581 +0100 -@@ -77,7 +77,7 @@ +--- xroach.c.orig 1991-06-06 12:12:07 UTC ++++ xroach.c +@@ -1,23 +1,31 @@ + /* + Xroach - A game of skill. Try to find the roaches under your windows. +- ++ + Copyright 1991 by J.T. Anderson + + jta@locus.com +- ++ + This program may be freely distributed provided that all + copyright notices are retained. + + To build: +- cc -o xroach roach.c -lX11 [-lsocketorwhatever] [-lm] [-l...] ++ cc -o xroach -lX11 -lm -I/usr/local/include/ -L/usr/local/lib xroach.c ++ ++ To run: ++ ./xroach -speed 2 -squish -rc brown -rgc yellowgreen ++ ++ Dedicated to Greg McFarlane (gregm@otc.otca.oz.au). ++ ++ Squish option contributed by Rick Petkiewizc (rick@locus.com). + +- Dedicated to Greg McFarlane. (gregm@otc.otca.oz.au) +- +- Squish option contributed by Rick Petkiewizc (rick@locus.com) +- + Virtual root code adapted from patch sent by Colin Rafferty who +- borrowed it from Tom LaStrange. Several other folks sent similar ++ borrowed it from Tom LaStrange. Several other folks sent similar + fixes. ++ ++ Some glitches removed by patch from Guus Sliepen (guus@sliepen.warande.net) ++ in 2001 (see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=102668#5). ++ ++ Last update: 2018-JAN-22 + */ + + /* @(#)xroach.c 1.5 4/2/91 11:53:31 */ +@@ -28,17 +36,9 @@ + #include <X11/Xatom.h> + + #include <stdio.h> +-#include <math.h> +-#include <malloc.h> +-#include <signal.h> +- +-#if __STDC__ + #include <stdlib.h> +-#else +-long strtol(); +-double strtod(); +-char *getenv(); +-#endif ++#include <signal.h> ++#include <math.h> + + char Copyright[] = "Xroach\nCopyright 1991 J.T. Anderson"; + +@@ -47,30 +47,31 @@ char Copyright[] = "Xroach\nCopyright 19 + typedef unsigned long Pixel; + typedef int ErrorHandler(); + +-#define SCAMPER_EVENT (LASTEvent + 1) ++#define SCAMPER_EVENT (LASTEvent + 1) + + #if !defined(GRAB_SERVER) +-#define GRAB_SERVER 0 ++#define GRAB_SERVER 0 + #endif + ++char *display_name = NULL; + Display *display; +-int screen; +-Window rootWin; +-unsigned int display_width, display_height; +-int center_x, center_y; + GC gc; + GC gutsGC; +-char *display_name = NULL; +-Pixel black, white; ++int screen; ++Pixel black; ++unsigned int display_height; ++unsigned int display_width; ++Window rootWin; + ++Bool squishRoach = False; ++Bool squishWinUp = False; + int done = 0; +-int eventBlock = 0; + int errorVal = 0; +-Bool squishRoach = False; ++int eventBlock = 0; + Pixmap squishMap; +-Bool squishWinUp = False; + +-typedef struct Roach { ++typedef struct Roach ++{ + RoachMap *rp; + int index; + float x; +@@ -86,69 +87,72 @@ Roach *roaches; + int maxRoaches = 10; + int curRoaches = 0; + float roachSpeed = 20.0; ++float turnSpeed = 10.0; + + Region rootVisible = NULL; + + void Usage(); + void SigHandler(); ++Window FindRootWindow(); ++int RandInt(int maxVal); ++int RoachInRect(Roach *roach, int rx, int ry, int x, int y, unsigned int width, unsigned int height); ++int RoachOverRect(Roach *roach, int rx, int ry, int x, int y, unsigned int width, unsigned int height); + void AddRoach(); +-void MoveRoach(); ++void TurnRoach(Roach *roach); ++void MoveRoach(int rx); + void DrawRoaches(); + void CoverRoot(); ++int RoachErrors(XErrorEvent *err); + int CalcRootVisible(); int MarkHiddenRoaches(); - Pixel AllocNamedColor(); +-Pixel AllocNamedColor(); +-Window FindRootWindow(); ++Pixel AllocNamedColor(char *colorName, Pixel dfltPix); ++void checkSquish(XButtonEvent *buttonEvent); -void -+int - main(ac, av) - int ac; - char *av[]; -@@ -96,19 +96,23 @@ +-main(ac, av) +-int ac; +-char *av[]; ++int main(int ac, char *av[]) + { +- XGCValues xgcv; +- int ax; + char *arg; +- RoachMap *rp; +- int rx; +- float angle; +- XEvent ev; +- char *roachColor = "black"; + char *gutsColor = NULL; +- int nVis; ++ char *roachColor = "black"; ++ float angle; + int needCalc; ++ int nVis; ++ RoachMap *rp; + Window squishWin; ++ XEvent ev; ++ XGCValues xgcv; + XSetWindowAttributes xswa; +- ++ /* Process command line options. */ - for (ax=1; ax<ac; ax++) { - arg = av[ax]; -+ for (ax=1; ax<ac; ) { -+ arg = av[ax++]; -+ -+ if (ax >= ac) -+ Usage(); -+ - if (strcmp(arg, "-display") == 0) { +- if (strcmp(arg, "-display") == 0) { - display_name = av[++ax]; -+ display_name = av[ax++]; - } - else if (strcmp(arg, "-rc") == 0) { +- } +- else if (strcmp(arg, "-rc") == 0) { - roachColor = av[++ax]; -+ roachColor = av[ax++]; - } - else if (strcmp(arg, "-speed") == 0) { -- roachSpeed = atof(av[++ax]); -+ roachSpeed = atof(av[ax++]); - } - else if (strcmp(arg, "-roaches") == 0) { +- } +- else if (strcmp(arg, "-speed") == 0) { +- roachSpeed = strtod(av[++ax], (char **)NULL); +- } +- else if (strcmp(arg, "-roaches") == 0) { - maxRoaches = strtol(av[++ax], (char **)NULL, 0); -+ maxRoaches = strtol(av[ax++], (char **)NULL, 0); - } - else { - Usage(); -@@ -212,6 +216,7 @@ +- } +- else if (strcmp(arg, "-squish") == 0) { +- squishRoach = True; +- } +- else if (strcmp(arg, "-rgc") == 0) { +- gutsColor = av[++ax]; +- } +- else { +- Usage(); +- } ++ for (int ax = 1; ax < ac; ax++) ++ { ++ arg = av[ax]; ++ ++ if (strcmp(arg, "-display") == 0) ++ display_name = av[++ax]; ++ else if (strcmp(arg, "-rc") == 0) ++ roachColor = av[++ax]; ++ else if (strcmp(arg, "-speed") == 0) ++ roachSpeed = (float) strtod(av[++ax], (char **) NULL); ++ else if (strcmp(arg, "-roaches") == 0) ++ maxRoaches = (int) strtol(av[++ax], (char **) NULL, 0); ++ else if (strcmp(arg, "-squish") == 0) ++ squishRoach = True; ++ else if (strcmp(arg, "-rgc") == 0) ++ gutsColor = av[++ax]; ++ else ++ Usage(); + } + +- srand((int)time((long *)NULL)); +- ++ /* Compensate rate of turning for speed of movement. */ ++ turnSpeed = 200 / roachSpeed; ++ ++ if (turnSpeed < 1) ++ turnSpeed = 1; ++ ++ srand((unsigned int) time((time_t *) NULL)); ++ + /* + Catch some signals so we can erase any visible roaches. + */ +@@ -158,144 +162,180 @@ char *av[]; + signal(SIGHUP, SigHandler); + + display = XOpenDisplay(display_name); +- if (display == NULL) { +- if (display_name == NULL) display_name = getenv("DISPLAY"); +- (void) fprintf(stderr, "%s: cannot connect to X server %s\n", av[0], +- display_name ? display_name : "(default)"); +- exit(1); ++ ++ if (display == NULL) ++ { ++ if (display_name == NULL) ++ display_name = getenv("DISPLAY"); ++ ++ fprintf(stderr, ++ "%s: cannot connect to X server %s\n", ++ av[0], ++ display_name ? display_name : "(default)"); ++ exit(1); + } + + screen = DefaultScreen(display); + rootWin = FindRootWindow(); + black = BlackPixel(display, screen); +- white = WhitePixel(display, screen); + +- display_width = DisplayWidth(display, screen); +- display_height = DisplayHeight(display, screen); +- center_x = display_width / 2; +- center_y = display_height / 2; +- ++ display_width = (unsigned int) DisplayWidth(display, screen); ++ display_height = (unsigned int) DisplayHeight(display, screen); ++ + /* + Create roach pixmaps at several orientations. + */ +- for (ax=0; ax<360; ax+=ROACH_ANGLE) { +- rx = ax / ROACH_ANGLE; +- angle = rx * 0.261799387799; +- rp = &roachPix[rx]; +- rp->pixmap = XCreateBitmapFromData(display, rootWin, +- rp->roachBits, rp->width, rp->height); +- rp->sine = sin(angle); +- rp->cosine = cos(angle); ++ for (int ax = 0; ax < 360; ax += ROACH_ANGLE) ++ { ++ int rx = ax / ROACH_ANGLE; ++ angle = (float) (rx * 0.261799387799); ++ rp = &roachPix[rx]; ++ rp->pixmap = XCreateBitmapFromData(display, ++ rootWin, ++ rp->roachBits, ++ (unsigned int) rp->width, ++ (unsigned int) rp->height); ++ rp->sine = (float) sin(angle); ++ rp->cosine = (float) cos(angle); + } + + /* + Create the squished pixmap + */ +- if (squishRoach) { +- squishMap = XCreateBitmapFromData(display, rootWin, +- squish_bits, squish_width, squish_height); +- } ++ if (squishRoach) ++ squishMap = XCreateBitmapFromData(display, ++ rootWin, ++ squish_bits, ++ squish_width, ++ squish_height); + +- roaches = (Roach *)malloc(sizeof(Roach) * maxRoaches); ++ roaches = (Roach *) malloc(sizeof(Roach) * maxRoaches); + + gc = XCreateGC(display, rootWin, 0L, &xgcv); + XSetForeground(display, gc, AllocNamedColor(roachColor, black)); + XSetFillStyle(display, gc, FillStippled); + +- if (squishRoach && gutsColor != NULL) { ++ if (squishRoach && gutsColor != NULL) ++ { + gutsGC = XCreateGC(display, rootWin, 0L, &xgcv); + XSetForeground(display, gutsGC, AllocNamedColor(gutsColor, black)); + XSetFillStyle(display, gutsGC, FillStippled); + } + else +- gutsGC = gc; +- ++ { ++ gutsGC = gc; ++ } ++ + while (curRoaches < maxRoaches) +- AddRoach(); +- ++ AddRoach(); ++ + XSelectInput(display, rootWin, ExposureMask | SubstructureNotifyMask); + +- if (squishRoach) { +- xswa.event_mask = ButtonPressMask; +- xswa.override_redirect = True; +- squishWin = XCreateWindow(display, rootWin, 0, 0, +- display_width, display_height, 0, +- CopyFromParent, InputOnly, CopyFromParent, +- CWOverrideRedirect | CWEventMask, &xswa); +- XLowerWindow(display, squishWin); ++ if (squishRoach) ++ { ++ xswa.event_mask = ButtonPressMask; ++ xswa.override_redirect = True; ++ squishWin = XCreateWindow(display, ++ rootWin, ++ 0, 0, ++ display_width, display_height, ++ 0, ++ CopyFromParent, InputOnly, CopyFromParent, ++ CWOverrideRedirect | CWEventMask, ++ &xswa); ++ XLowerWindow(display, squishWin); + } +- ++ + needCalc = 1; +- while (!done) { +- if (XPending(display)) { +- XNextEvent(display, &ev); +- } +- else { +- if (needCalc) { +- needCalc = CalcRootVisible(); +- } +- if (needCalc) +- nVis = 0; +- else +- nVis = MarkHiddenRoaches(); +- if (nVis) { +- ev.type = SCAMPER_EVENT; +- if (!squishWinUp && squishRoach) { +- XMapWindow(display, squishWin); +- squishWinUp = True; +- } +- } +- else { +- if (squishWinUp && squishRoach) { +- XUnmapWindow(display, squishWin); +- squishWinUp = False; +- } +- if (needCalc == 0) +- DrawRoaches(); +- eventBlock = 1; +- XNextEvent(display, &ev); +- eventBlock = 0; +- } +- } +- +- switch (ev.type) { +- +- case SCAMPER_EVENT: +- for (rx=0; rx<curRoaches; rx++) { +- if (!roaches[rx].hidden) +- MoveRoach(rx); +- } +- DrawRoaches(); +- XSync(display, False); +- break; +- +- case UnmapNotify: +- if (ev.xunmap.window != squishWin) +- needCalc = 1; +- break; + +- case MapNotify: +- case Expose: +- case ConfigureNotify: +- needCalc = 1; +- break; +- +- case ButtonPress: +- checkSquish(&ev); +- break; +- +- } ++ while (!done) ++ { ++ if (XPending(display)) ++ { ++ XNextEvent(display, &ev); ++ } ++ else ++ { ++ if (needCalc) ++ needCalc = CalcRootVisible(); ++ ++ if (needCalc) ++ nVis = 0; ++ else ++ nVis = MarkHiddenRoaches(); ++ ++ ev.type = SCAMPER_EVENT; ++ ++ if (nVis) ++ { ++ if (!squishWinUp && squishRoach) ++ { ++ XMapWindow(display, squishWin); ++ squishWinUp = True; ++ } ++ } ++ else ++ { ++ if (squishWinUp && squishRoach) ++ { ++ XUnmapWindow(display, squishWin); ++ squishWinUp = False; ++ } ++ ++ /* ++ if (needCalc == 0) ++ DrawRoaches(); ++ ++ eventBlock = 1; ++ XNextEvent(display, &ev); ++ eventBlock = 0; ++ */ ++ } ++ } ++ ++ switch (ev.type) ++ { ++ case SCAMPER_EVENT: ++ for (int rx = 0; rx < curRoaches; rx++) ++ if (!roaches[rx].hidden) ++ MoveRoach(rx); ++ ++ DrawRoaches(); ++ XFlush(display); ++ usleep(20000); ++ XSync(display, False); ++ break; ++ ++ case UnmapNotify: ++ if (ev.xunmap.window != squishWin) ++ needCalc = 1; ++ break; ++ ++ case MapNotify: ++ case Expose: ++ case ConfigureNotify: ++ needCalc = 1; ++ break; ++ ++ case ButtonPress: ++ checkSquish(&ev); ++ done = !curRoaches; /* Stop program if there are no more roaches */ ++ break; ++ ++ default: ++ break; ++ } + } +- ++ CoverRoot(); - +- XCloseDisplay(display); -+ return(0); ++ free(roaches); ++ return 0; } #define USEPRT(msg) fprintf(stderr, msg) -@@ -465,7 +470,7 @@ + +-void +-Usage() ++void Usage() + { + USEPRT("Usage: xroach [options]\n\n"); + USEPRT("Options:\n"); +@@ -305,314 +345,345 @@ Usage() + USEPRT(" -speed roachspeed\n"); + USEPRT(" -squish\n"); + USEPRT(" -rgc roachgutscolor\n"); +- ++ + exit(1); + } + +-void +-SigHandler() ++void SigHandler() + { +- + /* + If we are blocked, no roaches are visible and we can just bail + out. If we are not blocked, then let the main procedure clean + up the root window. + */ +- if (eventBlock) { +- XCloseDisplay(display); +- exit(0); ++ if (eventBlock) ++ { ++ XCloseDisplay(display); ++ exit(0); + } +- else { +- done = 1; ++ else ++ { ++ done = 1; + } + } + + /* + Find the root or virtual root window. + */ +-Window +-FindRootWindow() ++Window FindRootWindow() + { +- Window rootWin; +- Window realRoot; ++ Atom actualType; + Atom swmVroot; +- Window rootReturn, parentReturn, *children; ++ int actualFormat; ++ unsigned char *newRoot; + unsigned int numChildren; +- int cx; +- Atom actualType; +- Atom actualFormat; +- unsigned long nItems; + unsigned long bytesAfter; +- Window *newRoot; +- ++ unsigned long nItems; ++ Window *children; ++ Window parentReturn; ++ Window realRoot; ++ Window rootReturn; ++ Window rootWin; ++ + /* + Get real root window. + */ + realRoot = rootWin = RootWindow(display, screen); +- ++ + /* + Get atom for virtual root property. If the atom doesn't + exist, we can assume the corresponding property does not + exist. + */ + swmVroot = XInternAtom(display, "__SWM_VROOT", True); +- ++ + if (swmVroot == None) +- return rootWin; +- ++ return rootWin; ++ + /* + Run children of root, looking for a virtual root. + */ +- XQueryTree(display, rootWin, &rootReturn, &parentReturn, +- &children, &numChildren); +- for (cx=0; cx<numChildren; cx++) { +- newRoot = NULL; +- nItems = 0; +- if (XGetWindowProperty(display, children[cx], swmVroot, 0L, 1L, False, +- XA_WINDOW, &actualType, &actualFormat, &nItems, +- &bytesAfter, &newRoot) == Success && actualFormat != None) { +- if (nItems >= 1) { +- rootWin = *newRoot; +- } +- if (newRoot) { +- XFree(newRoot); +- } +- } +- if (rootWin != realRoot) break; ++ XQueryTree(display, ++ rootWin, ++ &rootReturn, ++ &parentReturn, ++ &children, ++ &numChildren); ++ ++ for (int cx = 0; cx < numChildren; cx++) ++ { ++ newRoot = NULL; ++ nItems = 0; ++ ++ if (XGetWindowProperty(display, ++ children[cx], ++ swmVroot, ++ 0, ++ 1, ++ False, ++ XA_WINDOW, ++ &actualType, ++ &actualFormat, ++ &nItems, ++ &bytesAfter, ++ &newRoot) == Success && actualFormat != None) ++ { ++ if (nItems >= 1) ++ rootWin = *newRoot; ++ ++ if (newRoot) ++ XFree(newRoot); ++ } ++ ++ if (rootWin != realRoot) ++ break; + } ++ + XFree(children); +- ++ + return rootWin; + } + + /* + Generate random integer between 0 and maxVal-1. + */ +-int +-RandInt(maxVal) +-int maxVal; ++int RandInt(int maxVal) + { +- return rand() % maxVal; ++ return rand() % maxVal; + } + + /* + Check for roach completely in specified rectangle. + */ +-int +-RoachInRect(roach, rx, ry, x, y, width, height) +-Roach *roach; +-int rx; +-int ry; +-int x; +-int y; +-unsigned int width; +-unsigned int height; ++int RoachInRect(Roach *roach, int rx, int ry, int x, int y, unsigned int width, unsigned int height) + { +- if (rx < x) return 0; +- if ((rx + roach->rp->width) > (x + width)) return 0; +- if (ry < y) return 0; +- if ((ry + roach->rp->height) > (y + height)) return 0; +- ++ if (rx < x) ++ return 0; ++ ++ if ((rx + roach->rp->width) > (x + width)) ++ return 0; ++ ++ if (ry < y) ++ return 0; ++ ++ if ((ry + roach->rp->height) > (y + height)) ++ return 0; ++ + return 1; + } + + /* + Check for roach overlapping specified rectangle. + */ +-int +-RoachOverRect(roach, rx, ry, x, y, width, height) +-Roach *roach; +-int rx; +-int ry; +-int x; +-int y; +-unsigned int width; +-unsigned int height; ++int RoachOverRect(Roach *roach, int rx, int ry, int x, int y, unsigned int width, unsigned int height) + { +- if (rx >= (x + width)) return 0; +- if ((rx + roach->rp->width) <= x) return 0; +- if (ry >= (y + height)) return 0; +- if ((ry + roach->rp->height) <= y) return 0; +- ++ if (rx >= (x + width)) ++ return 0; ++ ++ if ((rx + roach->rp->width) <= x) ++ return 0; ++ ++ if (ry >= (y + height)) ++ return 0; ++ ++ if ((ry + roach->rp->height) <= y) ++ return 0; ++ + return 1; + } + + /* + Give birth to a roach. + */ +-void +-AddRoach() ++void AddRoach() + { + Roach *r; +- +- if (curRoaches < maxRoaches) { +- r = &roaches[curRoaches++]; +- r->index = RandInt(ROACH_HEADINGS); +- r->rp = &roachPix[r->index]; +- r->x = RandInt(display_width - r->rp->width); +- r->y = RandInt(display_height - r->rp->height); +- r->intX = -1; +- r->intY = -1; +- r->hidden = 0; +- r->steps = RandInt(200); +- r->turnLeft = RandInt(100) >= 50; ++ ++ if (curRoaches < maxRoaches) ++ { ++ r = &roaches[curRoaches++]; ++ r->index = RandInt(ROACH_HEADINGS); ++ r->rp = &roachPix[r->index]; ++ r->x = RandInt(display_width - r->rp->width); ++ r->y = RandInt(display_height - r->rp->height); ++ r->intX = -1; ++ r->intY = -1; ++ r->hidden = 0; ++ r->steps = RandInt((int) turnSpeed); ++ r->turnLeft = RandInt(100) >= 50; + } + } + + /* + Turn a roach. + */ +-void +-TurnRoach(roach) +-Roach *roach; ++void TurnRoach(Roach *roach) + { +- if (roach->index != (roach->rp - roachPix)) return; ++ if (roach->index != (roach->rp - roachPix)) ++ return; + +- if (roach->turnLeft) { +- roach->index += (RandInt(30) / 10) + 1; +- if (roach->index >= ROACH_HEADINGS) +- roach->index -= ROACH_HEADINGS; +- } +- else { +- roach->index -= (RandInt(30) / 10) + 1; +- if (roach->index < 0) +- roach->index += ROACH_HEADINGS; ++ if (roach->turnLeft) ++ { ++ roach->index += (RandInt(30) / 10) + 1; ++ ++ if (roach->index >= ROACH_HEADINGS) ++ roach->index -= ROACH_HEADINGS; ++ } else ++ { ++ roach->index -= (RandInt(30) / 10) + 1; ++ ++ if (roach->index < 0) ++ roach->index += ROACH_HEADINGS; + } + } + + /* + Move a roach. + */ +-void +-MoveRoach(rx) +-int rx; ++void MoveRoach(int rx) + { +- Roach *roach; +- Roach *r2; + float newX; + float newY; +- int ii; +- ++ Roach *roach; ++ + roach = &roaches[rx]; + newX = roach->x + (roachSpeed * roach->rp->cosine); + newY = roach->y - (roachSpeed * roach->rp->sine); +- +- if (RoachInRect(roach, (int)newX, (int)newY, +- 0, 0, display_width, display_height)) { +- +- roach->x = newX; +- roach->y = newY; + +- if (roach->steps-- <= 0) { +- TurnRoach(roach); +- roach->steps = RandInt(200); +- } ++ if (RoachInRect(roach, ++ (int) newX, (int) newY, ++ 0, 0, ++ display_width, display_height)) ++ { ++ roach->x = newX; ++ roach->y = newY; + +- for (ii=rx+1; ii<curRoaches; ii++) { +- r2 = &roaches[ii]; +- if (RoachOverRect(roach, (int)newX, (int)newY, +- r2->intX, r2->intY, r2->rp->width, r2->rp->height)) { +- +- TurnRoach(roach); +- } +- } ++ if (roach->steps-- <= 0) ++ { ++ TurnRoach(roach); ++ roach->steps = RandInt((int) turnSpeed); ++ ++ /* ++ Previously, roaches would just go around in circles. ++ This makes their movement more interesting (and disgusting too!). ++ */ ++ if (RandInt(100) >= 80) ++ roach->turnLeft ^= 1; ++ } ++ ++ /* This is a kind of anti-collision algorithm which doesn't do what it is supposed to do, ++ it eats CPU time and sometimes makes roaches spin around very crazy. Therefore it is ++ commented out. ++ ++ for (int ii = rx + 2; ii < curRoaches; ii++) { ++ r2 = &roaches[ii]; ++ ++ if (RoachOverRect(roach, ++ (int) newX, (int) newY, ++ r2->intX, r2->intY, ++ (unsigned int) r2->rp->width, (unsigned int) r2->rp->height)) ++ TurnRoach(roach); ++ ++ } ++ */ + } +- else { +- TurnRoach(roach); ++ else ++ { ++ TurnRoach(roach); + } + } +- ++ + /* + Draw all roaches. + */ +-void +-DrawRoaches() ++void DrawRoaches() + { + Roach *roach; +- int rx; +- +- for (rx=0; rx<curRoaches; rx++) { +- roach = &roaches[rx]; +- +- if (roach->intX >= 0 && roach->rp != NULL) { +- XClearArea(display, rootWin, roach->intX, roach->intY, +- roach->rp->width, roach->rp->height, False); +- } +- } +- +- for (rx=0; rx<curRoaches; rx++) { +- roach = &roaches[rx]; +- +- if (!roach->hidden) { +- roach->intX = roach->x; +- roach->intY = roach->y; +- roach->rp = &roachPix[roach->index]; +- +- XSetStipple(display, gc, roach->rp->pixmap); +- XSetTSOrigin(display, gc, roach->intX, roach->intY); +- XFillRectangle(display, rootWin, gc, +- roach->intX, roach->intY, roach->rp->width, roach->rp->height); +- } +- else { +- roach->intX = -1; *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802140808.w1E88nbK032450>