diff --git a/games/xasteroids/Makefile b/games/xasteroids/Makefile index 9dd55f1ca986..7c486397fc0c 100644 --- a/games/xasteroids/Makefile +++ b/games/xasteroids/Makefile @@ -1,38 +1,39 @@ PORTNAME= xasteroids PORTVERSION= 5.0 -PORTREVISION= 3 +PORTREVISION= 4 CATEGORIES= games MASTER_SITES= XCONTRIB/../R5contrib DISTNAME= ${PORTNAME} EXTRACT_SUFX= .sh.Z -MAINTAINER= ports@FreeBSD.org +MAINTAINER= fuz@FreeBSD.org COMMENT= X11 based asteroids style arcade game -EXTRACT_CMD= ( cd ${WRKSRC}; zcat | ${SH} -s ) -EXTRACT_BEFORE_ARGS= < -EXTRACT_AFTER_ARGS= # empty +LICENSE= XASTEROIDS +LICENSE_NAME= Xasteroids license +LICENSE_FILE= ${WRKSRC}/README +LICENSE_PERMS= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept -NO_WRKSUBDIR= yes - -USES= xorg +USES= localbase:ldflags xorg USE_XORG= x11 xext -CPPFLAGS+= -I${LOCALBASE}/include -LDFLAGS+= -L${LOCALBASE}/lib -lXext -lX11 -lm +LIBS+= -lXext -lX11 -lm +NO_WRKSUBDIR= yes PLIST_FILES= bin/xasteroids \ share/man/man6/xasteroids.6.gz -post-extract: - @${LN} -sf xast.man ${WRKSRC}/xasteroids.6 +do-extract: + (cd ${EXTRACT_WRKDIR} && \ + ${SETENV} ${EXTRACT_ENV} zcat ${_DISTDIR}/${DISTNAME}${EXTRACT_SUFX} | \ + ${SETENV} ${EXTRACT_ENV} ${SH} -s) do-build: - (cd ${WRKSRC} && ${CC} ${CPPFLAGS} ${CFLAGS} -o xasteroids xast.c \ - ${LDFLAGS}) + (cd ${WRKSRC} && ${CC} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} \ + -o xasteroids xast.c ${LIBS}) do-install: (cd ${WRKSRC} && ${INSTALL_PROGRAM} xasteroids ${STAGEDIR}${PREFIX}/bin) - (cd ${WRKSRC} && ${INSTALL_MAN} xasteroids.6 ${STAGEDIR}${PREFIX}/share/man/man6) + (cd ${WRKSRC} && ${INSTALL_MAN} xast.man ${STAGEDIR}${PREFIX}/share/man/man6/xasteroids.6) .include diff --git a/games/xasteroids/files/patch-xast.c b/games/xasteroids/files/patch-xast.c index f426eaf6f3f7..672ccd21a155 100644 --- a/games/xasteroids/files/patch-xast.c +++ b/games/xasteroids/files/patch-xast.c @@ -1,421 +1,483 @@ ---- xast.c.orig +--- xast.c.orig 2026-06-19 11:03:44 UTC +++ xast.c -@@ -3,6 +3,13 @@ +@@ -3,6 +3,14 @@ goetz@cs.buffalo.EDU Version 5, 9 Feb 93 + Changes after version 5.0: + + Improved cursor-hiding. + Arrow keys. + ANSI-C cleanups. + Use usleep() instead of a delay loop, when available. ++ Add prototypes. + Changes from version 4.3: High score script. -@@ -27,16 +34,30 @@ +@@ -27,16 +35,30 @@ Pat Ryan Craig Smith Doug Merritt + Stephen McCamant Makefile by James Berg Hi score script by Chris Moore Man page by David Partain */ #include /* For NULL */ +#include /* For malloc(), rand() etc */ +#include /* For srtlen() */ +#include /* For time() */ #include #include -#include /* For erasing cursor - not important */ +#include #include +#ifdef HAS_USLEEP +#include +#endif + +#ifndef __STDC__ +define void +#endif + +#define rand(rndint) rand() /* ??? */ + /* Indexes for 1st dimension of obj */ /* The order they are in is important */ #define AST 0 -@@ -68,10 +89,10 @@ +@@ -68,10 +90,10 @@ #define M_BULLET 0.1 /* Keys */ -#define FIRE 'p' -#define PAUSE 27 /* escape */ -#define SHIELD '`' -#define THRUST 'o' +#define FIRE XK_p +#define PAUSE XK_Escape /* escape */ +#define SHIELD XK_grave /* ` */ +#define THRUST XK_o #define BMAX 300 /* Max particles in a "boom" + 1 */ #define letheight 20 /* height of font */ -@@ -121,6 +142,7 @@ +@@ -121,6 +143,7 @@ int width, height, shapesize[LASTSHAPE+1] = {44, 21, 10, 2, 1, SHIPSIZE+1, 35, 20}, shield_on; +void initasts() { int i; extern Objtype obj[SHIP+1]; -@@ -143,6 +165,7 @@ +@@ -143,6 +166,7 @@ initasts() obj[i].mass = M_BULLET; } } +void makeasts() { int i; extern Objtype obj[SHIP+1]; -@@ -163,7 +186,7 @@ +@@ -163,7 +187,7 @@ makeasts() if (a > 63) obj[i].y = (double) a; else obj[i].y = (double) height - a; - a = rand(rndint); a = 4 - a>>5; + a = rand(rndint); a = 4 - (a>>5); obj[i].rot = (double) a; a = rand(rndint); obj[i].rotvel = ((double) a)/2048; -@@ -177,6 +200,7 @@ +@@ -177,6 +201,7 @@ makeasts() numasts = i; } +void makeenemy() /* Start an enemy ship */ { extern Objtype obj[SHIP+1]; extern int height, level, rndint; -@@ -258,6 +282,7 @@ +@@ -199,9 +224,9 @@ int nextast() /* Find next unused asteroid object */ + return i; + } + +-int collide(i, j) /* Returns non-zero if i collided with j */ ++int collide(int i, int j) ++ /* Returns non-zero if i collided with j */ + /* Ship must be j! (See below) */ +- int i, j; + { extern Objtype obj[SHIP+1]; + extern int shapesize[LASTSHAPE+1]; + extern double drawscale; +@@ -258,15 +283,17 @@ Loopend: jx1 = jx2; jy1 = jy2; return 0; } +-blastpair(i, j) /* Generate random velocity vector v. */ +- int i, j ; /* Add v to i, -v to j. */ +void - blastpair(i, j) /* Generate random velocity vector v. */ - int i, j ; /* Add v to i, -v to j. */ ++blastpair(int i, int j) ++ /* Generate random velocity vector v. */ ++ /* Add v to i, -v to j. */ { extern int rndint; -@@ -266,7 +291,7 @@ + extern Objtype obj[SHIP+1]; + unsigned char c; /* for rand */ double vx, vy; c = rand(rndint); /* c = 4 - c>>5; if you need angles from -3 to 4 */ - c>>2; /* possibly save some time on sin/cos */ + c >>= 2; /* possibly save some time on sin/cos */ vx = cos((double) c); vy = sin((double) c); obj[i].xvel = obj[i].xvel + vx; obj[i].yvel = obj[i].yvel + vy; -@@ -282,6 +307,7 @@ +@@ -282,8 +309,8 @@ blastpair(i, j) /* Generate random velocity vector v. #define rotinert(i) (double) (obj[i].mass*shapesize[obj[i].shape]*shapesize[obj[i].shape]) /* cause two objects to collide elastically */ +-bounce(i, j) +-int i,j; +void - bounce(i, j) - int i,j; ++bounce(int i, int j) { -@@ -345,6 +371,7 @@ + double rotrat, temp; + extern Objtype obj[SHIP+1]; +@@ -345,10 +372,9 @@ obj[j].rotvel = temp; obj[j].rotvel = temp; } +-botline(disp, window, gc) /* Print status line text */ +- Display *disp; +- Drawable window; +- GC gc; +void - botline(disp, window, gc) /* Print status line text */ - Display *disp; - Drawable window; -@@ -357,6 +384,7 @@ ++botline(Display *disp, Drawable window, GC gc) ++ /* Print status line text */ + { extern int highscore, ships, score; + char text[70]; + sprintf(text, "Ships:%2d Score:%6d Shield: High:%6d", +@@ -357,10 +383,9 @@ botline(disp, window, gc) /* Print status line text */ text, strlen(text)); } +-printss(disp, window, gc) /* Print ships and score */ +- Display *disp; +- Drawable window; +- GC gc; +void - printss(disp, window, gc) /* Print ships and score */ - Display *disp; - Drawable window; -@@ -389,6 +417,7 @@ ++printss(Display *disp, Drawable window, GC gc) ++ /* Print ships and score */ + { extern int height, highscore, oldscore, ships, score; + extern Objtype obj[SHIP+1]; /* to kill ship */ + char sstring[30]; +@@ -389,18 +414,17 @@ printss(disp, window, gc) /* Print ships and score */ XClearArea(disp, window, 340+(energy>>1), height+8, 8, 10, False); } +-upscore(killer, up) /* Only award score for things the player shot */ +- int killer, up; +void - upscore(killer, up) /* Only award score for things the player shot */ - int killer, up; ++upscore(int killer, int up) ++ /* Only award score for things the player shot */ { extern int score; -@@ -397,6 +426,7 @@ + if (killer != ENEMYBUL && killer != SHIP) + score = score + up; } /* boom, movebooms, drawbooms all by Peter Phillips */ +-boom(ob, particles, duration) +-int ob; +-int particles; +-int duration; +void - boom(ob, particles, duration) - int ob; - int particles; -@@ -429,6 +459,7 @@ ++boom(int ob, int particles, int duration) + { extern int rndint; + int i; + unsigned int r1, r2; +@@ -429,6 +453,7 @@ int duration; } /* move the various booms that are active */ +void movebooms() { int i; -@@ -461,6 +492,7 @@ +@@ -461,10 +486,8 @@ movebooms() } /* Draw the various booms */ +-drawbooms(disp, window, gc) +- Display *disp; +- Drawable window; +- GC gc; +void - drawbooms(disp, window, gc) - Display *disp; - Drawable window; -@@ -481,6 +513,7 @@ ++drawbooms(Display *disp, Drawable window, GC gc) + { + int i; + Boom b; +@@ -481,6 +504,7 @@ drawbooms(disp, window, gc) } } +void deletebooms() /* delete all booms */ { Boom b; -@@ -490,11 +523,12 @@ +@@ -490,11 +514,11 @@ deletebooms() /* delete all booms */ b = b->next; } } +-killast(killer, i) +- int killer, i; /* i = Asteroid # to kill */ +void - killast(killer, i) - int killer, i; /* i = Asteroid # to kill */ ++killast(int killer, int i) /* i = Asteroid # to kill */ { extern Objtype obj[SHIP+1]; extern int numasts; - int k, na, oldna; + int k, na = 0, oldna; if (obj[i].shape == ASTSHAPE1) { na = nextast(); /* Could put 6 lines in a sub */ -@@ -543,6 +577,8 @@ +@@ -543,8 +567,9 @@ killast(killer, i) { boom(i, 9, 7); obj[i].alive = 0; upscore(killer, 500);} } +-moveobjs(crash) +- int *crash; + +void - moveobjs(crash) - int *crash; ++moveobjs(int *crash) { extern Objtype obj[SHIP+1]; -@@ -585,6 +621,7 @@ + extern int ships; + extern double speedscale; +@@ -585,6 +610,7 @@ moveobjs(crash) } } +void fire() { extern Objtype obj[SHIP+1]; extern int width, nextbul; -@@ -603,6 +640,7 @@ +@@ -603,6 +629,7 @@ fire() nextbul++; if (nextbul == LASTBUL+1) nextbul = FBUL; } +void hyper() { extern Objtype obj[SHIP+1]; extern int width, height, rndint; -@@ -617,6 +655,7 @@ +@@ -617,13 +644,9 @@ hyper() obj[SHIP].y = (double) i; } +-vdraw(disp, window, gc, shape, x, y, rot) +- Display *disp; +- Drawable window; +- GC gc; +- int shape; +- double x, y, rot; +- +void - vdraw(disp, window, gc, shape, x, y, rot) - Display *disp; - Drawable window; -@@ -639,6 +678,7 @@ ++vdraw(Display *disp, Drawable window, GC gc, ++ int shape, double x, double y, double rot) + { int line; + extern PolarPair shapes[LASTSHAPE+1][11]; + extern int numpairs[LASTSHAPE+1]; +@@ -639,9 +662,8 @@ vdraw(disp, window, gc, shape, x, y, rot) XDrawLines (disp, window, gc, figure, numpairs[shape], CoordModePrevious); } +-main(argc, argv) +- int argc; +- char **argv; +int - main(argc, argv) - int argc; - char **argv; -@@ -663,8 +703,8 @@ ++main(int argc, char *argv[]) + { Colormap cmap; + Cursor cursor; + Display *disp; +@@ -663,8 +685,8 @@ main(argc, argv) extern int level, numasts, rndint, ships, score, oldscore; extern Objtype obj[SHIP+1]; unsigned char c; /* for rand */ - double *temp, dx, dy, dist; - int crashed, flashon, len, pause = 0, delay = 64, + double dx, dy, dist; + int crashed, flashon, pause = 0, delay = 64, enemycount, counter, counterstart = 1, i, /* index for drawing objs, counting bullets */ r; /* radius of shield circle */ -@@ -704,11 +744,30 @@ +@@ -704,11 +726,30 @@ main(argc, argv) KeyPressMask | KeyReleaseMask | StructureNotifyMask); XMapRaised (disp, window); - /* Erase cursor. Just delete next 5 lines if any error. */ + /* Make cursor invisible. Just delete chunk if any error. */ cmap = XDefaultColormap(disp, screen); XAllocNamedColor(disp, cmap, "Black", &exact, &black); +#if 0 /* Easy way, but can leave a black spot */ +#include cursor = XCreateFontCursor(disp, XC_dot); XRecolorCursor(disp, cursor, &black, &black); +#else /* Hard, good way */ + { unsigned wd, ht; + Pixmap pm, maskpm; + GC cleargc; + XQueryBestCursor(disp, window, 1, 1, &wd, &ht); + pm = XCreatePixmap(disp, window, wd, ht, 1); + maskpm = XCreatePixmap(disp, window, wd, ht, 1); + cleargc = XCreateGC(disp, pm, 0, 0); + XFillRectangle(disp, pm, cleargc, 0, 0, wd, ht); + XFillRectangle(disp, maskpm, cleargc, 0, 0, wd, ht); + cursor = XCreatePixmapCursor(disp, pm, maskpm, + &black, &black, 1, 1); + XFreePixmap(disp, pm); + XFreePixmap(disp, maskpm); + XFreeGC(disp, cleargc); + } +#endif XDefineCursor(disp, window, cursor); XFillRectangle (disp, pixmap, pmgc, 0, 0, width, height); -@@ -746,7 +805,7 @@ +@@ -746,7 +787,7 @@ Newship: botline(disp, window, gc); { XNextEvent(disp, &event); switch (event.type) { case MappingNotify: - XRefreshKeyboardMapping (&event); + XRefreshKeyboardMapping ((XMappingEvent *)&event); break; case ConfigureNotify: width = event.xconfigure.width; -@@ -757,28 +816,29 @@ +@@ -757,28 +798,29 @@ Newship: botline(disp, window, gc); botline(disp, window, gc); break; case KeyPress: - len = XLookupString (&event, text, 10, &key, 0); - if (len == 1 && !shield_on) switch (text[0]) - { case 'e': + key = XLookupKeysym ((XKeyEvent *)&event, 0); + if (!shield_on) switch (key) + { case XK_Left: case XK_e: obj[SHIP].rotvel = obj[SHIP].rotvel - .1; break; - case 'r': + case XK_Right: case XK_r: obj[SHIP].rotvel = obj[SHIP].rotvel + .1; break; - case 'w': + case XK_w: obj[SHIP].rot -= pi/4; break; - case 't': + case XK_t: obj[SHIP].rot += pi/4; break; - case 'd': + case XK_d: obj[SHIP].rotvel = obj[SHIP].rotvel - .02; break; - case 'f': + case XK_f: obj[SHIP].rotvel = obj[SHIP].rotvel + .02; break; - case THRUST: + case XK_Up: case THRUST: obj[SHIP].xvel += cos(obj[SHIP].rot); obj[SHIP].yvel += sin(obj[SHIP].rot); obj[SHIP].shape = SHIPTHRSHAPE; break; + case XK_Control_L: case XK_Control_R: case FIRE: if (obj[SHIP].alive) fire(); break; - case ' ': + case XK_space: if (obj[SHIP].alive) { hyper(); flashon = 1; /* NOT XSetForeground (disp, gc, bg); -@@ -787,52 +847,55 @@ +@@ -787,52 +829,55 @@ Newship: botline(disp, window, gc); XFillRectangle (disp, pixmap, pmgc, 0, 0, width, height); } break; - case SHIELD: + case XK_Down: case SHIELD: if (energy) { shield_on = 1; obj[SHIP].shape = SHIPSHAPE;} break; - case '.': /* decrease delay */ + case XK_period: /* decrease delay */ if (delay > 1) delay >>=1; break; - case ',': /* increase delay */ + case XK_comma: /* increase delay */ delay <<=1; break; - case 'm': /* decrease drawscale - may go negative */ + case XK_m: /* decrease drawscale - may go negative */ drawscale -= .1; break; - case 'n': /* increase drawscale */ + case XK_n: /* increase drawscale */ drawscale += .1; break; - case '2': /* increase speedscale */ + case XK_2: /* increase speedscale */ speedscale += .1; break; - case '1': /* decrease speedscale */ + case XK_1: /* decrease speedscale */ speedscale -= .1; break; - case 'b': /* increase moves/update */ + case XK_b: /* increase moves/update */ counterstart++; break; - case 'v': /* decrease moves/update */ + case XK_v: /* decrease moves/update */ if (counterstart > 1) counterstart--; break; case PAUSE: /* pause */ pause = 1 - pause; break; - case '+': /* cheat */ + case XK_plus: /* cheat */ ships++; botline(disp, window, gc); break; - case 'Q': /* quit */ - goto End; - case 's': /* start new ship */ - if (!obj[SHIP].alive) + case XK_q: /* quit */ + if (event.xkey.state & ShiftMask) + goto End; + break; + case XK_s: /* start new ship */ + if (!obj[SHIP].alive) { if (ships < 1) goto Newgame; else goto Newship; + } break; } break; case KeyRelease: - len = XLookupString(&event, text, 10, &key, 0); - if (len == 1) switch (text[0]) - { case 'e': + key = XLookupKeysym((XKeyEvent *)&event, 0); + switch (key) + { case XK_Left: case XK_e: obj[SHIP].rotvel = 0; break; - case 'r': + case XK_Right: case XK_r: obj[SHIP].rotvel = 0; break; - case THRUST: + case XK_Up: case THRUST: obj[SHIP].shape = SHIPSHAPE; break; - case SHIELD: + case XK_Down: case SHIELD: shield_on = 0; break; } /* break; */ -@@ -850,7 +913,7 @@ +@@ -850,7 +895,7 @@ Newship: botline(disp, window, gc); botline(disp, window, gc); } /* Write copyright notice */ - if (!ships && blist == NULL) + if (!ships) { sprintf(text, "Xasteroids"); XDrawImageString (disp, pixmap, gc, width/2-50, height/2-2*letheight, -@@ -917,7 +980,11 @@ +@@ -917,7 +962,11 @@ Newship: botline(disp, window, gc); } else obj[ENEMYBUL].alive = 0; } +#ifdef HAS_USLEEP + usleep(delay); +#else for (i = 0; i < delay; i++); +#endif } } } diff --git a/games/xasteroids/files/patch-xast.man b/games/xasteroids/files/patch-xast.man index ca47d46783a1..43991bf5db10 100644 --- a/games/xasteroids/files/patch-xast.man +++ b/games/xasteroids/files/patch-xast.man @@ -1,122 +1,122 @@ ---- xast.man.orig +--- xast.man.orig 2026-06-19 11:03:44 UTC +++ xast.man @@ -1,9 +1,9 @@ -.TH xasteroids n +.TH xasteroids 6 .SH NAME xasteroids - X windows based asteroids style arcade game .SH SYNOPSIS -.ta 8n -\fBxasteroids\fP +.ta 6 +\fBxasteroids\fP [-s] .br .SH DESCRIPTION Make big rocks into little ones. -@@ -11,60 +11,70 @@ +@@ -11,60 +11,70 @@ Make big rocks into little ones. .SH COMMANDS .I xasteroids - e Rotate counterclockwise ("left") - r Rotate clockwise ("right") - w Rotate 45 degrees counterclockwise - t Rotate 45 degrees clockwise - d Increase counterclockwise rotational velocity - f Increase clockwise rotational velocity - o Thrust - p Fire - ` Shields - space Hyperspace - s Start new ship in center of playing field - (Also used to start a new game) - esc Pause - Q Quit +.ft CW + e Left Arrow Rotate counterclockwise ("left") + r Right Arrow Rotate clockwise ("right") + w Rotate 45 degrees counterclockwise + t Rotate 45 degrees clockwise + d Increase CCWise rotational velocity + f Increase clockwise rotational velocity + o Up Arrow Thrust + p Control Fire + ` Down Arrow Shields + space Hyperspace + s Start new ship in center of playing field + (Also used to start a new game) + esc Pause + Q Quit +.ft R Speed commands: Key associated with faster speed is to the right of its - corresponding key associated with slower speed. +corresponding key associated with slower speed. - . Decrease delay: Speed game up - , Increase delay: Slow the game down - m Decrease size ("Minimize") - n Increase size - b Increase # of moves/frame - v Decrease # of moves/frame - 2 Increase scale of movement - 1 Decrease scale of movement +.ft CW + . Decrease delay: Speed game up + , Increase delay: Slow the game down + m Decrease size ("Minimize") + n Increase size + b Increase # of moves/frame + v Decrease # of moves/frame + 2 Increase scale of movement + 1 Decrease scale of movement Object Score - Big asteroid 25, or 2000*level if it is the last asteroid remaining - Medium asteroid 50, or 500*level if it is the last asteroid remaining + Big asteroid 25, or + 2000*level if last asteroid remaining + Medium asteroid 50, or + 500*level if last asteroid remaining Little asteroid 100 Enemy spaceship 500 Enemy bullet 500 +.ft R Commands can only be entered when the mouse pointer is in the asteroids window. Resize the window with your window manager at any time for a different playing field. - -.SH OPTIONS -.I xasteroids [-s] --s Display high scores without running game. .PP .SH AUTHOR Phil Goetz .br goetz@cs.Buffalo.EDU .SH CONTRIBUTORS -Peter Phillips pphillip@cs.ubc.ca -Pat Ryan pat@jaameri.gsfc.nasa.gov -Craig Smith csmith@cscs.UUCP -Doug Merritt doug@netcom.com -James Berg berg@plains (makefile) -Chris Moore moore@src.bae.co.uk (hi score script) -David Partain dlp@ida.liu.se (original man page) +Peter Phillips +.br +Pat Ryan +.br +Craig Smith +.br +Doug Merritt +.br +Stephen McCamant +.br +James Berg (makefile) +.br +Chris Moore (hi score script) +.br +David Partain (original man page) diff --git a/games/xasteroids/pkg-descr b/games/xasteroids/pkg-descr index 18a70457fc90..c2d9e4a2ca33 100644 --- a/games/xasteroids/pkg-descr +++ b/games/xasteroids/pkg-descr @@ -1,2 +1,12 @@ X11 based asteroids style arcade game. Make big rocks into little ones. + +This port is based on version 5.0 of xasteroids. +The following changes have been made: + + - Improved cursor-hiding. + - Arrow keys. + - ANSI-C cleanups. + - Use usleep() instead of a delay loop, when available. + - Add prototypes. + - Reformat man page.