VPA-Keyboard

For planets.nu -- Add VPA-key strokes, and commands

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name        VPA-Keyboard
// @author      Quapla
// @copyright   Basecode: Kero van Gelder, 2016 - latest: Quapla
// @license     Lesser Gnu Public License, version 3
// @downloadURL
// @description For planets.nu -- Add VPA-key strokes, and commands
// @namespace   quapla/VPA-Keyboard
// @include     http://planets.nu/*
// @include     http://play.planets.nu/*
// @include     http://test.planets.nu/*
// @version     1.0.8
// @grant       none
// ==/UserScript==

// Reference:   Kero van Gelder's Keyboard: http://chmeee.org/ext/planets.nu/Keyboard.user.js

// Changes by Quapla:
// Use Arrows to select ships
// --> LEFT/RIGHT numerical previous/next
// --> UP/DOWN previous/next at same position as planet -> base -> ships (numerical) -> again planet
// --> '#' sets all ships at position "ready" and moves to next ship (not ready yet)
// --> ' ' toggles move mode to set waypoints with cursors, use SHIFT for 81LY

sharedContent.prototype.planetSurvey_ori = sharedContent.prototype.planetSurvey;
sharedContent.prototype.planetSurvey = function (planetId) {
	vgap.currentPlanetSurvey = planetId;
	this.planetSurvey_ori(planetId);
}

sharedContent.prototype.editNote_ori = sharedContent.prototype.editNote;
sharedContent.prototype.editNote = function (noteId, noteType) {
	vgap.currentNoteId = noteId;
	vgap.currentNoteType = noteType;
	this.editNote_ori(noteId, noteType);
	$("#EditNote").focus();
}

vgapShipScreen.prototype.shipMission_ori = vgapShipScreen.prototype.shipMission;
vgapShipScreen.prototype.shipMission = function () {
	this.shipMissionOpen = true;
	this.shipMission_ori();
}

vgapShipScreen.prototype.selectMission_ori = vgapShipScreen.prototype.selectMission;
vgapShipScreen.prototype.selectMission = function (missionId) {
	this.selectMission_ori(missionId);
	this.shipMissionOpen = false;
}

vgapShipScreen.prototype.primaryEnemy_ori = vgapShipScreen.prototype.primaryEnemy;
vgapShipScreen.prototype.primaryEnemy = function () {
	this.primaryEnemyOpen = true;
	this.primaryEnemy_ori();
}
vgapShipScreen.prototype.selectEnemy_ori = vgapShipScreen.prototype.selectEnemy;
vgapShipScreen.prototype.selectEnemy = function (enemyId) {
	this.selectEnemy_ori(enemyId);
	this.primaryEnemyOpen = false;
}
vgaPlanets.prototype.closeMore_ori = vgaPlanets.prototype.closeMore;
vgaPlanets.prototype.closeMore = function (callback) {
	vgap.closeMore_ori(callback);
	this.primaryEnemyOpen = false;
	vgap.currentPlanetSurvey = null;
	vgap.shipScreen.shipMissionOpen = false;
}

vgapMap.prototype.selectPlanet_ori = vgapMap.prototype.selectPlanet;
vgapMap.prototype.selectPlanet = function (planet) {
	vgaPlanets.prototype.Quapla_Move = false;
	this.selectPlanet_ori(planet);
}

vgapMap.prototype.selectShip_ori = vgapMap.prototype.selectShip;
vgapMap.prototype.selectShip = function (ship) {
	vgaPlanets.prototype.Quapla_Move = false;
	this.selectShip_ori(ship);
}
vgapMap.prototype.drawPlanetNames = function (e, f) {
	if (vgap.map.planetnames) {
		for (var a = 0; a < vgap.planets.length; a++) {
			var c = vgap.planets[a];
			if (this.isVisible(c.x, c.y, this.planetRad(c))) {
				var show = c.id + "- " + c.name;
				var ctx = vgap.map.ctx;
				ctx.textAlign = "center";
				//ctx.fillStyle = color;
				ctx.fillText(show, this.screenX(c.x), (this.screenY(c.y)-10));
			}
		}
	} else {
		//$(".PlanetName").remove()
		vgapMap.prototype.reload();
	}
	/*	drawPlanetNames : function (x, y) {
		for (var i = 0; i < vgap.planets.length; i++) {
			var planet = vgap.planets[i];
			var left = this.screenX(planet.x) + 10;
			var top = this.screenY(planet.y) - 15;
			$("<div class='PlanetName' style='left:" + left + "px;top:" + top + "px;'>" + planet.id + ": " + planet.name + "</div>").appendTo(this.mapCover);
		}
*/

}


		
var hotkey_ori = vgaPlanets.prototype.hotkey;
vgaPlanets.prototype.hotkey = function (event) {
	//console.log("KC: "+event.keyCode);
	if (vgap.shipScreen.primaryEnemyOpen) {
		var enemy = 0;
		if (event.keyCode >= 48 && event.keyCode <= 57)
			enemy = event.keyCode - 48;
		if (event.keyCode >= 65 && event.keyCode <= 90)
			enemy = event.keyCode - 65 + 10;
		if (enemy <= vgap.players.length) {
			vgap.shipScreen.selectEnemy(enemy);
			return;
		}
	}

	if (vgap.shipScreen.shipMissionOpen) {
		var missionId = -1;
		if (event.keyCode == 67)
			missionId = 9; // 'c', Cloak
		else if (event.keyCode == 69)
			missionId = 0; // 'e', Explore
		else if (event.keyCode == 73)
			missionId = 7; // 'i', Intercept
		else if (event.keyCode == 75)
			missionId = 3; // 'k', Kill
		else if (event.keyCode == 76)
			missionId = 2; // 'l', Lay Mines
		else if (event.keyCode == 77)
			missionId = 1; // 'm', Mine Sweep
		else if (event.keyCode == 83 && event.shiftKey)
			missionId = 8; // 'S', Special / Super Spy
		else if (event.keyCode == 83)
			missionId = 4; // 's', Sensor Sweep
		else if (event.keyCode == 84)
			missionId = 6; // 't', Tow
		if (missionId >= 0) {
			vgap.shipScreen.selectMission(missionId);
			return;
		}
	}

	if (vgap.editNoteOpen) {
		if (event.keyCode == 13 && event.ctrlKey) {
			this.saveNote(vgap.currentNoteId, vgap.currentNoteType);
			return;
		}
	}

	if (event.keyCode == 27) {
		if (this.findObjectFeatureActivated)
			vgap.map.hideFindObjectFeature();
		else if (vgap.moreOpen)
			this.closeMore();
		else if (this.lcOpen)
			this.deselectAll();
		return;
	}

	/*	TAB not working properly in browsers
	if (event.keyCode == 9) { //TAB}
	if (event.shiftKey) vgap.map.zoomout()
	else vgap.map.zoomin()
	return;
	}
	 */

	if (vgap.hotkeysOn) {
		switch (event.keyCode) {
		case 8:
			if ((this.starbaseScreenOpen || this.planetScreenOpen || this.shipScreenOpen) && !this.moreOpen) {
				vgap.rPrev();
				return;
			}
		case 78: // 'n'
			if (event.shiftKey) {
				if (this.planetScreenOpen) {
					shtml.editNote(vgap.planetScreen.planet.id, 1);
					return;
				} else if (vgap.currentPlanetSurvey > 0) { // ship screen is open, but unowned planet is selected
					shtml.editNote(vgap.currentPlanetSurvey, 1);
					return
				} else if (this.shipScreenOpen) {
					shtml.editNote(vgap.shipScreen.ship.id, 2);
					return;
				} else if (this.starbaseScreenOpen) {
					shtml.editNote(vgap.starbaseScreen.starbase.id, 3);
					return;
				}
			}
			break;
		case 88: // 'x'
			this.map.clearTools();
			return;
		case 90: // 'z'
			this.map.zoomFarInOrOut_OnWaypointOrPlanet();
			return;

		case 32: //space bar
			if (this.planetScreenOpen || this.shipScreenOpen) {
				vgaPlanets.prototype.Quapla_Move = !vgaPlanets.prototype.Quapla_Move;
				return;
			}

			//case 188: // '<' if (event.shiftKey)
		case 38: // Arrow up
			if (vgaPlanets.prototype.Quapla_Move)
				if (event.shiftKey)
					this.map.moveSelect(0, 81);
				else
					this.map.moveSelect(0, 1);
			else
				vgap.unrotateActiveObject();
			return;
			// case 190: // '>'
		case 40: // Arrow-Down if (event.shiftKey)
			if (vgaPlanets.prototype.Quapla_Move)
				if (event.shiftKey)
					this.map.moveSelect(0, -81);
				else
					this.map.moveSelect(0, -1);
			else
				vgap.rotateActiveObject();
			return;
		case 39: // Arrow right // if (ev.keyCode == 39 && this.shipScreenOpen || this.planetScreenOpen)
			if (vgaPlanets.prototype.Quapla_Move)
				if (event.shiftKey)
					this.map.moveSelect(81, 0);
				else
					this.map.moveSelect(1, 0);
			else
				this.rNext();
			return;
		case 37: // Arrow left // if (ev.keyCode == 39 && this.shipScreenOpen || this.planetScreenOpen)
			if (vgaPlanets.prototype.Quapla_Move)
				if (event.shiftKey)
					this.map.moveSelect(-81, 0);
				else
					this.map.moveSelect(-1, 0);
			else
				this.rPrev();
			return;

		case 163: // '#' set ships/planet ready "Firefox"
		case 191: // Opera
			{
				var item = 0;
				var item2 = 0;
				if (this.planetScreenOpen) {
					var item = vgap.planetScreen.planet.id;
					vgap.planetScreen.planet.readystatus = 1;
				} else if (this.starbaseScreenOpen) {
					item = vgap.starbaseScreen.starbase.id;
					vgap.starbaseScreen.starbase.readystatus = 1;
				} else if (this.shipScreenOpen) {
					var ship = vgap.shipScreen.ship;
					item = ship.id;
					ship.readystatus = 1; // Set ready
					var ships = vgap.shipsAt(ship.x, ship.y)
						var index = ships.indexOf(ship);
					for (var i = 0; i < ships.length; i++) {
						if (ships[i].ownerid == vgap.player.id)
							if (ships[i].readystatus == 0)
								ships[i].readystatus = 1;
					}
				}
				do {
					this.rNext();
					if (this.planetScreenOpen) {
						if (vgap.planetScreen.planet.readystatus < 1)
							break; // This is the next "unready" one...
						item2 = vgap.planetScreen.planet.id;
					} else if (this.starbaseScreenOpen) {
						if (vgap.starbaseScreen.starbase.readystatus < 1)
							break;
						item2 = vgap.starbaseScreen.starbase.id;
					} else if (this.shipScreenOpen) {
						if (vgap.shipScreen.ship.readystatus < 1)
							break;
						item2 = vgap.shipScreen.ship.id;
					}
				} while (item != item2); // until
				return;
			}
			case 80: // 'P' && (!this.planetScreenOpen && !this.starbaseScreenOpen))
			case 112: // 'p'
			{
				vgap.map.planetnames = !vgap.map.planetnames;
				vgap.map.drawPlanetNames();
				return;
			}
		} // End Case
	}
	hotkey_ori.apply(this, arguments);
	//this.hotkey_ori(event);
}

vgapMap.prototype.zoomFarInOrOut_OnWaypointOrPlanet = function () {
	var zoomedOut = (this.zoom < 29);
	if (zoomedOut) {
		this.zoomFactorBeforeZoomingInDeeply = this.zoom;
		this.setZoom(42);
	} else {
		this.setZoom(this.zoomFactorBeforeZoomingInDeeply);
	}
	var x,
	y;
	if (this.activeShip) {
		x = this.activeShip.targetx;
		y = this.activeShip.targety;
	} else if (this.activePlanet) {
		x = this.activePlanet.x;
		y = this.activePlanet.y;
	} else {
		x = this.centerX;
		y = this.centerY;
	}

	this.centerX = x;
	this.centerY = y;
	this.canvas.x = x - $(window).width() / 2 / this.zoom;
	this.canvas.y = y - $(window).height() / 2 / this.zoom;
	this.draw();
}

vgaPlanets.prototype.rotateActiveObject = function () {
	if (vgap.planetScreenOpen) {
		var planet = vgap.map.activePlanet;
		if (planet.isbase) {
			vgap.map.selectStarbase(planet.id);
		} else {
			var ships = vgap.shipsAt(planet.x, planet.y);
			if (ships.length > 0)
				vgap.map.selectShip(ships[0].id);
			// else only a planet
		}
	} else if (vgap.starbaseScreenOpen) {
		var planet = vgap.map.activePlanet;
		var ships = vgap.shipsAt(planet.x, planet.y);
		if (ships.length > 0) {
			vgap.map.selectShip(ships[0].id);
		} else {
			vgap.map.selectPlanet(planet.id);
		}
	} else if (vgap.shipScreenOpen) {
		var ship = vgap.map.activeShip;
		var ships = vgap.shipsAt(ship.x, ship.y)
			var index = ships.indexOf(ship);
		if (index == ships.length - 1) {
			var planet = vgap.planetAt(ship.x, ship.y)
				if (planet) {
					vgap.map.selectPlanet(planet.id);
				} else if (ships.length > 1) {
					vgap.map.selectShip(ships[0].id);
				} // else Cannot rotate 1 ship
		} else {
			vgap.map.selectShip(ships[index + 1].id);
		}
	}
}

vgaPlanets.prototype.unrotateActiveObject = function () {
	if (vgap.planetScreenOpen) {
		var planet = vgap.map.activePlanet;
		var ships = vgap.shipsAt(planet.x, planet.y);
		if (ships.length > 0) {
			vgap.map.selectShip(ships[ships.length - 1].id);
		} else if (planet.isbase) {
			vgap.map.selectStarbase(planet.id);
		} // else only a planet
	} else if (vgap.starbaseScreenOpen) {
		var planet = vgap.map.activePlanet;
		vgap.map.selectPlanet(planet.id);
	} else if (vgap.shipScreenOpen) {
		var ship = vgap.map.activeShip;
		var ships = vgap.shipsAt(ship.x, ship.y)
			var index = ships.indexOf(ship);
		if (index == 0) {
			var planet = vgap.planetAt(ship.x, ship.y)
				if (planet) {
					if (planet.isbase) {
						vgap.map.selectStarbase(planet.id);
					} else {
						vgap.map.selectPlanet(planet.id);
					}
				} else {
					if (ships.length > 1)
						vgap.map.selectShip(ships[ships.length - 1].id);
				}
		} else {
			vgap.map.selectShip(ships[index - 1].id);
		}
	}
}