/* -*- 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 "pacman.h"
#include "pacman_ai.h"
#include "pacman_level.h"
-
-#if defined(USE_PIXMAP) /* computed in pacman.h */
-# include "images/pacman/ghost-u1.xpm"
-# include "images/pacman/ghost-u2.xpm"
-# include "images/pacman/ghost-r1.xpm"
-# include "images/pacman/ghost-r2.xpm"
-# include "images/pacman/ghost-l1.xpm"
-# include "images/pacman/ghost-l2.xpm"
-# include "images/pacman/ghost-d1.xpm"
-# include "images/pacman/ghost-d2.xpm"
-/* Used to clean up the dust left by wag. */
-# include "images/pacman/ghost-mask.xpm"
-# include "images/pacman/pacman-u1.xpm"
-# include "images/pacman/pacman-u2.xpm"
-# include "images/pacman/pacman-r1.xpm"
-# include "images/pacman/pacman-r2.xpm"
-# include "images/pacman/pacman-l1.xpm"
-# include "images/pacman/pacman-l2.xpm"
-# include "images/pacman/pacman-d1.xpm"
-# include "images/pacman/pacman-d2.xpm"
-# include "images/pacman/pacman-0.xpm"
-# include "images/pacman/ghost-s1.xpm"
-# include "images/pacman/ghost-s2.xpm"
-# include "images/pacman/ghost-sf1.xpm"
-# include "images/pacman/ghost-sf2.xpm"
-# include "images/pacman/eyes-l.xpm"
-# include "images/pacman/eyes-r.xpm"
-# include "images/pacman/eyes-u.xpm"
-# include "images/pacman/eyes-d.xpm"
-# include "images/pacman/pacman-ds1.xpm"
-# include "images/pacman/pacman-ds2.xpm"
-# include "images/pacman/pacman-ds3.xpm"
-# include "images/pacman/pacman-ds4.xpm"
-# include "images/pacman/pacman-ds5.xpm"
-# include "images/pacman/pacman-ds6.xpm"
-# include "images/pacman/pacman-ds7.xpm"
-# include "images/pacman/pacman-ds8.xpm"
-#endif
-
-static const struct
-{
- int dx, dy;
-} dirvecs[DIRVECS] = { { -1, 0},
- { 0, 1},
- { 1, 0},
- { 0, -1}};
+#include "images/gen/pacman_png.h"
#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;
char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
char *s = NULL;
- font = XLoadQueryFont (display, f_name);
+ font = load_font_retry (display, f_name);
assert (font != NULL);
s = (char *) malloc (256);
char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
char *s = NULL;
- font = XLoadQueryFont (display, f_name);
+ font = load_font_retry (display, f_name);
assert (font != NULL);
s = (char *) malloc (256);
XFontStruct *font = NULL;
char *f_name = "-*-utopia-*-r-*-*-*-600-*-*-p-*-*-*";
- font = XLoadQueryFont (display, f_name);
+ font = load_font_retry (display, f_name);
assert (font != NULL);
assert (s != NULL);
{
pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
if (pp->xs > 32){
- *w = *h = (pp->xs / 32 );
+ *w = *h = (pp->xs / 16 );
}else {
*w = *h = 1;
}
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);
/* Draws the pacman sprite, removing the previous location. */
-#if defined(USE_PIXMAP)
static void
draw_pacman_sprite (ModeInfo * mi)
}
}
-#else /* USE_PIXMAP */
-
-/* Draws the pacman sprite, removing the previous location. */
-static void
-draw_pacman_sprite (ModeInfo * mi)
-{
- 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) {
-
- ERASE_IMAGE (display, window, pp->stippledGC,
- pp->pacman.cf, pp->pacman.rf,
- pp->pacman.oldcf, pp->pacman.oldrf,
- pp->spritexs, pp->spriteys);
- }
-
- if (MI_NPIXELS (mi) > 2)
- XSetForeground (display, pp->stippledGC, MI_PIXEL (mi, YELLOW));
- else
- XSetForeground (display, pp->stippledGC, MI_WHITE_PIXEL (mi));
-
- XSetFillStyle (display, pp->stippledGC, FillOpaqueStippled);
-
- if (pp->xs < 2 || pp->ys < 2)
- XDrawPoint (display, window, pp->stippledGC,
- pp->pacman.cf, pp->pacman.rf);
- else
- XFillRectangle (display, window, pp->stippledGC,
- pp->pacman.cf, pp->pacman.rf,
- pp->spritexs, pp->spriteys);
- pp->pacman.mouthstage += pp->pacman.mouthdirection;
- if ((pp->pacman.mouthstage >= MAXMOUTH) || (pp->pacman.mouthstage < 0)) {
- pp->pacman.mouthdirection *= -1;
- pp->pacman.mouthstage += pp->pacman.mouthdirection * 2;
- }
- pp->pacman.oldcf = pp->pacman.cf;
- pp->pacman.oldrf = pp->pacman.rf;
-}
-
-/* Draws a ghost sprite, removing the previous sprite and restores the level. */
-static void
-draw_ghost_sprite (ModeInfo * mi, const unsigned ghost)
-{
- Display *display = MI_DISPLAY (mi);
- Window window = MI_WINDOW (mi);
- pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
-
- pp->ghosts[ghost].cf =
- pp->ghosts[ghost].col * pp->xs + pp->ghosts[ghost].delta.x *
- pp->ghosts[ghost].cfactor + pp->xb + pp->spritedx;
- pp->ghosts[ghost].rf =
- pp->ghosts[ghost].row * pp->ys + pp->ghosts[ghost].delta.y *
- pp->ghosts[ghost].rfactor + pp->yb + pp->spritedy;
-
- XSetForeground (display, pp->stippledGC, MI_BLACK_PIXEL (mi));
- XFillRectangle (display,
- window,
- pp->stippledGC,
- pp->ghosts[ghost].cf,
- pp->ghosts[ghost].rf, pp->spritexs, pp->spriteys);
-
- if (pp->ghosts[ghost].oldcf != NOWHERE ||
- pp->ghosts[ghost].oldrf != NOWHERE) {
-
- ERASE_IMAGE (display, window, pp->stippledGC,
- pp->ghosts[ghost].cf, pp->ghosts[ghost].rf,
- pp->ghosts[ghost].oldcf, pp->ghosts[ghost].oldrf,
- pp->spritexs, pp->spriteys);
- }
-
- drawlevelblock (mi, pp,
- (unsigned int) pp->ghosts[ghost].col,
- (unsigned int) pp->ghosts[ghost].row);
-
- if (MI_NPIXELS (mi) > 2)
- XSetForeground (display, pp->stippledGC, MI_PIXEL (mi, GREEN));
- else
- XSetForeground (display, pp->stippledGC, MI_WHITE_PIXEL (mi));
-
- XSetFillStyle (display, pp->stippledGC, FillOpaqueStippled);
-
- if (pp->xs < 2 || pp->ys < 2)
- XDrawPoint (display, window, pp->stippledGC,
- pp->ghosts[ghost].cf, pp->ghosts[ghost].rf);
- else
- XFillRectangle (display,
- window,
- pp->stippledGC,
- pp->ghosts[ghost].cf,
- pp->ghosts[ghost].rf, pp->spritexs, pp->spriteys);
-
- pp->ghosts[ghost].oldcf = pp->ghosts[ghost].cf;
- pp->ghosts[ghost].oldrf = pp->ghosts[ghost].rf;
-}
-#endif /* USE_PIXMAP */
static int
ghost_over (ModeInfo * mi, int x, int y)
/* CODE TO LOAD AND SCALE THE PIXMAPS
*/
-#if defined(USE_PIXMAP)
/* Grabbed the scaling routine off of usenet.
* Changed it so that the information specific
* to the source pixmap does not have to be a parameter.
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;
}
-static void
-pacman_fail (char *s)
+static Pixmap
+subpixmap (Display *dpy, Window window, Pixmap src,
+ int w, int h, int y, int depth)
{
- fprintf (stderr, "%s: %s\n", progname, s);
- exit (1);
+ XGCValues gcv;
+ Pixmap dest = XCreatePixmap (dpy, window, w, h, depth);
+ GC gc = XCreateGC (dpy, src, 0, &gcv);
+ XCopyArea (dpy, src, dest, gc, 0, y, w, h, 0, 0);
+ XFreeGC (dpy, gc);
+ return dest;
}
+
/* Load the ghost pixmaps and their mask. */
static void
-load_ghost_pixmaps (Display ** dpy, Window window, pacmangamestruct ** ps)
+load_pixmaps (Display ** dpy, Window window, pacmangamestruct ** ps)
{
pacmangamestruct *pp = *ps;
Display *display = *dpy;
- char *colors[] = {
- ". c #FF0000", /*Red */
- ". c #00FFDE", /*Blue */
- ". c #FFB847", /*Orange */
- ". c #FFB8DE", /*Pink */
- };
-
- char **bits[] = {
- ghost_u1_xpm, ghost_u2_xpm, ghost_r1_xpm, ghost_r2_xpm,
- ghost_d1_xpm, ghost_d2_xpm, ghost_l1_xpm, ghost_l2_xpm
- };
- char * const *s_bits[] = {
- ghost_s1_xpm, ghost_s2_xpm,
- ghost_sf1_xpm, ghost_sf2_xpm
- };
- char * const *e_bits[] = {
- eyes_u_xpm, eyes_r_xpm, eyes_d_xpm, eyes_l_xpm
- };
-
- int i, j, k, m;
- int w = pp->spritexs;
- int h = pp->spriteys;
+ Pixmap sprites, sprites_mask;
+ int i, j, k, m, sw, sh, srcy;
+/* int w = pp->spritexs;
+ int h = pp->spriteys;*/
GC gc = 0;
- Pixmap temp;
+/* Pixmap temp;*/
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes (display, window, &xgwa);
+
+ sprites = image_data_to_pixmap (display, window,
+ pacman_png, sizeof(pacman_png), &sw, &sh,
+ &sprites_mask);
+ if (!sprites || !sprites_mask) abort();
+
+ srcy = 0;
+
+ gc = XCreateGC (display, sprites_mask, 0, &gcv);
+
+ pp->ghostMask = subpixmap (display, window, sprites_mask,
+ sw, sw, srcy, 1);
+ pp->ghostMask = scale_pixmap (&display, gc, pp->ghostMask,
+ pp->spritexs, pp->spriteys);
for (i = 0; i < 4; i++) {
m = 0;
for (j = 0; j < MAXGDIR; j++) {
for (k = 0; k < MAXGWAG; k++) {
- bits[m][2] = colors[i];
pp->ghostPixmap[i][j][k] =
- xpm_data_to_pixmap (display, window, bits[m], &w, &h,
- &pp->ghostMask);
-
- if (!pp->ghostPixmap[i][j][k])
- pacman_fail ("Cannot load ghost images");
-
+ subpixmap (display, window, sprites, sw, sw, srcy,
+ xgwa.depth);
pp->ghostPixmap[i][j][k] =
scale_pixmap (&display, pp->stippledGC,
pp->ghostPixmap[i][j][k], pp->spritexs,
pp->spriteys);
-
- if (!pp->ghostPixmap[i][j][k])
- pacman_fail ("Cannot scale ghost images");
m++;
+ srcy += sw;
+ if (srcy >= sh) abort();
}
}
}
+
/* load the scared ghost */
m = 0;
for (i = 0; i < MAXGFLASH; i++) {
for (j = 0; j < MAXGWAG; j++) {
pp->s_ghostPixmap[i][j] =
- xpm_data_to_pixmap (display, window, s_bits[m++], &w, &h,
- &pp->ghostMask);
-
- if (!pp->s_ghostPixmap[i][j])
- pacman_fail ("Cannot Scare Ghost images");
+ subpixmap (display, window, sprites, sw, sw, srcy,
+ xgwa.depth);
+ m++;
pp->s_ghostPixmap[i][j] = scale_pixmap (&display, pp->stippledGC,
pp->s_ghostPixmap[i][j],
pp->spritexs,
pp->spriteys);
-
- if (!pp->s_ghostPixmap[i][j])
- pacman_fail ("Cannot scale Scared Ghost images");
+ srcy += sw;
+ if (srcy >= sh) abort();
}
}
+
/* load the ghost eyes */
for (i = 0; i < MAXGDIR; i++) {
pp->ghostEyes[i] =
- xpm_data_to_pixmap (display, window, e_bits[i], &w, &h,
- &pp->ghostMask);
-
- if (!pp->ghostEyes[i])
- pacman_fail ("Cannot open ghost eye images");
-
+ subpixmap (display, window, sprites, sw, sw, srcy, xgwa.depth);
pp->ghostEyes[i] = scale_pixmap (&display, pp->stippledGC,
pp->ghostEyes[i],
pp->spritexs,
pp->spriteys);
-
- if (!pp->ghostEyes[i])
- pacman_fail ("Cannot open ghost eye images");
+ srcy += sw;
+ if (srcy >= sh) abort();
}
-
- /* We really only need a single mask. This saves the headache of getting the
- * bottom of the ghost to clip just right. What we'll do is mask
- * the top portion of the ghost, but the bottom of the ghost will be solid.
- * I did this by setting the pixels between the fringe of their sheets
- * to black instead of none. -jeremy
- */
- temp = xpm_data_to_pixmap (display, window, ghost_mask_xpm,
- &w, &h, &pp->ghostMask);
-
- if (!temp)
- pacman_fail ("Cannot load temporary ghost image");
-
- temp = scale_pixmap (&display, pp->stippledGC,
- temp, pp->spritexs, pp->spriteys);
-
- if (!temp)
- pacman_fail ("Cannot scale temporary ghost image");
-
- gc = XCreateGC (display, pp->ghostMask, 0, 0);
-
- pp->ghostMask = scale_pixmap (&display, gc, pp->ghostMask,
- pp->spritexs, pp->spriteys);
- XFreePixmap (display, temp);
-}
-
-/* Load the pacman pixmaps and their mask. */
-static void
-load_pacman_pixmaps (Display ** dpy, Window window, pacmangamestruct ** ps)
-{
- pacmangamestruct *pp = *ps;
- Display *display = *dpy;
-
- char **bits[] = {
- pacman_0_xpm, pacman_u1_xpm, pacman_u2_xpm,
- pacman_0_xpm, pacman_r1_xpm, pacman_r2_xpm,
- pacman_0_xpm, pacman_d1_xpm, pacman_d2_xpm,
- pacman_0_xpm, pacman_l1_xpm, pacman_l2_xpm
- };
-
- char * const *ds_bits[] = {
- pacman_ds1_xpm, pacman_ds2_xpm, pacman_ds3_xpm, pacman_ds4_xpm,
- pacman_ds5_xpm, pacman_ds6_xpm, pacman_ds7_xpm, pacman_ds8_xpm
- };
-
- int i, j, m;
- int w = pp->spritexs;
- int h = pp->spriteys;
- GC gc = 0;
+ /* Load the pacman pixmaps and their mask. */
m = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < MAXMOUTH; j++) {
pp->pacmanPixmap[i][j] =
- xpm_data_to_pixmap (display, window, bits[m++], &w, &h,
- &pp->pacmanMask[i][j]);
-
- if (!pp->pacmanPixmap[i][j])
- pacman_fail ("Cannot load pacman pixmap.");
-
+ subpixmap (display, window, sprites, sw, sw, srcy,
+ xgwa.depth);
+ pp->pacmanMask[i][j] =
+ subpixmap (display, window, sprites_mask, sw, sw, srcy, 1);
+ m++;
pp->pacmanPixmap[i][j] = scale_pixmap (&display, pp->stippledGC,
pp->pacmanPixmap[i][j],
pp->spritexs,
pp->spriteys);
-
- if (!pp->pacmanPixmap[i][j])
- pacman_fail ("Cannot scale pacman pixmap.");
-
- if (!gc)
- gc = XCreateGC (display, pp->pacmanMask[i][j], 0, 0);
-
pp->pacmanMask[i][j] =
scale_pixmap (&display, gc, pp->pacmanMask[i][j],
pp->spritexs, pp->spriteys);
+ srcy += sw;
+ if (srcy >= sh) abort();
}
}
/* Load pacman death sequence */
for ( i = 0; i < PAC_DEATH_FRAMES; i++ ){
+ if (srcy > sh - sw) abort();
pp->pacman_ds[i] =
- xpm_data_to_pixmap (display, window, ds_bits[i], &w, &h,
- &pp->pacman_ds_mask[i]);
-
- if (!pp->pacman_ds[i])
- pacman_fail ("Cannot load pacman death frame.");
+ subpixmap (display, window, sprites, sw, sw, srcy, xgwa.depth);
+ pp->pacman_ds_mask[i] =
+ subpixmap (display, window, sprites_mask, sw, sw, srcy, 1);
pp->pacman_ds[i] = scale_pixmap ( &display, pp->stippledGC,
pp->pacman_ds[i],
pp->spritexs,
pp->spriteys);
-
- if (!pp->pacman_ds[i])
- pacman_fail ("Cannot scale pixmap.");
-
- if (!gc)
- gc = XCreateGC (display, pp->pacman_ds_mask[i], 0, 0);
-
pp->pacman_ds_mask[i] =
scale_pixmap (&display, gc, pp->pacman_ds_mask[i],
pp->spritexs, pp->spriteys);
+ srcy += sw;
}
-
}
-#endif /* USE_PIXMAP */
+
/* Hook function, sets state to initial position. */
ENTRYPOINT void
{
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;
-#if (! defined( USE_PIXMAP ))
- GC fg_gc, bg_gc;
- XPoint points[9];
- 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 defined(USE_PIXMAP)
- load_ghost_pixmaps (&display, window, &pp);
- load_pacman_pixmaps (&display, window, &pp);
-#else
- if ((pp->ghostPixmap[0][0][0] = XCreatePixmap (display, window,
- pp->spritexs, pp->spriteys,
- 1)) == None) {
- free_pacman (display, pp);
- return;
- }
-
- gcv.foreground = 0;
- gcv.background = 1;
- if ((bg_gc = XCreateGC (display, pp->ghostPixmap[0][0][0],
- GCForeground | GCBackground, &gcv)) == None) {
- free_pacman (display, pp);
- return;
- }
-
- gcv.foreground = 1;
- gcv.background = 0;
- if ((fg_gc = XCreateGC (display, pp->ghostPixmap[0][0][0],
- GCForeground | GCBackground, &gcv)) == None) {
- XFreeGC (display, bg_gc);
- free_pacman (display, pp);
- return;
- }
-
-#define SETPOINT(p, xp, yp) p.x = xp; p.y = yp
-
- /* draw the triangles on the bottom (scalable) */
- SETPOINT (points[0], 1, pp->spriteys * 5 / 6);
- SETPOINT (points[1], pp->spritexs / 6, pp->spriteys);
- SETPOINT (points[2], pp->spritexs / 3, pp->spriteys * 5 / 6);
- SETPOINT (points[3], pp->spritexs / 2, pp->spriteys);
- SETPOINT (points[4], pp->spritexs * 2 / 3, pp->spriteys * 5 / 6);
- SETPOINT (points[5], pp->spritexs * 5 / 6, pp->spriteys);
- SETPOINT (points[6], pp->spritexs, pp->spriteys * 5 / 6);
- SETPOINT (points[7], pp->spritexs, pp->spriteys / 2);
- SETPOINT (points[8], 1, pp->spriteys / 2);
-
- XFillRectangle (display, pp->ghostPixmap[0][0][0], bg_gc,
- 0, 0, pp->spritexs, pp->spriteys);
- XFillArc (display, pp->ghostPixmap[0][0][0], fg_gc,
- 0, 0, pp->spritexs, pp->spriteys, 0, 11520);
- XFillPolygon (display, pp->ghostPixmap[0][0][0], fg_gc,
- points, 9, Nonconvex, CoordModeOrigin);
- XFreeGC (display, bg_gc);
- XFreeGC (display, fg_gc);
-
-
- if (pp->pacmanPixmap[0][0] != None)
- for (dir = 0; dir < 4; dir++)
- for (mouth = 0; mouth < MAXMOUTH; mouth++)
- XFreePixmap (display, pp->pacmanPixmap[dir]
- [mouth]);
-
- for (dir = 0; dir < 4; dir++)
- for (mouth = 0; mouth < MAXMOUTH; mouth++) {
- if ((pp->pacmanPixmap[dir][mouth] =
- XCreatePixmap (display, MI_WINDOW (mi), pp->spritexs,
- pp->spriteys, 1)) == None) {
- free_pacman (display, pp);
- return;
- }
- gcv.foreground = 1;
- gcv.background = 0;
- if ((fg_gc = XCreateGC (display, pp->pacmanPixmap[dir][mouth],
- GCForeground | GCBackground,
- &gcv)) == None) {
- free_pacman (display, pp);
- return;
- }
- gcv.foreground = 0;
- gcv.background = 0;
- if ((bg_gc = XCreateGC (display,
- pp->pacmanPixmap[dir][mouth],
- GCForeground |
- GCBackground, &gcv)) == None) {
- XFreeGC (display, fg_gc);
- free_pacman (display, pp);
- return;
- }
- XFillRectangle (display,
- pp->pacmanPixmap[dir][mouth], bg_gc,
- 0, 0, pp->spritexs, pp->spriteys);
- if (pp->spritexs == 1 && pp->spriteys == 1)
- XFillRectangle (display,
- pp->pacmanPixmap[dir][mouth],
- fg_gc, 0, 0, pp->spritexs, pp->spriteys);
- else
- XFillArc (display,
- pp->pacmanPixmap[dir][mouth],
- fg_gc,
- 0, 0, pp->spritexs, pp->spriteys,
- ((90 - dir * 90) + mouth * 5) * 64,
- (360 + (-2 * mouth * 5)) * 64);
- XFreeGC (display, fg_gc);
- XFreeGC (display, bg_gc);
- }
-#endif /* USE_PIXMAP */
+ load_pixmaps (&display, window, &pp);
pp->pacman.lastbox = START;
pp->pacman.mouthdirection = 1;
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)
pp->height = height;
pp->xb = (pp->width - pp->ncols * pp->xs) >> 1;
pp->yb = (pp->height - pp->nrows * pp->ys) >> 1;
- MI_CLEARWINDOW (mi);
+ 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 */