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.
tdepacman/tdepacman/pacman.cpp

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;
}