Twill sent me the script for 1.0 if it's any use:
// ==UserScript==
// @name ConquerClub - Clickable Maps
// @include
http://*conquerclub.com/game.php?game=*
// ==/UserScript==
// version 1.0
debugging = false
if ( debugging ) {
var debug_win = window.open('', "test", "")
debug_win.document.open("text/plain", "replace")
}
function debug(debug_text) {
try {
debug_win.document.write(debug_text+"\n")
} catch(err) { return }
}
debug('running clickable map script')
function findPos(obj) {
var curleft = curtop = 0;
if (obj.offsetParent) {
curleft = obj.offsetLeft
curtop = obj.offsetTop
while (obj = obj.offsetParent) {
curleft += obj.offsetLeft
curtop += obj.offsetTop
}
}
return [curleft,curtop];
}
function createMenuItem(parentElem, id, listener, method, displayText) {
var m = new Array()
m['item'] = document.createElement('li')
m['link'] = document.createElement('a')
m['link'].id = id
m['link'].href = 'javascript:void(0);'
m['link'].innerHTML = displayText
parentElem.appendChild(m['item'])
m['item'].appendChild(m['link'])
m['link'].addEventListener(listener, method, false)
return m
}
function updateAction(_cmd) {
var helpmsg
if ( _cmd ) {
doAction = _cmd
if ( _cmd == 'large' || _cmd == 'small' ) {
switch(_cmd) {
case 'large':
mapx='largex'
mapy='largey'
break
case 'small':
mapx='smallx'
mapy='smally'
break
}
}
}
actionString = document.getElementById('action').innerHTML
if ( actionString.match('Waiting for your next turn') || actionString.match('You may take your turn now') ) {
doAction = 'Waiting'
helpmsg = ''
}
if ( actionString.match('armies left to deploy') ) {
doAction = 'Deploy'
helpmsg =
'<b>Change # of armies:</b> number keys, left/right arrow keys, mouse wheel. <b>Deploy:</b> click friendly territory. <b>Deploy one:</b> CTRL+click. '
+ '<b>Deploy all:</b> SHIFT+click'
}
if ( actionString.match('Attack from') ) {
doAction = 'Attack'
helpmsg = '<b>Attack from:</b> click friendly territory. <b>Attack to:</b> click enemy territory. <b>Auto-attack:</b> SHIFT+click enemy territory. <b>End attacks:</b> e'
}
if ( actionString.match('Advance') ) {
doAction = 'Advance'
helpmsg =
'<b>Change # of armies:</b> number keys, arrow keys, mouse wheel. <b>Advance 0 armies:</b> click territory attacked from. '
+ '<b>Advance selected # of armies:</b> click territory just conquered'
}
if ( actionString.match('Fortify') ) {
doAction = 'Fortify'
helpmsg =
'<b>Change # of armies:</b> number keys, arrow keys, mouse wheel. <b>Fortify from:</b> click territory. <b>Fortify to:</b> SHIFT+click territory. '
+ '<b>End fortification:</b> e'
}
if ( helpmsg ) { document.getElementById('helpDiv').innerHTML = ' '+helpmsg }
debug('running updatAction. new action: '+doAction)
return true
}
function toggle(optElem) {
var pref = optElem.id
switch(pref) {
case 'actionMenu':
switch(userPrefs[pref]) {
case 'normal':
actionForm.style.position = 'fixed'
actionForm.style.bottom = 0
actionForm.style.zIndex = 1
userPrefs[pref] = 'floating'
break
case 'floating':
actionForm.style.position = ''
actionForm.style.bottom = ''
actionForm.style.zIndex = 1
userPrefs[pref] = 'normal'
break
}
break
case 'showHelp':
helpDiv = document.getElementById('helpDiv')
switch(userPrefs[pref]) {
case 'N': helpDiv.style.visibility = 'visible'
break
case 'Y': helpDiv.style.visibility = 'hidden'
break
}
//break
default:
switch(userPrefs[pref]) {
case 'Y':
userPrefs[pref] = 'N'
break
case 'N':
userPrefs[pref] = 'Y'
break
}
break
}
// update the menu item to display the new preference
optElem.getElementsByTagName('b')[0].innerHTML = userPrefs[pref]
// store the updated preferences in the cookie
userPrefsToCookie(userPrefs)
}
function refreshClickableMap() {
debug('\n\nrunning refreshClickableMap')
GM_xmlhttpRequest({method: 'GET',url: 'http://www.conquerclub.com/maps/'+mapName+'.xml',headers: {'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.3' , 'Accept': 'application/xml,text/xml'},onload:
function(responseDetails) {
debug('running responseDetails')
updateAction('')
var parser = new DOMParser()
var dom = parser.parseFromString(responseDetails.responseText,"application/xml")
mapSize = unsafeWindow.mapResolution
territories = dom.getElementsByTagName('territory')
armies = document.getElementById('armies').innerHTML.split(',')
switch(mapSize) {
case 'L':
updateAction('large')
break
case 'S':
updateAction('small')
break
}
}})
}
function onMapClick(e) {
debug('map clicked')
var clickedTerritory
pos = findPos(outerMap)
mapOffsetLeft = pos[0]
mapOffsetTop = pos[1]
clickX = e.pageX - mapOffsetLeft - 4
clickY = e.pageY - mapOffsetTop + 19
for (i=0;i<territories.length;i++) {
title = territories[i].getElementsByTagName('name')[0].textContent
tX = territories[i].getElementsByTagName( mapx )[0].textContent
tY = territories[i].getElementsByTagName( mapy )[0].textContent
if ( tX > clickX - 15 && tX < clickX + 15 && tY > clickY - 15 && tY < clickY + 15 ) {
clickedTerritory = territories[i]
tIndex = i
tArmies = armies[i].split('-')
playerNumber = tArmies[0]
break
}
}
if ( ! clickedTerritory ) { debug('no territory clicked. x:'+clickX+' y:'+clickY); return false }
if ( doAction == 'Waiting' ) {
debug('not your turn. exiting')
return false
}
tName = clickedTerritory.getElementsByTagName('name')[0].textContent
try { fromTerritory = territories[document.getElementById('from_country').value].getElementsByTagName('name')[0].textContent
}catch(err){fromTerritory = ''}
try { toTerritory = territories[document.getElementById('to_country').value].getElementsByTagName('name')[0].textContent
}catch(err){toTerritory = ''}
selectFromCountry = document.getElementById('from_country')
selectToCountry = document.getElementById('to_country')
selectQuantity = document.getElementById('quantity')
if ( selectQuantity ) { numArmies = selectQuantity.value; selectQuantity.focus() }
updateAction('')
switch(doAction) {
case 'Deploy':
selectToCountry.value = tIndex
if ( selectToCountry.value != tIndex ) { return } // an enemy territory was clicked during deployment
toTerritory = tName
armiesLeftToDeploy = actionString.split(' ')[2]
confirmMessage = 'Deploy '+selectQuantity.value+' armies on '+toTerritory+'?'
if ( e.shiftKey ) {
selectQuantity.value = armiesLeftToDeploy
confirmMessage = 'Deploy all '+armiesLeftToDeploy+' armies on '+toTerritory+'?'
} else if ( e.ctrlKey ) {
selectQuantity.value = "1"
confirmMessage = 'Deploy 1 army on '+toTerritory+'?'
}
break
case 'Attack':
if ( fromTerritory == '' || toTerritory == '' ) { return }
// if freindly, then set from_country and return
if ( playerNumber == currentPlayerNumber ) {
selectFromCountry.value = tIndex
unsafeWindow.filterTo(tIndex)
if ( selectFromCountry.value != tIndex ) { return }
fromTerritory = tName
return
// if enemy, set as to_country and continue to attack
} else {
selectToCountry.value = tIndex
if ( selectToCountry.value != tIndex ) { alert(tName+' is not accessible from '+fromTerritory); return }
if ( e.shiftKey ) {
doAction = 'Auto-Attack'
}
toTerritory = tName
}
confirmMessage = doAction+' from '+fromTerritory+' to '+toTerritory+'?'
attackedFromTerritory = fromTerritory
break
case 'Advance':
debug('attackedFromTerritory: '+attackedFromTerritory)
toTerritory = tName
if ( toTerritory == '' ) { return }
if ( toTerritory == attackedFromTerritory ) { selectQuantity.value = '0'; numArmies = '0'; }
confirmMessage = 'Advance '+numArmies+' armies?'
break
case 'Fortify':
if ( e.shiftKey ) {
selectToCountry.value = tIndex
if ( selectToCountry.value != tIndex ) { alert(tName+' is not accessible from '+fromTerritory); return }
toTerritory = tName
} else {
selectFromCountry.value = tIndex
fromTerritory = tName
toTerritory = ''
unsafeWindow.filterTo(tIndex)
}
if ( fromTerritory == '' || toTerritory == '' ) { return }
confirmMessage = 'Fortify '+numArmies+' armies from '+fromTerritory+' to '+toTerritory+'?'
break
}
if ( userPrefs['confirm'+doAction] == 'Y' ) {
if ( confirm(confirmMessage) == false ) { return }
}
unsafeWindow.sendRequest(doAction)
}
function getCurrentPlayer() {
var allPlayers = new Array();
debug('getting player number for '+currentPlayerName)
playerElements = document.getElementById('players').getElementsByTagName('span')
for (var i=0;i<playerElements.length;i++) {
if ( playerElements[i].className.match('player') ) {
allPlayers.push(playerElements[i])
}
}
for (var i=0;i<allPlayers.length;i++) {
debug('checking player: '+allPlayers[i].innerHTML)
debug( ':'+allPlayers[i].innerHTML+': == :'+currentPlayerName+': i: '+i+' i+1: '+(parseInt(i)+1) )
if ( allPlayers[i].innerHTML == currentPlayerName ) {
var playerNumber = i+1
debug(currentPlayerName+': player '+playerNumber)
break
}
}
return playerNumber
}
function onKeyPress(e) {
if ( e.which == 101) { // e (end phase)
updateAction('')
if ( doAction == 'Attack' ) {
unsafeWindow.sendRequest("End Attacks")
}
if ( doAction == 'Fortify' ) {
debug('unsafeWindow.sendRequest("End Fortification")')
unsafeWindow.sendRequest("End Fortification")
}
return
}
selectQuantity = document.getElementById('quantity')
if ( ! selectQuantity ) { return }
switch (e.keyCode) {
case 37: // left arrow
selectQuantity.value = parseInt(selectQuantity.value) - 1
break
case 39: // right arrow
selectQuantity.value = parseInt(selectQuantity.value) + 1
break
}
if ( e.which > 47 && e.which < 58 ) { selectQuantity.value = e.which - 48 }
selectedQuantity = selectQuantity.value
}
function onMouseWheel(e) {
if ( userPrefs['useMouseWheel'] != 'Y' ) { return }
try { selectQuantity = document.getElementById('quantity') } catch (err) { return }
if ( ! selectQuantity ) { return }
if (e.detail) {
delta = -e.detail/3
if ( delta > 0 ) { selectQuantity.value = (parseInt(selectQuantity.value) + 1) }
if ( delta < 0 ) { selectQuantity.value = (parseInt(selectQuantity.value) - 1) }
selectedQuantity = selectQuantity.value
e.preventDefault()
e.returnValue = false
}
}
function setCookie(c_name,value,expiredays) {
var exdate=new Date()
exdate.setDate(exdate.getDate()+expiredays)
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}
function getCookie(c_name) {
if (document.cookie.length>0) {
c_start=document.cookie.indexOf(c_name + "=")
if (c_start!=-1) {
c_start=c_start + c_name.length+1
c_end=document.cookie.indexOf(";",c_start)
if (c_end==-1) { c_end=document.cookie.length }
return unescape(document.cookie.substring(c_start,c_end))
}
}
return ""
}
function userPrefsFromCookie() {
var a = getCookie('GM_CLICKABLE_MAPS').split(',')
var p = new Array()
for (i=0;i<a.length;i++) {
p[a[i].split(':')[0]] = a[i].split(':')[1]
}
return p
}
function userPrefsToCookie() {
var a = defaultPrefs
var p = new Array()
for (i=0;i<a.length;i++) {
pref_name = a[i].split(':')[0]
pref_value = userPrefs[pref_name]
p[i] = pref_name+':'+pref_value
}
setCookie('GM_CLICKABLE_MAPS', p, 1825)
}
// INITIALIZATION
var territories = new Array()
var armies = new Array()
var mapName = unsafeWindow.mapFile
var outerMap = document.getElementById('outer-map')
var mapCell = document.getElementById('map-cell')
mapCell.addEventListener('click', onMapClick, false)
var currentPlayerName = document.getElementById('leftColumn').getElementsByTagName('div')[1].getElementsByTagName('b')[0].innerHTML
var currentPlayerNumber = getCurrentPlayer()
var actionForm = document.getElementById('action-form')
var mapSize
var mapx
var mapy
var mapOffsetLeft
var mapOffsetTop
var fromTerritory
var toTerritory
var attackedFromTerritory
var selectQuantity
var selectedQuantity
var actionString
var doAction
var helpDiv = document.createElement('div')
helpDiv.id = 'helpDiv'
helpDiv.style.position = 'absolute'
helpDiv.style.height = '20px'
helpDiv.style.width = '100%'
helpDiv.style.top = '0px'
helpDiv.style.left = '0px'
helpDiv.style.paddingTop = '1px'
helpDiv.style.borderBottom = 'thin solid #000000'
helpDiv.style.zIndex = '1'
helpDiv.style.background= '#ddeedd'
helpDiv.style.color = '#000000'
document.getElementById('dashboard').parentNode.insertBefore(helpDiv, outerMap.previousSibling.previousSibling)
// set default preferences, then update userPrefs if necessary
var defaultPrefs = new Array()
defaultPrefs.push('actionMenu:normal')
defaultPrefs.push('confirmDeploy:Y')
defaultPrefs.push('confirmAttack:Y')
defaultPrefs.push('confirmAuto-Attack:Y')
defaultPrefs.push('confirmAdvance:Y')
defaultPrefs.push('confirmFortify:Y')
defaultPrefs.push('useMouseWheel:Y')
defaultPrefs.push('showHelp:Y')
if ( ! getCookie('GM_CLICKABLE_MAPS') ) {
setCookie('GM_CLICKABLE_MAPS', defaultPrefs, 1825)
}
var userPrefs = userPrefsFromCookie()
for ( var pref in defaultPrefs ) {
if ( ! userPrefs[defaultPrefs[pref].split(':')[0]] ) { userPrefs[defaultPrefs[pref].split(':')[0]] = defaultPrefs[pref].split(':')[1] }
}
userPrefsToCookie(userPrefs)
// insert menu container
var menuDiv = document.getElementById('leftColumn').getElementsByTagName('div')[1]
var clickableMapMenuHeading = document.createElement('h3')
var clickableMapMenu = document.createElement('ul')
clickableMapMenuHeading.innerHTML = '<b>Clickable Map Menu</b>'
menuDiv.appendChild(clickableMapMenuHeading)
menuDiv.appendChild(clickableMapMenu)
// create menu/submenu items
createMenuItem(clickableMapMenu, 'actionMenu', 'click', function(){toggle(this)}, 'Action Menu: <b>'+ userPrefs['actionMenu'] +'</b>')
createMenuItem(clickableMapMenu, 'confirmDeploy', 'click', function(){toggle(this)}, 'Confirm Deploy? <b>'+ userPrefs['confirmDeploy'] +'</b>')
createMenuItem(clickableMapMenu, 'confirmAttack', 'click', function(){toggle(this)}, 'Confirm Attack? <b>'+ userPrefs['confirmAttack'] +'</b>')
createMenuItem(clickableMapMenu, 'confirmAuto-Attack','click', function(){toggle(this)}, 'Confirm Auto-Attack? <b>'+ userPrefs['confirmAuto-Attack'] +'</b>')
createMenuItem(clickableMapMenu, 'confirmAdvance', 'click', function(){toggle(this)}, 'Confirm Advance? <b>'+ userPrefs['confirmAdvance'] +'</b>')
createMenuItem(clickableMapMenu, 'confirmFortify', 'click', function(){toggle(this)}, 'Confirm Fortify? <b>'+ userPrefs['confirmFortify'] +'</b>')
createMenuItem(clickableMapMenu, 'useMouseWheel', 'click', function(){toggle(this)}, 'Mouse Wheel Selects Number of Armies? <b>'+ userPrefs['useMouseWheel'] +'</b>')
createMenuItem(clickableMapMenu, 'showHelp', 'click', function(){toggle(this)}, 'Show Help Bar? <b>'+ userPrefs['showHelp'] +'</b>')
// load user prefs into menus
// action menu
for (var pref in userPrefs) {
var optElem = document.getElementById(pref)
switch(pref) {
case 'actionMenu':
switch(userPrefs[pref]) {
case 'normal':
actionForm.style.position=''
actionForm.style.bottom=''
actionForm.style.zIndex=1
userPrefs['actionMenu'] = 'normal'
break
case 'floating':
actionForm.style.position='fixed'
actionForm.style.bottom=0
actionForm.style.zIndex=1
userPrefs['actionMenu'] = 'floating'
break
}
break
case 'showHelp':
helpDiv = document.getElementById('helpDiv')
switch(userPrefs[pref]) {
case 'Y': helpDiv.style.visibility = 'visible'
break
case 'N': helpDiv.style.visibility = 'hidden'
break
}
break
// PREFERENCES BELOW THIS POINT ONLY NEED TO BE UPDATED IN THE MENU TO "Y" OR "N", SO WE ONLY NEED ONE CASE
default:
optElem.getElementsByTagName('b')[0].innerHTML = userPrefs[pref]
break
}
}
document.addEventListener('keypress', onKeyPress, false)
window.addEventListener('DOMMouseScroll', onMouseWheel, false)
refreshClickableMap()
var existingSendRequest = unsafeWindow.sendRequest
unsafeWindow.sendRequest = function(_cmd) {
existingSendRequest(_cmd)
setTimeout(function(){updateAction(_cmd)}, 1000)
return false
}
var existingGMScript = unsafeWindow.refreshGMScript
unsafeWindow.refreshGMScript = function() {
existingGMScript()
refreshClickableMap()
updateAction('')
debug('calling refreshGMScript')
return true
}