You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.5 KiB
148 lines
3.5 KiB
#include "pacman.h"
|
|
#include "board.h"
|
|
|
|
Pacman::Pacman(Board *b)
|
|
{
|
|
board = b;
|
|
setDemo(FALSE);
|
|
setAlive(0);
|
|
actualPosition = lastPosition = OUT;
|
|
mouthPosition = 0;
|
|
lastPix = 0;
|
|
maxPixmaps = 0;
|
|
}
|
|
|
|
void Pacman::setMaxPixmaps(int max)
|
|
{
|
|
if (actualDirection == X && lastPix >= 0) {
|
|
actualDirection = lastPix / (maxPixmaps/4);
|
|
if (max < maxPixmaps)
|
|
mouthPosition = 0;
|
|
else
|
|
mouthPosition = lastPix % (maxPixmaps/4);
|
|
maxPixmaps = max;
|
|
|
|
lastPix = pix();
|
|
|
|
actualDirection = X;
|
|
} else
|
|
maxPixmaps = max;
|
|
}
|
|
|
|
void Pacman::setAlive(int ticks)
|
|
{
|
|
actualState = alive;
|
|
pauseDuration = ticks;
|
|
pause = 0;
|
|
}
|
|
|
|
void Pacman::setPosition(int pos)
|
|
{
|
|
board->reset(lastPosition, pacman);
|
|
actualPosition = lastPosition = pos;
|
|
board->set(actualPosition, pacman);
|
|
mouthPosition = 0;
|
|
}
|
|
|
|
void Pacman::setDirection(int dir, bool forced)
|
|
{
|
|
if (forced ||
|
|
board->isWay(actualPosition, dir, empty) ||
|
|
board->isWay(actualPosition, dir, tunnel)) {
|
|
if (dir == X)
|
|
lastPix = pix();
|
|
actualDirection = dir;
|
|
nextDirection = X;
|
|
} else
|
|
nextDirection = dir;
|
|
}
|
|
|
|
void Pacman::setDemo(bool yes)
|
|
{
|
|
demo = yes;
|
|
}
|
|
|
|
pacmanState Pacman::state()
|
|
{
|
|
return actualState;
|
|
}
|
|
|
|
int Pacman::position()
|
|
{
|
|
return actualPosition;
|
|
}
|
|
|
|
int Pacman::direction()
|
|
{
|
|
return actualDirection;
|
|
}
|
|
|
|
bool Pacman::move()
|
|
{
|
|
if (pause-- > 0)
|
|
return FALSE;
|
|
else
|
|
pause = pauseDuration;
|
|
|
|
if (actualDirection == X || actualPosition == OUT)
|
|
return FALSE;
|
|
|
|
lastPosition = actualPosition;
|
|
|
|
if (demo) {
|
|
int d = actualDirection;
|
|
|
|
do // try new direction, but not the opposite
|
|
d = rand() % 4; // direction, to prevent hectic movement.
|
|
while (d == board->turn(actualDirection));
|
|
|
|
while (!board->isWay(actualPosition, d, empty) &&
|
|
!board->isWay(actualPosition, d, tunnel)) {
|
|
if (d != actualDirection) // if new actualDirection is not possible,
|
|
d = actualDirection; // try current actualDirection first.
|
|
else
|
|
d = rand() % 4;
|
|
}
|
|
|
|
actualDirection = d;
|
|
actualPosition = board->move(actualPosition, actualDirection);
|
|
|
|
} else {
|
|
|
|
if (nextDirection != X)
|
|
if (board->isWay(actualPosition, nextDirection, empty) ||
|
|
board->isWay(actualPosition, nextDirection, tunnel)) {
|
|
actualDirection = nextDirection;
|
|
nextDirection = X;
|
|
}
|
|
|
|
if (board->isWay(actualPosition, actualDirection, empty) ||
|
|
board->isWay(actualPosition, actualDirection, tunnel))
|
|
actualPosition = board->move(actualPosition, actualDirection);
|
|
}
|
|
|
|
if (actualPosition != lastPosition) {
|
|
board->reset(lastPosition, pacman);
|
|
board->set(actualPosition, pacman);
|
|
|
|
if (++mouthPosition >= (maxPixmaps/4))
|
|
mouthPosition = 0;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
int Pacman::pix()
|
|
{
|
|
if (actualPosition != OUT && maxPixmaps > 0)
|
|
switch (actualDirection) {
|
|
case N : return ((maxPixmaps/4)*0)+mouthPosition;
|
|
case E : return ((maxPixmaps/4)*1)+mouthPosition;
|
|
case S : return ((maxPixmaps/4)*2)+mouthPosition;
|
|
case W : return ((maxPixmaps/4)*3)+mouthPosition;
|
|
case X : return lastPix;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|