// vars var mousePosX = 0; var xPosition = 0; var acceleration = 0; var desiredPosX = 0; var velocity = 0; var active = false; var interactive = false; var hoverLevel = null; var selectedLevel = null; var DEADZONE = 100; var ACCELERATION_MULTIPLIER = 0.000005; var MAX_VELOCITY = 0.02; var EASE_OUT = 1.2; var levels = { "level": [ {"key": 0, "id": 1, "idtext": "0", "text": "Prologue", "startX": 0, "endX": 150, "posX": 0, "gold": 2000, "silver": 1500}, {"key": 1, "id": 2, "idtext": "1", "text": "Another Bomb", "startX": 151, "endX": 300, "posX": 150, "gold": 3200, "silver": 3000}, {"key": 2, "id": 3, "idtext": "2", "text": "Save the Scientists!", "startX": 301, "endX": 450, "posX": 300, "gold": 4000, "silver": 3000}, {"key": 3, "id": 5, "idtext": "3", "text": "In the City", "startX": 451, "endX": 600, "posX": 450, "gold": 3000, "silver": 2000}, {"key": 4, "id": 6, "idtext": "4", "text": "Across the Rooftops", "startX": 601, "endX": 750, "posX": 600, "gold": 4000, "silver": 2000}, {"key": 5, "id": 7, "idtext": "5", "text": "Up the Towers", "startX": 751, "endX": 900, "posX": 750, "gold": 2500, "silver": 1500}, {"key": 6, "id": 9, "idtext": "6", "text": "Hiding Out", "startX": 901, "endX": 1050, "posX": 900, "gold": 3000, "silver": 1500}, {"key": 7, "id": 10, "idtext": "7", "text": "Finding the Bomber", "startX": 1051, "endX": 1200, "posX": 1050, "gold": 3000, "silver": 2500}, {"key": 8, "id": 11, "idtext": "8", "text": "Almost There", "startX": 1201, "endX": 1350, "posX": 1200, "gold": 3500, "silver": 2000}, {"key": 9, "id": 13, "idtext": "I", "text": "Bonus Level", "startX": 1375, "endX": 1500, "posX": 1375, "gold": 2500, "silver": 1500}, {"key": 10, "id": 14, "idtext": "II", "text": "Bonus Level", "startX": 1501, "endX": 1625, "posX": 1500, "gold": 2500, "silver": 1500}, {"key": 11, "id": 15, "idtext": "III", "text": "Bonus Level", "startX": 1626, "endX": 1750, "posX": 1625, "gold": 3000, "silver": 2000}, {"key": 12, "id": 16, "idtext": "X", "text": "The Challenge", "startX": 1750, "endX": 2000, "posX": 1750, "gold": 2500, "silver": 1500}, ] }; // event jQuery(document).ready(init); // functions function init() { var levelsHTML = ""; $.each(levels.level, function(key, val) { if (val != null) { var x = val.posX - 240 * 0.2588190448135646; levelsHTML += "\t\t\t
\n"; levelsHTML += "\t\t\t\t
" + val.idtext + "
\n"; levelsHTML += "\t\t\t\t
" + val.text + "
\n"; levelsHTML += "\t\t\t
"; } }); $('div#city-levels').html(levelsHTML); selectedLevel = getLevelById(level); slideInLevel(selectedLevel); desiredPosX = getDesiredPosX(); // udpate look updateInterval = setInterval (update, 40); // mouse move $('#level-select').mousemove(function(e){ mouseMove(e.pageX - $('#level-select').offset().left, this.offsetWidth); }); // mouse click $('#level-select').click(selectLevel); } function mouseOver() { active = true; interactive = true; } function mouseOut() { active = false; interactive = false; } function mouseMove(mouseX, width) { mousePosX = mouseX; center = width / 2; if (mouseX > center + DEADZONE) { active = true; acceleration = (mouseX - center - DEADZONE) * ACCELERATION_MULTIPLIER; } else if (mouseX < center - DEADZONE) { active = true; acceleration = (mouseX - (center - DEADZONE)) * ACCELERATION_MULTIPLIER; } else active = false; } function selectLevel() { var aLevel = getHoverLevel(); if (aLevel != null) window.location.hash = getHash(aLevel.id, mode, 1); return false; } function getMouseX() { if (!e) var e = window.event; if (e.pageX || e.pageY) return e.pageX; else if (e.clientX || e.clientY) return e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; } function update() { updateScrolling(); updateLevelPanels(); } function updateLevelPanels() { var prevHoverLevel = hoverLevel; hoverLevel = getHoverLevel(); // hover level if (hoverLevel != prevHoverLevel) { if (prevHoverLevel != null && prevHoverLevel.id != selectedLevel.id) slideOutLevel(prevHoverLevel); if (hoverLevel != null && hoverLevel.id != selectedLevel.id) slideInLevel(hoverLevel); } // selected level if (level != selectedLevel.id) { if (hoverLevel == null || selectedLevel.id != hoverLevel.id) slideOutLevel(selectedLevel); selectedLevel = getLevelById(level); if (hoverLevel == null || selectedLevel.id != hoverLevel.id) slideInLevel(selectedLevel); desiredPosX = getDesiredPosX(); } } function slideInLevel(aLevel) { var x = aLevel.posX; $('div#level' + aLevel.key).clearQueue(); $('div#level' + aLevel.key).animate({'top': -40, 'left': x}, 200, null); } function slideOutLevel(aLevel) { var x = aLevel.posX - 240 * 0.2588190448135646; $('div#level' + aLevel.key).clearQueue(); $('div#level' + aLevel.key).animate({'top': 200, 'left': x}, 200, null); } function updateScrolling() { if (active) { velocity += acceleration; velocity = clamp(velocity, -MAX_VELOCITY, MAX_VELOCITY); xPosition += velocity; xPosition = clamp(xPosition, 0, 1); if (xPosition == 0 || xPosition == 1) velocity = 0; } else if (!interactive) { velocity = (desiredPosX - xPosition) * Math.max(10, Math.abs(desiredPosX - xPosition) * 10) * 0.025; xPosition += velocity; xPosition = clamp(xPosition, 0, 1); if (xPosition == 0 || xPosition == 1) velocity = 0; } else { velocity /= EASE_OUT; xPosition += velocity; xPosition = clamp(xPosition, 0, 1); if (xPosition == 0 || xPosition == 1) velocity = 0; } $('div#city-sky').css('left', Math.round(xPosition * -400) + 'px'); $('div#city-background').css('left', Math.round(xPosition * -625) + 'px'); $('div#city-foreground').css('left', Math.round(xPosition * -1100) + 'px'); $('div#city-levels').css('left', Math.round(xPosition * -1100) + 'px'); } function getHoverLevel() { if (!interactive) return null; var worldX = xPosition * 1100 + mousePosX; var levelObj = null; $.each(levels.level, function(key, val) { if (val != null && worldX > val.startX && worldX < val.endX) { levelObj = val; // break each by returning false return false; } }); return levelObj; } function getLevelById(levelId) { var levelObj = null; $.each(levels.level, function(key, val) { if (val.id == levelId) { levelObj = val; // break each by returning false return false; } }); return levelObj; } function getDesiredPosX() { return (selectedLevel.posX - 300) / 1100; } function clamp(value, min, max) { return Math.max(min, Math.min(max, value)) }