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/fruit.cpp

177 lines
4.3 KiB

#include <stdlib.h>
#include "fruit.h"
Fruit::Fruit(Board *b)
{
board = b;
maxPixmaps = 0;
setLevel(0, 0, 0, 0);
}
void Fruit::setEaten(int duration)
{
actualState = eaten;
timeLeft = duration;
actualDirection = X;
}
void Fruit::setLevel(int level, int wDuration, int fDuration, int ticks)
{
actualLevel = level;
waitDuration = wDuration;
fruitDuration = fDuration;
pauseDuration = ticks;
pause = 0;
actualState = inactive;
timeLeft = waitDuration;
lastPosition = OUT;
setPosition(OUT);
setMovement(OUT, OUT, 0);
actualDirection = X;
setMaxPixmaps(maxPixmaps);
}
void Fruit::setMaxPixmaps(int max)
{
maxPixmaps = max;
if (actualLevel-1 < maxPixmaps)
actualPix = actualLevel == 0 ? 0 : actualLevel-1;
else if (maxPixmaps > 0)
actualPix = rand() % maxPixmaps;
else
actualPix = -1;
}
void Fruit::setMovement(int entry, int tunnel, int iq)
{
homePosition = board->position(fruithome);
entryPosition = entry;
tunnelPosition = tunnel;
IQ = iq;
}
void Fruit::setPosition(int pos)
{
board->reset(lastPosition, fruit);
actualPosition = lastPosition = pos;
board->set(actualPosition, fruit);
}
void Fruit::setDirection(int dir)
{
actualDirection = dir;
}
fruitState Fruit::state()
{
return actualState;
}
int Fruit::position()
{
return actualPosition;
}
int Fruit::direction()
{
return actualDirection;
}
bool Fruit::move(bool activate)
{
if (timeLeft > 0) {
timeLeft--;
}
if (actualDirection == X || actualState == inactive) {
if (timeLeft == 0 || (activate && actualState == inactive)) {
if (actualState == inactive) {
if (entryPosition == OUT || tunnelPosition == OUT) {
setPosition(board->position(fruithome));
} else {
setPosition(entryPosition);
actualDirection = 0;
while (!board->isWay(actualPosition, actualDirection, empty) ||
board->isJump(actualPosition, actualDirection))
actualDirection++;
}
timeLeft = fruitDuration;
setMaxPixmaps(maxPixmaps);
actualState = active;
} else {
actualState = inactive;
setPosition(OUT);
timeLeft = waitDuration;
actualDirection = X;
}
return TRUE;
}
return FALSE;
}
if (pause-- > 0)
return FALSE;
else
pause = pauseDuration;
if (actualPosition == OUT)
return FALSE;
if (actualDirection == X)
return TRUE;
int d = actualDirection;
if (rand() % (int) ((190-IQ)/10) == 0)
if (timeLeft > 0) // coming home or leaving again
d = board->closeup(actualPosition, d, homePosition);
else
d = board->closeup(actualPosition, d, tunnelPosition);
else
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)) ||
d == board->turn(actualDirection)) {
if (d != actualDirection) // if new direction is not possible,
d = actualDirection; // try current direction first.
else
d = rand() % 4;
}
actualDirection = d;
actualPosition = board->move(actualPosition, actualDirection);
if (actualPosition == homePosition) {
timeLeft = 0;
}
if (board->isTunnel(actualPosition)) {
setPosition(OUT);
timeLeft = waitDuration;
actualState = inactive;
actualDirection = X;
if (board->tunnels() > 0) {
entryPosition = board->position(tunnel, rand() % board->tunnels());
tunnelPosition = board->position(tunnel, rand() % board->tunnels());
}
}
if (actualPosition != lastPosition) {
setPosition(actualPosition);
}
return TRUE;
}
int Fruit::pix()
{
if (actualPosition == OUT || actualState == inactive)
return -1;
else
return actualPix;
}