// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <math.h>
+#include <iostream>
+#include <cassert>
#include "gameloop.h"
#include "globals.h"
#include "player.h"
PlayerSprite smalltux;
PlayerSprite largetux;
+PlayerSprite icetux;
PlayerSprite firetux;
PlayerKeymap keymap;
base.height = 32;
size = SMALL;
- got_coffee = false;
+ got_power = NONE_POWER;
base.x = plevel->start_pos_x;
base.y = plevel->start_pos_y;
collision_swept_object_map(&old_base, &base);
+ if (!invincible_timer.started()
+ && (isspike(base.x, base.y) || isspike(base.x + base.width, base.y)
+ || isspike(base.x, base.y + base.height)
+ || isspike(base.x + base.width, base.y + base.height)))
+ {
+ kill(SHRINK);
+ }
+
// Don't accelerate Tux if he is running against a wall
if (target.x != base.x)
{
/* Shoot! */
- if (input.fire == DOWN && input.old_fire == UP && got_coffee)
+ if (input.fire == DOWN && input.old_fire == UP && got_power != NONE_POWER)
{
World::current()->add_bullet(base.x, base.y, physic.get_velocity_x(), dir);
input.old_fire = DOWN;
if (size == SMALL)
sprite = &smalltux;
- else if (got_coffee)
+ else if (got_power == FIRE_POWER)
sprite = &firetux;
+ else if (got_power == ICE_POWER)
+ sprite = &icetux;
else
sprite = &largetux;
Player::collision(void* p_c_object, int c_object)
{
BadGuy* pbad_c = NULL;
+ Trampoline* ptramp_c = NULL;
switch (c_object)
{
kill(SHRINK);
}
else
- {
- pbad_c->dying = DYING_FALLING;
- play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
- World::current()->add_score(pbad_c->base.x,
- pbad_c->base.y,
- 25 * player_status.score_multiplier);
- }
+ pbad_c->kill_me(20);
}
+ else if (pbad_c->frozen_timer.check() && (pbad_c->kind == BAD_MRBOMB
+ || pbad_c->kind == BAD_JUMPY || pbad_c->kind == BAD_FISH
+ || pbad_c->kind == BAD_SPIKY))
+ pbad_c->kill_me(20);
else
{
if (!invincible_timer.started())
player_status.score_multiplier++;
}
break;
+
+ case CO_TRAMPOLINE:
+ ptramp_c = (Trampoline*) p_c_object;
+
+ // Pick up trampoline
+ if (ptramp_c->mode != Trampoline::M_HELD && input.fire == DOWN && !holding_something && on_ground())
+ {
+ holding_something = true;
+ ptramp_c->mode = Trampoline::M_HELD;
+ ptramp_c->base.y -= 8;
+ }
+ // Set down trampoline
+ else if (ptramp_c->mode == Trampoline::M_HELD && input.fire != DOWN)
+ {
+ holding_something = false;
+ ptramp_c->mode = Trampoline::M_NORMAL;
+ ptramp_c->base.y += 8;
+ ptramp_c->physic.set_velocity(physic.get_velocity_x(), physic.get_velocity_y());
+
+ //if (dir == RIGHT)
+ // ptramp_c->base.x = base.x + base.width+1;
+ //else /* LEFT */
+ // ptramp_c->base.x = base.x - base.width-1;
+ }
+/*
+ // Don't let tux walk through trampoline
+ else if (ptramp_c->mode != Trampoline::M_HELD && on_ground())
+ {
+ if (physic.get_velocity_x() > 0) // RIGHT
+ {
+ physic.set_velocity_x(0);
+ base.x = ptramp_c->base.x - base.width;
+ }
+ else if (physic.get_velocity_x() < 0) // LEFT
+ {
+ physic.set_velocity_x(0);
+ base.x = ptramp_c->base.x + ptramp_c->base.width;
+ }
+ }
+*/
+
+ break;
+
default:
break;
}
if (mode == SHRINK && size == BIG)
{
- if (got_coffee)
+ if (got_power != NONE_POWER)
{
- got_coffee = false;
+ got_power = NONE_POWER;
}
else
{
bool Player::is_dead()
{
- if(base.y > screen->h || base.x < scroll_x - AUTOSCROLL_DEAD_INTERVAL) // last condition can happen in auto-scrolling
+ if(base.y > World::current()->get_level()->height * /*TILE_HEIGHT*/ 32 || base.x < scroll_x - AUTOSCROLL_DEAD_INTERVAL) // last condition can happen in auto-scrolling
return true;
else
return false;
void
Player::remove_powerups()
{
- got_coffee = false;
+ got_power = NONE_POWER;
size = SMALL;
base.height = 32;
}
}
/* Keep in-bounds, vertically: */
- if (base.y > screen->h)
+ if (base.y > World::current()->get_level()->height * /*TILE_HEIGHT*/ 32)
{
kill(KILL);
}