+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*-
* Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
*
*
*/
+#ifndef __PACMAN_H__
+#define __PACMAN_H__
+
+#include "config.h"
+#include "xlockmoreI.h"
+
+#if defined(HAVE_GDK_PIXBUF) || defined(HAVE_XPM)
+#define USE_PIXMAP
+#include "xpm-pixmap.h"
+#else
+#if defined(USE_PIXMAP)
+#undef USE_PIXMAP
+#endif
+#endif
+
#define LEVHEIGHT 32U
#define LEVWIDTH 40U
#define SNB(v, n) ((v) |= (1 << (n)))
#define UNSNB(v, n) ((v) &= ~(1 << (n)))
#define GHOSTS 4U
+#if defined(USE_PIXMAP)
+#define MAXMOUTH 3
+#else
#define MAXMOUTH 11
+#endif
#define MAXGPOS 2
+#define MAXGDIR 4
+#define MAXGWAG 2
+#define MAXGFLASH 2
#define MINGRIDSIZE 4
#define MINSIZE 3
#define NOWHERE 16383
#define GETFACTOR(x, y) ((x) > (y) ? 1 : ((x) < (y) ? -1 : 0))
#define SIGN(x) GETFACTOR((x), 0)
#define TRACEVECS 40
+#define PAC_DEATH_FRAMES 8
+
+#define GHOST_TRACE ( LEVWIDTH * LEVHEIGHT )
+
+typedef struct
+{
+ int vx, vy;
+} tracevec_struct;
+
+typedef enum
+ { inbox = 0, goingout, randdir, chasing, hiding, goingin } GhostState;
+typedef enum
+ { ps_eating = 0, ps_chasing, ps_hiding, ps_random, ps_dieing } PacmanState;
+typedef enum
+{ GHOST_DANGER, GHOST_EATEN } GameState;
+
+typedef struct
+{
+ volatile unsigned int col, row;
+ unsigned int lastbox, nextcol, nextrow;
+ int dead;
+ int cfactor, rfactor;
+ int cf, rf;
+ int oldcf, oldrf;
+ volatile int timeleft;
+ GhostState aistate;
+ int speed;
+ XPoint delta;
+ XPoint err;
+ int flash_scared;
+ int trace_idx;
+ tracevec_struct trace[GHOST_TRACE];
+ int home_idx;
+ volatile int home_count;
+ tracevec_struct way_home[GHOST_TRACE];
+ volatile int wait_pos; /* a cycle before calculating the position */
+#if 0 /* Used for debugging */
+ int ndirs;
+ int oldndirs;
+#endif
+
+#if 0 /* Used for debugging */
+ char last_stat[1024];
+#endif
-#define DEF_TRACKMOUSE "False"
-static Bool trackmouse;
-
-typedef struct { int vx, vy; } tracevec_struct;
-
-typedef enum { inbox = 0, goingout, randdir, chasing, hiding } GhostState;
-typedef enum { ps_eating = 0, ps_chasing, ps_hiding, ps_random } PacmanState;
-typedef enum { GHOST_DANGER, GHOST_EATEN } GameState;
-
-typedef struct {
- unsigned int col, row;
- unsigned int lastbox, nextcol, nextrow;
- int dead;
- int cfactor, rfactor;
- int cf, rf;
- int oldcf, oldrf;
- int timeleft;
- GhostState aistate;
- /*int color; */
- int speed;
- XPoint delta;
- XPoint err;
} ghoststruct;
-typedef struct {
- unsigned int col, row;
- unsigned int lastbox, nextcol, nextrow;
- int mouthstage, mouthdirection;
- int cfactor, rfactor;
- int cf, rf;
- int oldcf, oldrf;
- int oldlx, oldly;
- int justate;
- PacmanState aistate;
- tracevec_struct trace[TRACEVECS];
- int cur_trace;
- int state_change;
- int roundscore;
- int speed;
- int lastturn;
- XPoint delta;
- XPoint err;
+typedef struct
+{
+ unsigned int col, row;
+ unsigned int lastbox, nextcol, nextrow;
+ int mouthstage, mouthdirection;
+ int cfactor, rfactor;
+ int cf, rf;
+ int oldcf, oldrf;
+ int oldlx, oldly;
+ int justate;
+ PacmanState aistate;
+ tracevec_struct trace[TRACEVECS];
+ int cur_trace;
+ int state_change;
+ int roundscore;
+ int speed;
+ int lastturn;
+ XPoint delta;
+ XPoint err;
+ int deaths;
+ int init_row;
} pacmanstruct;
-typedef struct {
- unsigned short width, height;
- unsigned short nrows, ncols;
- short xs, ys, xb, yb;
- short incx, incy;
- GC stippledGC;
- int graphics_format;
- pacmanstruct pacman;
- ghoststruct *ghosts;
- unsigned int nghosts;
- Pixmap pacmanPixmap[4][MAXMOUTH];
-/* Pixmap ghostPixmap[4][MAXGPOS];*/
- Pixmap ghostPixmap;
- char level[LEVHEIGHT * LEVWIDTH];
- unsigned int wallwidth;
- unsigned int dotsleft;
- int spritexs, spriteys, spritedx, spritedy;
-
- GameState gamestate;
- unsigned int timeleft;
+typedef struct
+{
+ unsigned short width, height;
+ unsigned short nrows, ncols;
+ short xs, ys, xb, yb;
+ short incx, incy;
+ GC stippledGC;
+ int graphics_format;
+ pacmanstruct pacman;
+ ghoststruct *ghosts;
+ unsigned int nghosts;
+ Pixmap pacmanPixmap[4][MAXMOUTH];
+ Pixmap pacmanMask[4][MAXMOUTH];
+ Pixmap pacman_ds[PAC_DEATH_FRAMES]; /* pacman death sequence */
+ Pixmap pacman_ds_mask[PAC_DEATH_FRAMES];
+ Pixmap ghostPixmap[4][MAXGDIR][MAXGWAG];
+ Pixmap ghostMask;
+ Pixmap s_ghostPixmap[MAXGFLASH][MAXGWAG]; /* Scared ghost Pixmaps */
+ Pixmap ghostEyes[MAXGDIR];
+ char level[LEVHEIGHT * LEVWIDTH];
+ unsigned int wallwidth;
+ unsigned int dotsleft;
+ int spritexs, spriteys, spritedx, spritedy;
+
+ GameState gamestate;
+ unsigned int timeleft;
} pacmangamestruct;
#define DIRVECS 4
-static const struct { int dx, dy; } dirvecs[DIRVECS] =
- { {-1, 0}, {0, 1}, {1, 0}, {0, -1}};
-static pacmangamestruct *pacmangames = (pacmangamestruct *) NULL;
+extern pacmangamestruct *pacmangames;
+extern Bool trackmouse;
typedef char lev_t[LEVHEIGHT][LEVWIDTH + 1];
-/* function type definitions */
-
- /* level generation */
-static int creatlevelblock(lev_t *level, const unsigned x,
- const unsigned y);
-static void setblockto(lev_t *level, const unsigned x, const unsigned y,
- const char c);
-static int checkset(lev_t *level, const unsigned x, const unsigned y);
-static int checksetout(lev_t *level, const unsigned x, const unsigned y);
-static int checkunsetdef(lev_t *level, const unsigned x, const unsigned y);
-static void clearlevel(lev_t *level);
-static void copylevel(char *dest, lev_t *level);
-static void createjail(lev_t *level, const unsigned width,
- const unsigned height);
-static void finishjail(lev_t *level, const unsigned width,
- const unsigned height);
-static int tryset(lev_t *level, const unsigned xpos, const unsigned ypos,
- const char *block);
-static int creatlevelblock(lev_t *level, const unsigned x,
- const unsigned y);
-static void filllevel(lev_t *level);
-static void frmtlevel(lev_t *level);
-static unsigned countdots(ModeInfo * mi);
-static int createnewlevel(ModeInfo * mi);
-static int check_pos(pacmangamestruct *pp, int y, int x, int ghostpass);
-static int check_dot(pacmangamestruct *pp, unsigned int x, unsigned int y);
-
- /* graphics rendering */
-static void drawlevel(ModeInfo * mi);
-
- /* AI */
-static int ghost_get_posdirs(pacmangamestruct *pp, int *posdirs,
- ghoststruct *g);
-static void ghost_random(pacmangamestruct *pp, ghoststruct *g);
-static void ghost_chasing(pacmangamestruct *pp, ghoststruct *g);
-static void ghost_hiding(pacmangamestruct *pp, ghoststruct *g);
-static void ghost_update(pacmangamestruct *pp, ghoststruct *g);
-
-static void pac_dot_vec(pacmangamestruct *pp, pacmanstruct *p,
- long *vx, long *vy);
-static int pac_ghost_prox_and_vector(pacmangamestruct *pp,
- pacmanstruct *p, int *vx, int *vy);
-static int pac_get_posdirs(pacmangamestruct *pp, pacmanstruct *p,
- int *posdirs);
-static void pac_clear_trace(pacmanstruct *p);
-static void pac_save_trace(pacmanstruct *p, const int vx, const int vy);
-static int pac_check_trace(const pacmanstruct *p, const int vx,
- const int vy);
-static void pac_eating(pacmangamestruct *pp, pacmanstruct *p);
-#if 0
-static void pac_chasing(pacmangamestruct *pp, pacmanstruct *p);
-#endif
-static void pac_random(pacmangamestruct *pp, pacmanstruct *p);
-static int pac_get_vector_screen(pacmangamestruct *pp, pacmanstruct *p,
- const int x, const int y, int *vx, int *vy);
-static int pac_trackmouse(ModeInfo * mi, pacmangamestruct *pp,
- pacmanstruct *p);
-static void pac_update(ModeInfo * mi, pacmangamestruct *pp,
- pacmanstruct *p);
-
- /* generic functions */
-static void repopulate(ModeInfo * mi);
+#define NUM_BONUS_DOTS 4
+
+#endif /* __PACMAN_H__ */