MH - Raistlin - Keyboard shortcuts

Raccourcis clavier pour les compétences et sortilèges

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        MH - Raistlin - Keyboard shortcuts
// @namespace   MH
// @description Raccourcis clavier pour les compétences et sortilèges
// @include     *://games.mountyhall.com/*
// @include     *://mh2.mh.raistlin.fr/*
// @icon        https://xballiet.github.io/ImagesMH/MZ.png
// @version     1.5
// @grant       none
// @require     https://greasyfork.org/scripts/23602-tout-mz?version=892175&d=.user.js
// ==/UserScript==

// La liste des keyCodes est trouvable par exemple ici :
//      http://www.cambiaresearch.com/c4/702b8cd1-e5b0-42e6-83ac-25f0306e3e25/Javascript-Char-Codes-Key-Codes.aspx
// La liste des constantes JS correspondante est trouvable par exemple ici :
//      http://stackoverflow.com/questions/1465374/javascript-event-keycode-constants

/****************************************************************************************
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 *     UTILS                                                                            *
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 ****************************************************************************************/
function array_flip(trans) {
	var key, tmp_ar = {};
	for (key in trans) {
		if (trans.hasOwnProperty(key)) {
			tmp_ar[trans[key]] = key;
		}
	}
	return tmp_ar;
}

function getShortCutsArray() {
	// Tableau contenant la liste des raccourcis sous la forme C => 124
	var localShortCutsArray = new Array();
	var shortCutsList = window.localStorage['shortcutsList'];
	if ((shortCutsList == null) || (shortCutsList == undefined) || (shortCutsList == 'undefined')) {
		return new Array();
	}
	var firstArray = shortCutsList.split(';');
	for (var i = 0 ; i < firstArray.length - 1 ; i++) {
		secondArray = firstArray[i].split(':');
		if (secondArray[0].length > 0) {
			localShortCutsArray[secondArray[0]] = secondArray[1];
		}
	}
	return localShortCutsArray;
}

function insertBefore(next, el) {
	next.parentNode.insertBefore(el, next);
}

function insertTd(next) {
	var td = document.createElement('td');
	insertBefore(next, td);
	return td;
}

function appendText(paren, text, bold) {
	if (bold) {
		var b = document.createElement('b');
		b.appendChild(document.createTextNode(text));
		paren.appendChild(b);
	} else {
		paren.appendChild(document.createTextNode(text));
	}
}

function appendTextbox(paren, type, nam, size, maxlength, value) {
	var input = document.createElement('input');
	input.className = 'TextboxV2';
	input.type = type;
	input.name = nam;
	input.id = nam;
	input.size = size;
	input.maxLength = maxlength;
	if(value) input.value = value;
	paren.appendChild(input);
	return input;
}

function appendButton(paren, value, onClick) {
	var input = document.createElement('input');
	input.type = 'button';
	input.className = 'mh_form_submit';
	input.value = value;
	input.onmouseover = function(){this.style.cursor='pointer';};
	if(onClick) input.onclick = onClick;
	paren.appendChild(input);
	return input;
}

/****************************************************************************************
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 *     GESTION DE LA PAGE PROFIL                                                        *
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 ****************************************************************************************/

/***********************************************************************
 * Ajout d'un th entre le nom et le niveau de maitrise d'une comp/sort *
 ***********************************************************************/
function addThToTr(tr) {
	// On ajoute le th
	var th = document.createElement('th');
	insertBefore(tr.childNodes[5], th);

	// Un peu de mise en page
	th.width = '65px';
	th.align = 'center';
}

/***********************************************************************
 * Ajout d'un td entre le nom et le niveau de maitrise d'une comp/sort *
 ***********************************************************************/
function addTdToTr(tr, talName) {
	var talNameString = '' + talName;
	if (talNameString.length < 2) {
		talName = '0' + talName;
	}

	// On ajoute le td
	var td = insertTd(tr.childNodes[5]);

	// On ajoute le texte
	appendText(td, 'AltGr+');

	// On ajoute la textbox
	tb = appendTextbox(td, 'text', talName, 1, 1, '');

	// On met a jour la valeur de la textbox si le cookie existe
	var reverseShortCutsArray = array_flip(shortCutsArray);
	tb.value = reverseShortCutsArray[talName];

	// Si c'est pas un caractere, on vide (c'est moche, mais c'est pour eviter les "undefined")
	if (tb.value.length > 1) {
		tb.value = '';
	}
}

/***********************************************************************
 * Sauvegarde des raccourcis dans le localStorage                      *
 ***********************************************************************/
function shortCutUpdate() {
	// La chaine qui stockera la liste des raccourcis non vides
	var shortCutsList = '';

	// Un tableau juste pour verifier l'absence de doublons
	var localShortCutsArray = new Array();

	for (var i = 0 ; i < talIds.length ; i++) {
		// On recupere la liste des inputs rajoutes par le script pour les comps et les sorts
		var snapShotInputs = document.evaluate('./tbody/tr/td/input[@class="TextboxV2"]', document.getElementById(talIds[i]), null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

		// On parcourt la liste des textbox des comps et des sorts
		for (var cpt = 0 ; cpt < snapShotInputs.snapshotLength ; cpt++) {
			// On recupere la textbox courante
			var currentInput = snapShotInputs.snapshotItem(cpt);

			// On sauve la valeur du raccourci pour l'affichage ulterieur
			if (currentInput.value.length > 0) {
				shortCutsList += currentInput.value + ':' + currentInput.name + ';';
				// Si on tombe sur un doublon, on arrete la sauvegarde
				if (currentInput.value in localShortCutsArray) {
					window.alert('Erreur : doublons dans les raccourcis');
					return;
				}
				localShortCutsArray[currentInput.value] = currentInput.name;
			}
		}
	}

	// On sauve la liste et on previent le joueur
	window.localStorage['shortcutsList'] = shortCutsList;

	// On met a jour les 2 frames (gauche et haut-droite) pour que les raccourcis soient immediatement pris en compte
	window.parent.parent.Sommaire.location.reload();
	window.parent.parent.Main.Contenu.location.reload();

	window.alert('Raccourcis sauvegard\u00E9s');
}

function mainProfil() {
	// Si on est sur le profil, on rajoute les champs dans les comps/sorts pour rajouter le raccourcis
	// Le champ est initialise avec la valeur du localStorage si elle existe
	for (var i = 0 ; i < talIds.length ; i++) {
		// On recupere la liste des lignes de competences et sorts
		var listeTal = document.getElementById(talIds[i]);

		// Pour chaque competence et sort, on rajoute un champ "input" de 1 caractere entre la comp et le %
		x_tals = listeTal.getElementsByTagName('tr');
		addThToTr(x_tals[0]);
		for (var cpt = 1 ; cpt < x_tals.length ; cpt++) {
			var talTarget = document.evaluate('./td/a[@target="Action"]', x_tals[cpt], null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0).getAttribute('href').match(/\d+/);

			// Le nom de la textbox est l'id
			addTdToTr(x_tals[cpt], talTarget);
		}
	}

	// On rajoute un tr/td sous la table pour rajouter le bouton save
	var footer2 = document.getElementById('footer2');
	saveDiv = document.createElement('div');
	insertBefore(footer2, saveDiv);

	// On rajoute un bouton pour sauvegarder dans le localStorage
	saveButton = appendButton(saveDiv, 'Mise a jour des raccourcis', shortCutUpdate);
}

/****************************************************************************************
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 *     GESTION DES RACCOURCIS                                                           *
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 ****************************************************************************************/
// Ajout des keyhandlers
function keyHandler(e) {
	// Recuperation du keyCode correspondant a la touche pressee
	var keyPressedCode = (e.keyCode ? e.keyCode : e.which);

	// Recuperation du caractere correspondant
	var talent = shortCutsArray[String.fromCharCode(keyPressedCode)];

	// On lance le raccourci, sauf si on est en train de remplir un champ texte (input ou textarea)
	if ((e.ctrlKey && e.altKey) && (document.activeElement.nodeName != 'INPUT') && (document.activeElement.nodeName != 'TEXTAREA')) {
		window.parent.parent.Main.Action.location = '?ai_ToDo=' + talent;
	}
}

/****************************************************************************************
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 *     MAIN                                                                             *
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
 ****************************************************************************************/
// Tableau contenant les raccourcis : en variable globale (beuh)
shortCutsArray = getShortCutsArray();

var talIds = ['competences', 'sortileges'];

// Ajout des champs sur le profil
if (window.self.location.toString().indexOf('MH_Play/Play_profil2.php') !== -1) {
	mainProfil();
}

// Si on n'est pas sur le profil, on peut declencher les raccourcis (c'est pour eviter de lancer des raccourcis existants quand on essaye d'en mettre d'autres)
if (window.self.location.toString().indexOf('') !== -1) {
	document.addEventListener('keypress', keyHandler, true);
}