2 // C Implementation: world
7 // Author: Tobias Glaesser <tobi.web@gmx.de>, (C) 2004
9 // Copyright: See COPYING file that comes with this distribution
22 texture_type img_distro[4];
24 void bouncy_distro_init(bouncy_distro_type* pbouncy_distro, float x, float y)
26 pbouncy_distro->base.x = x;
27 pbouncy_distro->base.y = y;
28 pbouncy_distro->base.ym = -2;
31 void bouncy_distro_action(bouncy_distro_type* pbouncy_distro)
33 pbouncy_distro->base.y = pbouncy_distro->base.y + pbouncy_distro->base.ym * frame_ratio;
35 pbouncy_distro->base.ym += 0.1 * frame_ratio;
37 if (pbouncy_distro->base.ym >= 0)
38 bouncy_distros.erase(static_cast<std::vector<bouncy_distro_type>::iterator>(pbouncy_distro));
41 void bouncy_distro_draw(bouncy_distro_type* pbouncy_distro)
43 texture_draw(&img_distro[0],
44 pbouncy_distro->base.x - scroll_x,
45 pbouncy_distro->base.y);
48 void broken_brick_init(broken_brick_type* pbroken_brick, float x, float y, float xm, float ym)
50 pbroken_brick->base.x = x;
51 pbroken_brick->base.y = y;
52 pbroken_brick->base.xm = xm;
53 pbroken_brick->base.ym = ym;
54 timer_init(&pbroken_brick->timer, true);
55 timer_start(&pbroken_brick->timer,200);
58 void broken_brick_action(broken_brick_type* pbroken_brick)
60 pbroken_brick->base.x = pbroken_brick->base.x + pbroken_brick->base.xm * frame_ratio;
61 pbroken_brick->base.y = pbroken_brick->base.y + pbroken_brick->base.ym * frame_ratio;
63 if (!timer_check(&pbroken_brick->timer))
64 broken_bricks.erase(static_cast<std::vector<broken_brick_type>::iterator>(pbroken_brick));
67 void broken_brick_draw(broken_brick_type* pbroken_brick)
75 dest.x = (int)(pbroken_brick->base.x - scroll_x);
76 dest.y = (int)pbroken_brick->base.y;
80 texture_draw_part(&img_brick[0],src.x,src.y,dest.x,dest.y,dest.w,dest.h);
83 void bouncy_brick_init(bouncy_brick_type* pbouncy_brick, float x, float y)
85 pbouncy_brick->base.x = x;
86 pbouncy_brick->base.y = y;
87 pbouncy_brick->offset = 0;
88 pbouncy_brick->offset_m = -BOUNCY_BRICK_SPEED;
89 pbouncy_brick->shape = GameSession::current()->get_level()->gettileid(x, y);
92 void bouncy_brick_action(bouncy_brick_type* pbouncy_brick)
95 pbouncy_brick->offset = (pbouncy_brick->offset +
96 pbouncy_brick->offset_m * frame_ratio);
100 if (pbouncy_brick->offset < -BOUNCY_BRICK_MAX_OFFSET)
101 pbouncy_brick->offset_m = BOUNCY_BRICK_SPEED;
106 if (pbouncy_brick->offset >= 0)
107 bouncy_bricks.erase(static_cast<std::vector<bouncy_brick_type>::iterator>(pbouncy_brick));
110 void bouncy_brick_draw(bouncy_brick_type* pbouncy_brick)
115 if (pbouncy_brick->base.x >= scroll_x - 32 &&
116 pbouncy_brick->base.x <= scroll_x + screen->w)
118 dest.x = (int)(pbouncy_brick->base.x - scroll_x);
119 dest.y = (int)pbouncy_brick->base.y;
123 Level* plevel = GameSession::current()->get_level();
125 // FIXME: overdrawing hack to clean the tile from the screen to
126 // paint it later at on offseted position
127 if(plevel->bkgd_image[0] == '\0')
129 fillrect(pbouncy_brick->base.x - scroll_x, pbouncy_brick->base.y,
131 plevel->bkgd_red, plevel->bkgd_green, plevel->bkgd_blue, 0);
135 s = (int)scroll_x / 30;
136 texture_draw_part(&img_bkgd,dest.x + s,dest.y,dest.x,dest.y,dest.w,dest.h);
139 drawshape(pbouncy_brick->base.x - scroll_x,
140 pbouncy_brick->base.y + pbouncy_brick->offset,
141 pbouncy_brick->shape);
145 void floating_score_init(floating_score_type* pfloating_score, float x, float y, int s)
147 pfloating_score->base.x = x;
148 pfloating_score->base.y = y - 16;
149 timer_init(&pfloating_score->timer,true);
150 timer_start(&pfloating_score->timer,1000);
151 pfloating_score->value = s;
154 void floating_score_action(floating_score_type* pfloating_score)
156 pfloating_score->base.y = pfloating_score->base.y - 2 * frame_ratio;
158 if(!timer_check(&pfloating_score->timer))
159 floating_scores.erase(static_cast<std::vector<floating_score_type>::iterator>(pfloating_score));
162 void floating_score_draw(floating_score_type* pfloating_score)
165 sprintf(str, "%d", pfloating_score->value);
166 text_draw(&gold_text, str, (int)pfloating_score->base.x + 16 - strlen(str) * 8, (int)pfloating_score->base.y, 1);
170 void trybreakbrick(float x, float y, bool small)
172 Level* plevel = GameSession::current()->get_level();
174 Tile* tile = gettile(x, y);
179 /* Get a distro from it: */
180 add_bouncy_distro(((int)(x + 1) / 32) * 32,
183 if (!counting_distros)
185 counting_distros = true;
189 if (distro_counter <= 0)
190 plevel->change(x, y, TM_IA, tile->next_tile);
192 play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
193 score = score + SCORE_DISTRO;
199 plevel->change(x, y, TM_IA, tile->next_tile);
201 /* Replace it with broken bits: */
202 add_broken_brick(((int)(x + 1) / 32) * 32,
205 /* Get some score: */
206 play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER);
207 score = score + SCORE_BRICK;
213 void tryemptybox(float x, float y, int col_side)
215 Level* plevel = GameSession::current()->get_level();
217 Tile* tile = gettile(x,y);
221 // according to the collision side, set the upgrade direction
229 case 1: //'A': /* Box with a distro! */
230 add_bouncy_distro(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32 - 32);
231 play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
232 score = score + SCORE_DISTRO;
236 case 2: // 'B': /* Add an upgrade! */
237 if (tux.size == SMALL) /* Tux is small, add mints! */
238 add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_MINTS);
239 else /* Tux is big, add coffee: */
240 add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_COFFEE);
241 play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER);
244 case 3:// '!': /* Add a golden herring */
245 add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_HERRING);
252 plevel->change(x, y, TM_IA, tile->next_tile);
255 /* Try to grab a distro: */
256 void trygrabdistro(float x, float y, int bounciness)
258 Level* plevel = GameSession::current()->get_level();
259 Tile* tile = gettile(x, y);
260 if (tile && tile->distro)
262 plevel->change(x, y, TM_IA, tile->next_tile);
263 play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
265 if (bounciness == BOUNCE)
267 add_bouncy_distro(((int)(x + 1) / 32) * 32,
271 score = score + SCORE_DISTRO;
276 /* Try to bump a bad guy from below: */
277 void trybumpbadguy(float x, float y)
280 for (unsigned int i = 0; i < bad_guys.size(); i++)
282 if (bad_guys[i].base.x >= x - 32 && bad_guys[i].base.x <= x + 32 &&
283 bad_guys[i].base.y >= y - 16 && bad_guys[i].base.y <= y + 16)
285 bad_guys[i].collision(&tux, CO_PLAYER, COLLISION_BUMP);
291 for (unsigned int i = 0; i < upgrades.size(); i++)
293 if (upgrades[i].base.height == 32 &&
294 upgrades[i].base.x >= x - 32 && upgrades[i].base.x <= x + 32 &&
295 upgrades[i].base.y >= y - 16 && upgrades[i].base.y <= y + 16)
297 upgrades[i].base.xm = -upgrades[i].base.xm;
298 upgrades[i].base.ym = -8;
299 play_sound(sounds[SND_BUMP_UPGRADE], SOUND_CENTER_SPEAKER);