Lode Runner - Total Recall (v2.01a.3)
Cette révision appartient à :
@@ -0,0 +1,493 @@
|
||||
var classicInfo = [
|
||||
{type: 'TITLE', contain: " Classic Lode Runner " },
|
||||
{type: 'TEXT' , contain: "Release year : 1983, 1984"},
|
||||
{type: 'TEXT' , contain: "Platform : APPLE-II, Commodore 64, IBM PC, NES ..."},
|
||||
{type: 'TEXT' , contain: "Publisher : Br\u00F8derbund & Ariolasoft" }, //Brøderbund
|
||||
{type: 'TEXT' , contain: "Developer : Douglas E. Smith" },
|
||||
{type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605" } //★ ★ ★
|
||||
];
|
||||
|
||||
//ref: http://www.gb64.com/game.php?id=5906&d=42
|
||||
var proInfo = [
|
||||
{type: 'TITLE', contain: " Professional Lode Runner " },
|
||||
{type: 'TEXT' , contain: "Release year : 1984, 1985"},
|
||||
{type: 'TEXT' , contain: "Platform : Commodore 64"},
|
||||
{type: 'TEXT' , contain: "Publisher : DodoSoft & AlphaSoft" },
|
||||
{type: 'TEXT' , contain: "Developer : Unknown" },
|
||||
{type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605 \u2605" } //★ ★ ★ ★
|
||||
];
|
||||
|
||||
//ref:http://www.vizzed.com/play/revenge-of-lode-runner-appleii-online-apple-ii-6223-game
|
||||
var revengeInfo = [
|
||||
{type: 'TITLE', contain: " Revenge of Lode Runner " },
|
||||
{type: 'TEXT' , contain: "Release year : 1985, 1986"},
|
||||
{type: 'TEXT' , contain: "Platform : APPLE-II"},
|
||||
{type: 'TEXT' , contain: "Publisher : Br\u00F8derbund" }, //Brøderbund
|
||||
{type: 'TEXT' , contain: "Developer : Mad Man" },
|
||||
{type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605 \u2605" } //★ ★ ★ ★
|
||||
];
|
||||
|
||||
var fanBookInfo = [
|
||||
{type: 'TITLE', contain: " Lode Runner Fan Book " },
|
||||
{type: 'TEXT' , contain: 'From : "Apple Lode Runner - The Remake 1.0h"'},
|
||||
{type: 'TEXT' , contain: "Platform : Microsoft Windows"},
|
||||
{type: 'TEXT' , contain: "Publisher : Spoonbill Software" },
|
||||
{type: 'TEXT' , contain: 'Developer : Custom levels'},
|
||||
{type: 'TEXT_LINK' , text: "URL : ",
|
||||
textLink: "http://www.spoonbillsoftware.com.au/loderunner.htm",
|
||||
url: "http://www.spoonbillsoftware.com.au/loderunner.htm"
|
||||
},
|
||||
{type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605 \u2605 \u2605" } //★ ★ ★ ★ ★
|
||||
];
|
||||
|
||||
var championInfo = [
|
||||
{type: 'TITLE', contain: " Championship Lode Runner " },
|
||||
{type: 'TEXT' , contain: "Release year : 1984, 1985"},
|
||||
{type: 'TEXT' , contain: "Platform : APPLE-II, Commodore 64, NES ..."},
|
||||
{type: 'TEXT' , contain: "Publisher : Br\u00F8derbund & Hudson Soft" }, //Brøderbund
|
||||
{type: 'TEXT' , contain: "Developer : Douglas E. Smith" },
|
||||
{type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605 \u2605 \u2605" } //★ ★ ★ ★ ★
|
||||
];
|
||||
|
||||
//=========================================================================================
|
||||
|
||||
var editInfo = [
|
||||
{type: 'TITLE', contain: "Edit Custom Level"},
|
||||
{type: 'TEXT' , contain: "NEW : New or clear editing level"},
|
||||
{type: 'TEXT' , contain: "LOAD : Load exists level for customization"},
|
||||
{type: 'TEXT' , contain: "TEST : Test editing level" },
|
||||
{type: 'TEXT' , contain: "SAVE : Save current level" }
|
||||
|
||||
];
|
||||
|
||||
var testInfo = [
|
||||
{type: 'TITLE', contain: "Test Custom Level"},
|
||||
{type: 'TEXT' , contain: "If test success, players can save it. "}
|
||||
];
|
||||
|
||||
var customInfo = [
|
||||
{type: 'TITLE', contain: "Custom Levels"},
|
||||
{type: 'TEXT' , contain: "Players can create new levels or edit exists levels."}
|
||||
];
|
||||
|
||||
var demoHelp = [
|
||||
{type: 'TITLE', contain: " Demo Mode "},
|
||||
{type: 'TEXT' , contain: " Demo data collected from players," },
|
||||
{type: 'TEXT' , contain: " Only demo the fastest passed levels or" },
|
||||
{type: 'TEXT' , contain: "Recently passed levels of current player." }
|
||||
];
|
||||
|
||||
function createDemoInfo()
|
||||
{
|
||||
var titleName = playDataToTitleName(playData);
|
||||
var player = playerDemoData[curLevel-1].player;
|
||||
|
||||
if(player == "") player = "Unknown";
|
||||
|
||||
var demoInfo = [
|
||||
{type: 'TITLE', contain: " " + playDataToTitleName(playData)+ " " },
|
||||
{type: 'TEXT' , contain: "Demo level : " + curLevel},
|
||||
{type: 'TEXT' , contain: "Player : " + player },
|
||||
{type: 'TEXT_flagID_MSG' , text: "Location : ",
|
||||
flagId: playerDemoData[curLevel-1].cId.toLowerCase(),
|
||||
msg: " " + playerDemoData[curLevel-1].location
|
||||
},
|
||||
{type: 'TEXT' , contain: "Date : " + playerDemoData[curLevel-1].date+ " (" + playerDemoData[curLevel-1].ai+")" }
|
||||
];
|
||||
|
||||
return demoInfo;
|
||||
}
|
||||
|
||||
function infoMenu(callbackFun, args)
|
||||
{
|
||||
var infoMsg = null;
|
||||
|
||||
switch(playMode) {
|
||||
case PLAY_CLASSIC:
|
||||
case PLAY_MODERN:
|
||||
if(playData == PLAY_DATA_USERDEF) {
|
||||
infoMsg = customInfo;
|
||||
} else {
|
||||
infoMsg = getPlayVerInfo(playData);
|
||||
}
|
||||
break;
|
||||
case PLAY_DEMO:
|
||||
case PLAY_DEMO_ONCE:
|
||||
infoMsg = createDemoInfo();
|
||||
break;
|
||||
case PLAY_EDIT:
|
||||
infoMsg = editInfo;
|
||||
break;
|
||||
case PLAY_TEST:
|
||||
infoMsg = testInfo;
|
||||
break;
|
||||
}
|
||||
|
||||
if(infoMsg) infoObj.showInfo(infoMsg, callbackFun, args);
|
||||
else {
|
||||
if(callbackFun) callbackFun(args);
|
||||
error(arguments.callee.name, "Error: playMode = " + playMode);
|
||||
}
|
||||
}
|
||||
|
||||
function infoMenuClass(_stage, _scale)
|
||||
{
|
||||
var coverBackground, closeIcon;
|
||||
var infoBorder, infoBackground;
|
||||
var infoObj = [];
|
||||
|
||||
var INFO_BORDER_SIZE = 24 * _scale;
|
||||
var INFO_BORDER_HALF = INFO_BORDER_SIZE / 2;
|
||||
|
||||
var TITLE_TEXT_SIZE = 40 * _scale;
|
||||
var TITLE_TEXT_COLOR = "white";
|
||||
var TITLE_TEXT_SHADOW_COLOR = "#FF0";
|
||||
|
||||
var ITEM_TEXT_SIZE = 32 * _scale;
|
||||
var ITEM_TEXT_COLOR = "yellow";
|
||||
|
||||
var FLAG_SCALE = _scale * 5/4;
|
||||
var FLAG_MSG_SIZE = 28 * _scale;
|
||||
var FLAG_MSG_COLOR = "white";
|
||||
|
||||
var TOP_BORDER_SIZE = TITLE_TEXT_SIZE/2 | 0;
|
||||
var BOTTOM_BORDER_SIZE = ITEM_TEXT_SIZE/ 2 | 0;
|
||||
var BORDER_WIDTH = ITEM_TEXT_SIZE;
|
||||
|
||||
var CLOSE_BOX_SIZE = 12 * _scale + 2;
|
||||
|
||||
var menuX, menuY, startX, startY;
|
||||
|
||||
var callBackFun, callBackArgs;
|
||||
var saveStateObj;
|
||||
|
||||
|
||||
this.showInfo = function(info, callback, args)
|
||||
{
|
||||
if(typeof args == "undefined") args = null;
|
||||
callBackFun = callback;
|
||||
callBackArgs = args;
|
||||
closeIcon = null;
|
||||
|
||||
initInfo(info);
|
||||
drawBackground();
|
||||
drawInfoBackground();
|
||||
drawInfo();
|
||||
drawCloseIcon(0);
|
||||
_stage.update();
|
||||
|
||||
saveStateObj = saveKeyHandler(InfoKeyDown);
|
||||
}
|
||||
|
||||
function initInfo(infoList)
|
||||
{
|
||||
var textLength;
|
||||
var maxTextWidth =0;
|
||||
|
||||
infoObj = [];
|
||||
menuX = menuY = 0;
|
||||
for(var i = 0; i < infoList.length; i++) {
|
||||
|
||||
switch( infoList[i].type) {
|
||||
case 'TITLE':
|
||||
infoObj[i] = {};
|
||||
infoObj[i].type = 'TITLE';
|
||||
infoObj[i].text = new createjs.Text(infoList[i].contain,
|
||||
"bold " + TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR);
|
||||
infoObj[i].text.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 0, 0, 2 );
|
||||
infoObj[i].width = infoObj[i].text.getBounds().width;
|
||||
infoObj[i].height = infoObj[i].text.getBounds().height;
|
||||
menuY += (infoObj[i].height * 3/2|0);
|
||||
break;
|
||||
case 'TEXT':
|
||||
infoObj[i] = {};
|
||||
infoObj[i].type = 'TEXT';
|
||||
infoObj[i].text = new createjs.Text(infoList[i].contain,
|
||||
"bold " + ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR);
|
||||
infoObj[i].width = infoObj[i].text.getBounds().width;
|
||||
infoObj[i].height = infoObj[i].text.getBounds().height;
|
||||
menuY += (infoObj[i].height * 3/2|0);
|
||||
break;
|
||||
case 'TEXT_flagID_MSG':
|
||||
infoObj[i] = {};
|
||||
infoObj[i].type = 'TEXT_flagID_MSG';
|
||||
|
||||
infoObj[i].text = new createjs.Text(infoList[i].text,
|
||||
"bold " + ITEM_TEXT_SIZE + "px Helvetica", ITEM_TEXT_COLOR);
|
||||
infoObj[i].textWidth = infoObj[i].text.getBounds().width;
|
||||
infoObj[i].textHeight = infoObj[i].text.getBounds().height;
|
||||
|
||||
if(infoList[i].flagId in countryId) {
|
||||
infoObj[i].flag = new createjs.Sprite(countryFlagData, infoList[i].flagId);
|
||||
} else {
|
||||
infoObj[i].flag = new createjs.Sprite(countryFlagData, "unknown");
|
||||
}
|
||||
infoObj[i].flag.setTransform(0, 0, FLAG_SCALE, FLAG_SCALE);
|
||||
infoObj[i].flagWidth = infoObj[i].flag.getTransformedBounds().width;
|
||||
infoObj[i].flagHeight = infoObj[i].flag.getTransformedBounds().height;
|
||||
|
||||
infoObj[i].msg = new createjs.Text(infoList[i].msg,
|
||||
"bold " + FLAG_MSG_SIZE + "px Helvetica", FLAG_MSG_COLOR);
|
||||
infoObj[i].msg.set({alpha:0});
|
||||
infoObj[i].msgWidth = infoObj[i].msg.getBounds().width;
|
||||
infoObj[i].msgHeight = infoObj[i].msg.getBounds().height;
|
||||
|
||||
infoObj[i].flag.msgObj = infoObj[i].msg;
|
||||
infoObj[i].flag.on('mouseover',function(evt) {
|
||||
this.msgObj.set({alpha:1});
|
||||
_stage.update();
|
||||
});
|
||||
infoObj[i].flag.on('mouseout', function(evt){
|
||||
this.msgObj.set({alpha:0});
|
||||
_stage.update();
|
||||
});
|
||||
|
||||
infoObj[i].width = infoObj[i].textWidth + infoObj[i].flagWidth + infoObj[i].msgWidth;
|
||||
menuY += (infoObj[i].textHeight * 3/2|0);
|
||||
break;
|
||||
case 'TEXT_LINK':
|
||||
infoObj[i] = {};
|
||||
infoObj[i].type = 'TEXT_LINK';
|
||||
|
||||
infoObj[i].text = new createjs.Text(infoList[i].text,
|
||||
"bold " + ITEM_TEXT_SIZE + "px Helvetica", ITEM_TEXT_COLOR);
|
||||
infoObj[i].textWidth = infoObj[i].text.getBounds().width;
|
||||
infoObj[i].textHeight = infoObj[i].text.getBounds().height;
|
||||
|
||||
infoObj[i].textLink = new createjs.Text(infoList[i].textLink,
|
||||
"bold " + ITEM_TEXT_SIZE + "px Helvetica", ITEM_TEXT_COLOR);
|
||||
infoObj[i].texLinktWidth = infoObj[i].textLink.getBounds().width;
|
||||
infoObj[i].texLinktHeight = infoObj[i].textLink.getBounds().height;
|
||||
|
||||
infoObj[i].textLink.url = infoList[i].url;
|
||||
infoObj[i].textLink.on('mouseover',function(evt) {
|
||||
_stage.cursor = "pointer";
|
||||
_stage.update();
|
||||
});
|
||||
infoObj[i].textLink.on('mouseout', function(evt){
|
||||
_stage.cursor = "default";
|
||||
_stage.update();
|
||||
});
|
||||
infoObj[i].textLink.on('click', function(evt){
|
||||
window.open(this.url).focus();
|
||||
_stage.cursor = "default";
|
||||
_stage.update();
|
||||
});
|
||||
|
||||
infoObj[i].width = infoObj[i].textWidth + infoObj[i].texLinktWidth;
|
||||
menuY += (infoObj[i].textHeight * 3/2|0);
|
||||
break;
|
||||
default:
|
||||
error(arguments.callee.name, "Error: type don't support, type = " + infoList[i].type);
|
||||
continue;
|
||||
}
|
||||
if(maxTextWidth < infoObj[i].width) maxTextWidth = infoObj[i].width;
|
||||
}
|
||||
menuX = maxTextWidth + BORDER_WIDTH * 2;
|
||||
menuY += (TOP_BORDER_SIZE + BOTTOM_BORDER_SIZE);
|
||||
|
||||
startX = (_stage.canvas.width-menuX)/2|0;
|
||||
startY = (_stage.canvas.height-menuY)/2|0;
|
||||
if(startX < 0) startX = 0;
|
||||
if(startY < 0) startY = 0;
|
||||
}
|
||||
|
||||
function drawBackground()
|
||||
{
|
||||
coverBackground = new createjs.Shape();
|
||||
coverBackground.graphics.beginFill("black").drawRect(0, 0, _stage.canvas.width, _stage.canvas.height).endFill();
|
||||
coverBackground.alpha = 0.3;
|
||||
_stage.addChild(coverBackground);
|
||||
}
|
||||
|
||||
function removeBackground()
|
||||
{
|
||||
_stage.removeChild(coverBackground);
|
||||
}
|
||||
|
||||
function drawInfoBackground()
|
||||
{
|
||||
|
||||
infoBorder = new createjs.Shape();
|
||||
infoBackground = new createjs.Shape();
|
||||
|
||||
infoBorder.alpha = 0.8;
|
||||
infoBorder.graphics.beginFill("#FF0")
|
||||
.drawRoundRect(startX-INFO_BORDER_HALF, startY-INFO_BORDER_HALF, menuX+INFO_BORDER_SIZE, menuY+INFO_BORDER_SIZE, INFO_BORDER_HALF).endFill();
|
||||
|
||||
infoBackground.alpha = 0.6;
|
||||
infoBackground.graphics.beginFill("#190218")
|
||||
.drawRoundRect(startX, startY, menuX, menuY, INFO_BORDER_HALF/2).endFill();
|
||||
|
||||
_stage.addChild(infoBorder);
|
||||
_stage.addChild(infoBackground);
|
||||
}
|
||||
|
||||
function removeInfoBackground()
|
||||
{
|
||||
_stage.removeChild(infoBackground);
|
||||
_stage.removeChild(infoBorder);
|
||||
}
|
||||
|
||||
function drawInfo()
|
||||
{
|
||||
var tmpY = startY;
|
||||
for(var i = 0; i < infoObj.length; i++) {
|
||||
switch( infoObj[i].type) {
|
||||
case 'TITLE':
|
||||
tmpY += (infoObj[i].height/2|0);
|
||||
infoObj[i].text.x = startX + (menuX - infoObj[i].width)/2|0;
|
||||
infoObj[i].text.y = tmpY;
|
||||
tmpY += infoObj[i].height *3/2|0;
|
||||
_stage.addChild(infoObj[i].text);
|
||||
break;
|
||||
case 'TEXT':
|
||||
infoObj[i].text.x = startX + BORDER_WIDTH;
|
||||
infoObj[i].text.y = tmpY;
|
||||
tmpY += infoObj[i].height *3/2|0;
|
||||
_stage.addChild(infoObj[i].text);
|
||||
break;
|
||||
case 'TEXT_flagID_MSG':
|
||||
infoObj[i].text.x = startX + BORDER_WIDTH;
|
||||
infoObj[i].text.y = tmpY;
|
||||
|
||||
infoObj[i].flag.x = startX + BORDER_WIDTH + infoObj[i].textWidth;
|
||||
infoObj[i].flag.y = tmpY+ (infoObj[i].textHeight - infoObj[i].flagHeight)/3;
|
||||
|
||||
infoObj[i].msg.x = startX + BORDER_WIDTH + infoObj[i].textWidth + infoObj[i].flagWidth;
|
||||
infoObj[i].msg.y = tmpY+ (infoObj[i].textHeight - infoObj[i].msgHeight);
|
||||
|
||||
tmpY += infoObj[i].textHeight *3/2|0;
|
||||
_stage.addChild(infoObj[i].text);
|
||||
_stage.addChild(infoObj[i].flag);
|
||||
_stage.addChild(infoObj[i].msg);
|
||||
break;
|
||||
case 'TEXT_LINK':
|
||||
infoObj[i].text.x = startX + BORDER_WIDTH;
|
||||
infoObj[i].text.y = tmpY;
|
||||
|
||||
infoObj[i].textLink.x = startX + BORDER_WIDTH + infoObj[i].textWidth;
|
||||
infoObj[i].textLink.y = tmpY;
|
||||
tmpY += infoObj[i].textHeight *3/2|0;
|
||||
_stage.addChild(infoObj[i].text);
|
||||
_stage.addChild(infoObj[i].textLink);
|
||||
break;
|
||||
default:
|
||||
error(arguments.callee.name, "Error: type don't support, type = " + infoObj[i].type);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function removeInfo()
|
||||
{
|
||||
for(var i = 0; i < infoObj.length; i++) {
|
||||
switch(infoObj[i].type) {
|
||||
case 'TITLE':
|
||||
case 'TEXT':
|
||||
_stage.removeChild(infoObj[i].text);
|
||||
break;
|
||||
case 'TEXT_flagID_MSG':
|
||||
_stage.removeChild(infoObj[i].text);
|
||||
_stage.removeChild(infoObj[i].flag);
|
||||
break;
|
||||
case 'TEXT_LINK':
|
||||
_stage.removeChild(infoObj[i].text);
|
||||
_stage.removeChild(infoObj[i].textLink);
|
||||
break;
|
||||
default:
|
||||
error(arguments.callee.name, "Error: type don't support, type = " + infoObj[i].type);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function InfoKeyDown(event)
|
||||
{
|
||||
if(!event){ event = window.event; } //cross browser issues exist
|
||||
if(event.keyCode == KEYCODE_ESC) {
|
||||
closeInfoMenu();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function drawCloseIcon(mouseOver)
|
||||
{
|
||||
var cycle, cross;
|
||||
var alpha, cycColor, crosColor;
|
||||
if(closeIcon == null) {
|
||||
closeIcon = new createjs.Container();
|
||||
cross = new createjs.Shape();
|
||||
cycle = new createjs.Shape();
|
||||
closeIcon.addChild(cycle, cross);
|
||||
closeIcon.on("mouseover", handleMouseOver);
|
||||
closeIcon.on("mouseout", handleMouseOut);
|
||||
closeIcon.on("click", closeInfoMenu);
|
||||
closeIcon.x = startX+menuX - CLOSE_BOX_SIZE*3;
|
||||
closeIcon.y = startY + CLOSE_BOX_SIZE*2;
|
||||
_stage.enableMouseOver(30);
|
||||
_stage.addChild(closeIcon);
|
||||
} else {
|
||||
cycle = closeIcon.getChildAt(0);
|
||||
cross = closeIcon.getChildAt(1);
|
||||
}
|
||||
if(mouseOver) {
|
||||
alpha = 0.6;
|
||||
cycColor = "red";
|
||||
crosColor = "white";
|
||||
} else {
|
||||
alpha = 0.01;
|
||||
cycColor = "gold";
|
||||
crosColor = "white";
|
||||
}
|
||||
|
||||
var g = cycle.graphics;
|
||||
g.clear();
|
||||
cycle.alpha = alpha;
|
||||
g.beginFill(cycColor).dc(CLOSE_BOX_SIZE/2, CLOSE_BOX_SIZE/2, CLOSE_BOX_SIZE*5/4);
|
||||
|
||||
g = cross.graphics;
|
||||
g.clear();
|
||||
//cross.alpha = 1;
|
||||
g.setStrokeStyle(CLOSE_BOX_SIZE/4).beginStroke(crosColor).moveTo(0,0)
|
||||
.lineTo(CLOSE_BOX_SIZE,CLOSE_BOX_SIZE).closePath();
|
||||
|
||||
g.moveTo(CLOSE_BOX_SIZE,0).lineTo(0,CLOSE_BOX_SIZE).closePath();
|
||||
|
||||
_stage.update();
|
||||
}
|
||||
|
||||
function removeCloseIcon()
|
||||
{
|
||||
_stage.removeChild(closeIcon);
|
||||
}
|
||||
|
||||
function handleMouseOver(event)
|
||||
{
|
||||
_stage.cursor = 'pointer';
|
||||
drawCloseIcon(1);
|
||||
}
|
||||
|
||||
function handleMouseOut(event)
|
||||
{
|
||||
_stage.cursor = 'default';
|
||||
drawCloseIcon(0);
|
||||
}
|
||||
|
||||
function closeInfoMenu()
|
||||
{
|
||||
removeCloseIcon();
|
||||
removeInfo();
|
||||
removeInfoBackground();
|
||||
removeBackground();
|
||||
_stage.cursor = 'default';
|
||||
_stage.update();
|
||||
_stage.enableMouseOver(0);
|
||||
restoreKeyHandler(saveStateObj);
|
||||
|
||||
//add setTimeout just don't cause mouse event (click) cascade!
|
||||
if(callBackFun) setTimeout(function() { callBackFun(callBackArgs);}, 10);
|
||||
}
|
||||
|
||||
}
|
||||
Référencer dans un nouveau ticket
Bloquer un utilisateur