- var dt = 0.016;
- var GRAVITY = 1;
- var DRAG_MAX = 1;
- var LIFT_MAX = 1;
-
-
- var left = (1 - this.leftPivot) * Math.PI / 2;
- var right = (1 - this.rightPivot) * Math.PI / 2;
-
- var vx = (this.x - this.lastX) / dt;
- var vy = (this.y - this.lastY) / dt;
-
- var rotor = 1 * this.up;
-
- var cleft = Math.cos(left);
- var cright = Math.cos(right);
- var sleft = Math.sin(left);
- var sright = Math.sin(right);
-
- var dvyleft = sleft * rotor;
- var dvyright = sright * rotor;
- var dvxleft = cleft * rotor;
- var dvxright = cright * rotor;
-
- var dvx = (dvxleft - dvxright);
- var dvy = (dvyleft + dvyright) - GRAVITY;
-
- var leftarea = DRAG_MAX * Math.abs(sleft);
- var rightarea = DRAG_MAX * Math.abs(sright);
- var dragy = vy * vy * (leftarea + rightarea);
-
- leftarea = DRAG_MAX * Math.abs(cleft);
- rightarea = DRAG_MAX * Math.abs(cright);
- var dragx = vx * vx * (leftarea + rightarea);
-
- leftarea = LIFT_MAX * Math.abs(cleft);
- rightarea = LIFT_MAX * Math.abs(cright);
- var liftx = vy * vy * (rightarea - leftarea);
-
- leftarea = LIFT_MAX * Math.abs(sleft);
- rightarea = LIFT_MAX * Math.abs(sright);
- var lifty = vx * vx * (rightarea - leftarea);
-
- if (vy > 0) {
- dragy = -dragy;
- liftx = -liftx;
- }
- if (vx > 0) {
- dragx = -dragx;
- lifty = -lifty;
- }
-
- var ax = dvx + liftx + dragx;
- var ay = dvy + lifty + dragy;
-
- var origX = this.x;
- var origY = this.y;
- this.x += (this.x - this.lastX) + ax * dt * dt;
- this.y += (this.y - this.lastY) + ay * dt * dt;
- this.y = Math.max(0, this.y);
- this.lastX = origX;
- this.lastY = origY;
+ var THRUST = 3.5;
+ var DRAG_FREE = 0.01;
+ var DRAG_OPEN = 0.5;
+ var DRAG_LOCK = 1;
+ var CORRECTION = 1;
+
+ var leftAngle = (1 - this.leftPivot) * Math.PI / 2;
+ var rightAngle = (1 - this.rightPivot) * Math.PI / 2;
+
+ var cleft = Math.cos(leftAngle);
+ var cright = Math.cos(rightAngle);
+ var sleft = Math.sin(leftAngle);
+ var sright = Math.sin(rightAngle);
+
+ var thrust = +!this.free * +this.up * THRUST;
+ var ax = thrust * (cleft - cright);
+ var ay = thrust * (sright + sleft);
+
+ var v = this.body.linearVelocity;
+ var drag = this.up ? DRAG_OPEN : this.free ? DRAG_FREE : DRAG_LOCK;
+ ax += drag * Math.max(cleft, cright) * v.x * v.x * -Math.sign(v.x);
+ ay += drag * (sleft + sright) * v.y * v.y * -Math.sign(v.y);
+
+ if (!this.up || this.free)
+ ax += CORRECTION * (cleft - cright) * v.y * v.y * Math.sign(v.y);
+
+ this.body.ApplyForce(new b2Vec2(ax, ay), this.body.position);
+