+ float cv;
+ if (flapping_velocity == 0) {cv = 0;}
+ else {cv = flapping_velocity*(sqrt(TUX_FLAPPING_TIME-(float)flapping_timer.get_gone()))/sqrt(TUX_FLAPPING_TIME);}
+ //Handle change of direction while flapping
+ if (((dir == LEFT) && (cv > 0)) || (dir == RIGHT) && (cv < 0)) {cv *= (-1);}
+ physic.set_velocity_x(cv);
+ physic.set_velocity_y((float)flapping_timer.get_gone()/850);
+ }
+ }
+ }
+ else if(flapping_mode == RYAN_FLAP)
+ {
+ // Flapping, Ryan's version
+ if (input.jump == DOWN && can_flap)
+ {
+ if (!flapping_timer.started())
+ {
+ flapping_timer.start(TUX_FLAPPING_TIME);
+ }
+ if (!flapping_timer.check())
+ {
+ can_flap = false;
+ falling_from_flap = true;
+ }
+ jumping = true;
+ flapping = true;
+ if (flapping && flapping_timer.get_gone() <= TUX_FLAPPING_TIME
+ && physic.get_velocity_y() < 0)
+ {
+ float gravity = Sector::current()->gravity;
+ (void)gravity;
+ float xr = (fabsf(physic.get_velocity_x()) / MAX_RUN_XM);
+
+ // XXX: magic numbers. should be a percent of gravity
+ // gravity is (by default) -0.1f
+ physic.set_acceleration_y(.12 + .01f*xr);
+
+#if 0
+ // To slow down x-vel when flapping (not working)
+ if (fabsf(physic.get_velocity_x()) > MAX_WALK_XM)
+ {
+ if (physic.get_velocity_x() < 0)
+ physic.set_acceleration_x(1.0f);
+ else if (physic.get_velocity_x() > 0)
+ physic.set_acceleration_x(-1.0f);
+ }
+#endif