summaryrefslogtreecommitdiff
path: root/noncore/games/kpacman/fruit.cpp
Unidiff
Diffstat (limited to 'noncore/games/kpacman/fruit.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/games/kpacman/fruit.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/noncore/games/kpacman/fruit.cpp b/noncore/games/kpacman/fruit.cpp
new file mode 100644
index 0000000..e6ad2d5
--- a/dev/null
+++ b/noncore/games/kpacman/fruit.cpp
@@ -0,0 +1,176 @@
1#include <stdlib.h>
2
3#include "fruit.h"
4
5Fruit::Fruit(Board *b)
6{
7 board = b;
8 maxPixmaps = 0;
9 setLevel(0, 0, 0, 0);
10}
11
12void Fruit::setEaten(int duration)
13{
14 actualState = eaten;
15 timeLeft = duration;
16 actualDirection = X;
17}
18
19void Fruit::setLevel(int level, int wDuration, int fDuration, int ticks)
20{
21 actualLevel = level;
22 waitDuration = wDuration;
23 fruitDuration = fDuration;
24 pauseDuration = ticks;
25 pause = 0;
26 actualState = inactive;
27 timeLeft = waitDuration;
28 lastPosition = OUT;
29 setPosition(OUT);
30 setMovement(OUT, OUT, 0);
31 actualDirection = X;
32 setMaxPixmaps(maxPixmaps);
33}
34
35void Fruit::setMaxPixmaps(int max)
36{
37 maxPixmaps = max;
38 if (actualLevel-1 < maxPixmaps)
39 actualPix = actualLevel == 0 ? 0 : actualLevel-1;
40 else if (maxPixmaps > 0)
41 actualPix = rand() % maxPixmaps;
42 else
43 actualPix = -1;
44}
45
46void Fruit::setMovement(int entry, int tunnel, int iq)
47{
48 homePosition = board->position(fruithome);
49 entryPosition = entry;
50 tunnelPosition = tunnel;
51 IQ = iq;
52}
53
54void Fruit::setPosition(int pos)
55{
56 board->reset(lastPosition, fruit);
57 actualPosition = lastPosition = pos;
58 board->set(actualPosition, fruit);
59}
60
61void Fruit::setDirection(int dir)
62{
63 actualDirection = dir;
64}
65
66fruitState Fruit::state()
67{
68 return actualState;
69}
70
71int Fruit::position()
72{
73 return actualPosition;
74}
75
76int Fruit::direction()
77{
78 return actualDirection;
79}
80
81bool Fruit::move(bool activate)
82{
83 if (timeLeft > 0) {
84 timeLeft--;
85 }
86
87 if (actualDirection == X || actualState == inactive) {
88 if (timeLeft == 0 || (activate && actualState == inactive)) {
89 if (actualState == inactive) {
90 if (entryPosition == OUT || tunnelPosition == OUT) {
91 setPosition(board->position(fruithome));
92 } else {
93 setPosition(entryPosition);
94 actualDirection = 0;
95 while (!board->isWay(actualPosition, actualDirection, empty) ||
96 board->isJump(actualPosition, actualDirection))
97 actualDirection++;
98 }
99 timeLeft = fruitDuration;
100 setMaxPixmaps(maxPixmaps);
101 actualState = active;
102 } else {
103 actualState = inactive;
104 setPosition(OUT);
105 timeLeft = waitDuration;
106 actualDirection = X;
107 }
108 return TRUE;
109 }
110 return FALSE;
111 }
112
113 if (pause-- > 0)
114 return FALSE;
115 else
116 pause = pauseDuration;
117
118 if (actualPosition == OUT)
119 return FALSE;
120
121 if (actualDirection == X)
122 return TRUE;
123
124 int d = actualDirection;
125
126 if (rand() % (int) ((190-IQ)/10) == 0)
127 if (timeLeft > 0) // coming home or leaving again
128 d = board->closeup(actualPosition, d, homePosition);
129 else
130 d = board->closeup(actualPosition, d, tunnelPosition);
131 else
132 do // try new direction, but not the opposite
133 d = rand() % 4; // direction, to prevent hectic movement.
134 while (d == board->turn(actualDirection));
135
136 while ((!board->isWay(actualPosition, d, empty) &&
137 !board->isWay(actualPosition, d, tunnel)) ||
138 d == board->turn(actualDirection)) {
139 if (d != actualDirection) // if new direction is not possible,
140 d = actualDirection; // try current direction first.
141 else
142 d = rand() % 4;
143 }
144
145 actualDirection = d;
146 actualPosition = board->move(actualPosition, actualDirection);
147
148 if (actualPosition == homePosition) {
149 timeLeft = 0;
150 }
151
152 if (board->isTunnel(actualPosition)) {
153 setPosition(OUT);
154 timeLeft = waitDuration;
155 actualState = inactive;
156 actualDirection = X;
157 if (board->tunnels() > 0) {
158 entryPosition = board->position(tunnel, rand() % board->tunnels());
159 tunnelPosition = board->position(tunnel, rand() % board->tunnels());
160 }
161 }
162
163 if (actualPosition != lastPosition) {
164 setPosition(actualPosition);
165 }
166
167 return TRUE;
168}
169
170int Fruit::pix()
171{
172 if (actualPosition == OUT || actualState == inactive)
173 return -1;
174 else
175 return actualPix;
176}