/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /*- * Copyright (c) 2002 by Edwin de Jong . * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. * * Revision History: * 3-May-2002: Added AI to pacman and ghosts, slowed down ghosts. * 26-Nov-2001: Random level generator added * 01-Nov-2000: Allocation checks * 04-Jun-1997: Compatible with xscreensaver * */ #ifndef __PACMAN_H__ #define __PACMAN_H__ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "xlockmoreI.h" #include "ximage-loader.h" #define LEVHEIGHT 32U #define LEVWIDTH 40U #define TILEWIDTH 5U #define TILEHEIGHT 5U #define GETNB(n) ((1 << (n)) - 1) #define TESTNB(v, n) (((1 << (n)) & v) != 0x00) #define SNB(v, n) ((v) |= (1 << (n))) #define UNSNB(v, n) ((v) &= ~(1 << (n))) #define GHOSTS 4U #define MAXMOUTH 3 #define MAXGPOS 2 #define MAXGDIR 4 #define MAXGWAG 2 #define MAXGFLASH 2 #define MINGRIDSIZE 4 #define MINSIZE 3 #define NOWHERE 16383 #define START ((LRAND() & 1) ? 1 : 3) #define MINDOTPERC 10 #define YELLOW (MI_NPIXELS(mi) / 6) #define GREEN (23 * MI_NPIXELS(mi) / 64) #define BLUE (45 * MI_NPIXELS(mi) / 64) #define WHITE (MI_NPIXELS(mi)) #define LINEWIDTH 4 #define HLINEWIDTH 1 #define JAILHEIGHT 7 #define JAILWIDTH 8 #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 ) #define DIRVECS 4 #define NUM_BONUS_DOTS 4 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 } 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; int deaths; int init_row; } pacmanstruct; typedef struct { unsigned int x, y; int eaten; } bonus_dot; /* This are tiles which can be placed to create a level. */ struct tiles { char block[TILEWIDTH * TILEHEIGHT + 1]; unsigned dirvec[4]; unsigned ndirs; unsigned simular_to; }; 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; char last_pac_stat[1024]; /* draw_pacman_sprite */ int pm_mouth; int pm_mouth_delay; int pm_open_mouth; int pm_death_frame; int pm_death_delay; /* draw_ghost_sprite */ int gh_wag; int gh_wag_count; /* flash_bonus_dots */ int bd_flash_count; int bd_on; /* pacman_tick */ int ghost_scared_timer; int flash_timer; PacmanState old_pac_state; /* pacman_level.c */ bonus_dot bonus_dots[NUM_BONUS_DOTS]; struct tiles *tiles; } pacmangamestruct; extern pacmangamestruct *pacman_games; extern Bool pacman_trackmouse; typedef char lev_t[LEVHEIGHT][LEVWIDTH + 1]; #endif /* __PACMAN_H__ */