Skip site navigation (1)Skip section navigation (2)
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>