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.
177 lines
4.3 KiB
177 lines
4.3 KiB
4 years ago
|
#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;
|
||
|
}
|