Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

fruit.cpp

Go to the documentation of this file.
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)               // coming home or leaving again
00128             d = board->closeup(actualPosition, d, homePosition);
00129         else                    
00130             d = board->closeup(actualPosition, d, tunnelPosition);
00131     else
00132         do                              // try new direction, but not the opposite
00133             d = rand() % 4;             // direction, to prevent hectic movement.
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)       // if new direction is not possible,
00140             d = actualDirection;        // try current direction first.
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 }

Generated on Sat Nov 5 16:17:20 2005 for OPIE by  doxygen 1.4.2