Files
game-of-thrones-map/ASoIaF-objects.js
T
HPEnvy\Ryan 65a3b97c87 debugged
2020-08-20 16:10:31 +08:00

350 lines
11 KiB
JavaScript

//Tile Handling
function getTileCode(a, b) {
//converts tile x,y into keyhole string
var c = Math.pow(2, b);
var d = a.x;
var e = a.y;
var f = 't';
for (var g = 0; g < b; g++) {
c = c / 2;
if (e < c) {
if (d < c) {
f += 'q';
} else {
f += 'r';
d -= c;
}
} else {
if (d < c) {
f += 't';
e -= c;
} else {
f += 's';
d -= c;
e -= c;
}
}
}
return f;
}
//Tile Handling
function isOutsideTileRange(coord, zoom) {
var tileRange = 1 << zoom;
if (coord.x < 0 || coord.x >= tileRange) return true;
if (coord.y < 0 || coord.y >= tileRange) return true;
return false;
}
//Transparent markers placed on top of each city, town, castle, & ruin
function markLocation(map, key, locationOptions) {
//Sample input-> They_Lay_With_Lions: {lat:23.4027, lng:-126.2548, title:"23: Inn (They Lay with Lions)", url:"http://awoiaf.westeros.org/index.php/A_Storm_of_Swords-Chapter_1"},
if (
typeof locationOptions.lat != 'number' ||
typeof locationOptions.lng != 'number'
) {
console.log(
'Location ' + key + ' was missing either the lat or lng attribute.'
);
return false;
}
var title =
typeof locationOptions.title != 'undefined' ? locationOptions.title : '';
var url =
typeof locationOptions.url != 'undefined'
? locationOptions.url
: 'http://awoiaf.westeros.org/index.php/' + key;
var marker = new google.maps.Marker({
position: new google.maps.LatLng(locationOptions.lat, locationOptions.lng),
title: title,
icon: { path: google.maps.SymbolPath.CIRCLE, strokeOpacity: 0, scale: 3 },
map: map,
});
google.maps.event.addListener(marker, 'click', function (event) {
if (ctrlPressed) window.location = '#@' + key;
else window.open(url, '_blank');
});
return marker;
}
//Colored shapes matching the borders of the 9 constituencies of Westeros
function createPolygon(map, regionOptions) {
//Sample input-> {coords:giftCoords, color:"#000000", key:"Gift"} (giftCoords is an array of google.maps.LatLng objects)
if (typeof regionOptions.key != 'string')
return console.log('Region was missing a key attribute.');
if (typeof regionOptions.color != 'string')
return console.log(
'Region ' + regionOptions.key + ' was missing a color attribute.'
);
if (
typeof regionOptions.coords != 'object' ||
regionOptions.coords.length < 3
)
return console.log(
'Region ' + regionOptions.key + ' was missing a coords attribute.'
);
var url = 'http://awoiaf.westeros.org/index.php/' + regionOptions.key;
var polygon = new google.maps.Polygon({
paths: regionOptions.coords,
fillColor: regionOptions.color,
fillOpacity: 0.7,
strokeWeight: 0,
visible: false,
map: map,
});
google.maps.event.addListener(polygon, 'click', function (event) {
window.open(url, '_blank');
});
return polygon;
}
//Coats of arms for every known noble family (some locations were guessed)
function markNobility(map, nobilityOptions) {
//Sample input-> {wikiKey:"House_Bolton", seatKey:"Dreadfort", imgRatio:(120/102), img:"http://awoiaf.westeros.org/images/thumb/7/76/Bolton.png/102px-Bolton.png", isGreat:true, chapters:[196,999]} (seatKey may be replaced with lat & lng)
if (typeof nobilityOptions.img != 'string')
return console.log(
nobilityOptions.wikiKey +
' in the nobility list was missing an img attribute.'
);
if (typeof nobilityOptions.seatKey == 'string')
var coords = checkLocKey(nobilityOptions.seatKey);
else {
if (
typeof nobilityOptions.lat == 'number' &&
typeof nobilityOptions.lng == 'number'
)
var coords = checkLocKey('', nobilityOptions.lat, nobilityOptions.lng);
else return false;
}
if (!coords) return false;
var title =
typeof nobilityOptions.wikiKey == 'string'
? decodeURI(nobilityOptions.wikiKey).replace(/_/g, ' ')
: 'No name listed';
if (typeof nobilityOptions.clue == 'string') {
if (nobilityOptions.clue == 'mountain clan')
title = title.replace(/House/, 'Clan');
else title += ' (somewhere in ' + nobilityOptions.clue + ')';
}
var isGreat =
typeof nobilityOptions.isGreat != 'undefined'
? nobilityOptions.isGreat
: false;
var imgRatio =
typeof nobilityOptions.imgRatio == 'number'
? nobilityOptions.imgRatio
: 4 / 3;
var imgHeight = isGreat ? 60 : 30;
var anchorPoint = $.isArray(nobilityOptions.anchor)
? new google.maps.Point(
nobilityOptions.anchor[0],
nobilityOptions.anchor[1]
)
: new google.maps.Point(imgHeight / imgRatio / 2, imgHeight / 2);
var icon = new google.maps.MarkerImage(
nobilityOptions.img,
null,
null,
anchorPoint,
new google.maps.Size(imgHeight / imgRatio, imgHeight)
);
var marker = new google.maps.Marker({
position: new google.maps.LatLng(coords[0], coords[1]),
title: title,
icon: icon,
visible: false,
map: map,
});
if (typeof nobilityOptions.wikiKey == 'string')
google.maps.event.addListener(marker, 'click', function (event) {
window.open(
'http://awoiaf.westeros.org/index.php/' + nobilityOptions.wikiKey,
'_blank'
);
});
marker['isGreat'] = isGreat;
marker['chapters'] =
typeof nobilityOptions.chapters == 'object'
? nobilityOptions.chapters
: [0, 999];
marker['episodes'] =
typeof nobilityOptions.episodes == 'object'
? nobilityOptions.episodes
: [0, 999];
return marker;
}
//Teardrop markers & lines marking the path of each major character
function markPathSegment(map, overlayOptions) {
if (typeof overlayOptions.icon == 'string') {
switch (overlayOptions.icon) {
case 'skull':
var icon = 'skull.png';
break;
case 'lost':
var icon = 'question-mark.gif';
break;
default:
var icon =
'http://chart.googleapis.com/chart?chst=d_map_xpin_letter&chld=pin' +
overlayOptions.icon; //or d_map_pin_letter_withshadow
}
switch (overlayOptions.icon.substring(0, 3)) {
case '_sl':
icon = { url: icon, anchor: new google.maps.Point(23, 33) };
break;
case '_sr':
icon = { url: icon, anchor: new google.maps.Point(0, 33) };
break;
}
if (typeof overlayOptions.key == 'string') {
//Sample input-> {icon:"greyC", chapters:[0,17], episodes:[0,1], key:"Winterfell"}
checkResults = checkLocKey(overlayOptions.key);
if (!checkResults)
return console.log(
'Item ' +
overlayOptions.key +
' in the character path list does not match a known location.'
);
var overlay = new google.maps.Marker({
position: new google.maps.LatLng(checkResults[0], checkResults[1]),
icon: icon,
visible: false,
map: map,
});
} else {
//Sample input-> {icon:"greyE", chapters:[15,19], episodes:[1,1], coord:[26.4312,-114.1406]}
if (typeof overlayOptions.coord != 'object')
return console.log(
'One item in the character path list is missing a coord attribute.'
);
if (overlayOptions.coord.length != 2)
return console.log(
'One item in the character path list has an inappropriate coord attribute: ' +
overlayOptions.coord
);
if (!checkLocKey('', overlayOptions.coord[0], overlayOptions.coord[1]))
return console.log(
'One item in the character path list has coordinates outside the edges of the map: ' +
overlayOptions.coord
);
var overlay = new google.maps.Marker({
position: new google.maps.LatLng(
overlayOptions.coord[0],
overlayOptions.coord[1]
),
icon: icon,
visible: false,
map: map,
});
}
} //icons
if (typeof overlayOptions.line == 'string') {
//Sample input-> {line:"#808080", chapters:[20], episodes:2, path:[[26.4312,-114.1406], "Darry", [16.0669,-109.5263],"Hayford","King%27s_Landing"]}
if (typeof overlayOptions.line != 'string')
return console.log(
'One item in the character path list has neither a icon nor line attribute.'
);
if (typeof overlayOptions.path != 'object')
return console.log(
'One item in the character path list is missing a path attribute.'
);
//Parse the array of coordinates in the path attribute
var path = [];
var checkResults = [];
for (i in overlayOptions.path) {
if (typeof overlayOptions.path[i] == 'string') {
checkResults = checkLocKey(overlayOptions.path[i]);
if (!checkResults) continue;
path.push(new google.maps.LatLng(checkResults[0], checkResults[1]));
}
if (typeof overlayOptions.path[i] == 'object') {
if (overlayOptions.path[i].length != 2) continue;
if (
!checkLocKey('', overlayOptions.path[i][0], overlayOptions.path[i][1])
)
continue;
path.push(
new google.maps.LatLng(
overlayOptions.path[i][0],
overlayOptions.path[i][1]
)
);
}
}
var overlay = new google.maps.Polyline({
path: path,
strokeColor: overlayOptions.line,
strokeOpacity: 1.0,
strokeWeight: 8,
visible: false,
map: map,
});
//TEMPORARY
//google.maps.event.addListener(overlay, 'click', function(event) {
// new google.maps.InfoWindow({position:event.latLng, content:Math.round(event.latLng.lat()*10000)/10000+","+Math.round(event.latLng.lng()*10000)/10000 }).open(map);
//});
} //lines
if (typeof overlayOptions.arrow == 'string') {
//Sample input-> {arrow:"#808080", chapters:59, coord:[42.0329, -125.5078], heading:210}
if (typeof overlayOptions.coord != 'object')
return console.log(
'One arrow in the character path list is missing a coord attribute.'
);
if (overlayOptions.coord.length != 2)
return console.log(
'One arrow in the character path list has an inappropriate coord attribute: ' +
overlayOptions.coord
);
if (typeof overlayOptions.heading != 'number')
return console.log(
'One arrow in the character path list is missing a heading attribute.'
);
var overlay = new ArrowOverlay(
map,
new google.maps.LatLng(overlayOptions.coord[0], overlayOptions.coord[1]),
overlayOptions.heading,
overlayOptions.arrow,
1
);
} //arrows
overlay['chapters'] = [999, 999];
if (typeof overlayOptions.chapters == 'number')
overlay.chapters[0] = overlayOptions.chapters;
if (typeof overlayOptions.chapters == 'object') {
if (overlayOptions.chapters.length == 2)
if (typeof overlayOptions.chapters[1] == 'number')
overlay.chapters[1] = overlayOptions.chapters[1];
if (typeof overlayOptions.chapters[0] == 'number')
overlay.chapters[0] = overlayOptions.chapters[0];
}
overlay['episodes'] = [99, 99];
if (typeof overlayOptions.episodes == 'number')
overlay.episodes[0] = overlayOptions.episodes;
if (typeof overlayOptions.episodes == 'object') {
if (overlayOptions.episodes.length == 2)
if (typeof overlayOptions.episodes[1] == 'number')
overlay.episodes[1] = overlayOptions.episodes[1];
if (typeof overlayOptions.episodes[0] == 'number')
overlay.episodes[0] = overlayOptions.episodes[0];
}
return overlay;
}