+var PlayerController = new yT(yuu.C, {
+ constructor: function (body, left, right) {
+ this.body = body;
+ this.left = left;
+ this.right = right;
+ this.dleftLeft = this.dleftRight =
+ this.drightLeft = this.drightRight = 0;
+ this.up = 0;
+ this.free = 0;
+ this.leftPivot = 0;
+ this.rightPivot = 0;
+ this.x = this.lastX = body.x;
+ this.y = this.lastY = body.y;
+ this.commands = {
+ dleftLeft: yuu.propcmd(this, 'dleftLeft'),
+ dleftRight: yuu.propcmd(this, 'dleftRight'),
+ drightLeft: yuu.propcmd(this, 'drightLeft'),
+ drightRight: yuu.propcmd(this, 'drightRight'),
+ up: yuu.propcmd(this, 'up'),
+ free: yuu.propcmd(this, 'free'),
+ };
+ },
+
+ _updatePivots: function () {
+ var PIVOT_SPEED = 0.05;
+ var leftSpeed = (this.dleftRight - this.dleftLeft) * PIVOT_SPEED;
+ var rightSpeed = (this.drightLeft - this.drightRight) * PIVOT_SPEED;
+ this.leftPivot = yf.clamp(this.leftPivot + leftSpeed, 0, 1);
+ this.rightPivot = yf.clamp(this.rightPivot + rightSpeed, 0, 1);
+ },
+
+ _updateTransforms: function () {
+ this.left.yaw = -this.leftPivot * Math.PI / 2;
+ this.right.yaw = this.rightPivot * Math.PI / 2;
+ this.body.x = this.x;
+ this.body.y = this.y;
+ },
+
+ tick: function () {
+ this._updatePivots();
+ var GRAVITY = -0.0004;
+ var THRUST = 0.00035;
+ var FRICTIONK = 3.5;
+ var FRICTIONS = 5.0;
+ var DRAG_FREE = 0.01;
+ var DRAG_OPEN = 5.0;
+ var DRAG_LOCK = 10.0;
+ var CORRECTION = 3.0;
+
+ var leftAngle = (1 - this.leftPivot) * Math.PI / 2;
+ var rightAngle = (1 - this.rightPivot) * Math.PI / 2;
+
+ var vx = this.x - this.lastX;
+ var vy = this.y - this.lastY;
+
+ var cleft = Math.cos(leftAngle);
+ var cright = Math.cos(rightAngle);
+ var sleft = Math.sin(leftAngle);
+ var sright = Math.sin(rightAngle);
+
+ var ax = 0;
+ var ay = GRAVITY;
+
+ var thrust = +!this.free * +this.up * THRUST;
+ ax += thrust * (cleft - cright);
+ ay += thrust * (sright + sleft);
+
+ var drag = this.up ? DRAG_OPEN : this.free ? DRAG_FREE : DRAG_LOCK;
+ ax += drag * Math.max(cleft, cright) * vx * vx * -Math.sign(vx);
+ ay += drag * (sleft + sright) * vy * vy * -Math.sign(vy);
+
+ if (!this.up || this.free)
+ ax += CORRECTION * (cleft - cright) * vy * vy * Math.sign(vy);
+
+ var origX = this.x;
+ var origY = this.y;
+ this.y += vy + ay;
+ var collided = this.y < 0;
+ if (collided) {
+ var friction = -Math.sign(vx) * Math.abs(ay)
+ * (Math.abs(vx) < 0.001 ? FRICTIONS : FRICTIONK);
+ ax += Math.sign(friction) * Math.min(Math.abs(friction), Math.abs(vx));
+ }
+ this.x += vx + ax;
+ this.y = Math.max(0, this.y);
+ this.lastX = origX;
+ this.lastY = origY;
+ this._updateTransforms();