/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* pacman --- Mr. Pacman and his ghost friends */
-#if !defined( lint ) && !defined( SABER )
+#if 0
static const char sccsid[] = "@(#)pacman.c 5.00 2000/11/01 xlockmore";
-
#endif
/*-
# define UNIFORM_COLORS
# define BRIGHT_COLORS
+# define release_pacman 0
# define pacman_handle_event 0
# include "xlockmore.h" /* in xscreensaver distribution */
# include <assert.h>
# include "images/pacman/pacman-ds8.xpm"
#endif
+#if 0
static const struct
{
int dx, dy;
{ 0, 1},
{ 1, 0},
{ 0, -1}};
+#endif
#ifdef DISABLE_INTERACTIVE
ENTRYPOINT ModeSpecOpt pacman_opts = {
"pacman", /* *cmdline_arg; */
"init_pacman", /* *init_name; */
"draw_pacman", /* *callback_name; */
- "release_pacman", /* *release_name; */
+ (char *) NULL, /* *release_name; */
"refresh_pacman", /* *refresh_name; */
"change_pacman", /* *change_name; */
- (char *) NULL, /* *unused_name; */
+ "free_pacman", /* *free_name; */
&pacman_opts, /* *msopts */
10000, 4, 1, 0, 64, 1.0, "", "Shows Pacman(tm)", 0, NULL
};
static void drawlevel (ModeInfo * mi);
-static void
-free_pacman (Display * display, pacmangamestruct * pp)
+ENTRYPOINT void
+free_pacman (ModeInfo * mi)
{
+ Display * display = MI_DISPLAY (mi);
+ pacmangamestruct * pp = &pacman_games[MI_SCREEN (mi)];
int dir, mouth, i, j, k;
if (pp->ghosts != NULL) {
pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
unsigned int ghost;
- MI_CLEARWINDOW (mi);
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
drawlevel (mi);
pp->gamestate = GHOST_DANGER;
if (pp->ys % 2 == 1)
dy = -1;
-#ifndef HAVE_COCOA
+#ifndef HAVE_JWXYZ
XSetFillStyle (display, pp->stippledGC, FillSolid);
-#endif /* !HAVE_COCOA */
+#endif /* !HAVE_JWXYZ */
XSetLineAttributes (display, pp->stippledGC, pp->wallwidth,
LineSolid, CapRound, JoinMiter);
Display *display = MI_DISPLAY (mi);
Window window = MI_WINDOW (mi);
pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
- unsigned int dir;
pp->pacman.cf = pp->pacman.col * pp->xs + pp->pacman.delta.x *
pp->pacman.cfactor + pp->xb + pp->spritedx;
pp->pacman.rf = pp->pacman.row * pp->ys + pp->pacman.delta.y *
pp->pacman.rfactor + pp->yb + pp->spritedy;
- dir = (ABS (pp->pacman.cfactor) * (2 - pp->pacman.cfactor) +
- ABS (pp->pacman.rfactor) * (1 + pp->pacman.rfactor)) % 4;
-
XSetForeground (display, pp->stippledGC, MI_BLACK_PIXEL (mi));
if (pp->pacman.oldcf != NOWHERE && pp->pacman.oldrf != NOWHERE) {
end = dheight * yscale;
/* Scale height of temp into dest pixmap */
for (i = 0; i <= end; i += yscale)
- XCopyArea (*dpy, temp, dest, gc, 0, i, swidth, 1, 0, j++);
+ XCopyArea (*dpy, temp, dest, gc, 0, i, dwidth, 1, 0, j++);
XFreePixmap (*dpy, temp);
return (Pixmap) dest;
{
Display *display = MI_DISPLAY (mi);
Window window = MI_WINDOW (mi);
- int size = MI_SIZE (mi);
+ long size = MI_SIZE (mi);
pacmangamestruct *pp;
XGCValues gcv;
int i, j, k;
int dir, mouth;
#endif
- if (pacman_games == NULL) {
- if ((pacman_games = (pacmangamestruct *)
- calloc ((size_t) MI_NUM_SCREENS (mi),
- sizeof (pacmangamestruct))) == NULL)
- return;
- }
+ MI_INIT (mi, pacman_games);
pp = &pacman_games[MI_SCREEN (mi)];
pp->width = (unsigned short) MI_WIDTH (mi);
if (size == 0 ||
MINGRIDSIZE * size > (int) pp->width ||
MINGRIDSIZE * size > (int) pp->height) {
-
- pp->ys = pp->xs = MAX (MIN (pp->width / LEVWIDTH,
- pp->height / LEVHEIGHT), 1);
+ double scale = MIN (pp->width / LEVWIDTH, pp->height / LEVHEIGHT);
+
+ if (pp->width > pp->height * 5 || /* weird window aspect ratio */
+ pp->height > pp->width * 5)
+ scale = 0.8 * (pp->width / pp->height
+ ? pp->width / (double) pp->height
+ : pp->height / (double) pp->width);
+ pp->ys = MAX (scale, 1);
+ pp->xs = pp->ys;
}
else {
if (size < -MINSIZE)
pp->xs = pp->ys;
}
+
pp->wallwidth = (unsigned int) (pp->xs + pp->ys) >> 4;
if (pp->wallwidth < 1)
pp->wallwidth = 1;
if ((pp->stippledGC = XCreateGC (display, window,
GCForeground | GCBackground,
&gcv)) == None) {
- free_pacman (display, pp);
+ free_pacman (mi);
return;
}
}
-#ifdef HAVE_COCOA
+#ifdef HAVE_JWXYZ
jwxyz_XSetAntiAliasing (display, pp->stippledGC, False);
#endif
if ((pp->ghostPixmap[0][0][0] = XCreatePixmap (display, window,
pp->spritexs, pp->spriteys,
1)) == None) {
- free_pacman (display, pp);
+ free_pacman (mi);
return;
}
gcv.background = 1;
if ((bg_gc = XCreateGC (display, pp->ghostPixmap[0][0][0],
GCForeground | GCBackground, &gcv)) == None) {
- free_pacman (display, pp);
+ free_pacman (mi);
return;
}
if ((fg_gc = XCreateGC (display, pp->ghostPixmap[0][0][0],
GCForeground | GCBackground, &gcv)) == None) {
XFreeGC (display, bg_gc);
- free_pacman (display, pp);
+ free_pacman (mi);
return;
}
if ((pp->pacmanPixmap[dir][mouth] =
XCreatePixmap (display, MI_WINDOW (mi), pp->spritexs,
pp->spriteys, 1)) == None) {
- free_pacman (display, pp);
+ free_pacman (mi);
return;
}
gcv.foreground = 1;
if ((fg_gc = XCreateGC (display, pp->pacmanPixmap[dir][mouth],
GCForeground | GCBackground,
&gcv)) == None) {
- free_pacman (display, pp);
+ free_pacman (mi);
return;
}
gcv.foreground = 0;
GCForeground |
GCBackground, &gcv)) == None) {
XFreeGC (display, fg_gc);
- free_pacman (display, pp);
+ free_pacman (mi);
return;
}
XFillRectangle (display,
if ((pp->ghosts = (ghoststruct *) calloc ((size_t) pp->nghosts,
sizeof (ghoststruct))) ==
NULL) {
- free_pacman (display, pp);
+ free_pacman (mi);
return;
}
pp->pacman.mouthstage = MAXMOUTH - 1;
- MI_CLEARWINDOW (mi);
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
repopulate (mi);
}
pacman_tick (mi);
}
-/* Releases resources. */
-ENTRYPOINT void
-release_pacman (ModeInfo * mi)
-{
- if (pacman_games != NULL) {
- int screen;
-
- for (screen = 0; screen < MI_NUM_SCREENS (mi); screen++)
- free_pacman (MI_DISPLAY (mi), &pacman_games[screen]);
- free (pacman_games);
- pacman_games = (pacmangamestruct *) NULL;
- }
-}
-
+#ifndef STANDALONE
/* Refresh current level. */
ENTRYPOINT void
refresh_pacman (ModeInfo * mi)
drawlevel (mi);
pacman_tick (mi);
}
+#endif
ENTRYPOINT void
reshape_pacman(ModeInfo * mi, int width, int height)
{
pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
- pp->width = width;
+ pp->width = width;
pp->height = height;
- MI_CLEARWINDOW (mi);
+ pp->xb = (pp->width - pp->ncols * pp->xs) >> 1;
+ pp->yb = (pp->height - pp->nrows * pp->ys) >> 1;
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
/* repopulate (mi); */
drawlevel (mi);
}
ENTRYPOINT void
change_pacman (ModeInfo * mi)
{
- MI_CLEARWINDOW (mi);
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
repopulate (mi);
}
#endif /* !STANDALONE */