void BadGuy::action_bouncingsnowball(double frame_ratio) { static const float JUMPV = 4.5; fall(); // jump when on ground if(dying == DYING_NOT && issolid(base.x, base.y+32)) { physic.set_velocity_y(JUMPV); physic.enable_gravity(true); } else { mode = NORMAL; } // check for right/left collisions check_horizontal_bump(); physic.apply(frame_ratio, base.x, base.y); if(dying == DYING_NOT) collision_swept_object_map(&old_base, &base); // Handle dying timer: if (dying == DYING_SQUISHED && !timer.check()) { /* Remove it if time's up: */ remove_me(); return; } }
void BadGuy::action_fish(double frame_ratio) { static const float JUMPV = 6; static const int WAITTIME = 1000; // go in wait mode when back in water if(dying == DYING_NOT && gettile(base.x, base.y+ base.height)->water && physic.get_velocity_y() <= 0 && mode == NORMAL) { mode = FISH_WAIT; set_sprite(0, 0); physic.set_velocity(0, 0); physic.enable_gravity(false); timer.start(WAITTIME); } else if(mode == FISH_WAIT && !timer.check()) { // jump again set_sprite(img_fish, img_fish); mode = NORMAL; physic.set_velocity(0, JUMPV); physic.enable_gravity(true); } physic.apply(frame_ratio, base.x, base.y); if(dying == DYING_NOT) collision_swept_object_map(&old_base, &base); if(physic.get_velocity_y() < 0) set_sprite(img_fish_down, img_fish_down); }
void BadGuy::action_snowball(double frame_ratio) { if (dying == DYING_NOT) check_horizontal_bump(); fall(); physic.apply(frame_ratio, base.x, base.y); if (dying != DYING_FALLING) collision_swept_object_map(&old_base,&base); }
void Bullet::action(double frame_ratio) { frame_ratio *= 0.5f; float old_y = base.y; base.x = base.x + base.xm * frame_ratio; base.y = base.y + base.ym * frame_ratio; collision_swept_object_map(&old_base,&base); if (issolid(base.x, base.y + 4) || issolid(base.x, base.y)) { base.y = old_y; base.ym = -base.ym; if (base.ym > 9) base.ym = 9; else if (base.ym < -9) base.ym = -9; life_count -= 1; } base.ym = base.ym + 0.5 * frame_ratio; #ifndef RES320X240 if (base.x < scroll_x || base.x > scroll_x + screen->w || base.y > screen->h || issolid(base.x + 4, base.y + 2) || issolid(base.x, base.y + 2) || life_count <= 0) #else if (base.x < scroll_x || base.x > scroll_x + 640 || base.y > 480 || issolid(base.x + 4, base.y + 2) || issolid(base.x, base.y + 2) || life_count <= 0) #endif { remove_me(); } }
void BadGuy::action_jumpy(double frame_ratio) { const float vy = physic.get_velocity_y(); // XXX: These tests *should* use location from ground, not velocity if (fabsf(vy) > 5.6f) set_sprite(img_jumpy_left_down, img_jumpy_left_down); else if (fabsf(vy) > 5.3f) set_sprite(img_jumpy_left_middle, img_jumpy_left_middle); else set_sprite(img_jumpy_left_up, img_jumpy_left_up); Player& tux = *World::current()->get_tux(); static const float JUMPV = 6; fall(); // jump when on ground if(dying == DYING_NOT && issolid(base.x, base.y+32)) { physic.set_velocity_y(JUMPV); physic.enable_gravity(true); mode = JUMPY_JUMP; } else if(mode == JUMPY_JUMP) { mode = NORMAL; } // set direction based on tux if(tux.base.x > base.x) dir = RIGHT; else dir = LEFT; // move physic.apply(frame_ratio, base.x, base.y); if(dying == DYING_NOT) collision_swept_object_map(&old_base, &base); }
void BadGuy::action_spiky(double frame_ratio) { if (dying == DYING_NOT) 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(frame_ratio, base.x, base.y); if (dying != DYING_FALLING) collision_swept_object_map(&old_base,&base); }
void BadGuy::action_flyingsnowball(double frame_ratio) { static const float FLYINGSPEED = 1; static const int DIRCHANGETIME = 1000; // go into flyup mode if none specified yet if(dying == DYING_NOT && mode == NORMAL) { mode = FLY_UP; physic.set_velocity_y(FLYINGSPEED); timer.start(DIRCHANGETIME/2); } if(dying == DYING_NOT && !timer.check()) { if(mode == FLY_UP) { mode = FLY_DOWN; physic.set_velocity_y(-FLYINGSPEED); } else if(mode == FLY_DOWN) { mode = FLY_UP; physic.set_velocity_y(FLYINGSPEED); } timer.start(DIRCHANGETIME); } if(dying != DYING_NOT) physic.enable_gravity(true); physic.apply(frame_ratio, base.x, base.y); if(dying == DYING_NOT || dying == DYING_SQUISHED) collision_swept_object_map(&old_base, &base); // Handle dying timer: if (dying == DYING_SQUISHED && !timer.check()) { /* Remove it if time's up: */ remove_me(); return; } }
void BadGuy::action_bomb(double frame_ratio) { static const int TICKINGTIME = 1000; static const int EXPLODETIME = 1000; fall(); if(mode == NORMAL) { mode = BOMB_TICKING; timer.start(TICKINGTIME); } else if(!timer.check()) { if(mode == BOMB_TICKING) { mode = BOMB_EXPLODE; set_sprite(img_mrbomb_explosion, img_mrbomb_explosion); dying = DYING_NOT; // now the bomb hurts timer.start(EXPLODETIME); /* play explosion sound */ // FIXME: is the stereo all right? maybe we should use player cordinates... if (base.x < scroll_x + screen->w/2 - 10) play_sound(sounds[SND_EXPLODE], SOUND_LEFT_SPEAKER); else if (base.x > scroll_x + screen->w/2 + 10) play_sound(sounds[SND_EXPLODE], SOUND_RIGHT_SPEAKER); else play_sound(sounds[SND_EXPLODE], SOUND_CENTER_SPEAKER); } else if(mode == BOMB_EXPLODE) { remove_me(); return; } } // move physic.apply(frame_ratio, base.x, base.y); collision_swept_object_map(&old_base,&base); }
void Upgrade::action(double frame_ratio) { if (kind == UPGRADE_ICEFLOWER || kind == UPGRADE_GROWUP) { if (base.height < 32) { /* Rise up! */ base.height = base.height + 0.7 * frame_ratio; if(base.height > 32) base.height = 32; return; } } /* Away from the screen? Kill it! */ if(base.x < scroll_x - OFFSCREEN_DISTANCE) { remove_me(); return; } #ifndef RES320X240 if(base.y > screen->h) { #else if(base.y > 640) { #endif remove_me(); return; } /* Move around? */ physic.apply(frame_ratio, base.x, base.y); if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) { collision_swept_object_map(&old_base, &base); } // fall down? if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) { // falling? if(physic.get_velocity_y() != 0) { if(issolid(base.x, base.y + base.height)) { base.y = int(base.y / 32) * 32; old_base = base; if(kind == UPGRADE_GROWUP) { physic.enable_gravity(false); physic.set_velocity(dir == LEFT ? -GROWUP_SPEED : GROWUP_SPEED, 0); } else if(kind == UPGRADE_HERRING) { physic.set_velocity(dir == LEFT ? -2 : 2, 3); } } } else { if((physic.get_velocity_x() < 0 && !issolid(base.x+base.width, base.y + base.height)) || (physic.get_velocity_x() > 0 && !issolid(base.x, base.y + base.height))) { physic.enable_gravity(true); } } } // horizontal bounce? if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) { if ( (physic.get_velocity_x() < 0 && issolid(base.x, (int) base.y + base.height/2)) || (physic.get_velocity_x() > 0 && issolid(base.x + base.width, (int) base.y + base.height/2))) { physic.set_velocity(-physic.get_velocity_x(),physic.get_velocity_y()); dir = dir == LEFT ? RIGHT : LEFT; } } } void Upgrade::draw() { SDL_Rect dest; if (base.height < 32) { /* Rising up... */ #ifndef RES320X240 dest.x = (int)(base.x - scroll_x); #else dest.x = (int)(base.x - scroll_x)/2; #endif dest.y = (int)(base.y + 32 - base.height); dest.w = 32; dest.h = (int)base.height; if (kind == UPGRADE_GROWUP) img_growup->draw_part(0,0,dest.x,dest.y,dest.w,dest.h); else if (kind == UPGRADE_ICEFLOWER) img_iceflower->draw_part(0,0,dest.x,dest.y,dest.w,dest.h); else if (kind == UPGRADE_HERRING) img_star->draw_part(0,0,dest.x,dest.y,dest.w,dest.h); else if (kind == UPGRADE_1UP) img_1up->draw_part( 0, 0, dest.x, dest.y, dest.w, dest.h); } else { if (kind == UPGRADE_GROWUP) { img_growup->draw( base.x - scroll_x, base.y); } else if (kind == UPGRADE_ICEFLOWER) { img_iceflower->draw( base.x - scroll_x, base.y); } else if (kind == UPGRADE_HERRING) { img_star->draw( base.x - scroll_x, base.y); } else if (kind == UPGRADE_1UP) { img_1up->draw( base.x - scroll_x, base.y); } } }
void Player::action(double frame_ratio) { bool jumped_in_solid = false; if (input.fire == UP) holding_something = false; /* Move tux: */ previous_base = base; /* --- HANDLE TUX! --- */ if(dying == DYING_NOT) handle_input(); physic.apply(frame_ratio, base.x, base.y); if(dying == DYING_NOT) { base_type target = base; collision_swept_object_map(&old_base, &base); // Don't accelerate Tux if he is running against a wall if (target.x != base.x) { physic.set_velocity_x(0); } // special exception for cases where we're stuck under tiles after // being ducked. In this case we drift out if(!duck && on_ground() && old_base.x == base.x && old_base.y == base.y && collision_object_map(base)) { base.x += frame_ratio * WALK_SPEED * (dir ? 1 : -1); previous_base = old_base = base; } // Land: if (!on_ground()) { physic.enable_gravity(true); if(under_solid()) { // fall down physic.set_velocity_y(0); jumped_in_solid = true; } } else { /* Land: */ if (physic.get_velocity_y() < 0) { base.y = (int)(((int)base.y / 32) * 32); physic.set_velocity_y(0); } physic.enable_gravity(false); /* Reset score multiplier (for multi-hits): */ player_status.score_multiplier = 1; } if(jumped_in_solid) { if (isbrick(base.x, base.y) || isfullbox(base.x, base.y)) { World::current()->trygrabdistro(base.x, base.y - 32,BOUNCE); World::current()->trybumpbadguy(base.x, base.y - 64); World::current()->trybreakbrick(base.x, base.y, size == SMALL, RIGHT); bumpbrick(base.x, base.y); World::current()->tryemptybox(base.x, base.y, RIGHT); } if (isbrick(base.x+ 31, base.y) || isfullbox(base.x+ 31, base.y)) { World::current()->trygrabdistro(base.x+ 31, base.y - 32,BOUNCE); World::current()->trybumpbadguy(base.x+ 31, base.y - 64); if(size == BIG) World::current()->trybreakbrick(base.x+ 31, base.y, size == SMALL, LEFT); bumpbrick(base.x+ 31, base.y); World::current()->tryemptybox(base.x+ 31, base.y, LEFT); } } grabdistros(); if (jumped_in_solid) { ++base.y; ++old_base.y; if(on_ground()) { /* Make sure jumping is off. */ jumping = false; } } } /* ---- DONE HANDLING TUX! --- */ // check some timers skidding_timer.check(); invincible_timer.check(); safe_timer.check(); kick_timer.check(); }
void BadGuy::action_mriceblock(double frame_ratio) { Player& tux = *World::current()->get_tux(); if(mode != HELD) fall(); /* Move left/right: */ if (mode != HELD) { // move physic.apply(frame_ratio, base.x, base.y); if (dying != DYING_FALLING) collision_swept_object_map(&old_base,&base); } else if (mode == HELD) { /* FIXME: The pbad object shouldn't know about pplayer objects. */ /* If we're holding the iceblock */ dir = tux.dir; if(dir==RIGHT) { base.x = tux.base.x + 16; base.y = tux.base.y + tux.base.height/1.5 - base.height; } else /* facing left */ { base.x = tux.base.x - 16; base.y = tux.base.y + tux.base.height/1.5 - base.height; } if(collision_object_map(base)) { base.x = tux.base.x; base.y = tux.base.y + tux.base.height/1.5 - base.height; } if(tux.input.fire != DOWN) /* SHOOT! */ { if(dir == LEFT) base.x -= 24; else base.x += 24; old_base = base; mode=KICK; tux.kick_timer.start(KICKING_TIME); set_sprite(img_mriceblock_flat_left, img_mriceblock_flat_right); physic.set_velocity_x((dir == LEFT) ? -3.5 : 3.5); play_sound(sounds[SND_KICK],SOUND_CENTER_SPEAKER); } } if (!dying) { int changed = dir; check_horizontal_bump(); if(mode == KICK && changed != dir) { /* handle stereo sound (number 10 should be tweaked...)*/ if (base.x < scroll_x + screen->w/2 - 10) play_sound(sounds[SND_RICOCHET], SOUND_LEFT_SPEAKER); else if (base.x > scroll_x + screen->w/2 + 10) play_sound(sounds[SND_RICOCHET], SOUND_RIGHT_SPEAKER); else play_sound(sounds[SND_RICOCHET], SOUND_CENTER_SPEAKER); } } /* Handle mode timer: */ if (mode == FLAT) { if(!timer.check()) { mode = NORMAL; set_sprite(img_mriceblock_left, img_mriceblock_right); physic.set_velocity( (dir == LEFT) ? -.8 : .8, 0); } } }
void Upgrade::action(double frame_ratio) { if (kind == UPGRADE_ICEFLOWER || kind == UPGRADE_GROWUP) { if (base.height < 32) { /* Rise up! */ base.height = base.height + 0.7 * frame_ratio; if(base.height > 32) base.height = 32; return; } } /* Away from the screen? Kill it! */ if(base.x < scroll_x - OFFSCREEN_DISTANCE) { remove_me(); return; } if(base.y > screen->h) { remove_me(); return; } /* Move around? */ physic.apply(frame_ratio, base.x, base.y); if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) { collision_swept_object_map(&old_base, &base); } // fall down? if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) { // falling? if(physic.get_velocity_y() != 0) { if(issolid(base.x, base.y + base.height)) { base.y = int(base.y / 32) * 32; old_base = base; if(kind == UPGRADE_GROWUP) { physic.enable_gravity(false); physic.set_velocity(dir == LEFT ? -GROWUP_SPEED : GROWUP_SPEED, 0); } else if(kind == UPGRADE_HERRING) { physic.set_velocity(dir == LEFT ? -2 : 2, 3); } } } else { if((physic.get_velocity_x() < 0 && !issolid(base.x+base.width, base.y + base.height)) || (physic.get_velocity_x() > 0 && !issolid(base.x, base.y + base.height))) { physic.enable_gravity(true); } } } // horizontal bounce? if(kind == UPGRADE_GROWUP || kind == UPGRADE_HERRING) { if ( (physic.get_velocity_x() < 0 && issolid(base.x, (int) base.y + base.height/2)) || (physic.get_velocity_x() > 0 && issolid(base.x + base.width, (int) base.y + base.height/2))) { physic.set_velocity(-physic.get_velocity_x(),physic.get_velocity_y()); dir = dir == LEFT ? RIGHT : LEFT; } } }