00001 #include <stdlib.h>
00002
00003 #include "fruit.h"
00004
00005 Fruit::Fruit(Board *b)
00006 {
00007 board = b;
00008 maxPixmaps = 0;
00009 setLevel(0, 0, 0, 0);
00010 }
00011
00012 void Fruit::setEaten(int duration)
00013 {
00014 actualState = eaten;
00015 timeLeft = duration;
00016 actualDirection = X;
00017 }
00018
00019 void Fruit::setLevel(int level, int wDuration, int fDuration, int ticks)
00020 {
00021 actualLevel = level;
00022 waitDuration = wDuration;
00023 fruitDuration = fDuration;
00024 pauseDuration = ticks;
00025 pause = 0;
00026 actualState = inactive;
00027 timeLeft = waitDuration;
00028 lastPosition = OUT;
00029 setPosition(OUT);
00030 setMovement(OUT, OUT, 0);
00031 actualDirection = X;
00032 setMaxPixmaps(maxPixmaps);
00033 }
00034
00035 void Fruit::setMaxPixmaps(int max)
00036 {
00037 maxPixmaps = max;
00038 if (actualLevel-1 < maxPixmaps)
00039 actualPix = actualLevel == 0 ? 0 : actualLevel-1;
00040 else if (maxPixmaps > 0)
00041 actualPix = rand() % maxPixmaps;
00042 else
00043 actualPix = -1;
00044 }
00045
00046 void Fruit::setMovement(int entry, int tunnel, int iq)
00047 {
00048 homePosition = board->position(fruithome);
00049 entryPosition = entry;
00050 tunnelPosition = tunnel;
00051 IQ = iq;
00052 }
00053
00054 void Fruit::setPosition(int pos)
00055 {
00056 board->reset(lastPosition, fruit);
00057 actualPosition = lastPosition = pos;
00058 board->set(actualPosition, fruit);
00059 }
00060
00061 void Fruit::setDirection(int dir)
00062 {
00063 actualDirection = dir;
00064 }
00065
00066 fruitState Fruit::state()
00067 {
00068 return actualState;
00069 }
00070
00071 int Fruit::position()
00072 {
00073 return actualPosition;
00074 }
00075
00076 int Fruit::direction()
00077 {
00078 return actualDirection;
00079 }
00080
00081 bool Fruit::move(bool activate)
00082 {
00083 if (timeLeft > 0) {
00084 timeLeft--;
00085 }
00086
00087 if (actualDirection == X || actualState == inactive) {
00088 if (timeLeft == 0 || (activate && actualState == inactive)) {
00089 if (actualState == inactive) {
00090 if (entryPosition == OUT || tunnelPosition == OUT) {
00091 setPosition(board->position(fruithome));
00092 } else {
00093 setPosition(entryPosition);
00094 actualDirection = 0;
00095 while (!board->isWay(actualPosition, actualDirection, empty) ||
00096 board->isJump(actualPosition, actualDirection))
00097 actualDirection++;
00098 }
00099 timeLeft = fruitDuration;
00100 setMaxPixmaps(maxPixmaps);
00101 actualState = active;
00102 } else {
00103 actualState = inactive;
00104 setPosition(OUT);
00105 timeLeft = waitDuration;
00106 actualDirection = X;
00107 }
00108 return TRUE;
00109 }
00110 return FALSE;
00111 }
00112
00113 if (pause-- > 0)
00114 return FALSE;
00115 else
00116 pause = pauseDuration;
00117
00118 if (actualPosition == OUT)
00119 return FALSE;
00120
00121 if (actualDirection == X)
00122 return TRUE;
00123
00124 int d = actualDirection;
00125
00126 if (rand() % (int) ((190-IQ)/10) == 0)
00127 if (timeLeft > 0)
00128 d = board->closeup(actualPosition, d, homePosition);
00129 else
00130 d = board->closeup(actualPosition, d, tunnelPosition);
00131 else
00132 do
00133 d = rand() % 4;
00134 while (d == board->turn(actualDirection));
00135
00136 while ((!board->isWay(actualPosition, d, empty) &&
00137 !board->isWay(actualPosition, d, tunnel)) ||
00138 d == board->turn(actualDirection)) {
00139 if (d != actualDirection)
00140 d = actualDirection;
00141 else
00142 d = rand() % 4;
00143 }
00144
00145 actualDirection = d;
00146 actualPosition = board->move(actualPosition, actualDirection);
00147
00148 if (actualPosition == homePosition) {
00149 timeLeft = 0;
00150 }
00151
00152 if (board->isTunnel(actualPosition)) {
00153 setPosition(OUT);
00154 timeLeft = waitDuration;
00155 actualState = inactive;
00156 actualDirection = X;
00157 if (board->tunnels() > 0) {
00158 entryPosition = board->position(tunnel, rand() % board->tunnels());
00159 tunnelPosition = board->position(tunnel, rand() % board->tunnels());
00160 }
00161 }
00162
00163 if (actualPosition != lastPosition) {
00164 setPosition(actualPosition);
00165 }
00166
00167 return TRUE;
00168 }
00169
00170 int Fruit::pix()
00171 {
00172 if (actualPosition == OUT || actualState == inactive)
00173 return -1;
00174 else
00175 return actualPix;
00176 }