Restores the mouse from TankTrouble Classic back into TankTrouble Online
// ==UserScript==
// @name Classic Mouse
// @author commander
// @description Restores the mouse from TankTrouble Classic back into TankTrouble Online
// @namespace https://github.com/asger-finding/tanktrouble-userscripts
// @version 0.0.1
// @license GPL-3.0
// @match https://tanktrouble.com/*
// @match https://beta.tanktrouble.com/*
// @exclude *://classic.tanktrouble.com/
// @run-at document-end
// @grant none
// @noframes
// ==/UserScript==
/* eslint-disable new-cap */
/* eslint-disable complexity */
UIConstants.CLASSIC_MOUSE_INPUT = {
ROTATION_DEAD_ANGLE: 0.1,
POSITION_DEAD_DISTANCE: 180
};
MouseInputManager.method('update', function() {
this._super();
const game = GameManager.getGame();
if (game) {
let forwardState = false;
const backState = false;
const leftState = [];
const rightState = [];
let fireState = false;
const gameBounds = game.scale.bounds;
const gameScale = game.scale.scaleFactor;
this.mouseX = (MouseInputManager.mousePageX - gameBounds.x) * gameScale.x;
this.mouseY = (MouseInputManager.mousePageY - gameBounds.y) * gameScale.y;
if (game.input.enabled && MouseInputManager.mouseActivated) {
if (game.state.getCurrentState().getTankSprite) {
const tankSprite = game.state.getCurrentState().getTankSprite(this.playerId);
if (tankSprite) {
const relativeToTank = tankSprite.toLocal(new Phaser.Point(this.mouseX, this.mouseY));
const angle = Phaser.Math.angleBetween(0, 0, relativeToTank.x, relativeToTank.y);
const distance = Math.abs((angle / Math.PI) + 0.5);
const rotationSpeedMultiplier = distance > 0.1
? Math.max(Math.min(distance * 12, 4), 1)
: 1;
leftState.push(angle + (Math.PI * 0.5) < -UIConstants.CLASSIC_MOUSE_INPUT.ROTATION_DEAD_ANGLE, rotationSpeedMultiplier);
rightState.push(angle + (Math.PI * 0.5) > UIConstants.CLASSIC_MOUSE_INPUT.ROTATION_DEAD_ANGLE, rotationSpeedMultiplier);
forwardState = relativeToTank.getMagnitude() > UIConstants.CLASSIC_MOUSE_INPUT.POSITION_DEAD_DISTANCE / UIConstants.GAME_ASSET_SCALE;
fireState ||= KeyboardInputManager.leftMouseDown || game.input.mousePointer.leftButton.isDown;
}
}
}
let stateChanged = false;
stateChanged ||= this.storedStates.forward !== forwardState;
stateChanged ||= this.storedStates.fire !== fireState;
stateChanged ||= !leftState.every((el, i) => this.storedStates.left[i] === el);
stateChanged ||= !rightState.every((el, i) => this.storedStates.right[i] === el);
const gameController = GameManager.getGameController();
if (stateChanged && gameController) {
const inputState = InputState.withState(this.playerId, forwardState, backState, leftState, rightState, fireState);
gameController.setInputState(inputState);
}
this.storedStates.forward = forwardState;
this.storedStates.back = backState;
this.storedStates.left = leftState;
this.storedStates.right = rightState;
this.storedStates.fire = fireState;
}
});
Tank.method('setTankState', function(tankState) {
this.playerId = tankState.getPlayerId();
this.x = tankState.getX();
this.y = tankState.getY();
this.forward = tankState.getForward();
this.back = tankState.getBack();
this.rotation = tankState.getRotation();
this.fireDown = tankState.getFireDown();
this.locked = tankState.getLocked();
const left = tankState.getLeft();
const right = tankState.getRight();
[this.left, this.rotationSpeedMultiplier] = Array.isArray(left) ? left : [left, 1.0];
[this.right, this.rotationSpeedMultiplier] = Array.isArray(right) ? right : [right, 1.0];
if (this.b2dbody) {
this.b2dbody.SetPosition(Box2D.Common.Math.b2Vec2.Make(this.x, this.y));
this.b2dbody.SetAngle(this.rotation);
this.update();
}
});
Tank.method('update', function() {
this.x = this.b2dbody.GetPosition().x;
this.y = this.b2dbody.GetPosition().y;
this.rotation = this.b2dbody.GetAngle();
if (this.locked) {
this.b2dbody.SetLinearVelocity(Box2D.Common.Math.b2Vec2.Make(0.0, 0.0));
this.b2dbody.SetAngularVelocity(0.0);
} else {
this._computeSpeed();
this._computeRotationSpeed();
const speedX = Math.sin(this.rotation) * this.speed;
const speedY = -Math.cos(this.rotation) * this.speed;
this.b2dbody.SetLinearVelocity(Box2D.Common.Math.b2Vec2.Make(speedX, speedY));
this.b2dbody.SetAngularVelocity(this.rotationSpeed * (this.rotationSpeedMultiplier || 1));
}
});