void
BadGuy::init()
{
- base.x = 0;
- base.y = 0;
- base.width = 0;
- base.height = 0;
+ base.x = start_position.x;
+ base.y = start_position.y;
+ base.width = 32;
+ base.height = 32;
mode = NORMAL;
- dying = DYING_NOT;
old_base = base;
dir = LEFT;
seen = false;
specs = badguyspecs_manager->load(badguykind_to_string(kind));
- set_action("hide", "hide");
-
// if we're in a solid tile at start correct that now
if(Sector::current()) {
if(kind != BAD_FLAME && kind != BAD_FISH && kind != BAD_FLAMEFISH && collision_object_map(base))
while(collision_object_map(base))
--base.y;
}
-
- if(Sector::current()->camera) {
- Vector scroll = Sector::current()->camera->get_translation();
-
- if(start_position.x > scroll.x - X_OFFSCREEN_DISTANCE &&
- start_position.x < scroll.x + screen->w + X_OFFSCREEN_DISTANCE &&
- start_position.y > scroll.y - Y_OFFSCREEN_DISTANCE &&
- start_position.y < scroll.y + screen->h + Y_OFFSCREEN_DISTANCE) {
- activate(LEFT);
- }
- } } else {
- if(start_position.x > 0 && start_position.x <= screen->w
- && start_position.y > 0 && start_position.y <= screen->h)
- activate(LEFT);
}
}
frozen_timer.init(true);
timer.init(true);
+ dying = DYING_NOT;
+ seen = true;
+
dir = activation_dir;
float dirsign = activation_dir == LEFT ? -1 : 1;
-
+
set_action("left", "right");
if(kind == BAD_MRBOMB) {
physic.set_velocity(dirsign * BADGUY_WALK_SPEED, 0);
base.width = 66;
base.height = 66;
}
-
- base.x = start_position.x;
- base.y = start_position.y;
- old_base = base;
- seen = true;
}
Surface*
BadGuy::get_image()
{
+// Set action as the "default" one.
+specs->sprite->set_action("left");
+if(BAD_JUMPY)
+ specs->sprite->set_action("left-up");
+else if(kind == BAD_BOMB)
+ specs->sprite->set_action("ticking-left");
+else if(kind == BAD_FLAME)
+ specs->sprite->set_action("normal");
+else if(kind == BAD_STALACTITE)
+ specs->sprite->set_action("normal");
+else if(kind == BAD_FISH)
+ specs->sprite->set_action("normal");
+else if(kind == BAD_FLAMEFISH)
+ specs->sprite->set_action("normal");
+
return specs->sprite->get_frame(0);
}
}
// set direction based on tux
- if(tux.base.x > base.x)
- dir = RIGHT;
- else
- dir = LEFT;
+ if(dying == DYING_NOT)
+ {
+ if(tux.base.x > base.x)
+ dir = RIGHT;
+ else
+ dir = LEFT;
+ }
// move
physic.apply(elapsed_time, base.x, base.y, Sector::current()->gravity);
if(dying == DYING_NOT || dying == DYING_SQUISHED)
collision_swept_object_map(&old_base, &base);
- // set direction based on tux
- if(Sector::current()->player->base.x > base.x)
- dir = RIGHT;
- else
- dir = LEFT;
+ if(dying == DYING_NOT)
+ {
+ // set direction based on tux
+ if(Sector::current()->player->base.x > base.x)
+ dir = RIGHT;
+ else
+ dir = LEFT;
+ }
// Handle dying timer:
if (dying == DYING_SQUISHED && !timer.check())
check_horizontal_bump();
fall();
-#if 0
- // jump when we're about to fall
- if (physic.get_velocity_y() == 0 &&
- !issolid(base.x+base.width/2, base.y + base.height)) {
- physic.enable_gravity(true);
- physic.set_velocity_y(2);
- }
-#endif
physic.apply(elapsed_time, base.x, base.y, Sector::current()->gravity);
if (dying != DYING_FALLING)
fall();
+ // jump when we're about to fall
+ if (physic.get_velocity_y() == 0 &&
+ !issolid(base.x+base.width/2, base.y + base.height)) {
+ physic.enable_gravity(true);
+ physic.set_velocity_y(2);
+ }
+
physic.apply(elapsed_time, base.x, base.y, Sector::current()->gravity);
if (dying != DYING_FALLING)
collision_swept_object_map(&old_base,&base);
kill_me(0);
}
- if(!seen) {
- /* activate badguys if they're just inside the offscreen_distance around the
- * screen. Don't activate them inside the screen, since that might have the
- * effect of badguys suddenly popping up from nowhere
+ if(!seen)
+ {
+ /* Activate badguys if they're just around the screen to avoid
+ * the effect of having badguys suddenly popping up from nowhere.
*/
if (start_position.x > scroll_x - X_OFFSCREEN_DISTANCE &&
- start_position.x < scroll_x - base.width)
+ start_position.x < scroll_x - base.width &&
+ start_position.y > scroll_y - Y_OFFSCREEN_DISTANCE &&
+ start_position.y < scroll_y + screen->h + Y_OFFSCREEN_DISTANCE)
activate(RIGHT);
- else if(start_position.x > scroll_y - Y_OFFSCREEN_DISTANCE &&
- start_position.y < scroll_y - base.height)
- activate(LEFT);
- else if(start_position.x > scroll_x + screen->w &&
- start_position.x < scroll_x + screen->w + X_OFFSCREEN_DISTANCE)
- activate(LEFT);
- else if(start_position.y > scroll_y + screen->h &&
+ else if (start_position.x > scroll_x + screen->w &&
+ start_position.x < scroll_x + screen->w + X_OFFSCREEN_DISTANCE &&
+ start_position.y > scroll_y - Y_OFFSCREEN_DISTANCE &&
start_position.y < scroll_y + screen->h + Y_OFFSCREEN_DISTANCE)
activate(LEFT);
- } else {
+ else if (start_position.x > scroll_x - X_OFFSCREEN_DISTANCE &&
+ start_position.x < scroll_x + screen->w + X_OFFSCREEN_DISTANCE &&
+ ((start_position.y > scroll_y + screen->h &&
+ start_position.y < scroll_y + screen->h + Y_OFFSCREEN_DISTANCE) ||
+ (start_position.y > scroll_y - Y_OFFSCREEN_DISTANCE &&
+ start_position.y < scroll_y)))
+ {
+ if(start_position.x < scroll_x - screen->w/2)
+ activate(RIGHT);
+ else
+ activate(LEFT);
+ }
+ /* Special case for badguys on start of the level.
+ * If in the future, it's possible to set Tux start pos, this case
+ * should contemplate that. */
+ else if (start_position.x > 0 && start_position.x < screen->w &&
+ start_position.y > 0 && start_position.y < screen->h)
+ activate(LEFT);
+ }
+ else
+ {
if(base.x + base.width < scroll_x - X_OFFSCREEN_DISTANCE*4
|| base.x > scroll_x + screen->w + X_OFFSCREEN_DISTANCE*4
|| base.y + base.height < scroll_y - Y_OFFSCREEN_DISTANCE*4
- || base.y > scroll_y + screen->h + Y_OFFSCREEN_DISTANCE*4) {
+ || base.y > scroll_y + screen->h + Y_OFFSCREEN_DISTANCE*4)
+ {
seen = false;
if(dying != DYING_NOT)
remove_me();
+ }
}
- }
-
+
if(!seen)
return;
void
BadGuy::draw(DrawingContext& context)
{
+ if(!seen)
+ return;
+
if((dir == LEFT && action_left == "hide") ||
(dir == RIGHT && action_right == "hide"))
return;
else
{
// FIXME: Using the image size for the physics and collision is
- // a bad idea, since images should always overlap there physical
+ // a bad idea, since images should always overlap their physical
// representation
if(left != 0) {
if(base.width == 0 && base.height == 0) {
void
BadGuy::explode(bool right_way)
{
- BadGuy *badguy = Sector::current()->add_bad_guy(base.x, base.y, BAD_BOMB);
+ BadGuy *badguy = Sector::current()->add_bad_guy(base.x, base.y, BAD_BOMB, true);
if(right_way)
{
badguy->timer.start(0);
badguy->mode = BOMB_TICKING;
- badguy->dir = dir;
}
+ badguy->dir = dir;
remove_me();
}