86c2f509f4
fix: keybord layout AZERTY/QWERTY
3772 lignes
111 KiB
JavaScript
3772 lignes
111 KiB
JavaScript
function saveKeyHandler(newHandler)
|
|
{
|
|
var keyHandler, clickState;
|
|
|
|
keyHandler = document.onkeydown;
|
|
clickState = disableStageClickEvent();
|
|
document.onkeydown = newHandler;
|
|
|
|
return { keyHandler: keyHandler, clickState: clickState };
|
|
}
|
|
|
|
function restoreKeyHandler(stateObj)
|
|
{
|
|
document.onkeydown = stateObj.keyHandler;
|
|
if(stateObj.clickState) enableStageClickEvent();
|
|
}
|
|
|
|
function helpMenuClass(_stage, _bitmap, _editBitmap, _scale)
|
|
{
|
|
var HELP_BORDER_SIZE = 24;
|
|
|
|
var saveStateObj;
|
|
var playScale, curScale;
|
|
var stage, helpBitmap = [], bitmapId;
|
|
var helpBorder, helpBackground, versionText;
|
|
var startX, startY, menuX, menuY;
|
|
var closeBoxSize;
|
|
var callBackFun, callBackArgs;
|
|
var coverBackgroundObj, closeIcon;
|
|
|
|
stage = _stage;
|
|
helpBitmap[0] = _bitmap;
|
|
helpBitmap[1] = _editBitmap;
|
|
bitmapId = 0;
|
|
playScale = _scale;
|
|
|
|
this.showHelp = function(id, callback, scale, args)
|
|
{
|
|
curScale = scale;
|
|
if(typeof args == "undefined") args = null;
|
|
callBackFun = callback;
|
|
callBackArgs = args;
|
|
closeBoxSize = 12*curScale+2;
|
|
closeIcon = null;
|
|
bitmapId = id;
|
|
|
|
drawBackground();
|
|
drawHelpMenu();
|
|
drawCloseIcon(0);
|
|
stage.update();
|
|
|
|
saveStateObj = saveKeyHandler(helpKeyDown);
|
|
}
|
|
|
|
function drawBackground()
|
|
{
|
|
coverBackgroundObj = new createjs.Shape();
|
|
coverBackgroundObj.graphics.beginFill("black").drawRect(0, 0, stage.canvas.width, stage.canvas.height).endFill();
|
|
coverBackgroundObj.alpha = 0.3;
|
|
stage.addChild(coverBackgroundObj);
|
|
}
|
|
|
|
function removeBackground()
|
|
{
|
|
stage.removeChild(coverBackgroundObj);
|
|
}
|
|
|
|
function drawHelpMenu()
|
|
{
|
|
var borderSize = HELP_BORDER_SIZE * curScale;
|
|
var halfBorder = borderSize/2;
|
|
var bitmapW = helpBitmap[bitmapId].getBounds().width * curScale;
|
|
var bitmapH = helpBitmap[bitmapId].getBounds().height * curScale;
|
|
|
|
menuX = bitmapW + borderSize;
|
|
menuY = bitmapH + borderSize;
|
|
startX = (stage.canvas.width - menuX)/2;
|
|
startY = (stage.canvas.height - menuY)/2;
|
|
|
|
if(startX < 0) startX = 0;
|
|
if(startY < 0) startY = 0;
|
|
|
|
helpBorder = new createjs.Shape();
|
|
helpBackground = new createjs.Shape();
|
|
versionText = new createjs.Text(
|
|
"Ver " + VERSION + "." + AI_VERSION + "." + playScale
|
|
, (16*curScale) + "px Helvetica", "#FFF");
|
|
|
|
var helpG = helpBorder.graphics;
|
|
|
|
helpBorder.alpha = 0.8;
|
|
helpG.beginFill("#FF0").drawRoundRect(startX, startY, menuX, menuY, halfBorder).endFill();
|
|
|
|
|
|
var helpB = helpBackground.graphics;
|
|
|
|
helpBackground.alpha = 0.6;
|
|
helpB.beginFill("#190218")
|
|
.drawRoundRect(startX + halfBorder, startY + halfBorder, bitmapW, bitmapH, halfBorder/2).endFill();
|
|
|
|
|
|
helpBitmap[bitmapId].setTransform(startX + halfBorder, startY + halfBorder, curScale, curScale);
|
|
//helpBitmap.set({alpha:0.8});
|
|
|
|
versionText.x = startX + (menuX - versionText.getBounds().width-borderSize);
|
|
versionText.y = startY + (menuY - versionText.getBounds().height*2.5);
|
|
|
|
stage.addChild(helpBorder);
|
|
stage.addChild(helpBackground);
|
|
stage.addChild(helpBitmap[bitmapId]);
|
|
stage.addChild(versionText);
|
|
}
|
|
|
|
function removeHelpMenu()
|
|
{
|
|
stage.removeChild(versionText);
|
|
stage.removeChild(helpBitmap[bitmapId]);
|
|
stage.removeChild(helpBackground);
|
|
stage.removeChild(helpBorder);
|
|
}
|
|
|
|
function helpKeyDown(event)
|
|
{
|
|
if(!event){ event = window.event; } //cross browser issues exist
|
|
if(event.key == "Escape") {
|
|
closeHelpMenu();
|
|
}
|
|
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", closeHelpMenu);
|
|
closeIcon.x = startX+menuX - closeBoxSize*3;
|
|
closeIcon.y = startY + closeBoxSize*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(closeBoxSize/2, closeBoxSize/2, closeBoxSize*5/4);
|
|
|
|
g = cross.graphics;
|
|
g.clear();
|
|
//cross.alpha = 1;
|
|
g.setStrokeStyle(closeBoxSize/4).beginStroke(crosColor).moveTo(0,0)
|
|
.lineTo(closeBoxSize,closeBoxSize).closePath();
|
|
|
|
g.moveTo(closeBoxSize,0).lineTo(0,closeBoxSize).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 closeHelpMenu()
|
|
{
|
|
firstPlay = 0; // 01/12/2015
|
|
removeCloseIcon();
|
|
removeHelpMenu();
|
|
removeBackground();
|
|
stage.cursor = 'default';
|
|
stage.update();
|
|
stage.enableMouseOver(0);
|
|
restoreKeyHandler(saveStateObj);
|
|
if(callBackFun) setTimeout(function() { callBackFun(callBackArgs);}, 10); //add setTimeout just don't cause mouse event (click) cascade!
|
|
}
|
|
}
|
|
|
|
|
|
function closeIconClass(_width, _height, _stage, _scale, _activeColor, _callBack, _args)
|
|
{
|
|
var closeBoxSize = 12*_scale+2;
|
|
var closeIcon = null;;
|
|
|
|
drawCloseIcon(0);
|
|
return closeIcon; //must remove by contractor
|
|
|
|
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", handleMouseClick);
|
|
closeIcon.x = _width - closeBoxSize*3;
|
|
closeIcon.y = _height + closeBoxSize*2;
|
|
//_stage.enableMouseOver(30);
|
|
_stage.addChild(closeIcon);
|
|
} else {
|
|
cycle = closeIcon.getChildAt(0);
|
|
cross = closeIcon.getChildAt(1);
|
|
}
|
|
if(mouseOver) {
|
|
alpha = 1;
|
|
cycColor = _activeColor;
|
|
crosColor = "white";
|
|
} else {
|
|
alpha = 0.01;
|
|
cycColor = _activeColor;
|
|
crosColor = "white";
|
|
}
|
|
|
|
var g = cycle.graphics;
|
|
g.clear();
|
|
cycle.alpha = alpha;
|
|
g.beginFill(cycColor).dc(closeBoxSize/2, closeBoxSize/2, closeBoxSize*5/4);
|
|
|
|
g = cross.graphics;
|
|
g.clear();
|
|
//cross.alpha = 1;
|
|
g.setStrokeStyle(closeBoxSize/4).beginStroke(crosColor).moveTo(0,0)
|
|
.lineTo(closeBoxSize,closeBoxSize).closePath();
|
|
|
|
g.moveTo(closeBoxSize,0).lineTo(0,closeBoxSize).closePath();
|
|
|
|
_stage.update();
|
|
|
|
}
|
|
|
|
function handleMouseOver(event)
|
|
{
|
|
_stage.cursor = 'pointer';
|
|
drawCloseIcon(1);
|
|
}
|
|
|
|
function handleMouseOut(event)
|
|
{
|
|
_stage.cursor = 'default';
|
|
drawCloseIcon(0);
|
|
}
|
|
|
|
function handleMouseClick(event)
|
|
{
|
|
_stage.cursor = 'default';
|
|
if(_callBack) setTimeout(function(){_callBack(_args);},10);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// -+-- +-------------------------------------------------------------+
|
|
// TOP_BORDER1 | | Lode Runner 1 |
|
|
// | | |
|
|
// -+-- | #-----------+-----------+ |
|
|
// TOP_BORDER2 | | | 001 - 030 | 031 - 060 | |
|
|
// -+-- | +-----------+-----------+-----------------------------+ |
|
|
// BORDER2 | | | | |
|
|
// -+-- | | +---------------------------------------------+ | |
|
|
// | | | 001 002 003 | | |
|
|
// | | | +----------+ +----------+ +----------+ | | |
|
|
// | | | | | | | | | | | |
|
|
// | | | | | | | | | | | |
|
|
// | | | +----------+ +----------+ +----------+ | | |
|
|
// | | | 004 005 006 | | |
|
|
// | | | +----------+ +----------+ +----------+ | | |
|
|
// | | | | | | | | | | | |
|
|
// | | | | | | | | | | | |
|
|
// | | | +----------+ +----------+ +----------+ | | |
|
|
// -+-- | | +---------------------------------------------+ | |
|
|
// BORDER2 | | | | |
|
|
// -+-- | +-----------------------------------------------------+ |
|
|
// BORDER1 | | |
|
|
// -+-- +-------------------------------------------------------------+
|
|
// |<1>|<2>|
|
|
//
|
|
// # : (TABS_START_X, TABS_START_Y)
|
|
// <1> : BORDER1
|
|
// <2> : BORDER2
|
|
//
|
|
//
|
|
//
|
|
// |< 3 >| |<4>|<4>|
|
|
// -+- +--------------------------------------------------------+ -+-
|
|
// SLIDE_GAP_Y | | 001 | 002 | 003 | |
|
|
// -+- | +----------+ +----------+ +----------+ |
|
|
// SELECT_SIZE_Y | | | | | | | | | | |
|
|
// | | | | | | | | |
|
|
// -+- | +----------+ | +----------+ | +----------+ |
|
|
// SLIDE_GAP_Y1 | | |
|
|
// -+- | - - - - - - - - | - - - - - - - - | - - - - - - - - | SLIDE_AREA_Y
|
|
// | 004 005 006 |
|
|
// | +----------+ | +----------+ | +----------+ |
|
|
// | | | | | | | |
|
|
// | | | | | | | | | |
|
|
// | +----------+ +----------+ +----------+ |
|
|
// | | | | |
|
|
// +--------------------------------------------------------+ -+-
|
|
//
|
|
// |< SLIDE_AREA_X >|
|
|
//
|
|
//
|
|
// < 3 > : SELECT_SIZE_X
|
|
// < 4 > : SLIDE_GAP_X
|
|
|
|
|
|
function selectDialog(_titleName, _checkBitmap, _levelData, _activeLevel, _screenX1, _screenY1,
|
|
_parentStage, _scale, _activeFun, _closeFun, _postFun)
|
|
{
|
|
var TITLE_TEXT_SIZE = 36 * _scale;
|
|
var TABS_TEXT_SIZE = 20 * _scale;
|
|
|
|
var TOP_BORDER1 = TITLE_TEXT_SIZE * 2 | 0; //new: *2, old: *3/2
|
|
var TOP_BORDER2 = TABS_TEXT_SIZE * 3/2 | 0;
|
|
var BORDER1 = 20 * _scale;
|
|
var BORDER2 = 16 * _scale;
|
|
var TABS_START_X = BORDER1;
|
|
var TABS_START_Y = TOP_BORDER1;
|
|
|
|
var MAP_SCALE = _scale * 0.2;
|
|
var SELECT_SIZE_X = NO_OF_TILES_X*BASE_TILE_X*MAP_SCALE;
|
|
var SELECT_SIZE_Y = NO_OF_TILES_Y*BASE_TILE_Y*MAP_SCALE;
|
|
var SLIDE_PAGE_ITEMS = 3 * 10;
|
|
var SLIDE_GAP_X = BASE_TILE_X * _scale * 3/5; //new: 3/5, old: 3/4
|
|
var SLIDE_GAP_Y = BASE_TILE_Y * _scale * 3/4;
|
|
var SLIDE_GAP_Y1 = BASE_TILE_Y * _scale * 2/4; //new: 2/4, old: 3/4
|
|
|
|
var SLIDE_ITEM_X = 3;
|
|
var SLIDE_ITEM_Y = 3;
|
|
var SLIDE_AREA_X = (SLIDE_GAP_X*2+SELECT_SIZE_X)*SLIDE_ITEM_X;
|
|
var SLIDE_AREA_Y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y)*SLIDE_ITEM_Y;
|
|
|
|
var CANVAS_SIZE_X = (BORDER1+BORDER2)*2 + SLIDE_AREA_X;
|
|
var CANVAS_SIZE_Y = TOP_BORDER1 + TOP_BORDER2 + BORDER2 + SLIDE_AREA_Y +BORDER1+BORDER2;
|
|
|
|
var BACKGROUND_COLOR = "#ff5050";
|
|
var BORDER1_COLOR = BACKGROUND_COLOR;
|
|
var BORDER2_COLOR = "white";
|
|
var TABS_ACTIVE_FILL_COLOR = BORDER2_COLOR;
|
|
var TABS_ACTIVE_LINE_COLOR = BORDER2_COLOR;
|
|
var TABS_ACTIVE_TEXT_COLOR = "black";
|
|
var TABS_INACTIVE_FILL_COLOR = "#ccc";
|
|
var TABS_INACTIVE_LINE_COLOR = "#aaa";
|
|
var TABS_INACTIVE_TEXT_COLOR = "#888";
|
|
|
|
var SLIDE_BACKGROUND = "#EEEEFF";
|
|
var SLIDE_BOUNDLINE_COLOR = "red";
|
|
|
|
var SELECT_TEXT_COLOR = "black";
|
|
var SELECT_TEXT_ACTIVE_COLOR = "red";
|
|
var SELECT_TEXT_SIZE = 20 * _scale;
|
|
|
|
var SELECT_MOUSE_OVER_COLOR = "gold";
|
|
var SELECT_MAP_BACKGROUND_COLOR = "black";
|
|
var SELECT_SCORE_COLOR = "white";
|
|
var SELECT_SCORE_SHADOW = "black";
|
|
var SELECT_CHECK_SHADOW_COLOR = "white";
|
|
|
|
var TITLE_TEXT_COLOR = "white";
|
|
var TITLE_TEXT_SHADOW_COLOR = "gold";
|
|
|
|
var CLOSE_ICON_ACTIVE_COLOR = "#8080ff";
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
var canvas1;
|
|
var coverBackgroundObj;
|
|
var dialogStage;
|
|
var slider;
|
|
var boundLine1, boundLine2;
|
|
|
|
var tabs = [], tabsLine;
|
|
|
|
var maxPages, activePage; //0 -
|
|
var lastWheelFun = null;
|
|
|
|
var activeState = 0; //for edit mode only (1: active level shift, -1: active level deleted)
|
|
var levelDeleted = 0; //for edit mode only
|
|
var saveKeyStateObj;
|
|
|
|
init();
|
|
|
|
function init()
|
|
{
|
|
saveKeyState();
|
|
createCanvas1();
|
|
createDialogStage();
|
|
setBackground();
|
|
|
|
initVariable();
|
|
drawCoverBackground();
|
|
createSliderPage();
|
|
createSliderBoundLine();
|
|
createBorder1();
|
|
createBorder2();
|
|
createTabs(0);
|
|
createTitle();
|
|
new closeIconClass(CANVAS_SIZE_X, 0, dialogStage, _scale, CLOSE_ICON_ACTIVE_COLOR, closeBox, null);
|
|
dialogStage.update();
|
|
}
|
|
|
|
function initVariable()
|
|
{
|
|
maxPages = Math.ceil(_levelData.length / SLIDE_PAGE_ITEMS);
|
|
|
|
if(playMode == PLAY_EDIT && _activeLevel <= 0) {
|
|
_activeLevel = activePage = 0;
|
|
} else {
|
|
if(_activeLevel <= 0 || _activeLevel > _levelData.length) _activeLevel = 1;
|
|
activePage = Math.ceil(_activeLevel / SLIDE_PAGE_ITEMS)-1;
|
|
}
|
|
}
|
|
|
|
function drawCoverBackground()
|
|
{
|
|
coverBackgroundObj = new createjs.Shape();
|
|
coverBackgroundObj.graphics.beginFill("black")
|
|
.drawRect(0, 0, _parentStage.canvas.width, _parentStage.canvas.height).endFill();
|
|
coverBackgroundObj.alpha = 0.6;
|
|
_parentStage.addChild(coverBackgroundObj);
|
|
_parentStage.update();
|
|
}
|
|
|
|
function removeCoverBackground()
|
|
{
|
|
_parentStage.removeChild(coverBackgroundObj);
|
|
}
|
|
|
|
function createCanvas1()
|
|
{
|
|
canvas1 = document.createElement('canvas');
|
|
canvas1.id = "canvas1";
|
|
canvas1.width = CANVAS_SIZE_X;
|
|
canvas1.height = CANVAS_SIZE_Y;
|
|
|
|
var left = ((_screenX1 - canvas1.width)/2|0),
|
|
top = ((_screenY1 - canvas1.height)/2|0);
|
|
canvas1.style.left = (left>0?left:0) + "px";
|
|
canvas1.style.top = (top>0?top:0) + "px";
|
|
canvas1.style.position = "absolute";
|
|
document.body.appendChild(canvas1);
|
|
}
|
|
|
|
function saveKeyState()
|
|
{
|
|
saveKeyStateObj = saveKeyHandler(handleEscKeyDown);
|
|
}
|
|
|
|
function restoreKeyState()
|
|
{
|
|
restoreKeyHandler(saveKeyStateObj);
|
|
}
|
|
|
|
function handleEscKeyDown(event)
|
|
{
|
|
if(!event){ event = window.event; } //cross browser issues exist
|
|
|
|
if(event.shiftKey || event.ctrlKey) return false;
|
|
|
|
switch(event.key) {
|
|
case "Escape":
|
|
closeBox();
|
|
break;
|
|
default:
|
|
//debug("keycode = " + code);
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function closeBox()
|
|
{
|
|
removeCanvas1();
|
|
removeCoverBackground();
|
|
restoreKeyState();
|
|
if(_postFun) _postFun();
|
|
if(_closeFun) _closeFun(levelDeleted, _activeLevel, activeState); //for edit mode
|
|
}
|
|
|
|
function removeCanvas1()
|
|
{
|
|
dialogStage.removeAllChildren();
|
|
dialogStage.enableMouseOver(0);
|
|
dialogStage.cursor ="default";
|
|
createjs.Ticker.removeEventListener(dialogStage);
|
|
document.body.removeChild(canvas1);
|
|
}
|
|
|
|
function createDialogStage()
|
|
{
|
|
dialogStage = new createjs.Stage(canvas1);
|
|
dialogStage.enableMouseOver(60);
|
|
createjs.Ticker.setFPS(60);
|
|
createjs.Ticker.addEventListener("tick", dialogStage);
|
|
}
|
|
|
|
function setBackground()
|
|
{
|
|
var background = new createjs.Shape();
|
|
background.graphics.beginFill(BACKGROUND_COLOR).drawRoundRect(0, 0, CANVAS_SIZE_X, CANVAS_SIZE_Y, 8*_scale)
|
|
.endFill();
|
|
dialogStage.addChild(background);
|
|
}
|
|
|
|
|
|
function createSliderPage()
|
|
{
|
|
slider = new createjs.Container();
|
|
dialogStage.addChild(slider);
|
|
}
|
|
|
|
function createSliderBoundLine()
|
|
{
|
|
boundLine1 = new createjs.Shape();
|
|
boundLine2 = new createjs.Shape();
|
|
|
|
boundLine1.graphics.setStrokeStyle(2).beginStroke(SLIDE_BOUNDLINE_COLOR)
|
|
.moveTo(BORDER1+BORDER2, TOP_BORDER1+TOP_BORDER2+BORDER2+1)
|
|
.lineTo(SLIDE_AREA_X+BORDER1+BORDER2, TOP_BORDER1+TOP_BORDER2+BORDER2+1).endStroke();
|
|
boundLine1.alpha = 0;
|
|
|
|
boundLine2.graphics.setStrokeStyle(2).beginStroke(SLIDE_BOUNDLINE_COLOR)
|
|
.moveTo(BORDER1+BORDER2, CANVAS_SIZE_Y-BORDER1-BORDER2-1)
|
|
.lineTo(SLIDE_AREA_X+BORDER1+BORDER2, CANVAS_SIZE_Y-BORDER1-BORDER2-1).endStroke();
|
|
boundLine2.alpha = 0;
|
|
|
|
dialogStage.addChild(boundLine2, boundLine1);
|
|
}
|
|
|
|
function createBorder1()
|
|
{
|
|
var border1 = new createjs.Container();
|
|
var vBorder1 = new createjs.Shape();
|
|
var vBorder2 = new createjs.Shape();
|
|
|
|
vBorder1.graphics.beginFill(BORDER1_COLOR)
|
|
.drawRect(BORDER1+BORDER2-1, 0, SLIDE_AREA_X+2, TOP_BORDER1+TOP_BORDER2).endFill();
|
|
|
|
vBorder2.graphics.beginFill(BORDER1_COLOR)
|
|
.drawRect(BORDER1+BORDER2-1, CANVAS_SIZE_Y-BORDER1, SLIDE_AREA_X+2, BORDER1).endFill();
|
|
|
|
border1.addChild(vBorder1, vBorder2);
|
|
border1.on("mouseover", function() { dialogStage.cursor ="default"; });
|
|
dialogStage.addChild(border1);
|
|
}
|
|
|
|
function createBorder2()
|
|
{
|
|
var border2 = new createjs.Container();
|
|
var vBorder1 = new createjs.Shape();
|
|
var vBorder2 = new createjs.Shape();
|
|
var hBorder1 = new createjs.Shape();
|
|
var hBorder2 = new createjs.Shape();
|
|
|
|
|
|
vBorder1.graphics.beginFill(BORDER2_COLOR)
|
|
.drawRect(BORDER1, TOP_BORDER1+TOP_BORDER2,
|
|
CANVAS_SIZE_X-2*BORDER1, BORDER2+1).endFill();
|
|
|
|
vBorder2.graphics.beginFill(BORDER2_COLOR)
|
|
.drawRect(BORDER1, CANVAS_SIZE_Y-BORDER1-BORDER2-1,
|
|
CANVAS_SIZE_X-2*(BORDER1)-BORDER2,BORDER2+1).endFill();
|
|
|
|
hBorder1.graphics.beginFill(BORDER2_COLOR)
|
|
.drawRect(BORDER1, TOP_BORDER1+TOP_BORDER2+BORDER2,
|
|
BORDER2+2, CANVAS_SIZE_Y-BORDER1-BORDER2-TOP_BORDER1-TOP_BORDER2).endFill();
|
|
|
|
hBorder2.graphics.beginFill(BORDER2_COLOR)
|
|
.drawRect(CANVAS_SIZE_X-BORDER1-BORDER2-1, TOP_BORDER1+TOP_BORDER2+BORDER2,
|
|
BORDER2+1, CANVAS_SIZE_Y-BORDER1-BORDER2-TOP_BORDER1-TOP_BORDER2).endFill();
|
|
|
|
border2.addChild(vBorder1, vBorder2, hBorder1, hBorder2);
|
|
dialogStage.addChild(border2);
|
|
}
|
|
|
|
function clearTabs()
|
|
{
|
|
for(var i = 0; i < tabs.length; i++) {
|
|
dialogStage.removeChild(tabs[i]);
|
|
}
|
|
dialogStage.removeChild(tabsLine);
|
|
}
|
|
|
|
function createTabs(tabsOnly)
|
|
{
|
|
var tabBackground, tabText;
|
|
var textWidth, textHeight;
|
|
var tabsStartX = BORDER1;
|
|
|
|
for(var i = 0; i < maxPages; i++) {
|
|
var tabsName = ("00" + (i * SLIDE_PAGE_ITEMS + 1)).slice(-3) + " - " +
|
|
("00" + (i==maxPages-1?_levelData.length:((i+1) * SLIDE_PAGE_ITEMS))).slice(-3);
|
|
//debug(tabsName);
|
|
|
|
tabs[i] = new createjs.Container();
|
|
tabBackground = new createjs.Shape();
|
|
tabText = new createjs.Text(tabsName, TABS_TEXT_SIZE + "px Arial", TABS_INACTIVE_TEXT_COLOR);
|
|
textHeight = tabText.getBounds().height+4*_scale;
|
|
textWidth = tabText.getBounds().width+textHeight;
|
|
|
|
tabText.x = textHeight;
|
|
tabs[i].x = tabsStartX;
|
|
tabs[i].y = TOP_BORDER1+TOP_BORDER2 - textHeight;
|
|
tabsStartX += (textHeight/2+textWidth);
|
|
tabs[i].addChild(tabBackground, tabText);
|
|
tabsActive(i);
|
|
dialogStage.addChild(tabs[i]);
|
|
|
|
tabs[i].tabId = i;
|
|
|
|
tabs[i].on("mouseover", function(){ dialogStage.cursor = 'pointer'; dialogStage.update();});
|
|
tabs[i].on("mouseout", function() { dialogStage.cursor = 'default'; dialogStage.update();});
|
|
|
|
tabs[i].on("click", tabMouseClick);
|
|
}
|
|
|
|
tabsLine = new createjs.Shape();
|
|
tabsLine.graphics.setStrokeStyle(2).beginStroke(TABS_ACTIVE_LINE_COLOR)
|
|
.moveTo(BORDER1, TOP_BORDER1+TOP_BORDER2)
|
|
.lineTo(SLIDE_AREA_X+BORDER1+2*BORDER2, TOP_BORDER1+TOP_BORDER2).endStroke();
|
|
dialogStage.addChild(tabsLine);
|
|
|
|
tabsInActiveAll();
|
|
tabsActive(activePage);
|
|
if(!tabsOnly) setSlidePage(activePage);
|
|
|
|
function tabsActive(id)
|
|
{
|
|
tabBackground = tabs[id].getChildAt(0);
|
|
tabText = tabs[id].getChildAt(1);
|
|
|
|
tabBackground.graphics.clear().setStrokeStyle(1)
|
|
.beginStroke(TABS_ACTIVE_LINE_COLOR).beginFill(TABS_ACTIVE_FILL_COLOR)
|
|
.moveTo(0, textHeight).lineTo(textHeight/2, 0)
|
|
.lineTo(textHeight/2+textWidth, 0).lineTo(textHeight+textWidth, textHeight)
|
|
.lineTo(0, textHeight).endFill();
|
|
tabText.color = TABS_ACTIVE_TEXT_COLOR;
|
|
moveChild2Top(dialogStage, tabs[id]);
|
|
dialogStage.update();
|
|
}
|
|
|
|
function tabsInActive(id)
|
|
{
|
|
tabBackground = tabs[id].getChildAt(0);
|
|
tabText = tabs[id].getChildAt(1);
|
|
|
|
tabBackground.graphics.clear().setStrokeStyle(1)
|
|
.beginStroke(TABS_INACTIVE_LINE_COLOR).beginFill(TABS_INACTIVE_FILL_COLOR)
|
|
.moveTo(0, textHeight).lineTo(textHeight/2, 0)
|
|
.lineTo(textHeight/2+textWidth, 0).lineTo(textHeight+textWidth, textHeight)
|
|
.lineTo(0, textHeight).endFill();
|
|
tabText.color = TABS_INACTIVE_TEXT_COLOR;
|
|
moveChild2Top(dialogStage, tabs[id]);
|
|
}
|
|
|
|
function tabsInActiveAll()
|
|
{
|
|
for(var i = maxPages; i > 0; i--) {
|
|
tabsInActive(i-1);
|
|
moveChild2Top(dialogStage, tabs[i-1]);
|
|
}
|
|
moveChild2Top(dialogStage, tabsLine);
|
|
}
|
|
|
|
function tabMouseClick() {
|
|
if(activePage != this.tabId) {
|
|
tabsInActiveAll();
|
|
tabsActive(this.tabId);
|
|
setSlidePage(this.tabId);
|
|
activePage = this.tabId;
|
|
}
|
|
}
|
|
}
|
|
|
|
function setSlidePage(pages)
|
|
{
|
|
var startLevel = SLIDE_PAGE_ITEMS * pages+1;
|
|
var endLevel = (pages == maxPages-1)?_levelData.length:SLIDE_PAGE_ITEMS * (pages+1);
|
|
|
|
var pageItems = endLevel - startLevel+1;
|
|
var selectItemX = SLIDE_ITEM_X;
|
|
var selectItemY = Math.ceil(pageItems/SLIDE_ITEM_X);
|
|
|
|
var slideX = SLIDE_AREA_X;
|
|
var slideY = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * (selectItemY < SLIDE_ITEM_Y?SLIDE_ITEM_Y:selectItemY);
|
|
var slideStartX = BORDER1 + BORDER2;
|
|
var slideStartY = TOP_BORDER1 + TOP_BORDER2 + BORDER2;
|
|
|
|
var maxSliderY = slideStartY;
|
|
var minSliderY = slideStartY + SLIDE_AREA_Y - slideY;
|
|
|
|
var background = new createjs.Shape();
|
|
var selectRect = [], selectText = [];
|
|
var delSelectObj = [];
|
|
|
|
var sliderMoved = 0; //while move ths silder don't active mouse click
|
|
var firstPressMoveY = 0; //keep Y position while first press move
|
|
var closeClicked = 0, closeOver = 0;
|
|
|
|
var activeItemY = -1; //for scroll to active Item
|
|
|
|
|
|
init();
|
|
|
|
function init()
|
|
{
|
|
var diffY;
|
|
|
|
slider.removeAllChildren();
|
|
slider.removeAllEventListeners();
|
|
|
|
background.graphics.beginFill(SLIDE_BACKGROUND).drawRect(0, 0, slideX, slideY);
|
|
slider.addChild(background);
|
|
|
|
var id = -1;
|
|
|
|
levelLoop:
|
|
for(var y = 0; y < selectItemY; y++) {
|
|
for(var x = 0; x < selectItemX; x++) {
|
|
if(++id >= pageItems) break levelLoop;
|
|
createSelectLevel(x, y);
|
|
}
|
|
}
|
|
background.on("mouseover", function() {
|
|
dialogStage.cursor = "url('cursor/openhand.cur'), auto";}
|
|
);
|
|
background.on("mouseout", function() {
|
|
dialogStage.cursor = "default";}
|
|
);
|
|
|
|
slider.on("mousedown", function(evt) {
|
|
diffY = evt.currentTarget.y - evt.stageY;
|
|
});
|
|
|
|
slider.on("pressmove",function(evt) {
|
|
debug("pressmove (1) x=" + evt.stageX + ", y=" + evt.stageY);
|
|
if(sliderMoved++ <= 0) firstPressMoveY = evt.stageY;
|
|
|
|
boundLine1.alpha = boundLine2.alpha = 0;
|
|
dialogStage.cursor = "url('cursor/closedhand.cur'), auto";
|
|
|
|
evt.currentTarget.y = evt.stageY + diffY;
|
|
if(evt.currentTarget.y > maxSliderY) {
|
|
evt.currentTarget.y = maxSliderY;
|
|
boundLine1.alpha = 1;
|
|
} else
|
|
if(evt.currentTarget.y < minSliderY ) {
|
|
evt.currentTarget.y = minSliderY;
|
|
boundLine2.alpha = 1;
|
|
}
|
|
dialogStage.update();
|
|
});
|
|
|
|
slider.on("pressup", function(evt) {
|
|
debug("press-up (0)");
|
|
sliderMoved = firstPressMoveY = 0;
|
|
dialogStage.cursor = "url('cursor/openhand.cur'), auto";
|
|
boundLine1.alpha = boundLine2.alpha = 0;
|
|
|
|
//---------------------
|
|
// move to block bound
|
|
//---------------------
|
|
var blockSizeY = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y);
|
|
var startY = maxSliderY
|
|
var mod = (maxSliderY - slider.y) % blockSizeY; //division remainder value to block bound
|
|
|
|
if(blockSizeY/2 > mod) {
|
|
evt.currentTarget.y += mod; //shift down
|
|
} else {
|
|
evt.currentTarget.y -= (blockSizeY - mod); //shift up
|
|
}
|
|
|
|
dialogStage.update();
|
|
});
|
|
|
|
slider.x = slideStartX;
|
|
slider.y = slideStartY;
|
|
if(activeItemY > 0) { //scroll to active level
|
|
slider.y -= activeItemY*(SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y);
|
|
}
|
|
|
|
dialogStage.update();
|
|
enableMouseWheel();
|
|
}
|
|
|
|
function createSelectLevel(x, y)
|
|
{
|
|
var id = y*selectItemX+x;
|
|
var textColor = SELECT_TEXT_COLOR, level = startLevel+id;;
|
|
|
|
if(_activeLevel == level) {
|
|
activeItemY = y;
|
|
if(activeItemY + SLIDE_ITEM_Y > selectItemY) {
|
|
activeItemY = selectItemY - SLIDE_ITEM_Y;
|
|
}
|
|
textColor = SELECT_TEXT_ACTIVE_COLOR;
|
|
}
|
|
|
|
selectText[id] = new createjs.Text(("00"+level).slice(-3), SELECT_TEXT_SIZE + "px Arial",
|
|
textColor);
|
|
|
|
selectText[id].x = (SLIDE_GAP_X*2+SELECT_SIZE_X) * x + SLIDE_GAP_X;
|
|
selectText[id].y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * y + SLIDE_GAP_Y - SELECT_TEXT_SIZE*4/3;
|
|
slider.addChild(selectText[id]);
|
|
|
|
selectRect[id] = buildSelectMap(level, id);
|
|
selectRect[id].x = (SLIDE_GAP_X*2+SELECT_SIZE_X) * x + SLIDE_GAP_X;
|
|
selectRect[id].y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * y + SLIDE_GAP_Y;
|
|
slider.addChild(selectRect[id]);
|
|
|
|
if(playMode != PLAY_DEMO || (playMode == PLAY_DEMO && (typeof demoData[level-1] != "undefined"))) {
|
|
selectRect[id].on('click', selectClick);
|
|
selectRect[id].on('mouseover', selectMouseOver);
|
|
selectRect[id].on('mouseout', selectMouseOut);
|
|
}
|
|
|
|
selectRect[id].myId = id;
|
|
selectRect[id].myLevel = level;
|
|
}
|
|
|
|
function delSelectLevel(level)
|
|
{
|
|
var id = level - startLevel; //level = startLevel + id
|
|
var x, y;
|
|
var tabsOnly = 1;
|
|
|
|
//(1) remove deleted level
|
|
slider.removeChild(selectText[id]);
|
|
slider.removeChild(selectRect[id]);
|
|
|
|
//(2) remove close icon object
|
|
delSelectObj.splice(id,1);
|
|
|
|
//(3) shift level+1 - endLevel
|
|
while(level < endLevel) {
|
|
id = level - startLevel;
|
|
y = id /selectItemX|0;
|
|
x = id - y * selectItemX;
|
|
selectText[id] = selectText[id+1];
|
|
selectText[id].text = ("00"+level).slice(-3);
|
|
selectText[id].color = (_activeLevel == level)?SELECT_TEXT_ACTIVE_COLOR:SELECT_TEXT_COLOR;
|
|
selectText[id].x = (SLIDE_GAP_X*2+SELECT_SIZE_X) * x + SLIDE_GAP_X;
|
|
selectText[id].y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * y + SLIDE_GAP_Y - SELECT_TEXT_SIZE*4/3;
|
|
|
|
selectRect[id] = selectRect[id+1];
|
|
selectRect[id].x = (SLIDE_GAP_X*2+SELECT_SIZE_X) * x + SLIDE_GAP_X;
|
|
selectRect[id].y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * y + SLIDE_GAP_Y;
|
|
selectRect[id].myLevel = level;
|
|
selectRect[id].myId = level - startLevel;
|
|
|
|
level++;
|
|
}
|
|
|
|
//(3) add one if could add
|
|
if(level <= editLevels) {
|
|
// add new level
|
|
id = level - startLevel;
|
|
y = id /selectItemX|0;
|
|
x = id - y * selectItemX;
|
|
createSelectLevel(x,y);
|
|
maxPages = Math.ceil(_levelData.length / SLIDE_PAGE_ITEMS);
|
|
} else {
|
|
// no more level (remove last level)
|
|
if(level == startLevel) { //end pages and no more levels in this pages
|
|
maxPages--;
|
|
if(maxPages > 0) {
|
|
tabsOnly = 0;
|
|
activePage = maxPages-1;
|
|
//move to previous page
|
|
} else {
|
|
//no any level in select menu !!! ==> close it (maxPages < 0)
|
|
}
|
|
}
|
|
endLevel--;
|
|
|
|
pageItems = endLevel - startLevel+1;
|
|
selectItemY = Math.ceil(pageItems/SLIDE_ITEM_X);
|
|
slideY = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * (selectItemY < SLIDE_ITEM_Y?SLIDE_ITEM_Y:selectItemY);
|
|
minSliderY = slideStartY + SLIDE_AREA_Y - slideY;
|
|
if(slider.y < minSliderY) slider.y = minSliderY; //shift slider
|
|
}
|
|
|
|
//(3) redraw tabs page
|
|
clearTabs()
|
|
createTabs(tabsOnly);
|
|
|
|
if(maxPages <= 0) closeBox();
|
|
}
|
|
|
|
|
|
function buildSelectMap(level, id)
|
|
{
|
|
var levelMap = _levelData[level-1];
|
|
var selectMap = new createjs.Container();
|
|
var border = new createjs.Shape();
|
|
var background = new createjs.Shape();
|
|
|
|
var borderSize = _scale*4+2;
|
|
|
|
border.graphics.beginFill(SELECT_MOUSE_OVER_COLOR)
|
|
.drawRoundRect(-borderSize, -borderSize, SELECT_SIZE_X+2*borderSize, SELECT_SIZE_Y+2*borderSize, borderSize);
|
|
border.alpha = 0;
|
|
background.graphics.beginFill(SELECT_MAP_BACKGROUND_COLOR).drawRect(0, 0, SELECT_SIZE_X, SELECT_SIZE_Y);
|
|
|
|
selectMap.addChild(border, background);
|
|
selectMap.addChild(level2Bitmap(levelMap));
|
|
|
|
switch(playMode) {
|
|
case PLAY_EDIT:
|
|
if(editLevelData == _levelData) { //del box only for "custom levels", NOT for "LOAD" button
|
|
delSelectObj[id] = new delIcon();
|
|
selectMap.addChild(delSelectObj[id].getCloseObj());
|
|
}
|
|
break;
|
|
case PLAY_DEMO:
|
|
setDemoLevelInfo(selectMap, level);
|
|
break;
|
|
default:
|
|
setLevelInfo(selectMap, level);
|
|
break;
|
|
}
|
|
|
|
return selectMap;
|
|
}
|
|
|
|
function level2Bitmap(levelMap)
|
|
{
|
|
var container = new createjs.Container();
|
|
var guardCount = 0, runner = 0;
|
|
var bitmap;
|
|
|
|
//--------------------------------------------
|
|
// Parser map from right-bottom to left-top
|
|
// for drop guards if too manys
|
|
//--------------------------------------------
|
|
var index = NO_OF_TILES_Y * NO_OF_TILES_X - 1;
|
|
for(var y = NO_OF_TILES_Y-1; y >= 0; y--) {
|
|
for(var x = NO_OF_TILES_X-1; x >= 0; x--) {
|
|
var id = levelMap.charAt(index--);
|
|
|
|
var curTile;
|
|
switch(id) {
|
|
default:
|
|
case ' ': //empty
|
|
continue;
|
|
case '#': //Normal Brick
|
|
curTile = getThemeBitmap("brick");
|
|
break;
|
|
case '@': //Solid Brick
|
|
curTile = getThemeBitmap("solid");
|
|
break;
|
|
case 'H': //Ladder
|
|
curTile = getThemeBitmap("ladder");
|
|
break;
|
|
case '-': //Line of rope
|
|
curTile = getThemeBitmap("rope");
|
|
break;
|
|
case 'X': //False brick
|
|
curTile = getThemeBitmap("brick");
|
|
break;
|
|
case 'S': //Ladder appears at end of level
|
|
continue;
|
|
case '$': //Gold chest
|
|
curTile = getThemeBitmap("gold");
|
|
break;
|
|
case '0': //Guard
|
|
if(++guardCount > MAX_NEW_GUARD) {
|
|
continue; //too many guard , set this tile as empty
|
|
}
|
|
curTile = new createjs.Sprite(guardData, "runLeft");
|
|
curTile.stop();
|
|
break;
|
|
case '&': //Player
|
|
if(++runner > 1) {
|
|
continue; //too many runner, set this tile as empty
|
|
}
|
|
curTile = new createjs.Sprite(runnerData, "runRight");
|
|
curTile.stop();
|
|
break;
|
|
}
|
|
curTile.setTransform(x * BASE_TILE_X*MAP_SCALE, y * BASE_TILE_Y*MAP_SCALE,MAP_SCALE, MAP_SCALE);
|
|
container.addChild(curTile);
|
|
}
|
|
}
|
|
container.cache(0, 0, SELECT_SIZE_X, SELECT_SIZE_Y);
|
|
bitmap = new createjs.Bitmap( container.cacheCanvas); //change "cont.getCacheDataURL()" to "cont.cacheCanvas"
|
|
container.removeAllChildren();
|
|
return bitmap;
|
|
}
|
|
|
|
//for demo mode
|
|
function setDemoLevelInfo(selectObj, level)
|
|
{
|
|
if( typeof demoData[level-1] != "undefined") {
|
|
var bitmap = _checkBitmap.clone();
|
|
var startX = (SELECT_SIZE_X - _checkBitmap.getBounds().width*_scale)/2|0;
|
|
var startY = (SELECT_SIZE_Y - _checkBitmap.getBounds().height*_scale)/4|0;
|
|
|
|
bitmap.setTransform(startX, startY, _scale, _scale);
|
|
bitmap.set({alpha:0.9});
|
|
bitmap.shadow = new createjs.Shadow(SELECT_CHECK_SHADOW_COLOR, 2, 2, 5);
|
|
selectObj.addChild(bitmap);
|
|
}
|
|
}
|
|
|
|
function setLevelInfo(selectObj, level)
|
|
{
|
|
if(modernScoreInfo[level-1] >= 0) {
|
|
var bitmap = _checkBitmap.clone();
|
|
var scoreText = new createjs.Text(modernScoreInfo[level-1],
|
|
"bold "+SELECT_TEXT_SIZE +"px Helvetica",SELECT_SCORE_COLOR);
|
|
var startX = (SELECT_SIZE_X - _checkBitmap.getBounds().width*_scale)/2|0;
|
|
var startY = (SELECT_SIZE_Y - _checkBitmap.getBounds().height*_scale)/4|0;
|
|
|
|
bitmap.setTransform(startX, startY, _scale, _scale);
|
|
bitmap.set({alpha:0.9});
|
|
bitmap.shadow = new createjs.Shadow(SELECT_CHECK_SHADOW_COLOR, 2, 2, 5);
|
|
selectObj.addChild(bitmap);
|
|
|
|
scoreText.x = (SELECT_SIZE_X - scoreText.getBounds().width)/2|0;
|
|
scoreText.y = SELECT_SIZE_Y - scoreText.getBounds().height;
|
|
scoreText.shadow = new createjs.Shadow( SELECT_SCORE_SHADOW, 2, 2, 3);
|
|
selectObj.addChild(scoreText);
|
|
}
|
|
}
|
|
|
|
function selectClick(evt)
|
|
{
|
|
debug("selectClick(0) x=" + evt.stageX + ", y=" + evt.stageY + "(" + Math.abs(firstPressMoveY-evt.stageY) +")");
|
|
|
|
//=============================================================================================================
|
|
// BUG FIX: This is not a root solution !!! 6/16/2014
|
|
// sometime when click on slect map level, also will do "pressmove" command
|
|
// (1) pressmove => (2) select click ==> (3) pressup
|
|
// so currently use sliderMoved count > 10 or (click Y-pos not equal to pressmove Y-pos ) acts as move slider
|
|
// otherwise acts as click the selection!
|
|
//=============================================================================================================
|
|
if(sliderMoved > 10 || (sliderMoved && firstPressMoveY != evt.stageY) || closeClicked) {
|
|
//while move the silder or click on delete level icon don't active mouse click
|
|
debug("sliderMoved = " + sliderMoved + " closeClicked = " + closeClicked);
|
|
sliderMoved = firstPressMoveY = closeClicked = 0;
|
|
return;
|
|
}
|
|
debug("selectClick");
|
|
removeCanvas1();
|
|
removeCoverBackground();
|
|
restoreKeyState();
|
|
if(_postFun) _postFun();
|
|
_activeFun(this.myLevel);
|
|
}
|
|
|
|
function selectMouseOver()
|
|
{
|
|
var border = this.getChildAt(0);
|
|
|
|
if(playMode == PLAY_EDIT && editLevelData == _levelData) { //del box only for "custom levels", NOT for "LOAD"
|
|
delSelectObj[this.myId].selectOver();
|
|
}
|
|
|
|
border.alpha = 1;
|
|
dialogStage.cursor = 'pointer';
|
|
dialogStage.update();
|
|
}
|
|
|
|
function selectMouseOut()
|
|
{
|
|
var border = this.getChildAt(0);
|
|
|
|
if(playMode == PLAY_EDIT && editLevelData == _levelData) { //del box only for "custom levels", NOT for "LOAD"
|
|
if(this.myId < delSelectObj.length) delSelectObj[this.myId].selectOut();
|
|
////else debug("mouse out: select deleted");
|
|
}
|
|
|
|
border.alpha = 0;
|
|
dialogStage.cursor = "url('cursor/openhand.cur'), auto";
|
|
dialogStage.update();
|
|
}
|
|
|
|
function wheelScroll(e)
|
|
{
|
|
var direction = e.detail?-e.detail:e.wheelDelta; //e.detail: for fireFox, e.wheelDelta: for chrome, IE
|
|
direction = (direction>0)?1: -1;
|
|
|
|
|
|
slider.y += ((SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y)) * direction;
|
|
//boundLine1.alpha = boundLine2.alpha = 0;
|
|
if(slider.y > maxSliderY) {
|
|
slider.y = maxSliderY;
|
|
//boundLine1.alpha = 1;
|
|
} else if(slider.y < minSliderY ) {
|
|
slider.y = minSliderY;
|
|
//boundLine2.alpha = 1;
|
|
}
|
|
dialogStage.update();
|
|
}
|
|
|
|
function enableMouseWheel()
|
|
{
|
|
if(lastWheelFun) {
|
|
canvas1.removeEventListener("mousewheel", lastWheelFun, false);
|
|
canvas1.removeEventListener('DOMMouseScroll', lastWheelFun, false);
|
|
}
|
|
lastWheelFun = wheelScroll;
|
|
//for chrome
|
|
canvas1.addEventListener("mousewheel", wheelScroll, false);
|
|
//for firefox
|
|
canvas1.addEventListener('DOMMouseScroll', wheelScroll, false);
|
|
}
|
|
|
|
function delIcon()
|
|
{
|
|
var closeBoxSize = 12*_scale+1;
|
|
var cross, cycle, delIconObj;
|
|
|
|
createCloseIcon();
|
|
|
|
this.getCloseObj = function ()
|
|
{
|
|
return delIconObj;
|
|
}
|
|
|
|
|
|
this.selectOver = function ()
|
|
{
|
|
////debug("select over");
|
|
if(closeOver) return;
|
|
drawIcon(1);
|
|
}
|
|
|
|
this.selectOut = function ()
|
|
{
|
|
////debug("select out");
|
|
drawIcon(0);
|
|
}
|
|
|
|
function createCloseIcon()
|
|
{
|
|
cross = new createjs.Shape();
|
|
cycle = new createjs.Shape();
|
|
delIconObj = new createjs.Container();
|
|
delIconObj.addChild(cycle, cross);
|
|
delIconObj.on("mouseover", handleMouseOver);
|
|
delIconObj.on("mouseout", handleMouseOut);
|
|
delIconObj.on("click", handleMouseClick);
|
|
delIconObj.x = SELECT_SIZE_X - closeBoxSize*2;
|
|
delIconObj.y = closeBoxSize;
|
|
|
|
drawIcon(0);
|
|
}
|
|
|
|
function drawIcon(state)
|
|
{
|
|
var cycAlpha, crosAlpha, cycColor, crosColor;
|
|
|
|
crosColor = "white";
|
|
|
|
switch(state) {
|
|
case 0:
|
|
cycColor = "#888";
|
|
cycAlpha = crosAplha = 0;
|
|
break;
|
|
case 1:
|
|
cycColor = "#888";
|
|
crosAlpha = 1;
|
|
cycAlpha = 0.7;
|
|
break;
|
|
case 2:
|
|
cycColor = "red";
|
|
crosAlpha = cycAlpha = 1;
|
|
break;
|
|
}
|
|
|
|
var g = cycle.graphics;
|
|
g.clear();
|
|
cycle.alpha = cycAlpha;
|
|
g.beginFill(cycColor).dc(closeBoxSize/2, closeBoxSize/2, closeBoxSize*7/6);
|
|
//g.beginFill(cycColor).dr(-closeBoxSize/2, - closeBoxSize/2, closeBoxSize*2, closeBoxSize*2);
|
|
|
|
g = cross.graphics;
|
|
g.clear();
|
|
cross.alpha = crosAlpha;
|
|
g.setStrokeStyle(closeBoxSize/4).beginStroke(crosColor).moveTo(0,0)
|
|
.lineTo(closeBoxSize,closeBoxSize).closePath();
|
|
|
|
g.moveTo(closeBoxSize,0).lineTo(0,closeBoxSize).closePath();
|
|
}
|
|
|
|
function handleMouseOver(event)
|
|
{
|
|
////debug("close over");
|
|
closeOver = 1;
|
|
drawIcon(2);
|
|
}
|
|
|
|
function handleMouseOut(event)
|
|
{
|
|
////debug("close out");
|
|
closeOver = 0;
|
|
drawIcon(1);
|
|
}
|
|
|
|
function handleMouseClick(event)
|
|
{
|
|
closeClicked = 1;
|
|
////debug("delete level = " + delIconObj.parent.myLevel);
|
|
delLevel(delIconObj.parent.myLevel); //get level from parent's property
|
|
}
|
|
}
|
|
|
|
//-------------------------------
|
|
// for edit mode to delete level
|
|
//-------------------------------
|
|
|
|
function delLevel(level)
|
|
{
|
|
//(1) remove from local storage & variable
|
|
delEditLevel(level);
|
|
levelDeleted = 1;
|
|
|
|
//(2) shift or delete active level
|
|
if(_activeLevel == level) {
|
|
_activeLevel = 0;
|
|
activeState = -1; //active level deleted
|
|
|
|
clearTestLevel(); //test level deleted
|
|
|
|
} else if( _activeLevel > level) {
|
|
_activeLevel--;
|
|
activeState = 1; //active level shift
|
|
|
|
getTestLevel(testLevelInfo);
|
|
testLevelInfo.level = _activeLevel; // change level no
|
|
setTestLevel(testLevelInfo);
|
|
|
|
} else if (_activeLevel == 0) { //0 meaings test level is new level
|
|
|
|
if(testLevelInfo.modified == 1) {
|
|
testLevelInfo.level = editLevels+1;
|
|
setTestLevel(testLevelInfo);
|
|
}
|
|
}
|
|
|
|
//(3) shift or delete playInfo of user created
|
|
playData = PLAY_DATA_USERDEF;
|
|
if(editLevels > 0) {
|
|
getModernInfo();
|
|
if(curLevel == level) { //play level deleted
|
|
curLevel = 1;
|
|
setModernInfo();
|
|
} else if ( curLevel > level) { //level shift
|
|
curLevel--;
|
|
setModernInfo();
|
|
}
|
|
} else {
|
|
clearModernInfo();
|
|
}
|
|
|
|
//(4) remove from slider
|
|
delSelectLevel(level);
|
|
|
|
////debug("delete level = " + level);
|
|
}
|
|
}
|
|
|
|
function createTitle()
|
|
{
|
|
var titleText = new createjs.Text(_titleName,
|
|
"italic bold " + TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR);
|
|
titleText.x = (CANVAS_SIZE_X - titleText.getBounds().width)/2|0;
|
|
titleText.y = (TOP_BORDER1 - titleText.getBounds().height)/2|0;
|
|
titleText.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 2, 2, 10 );
|
|
dialogStage.addChild(titleText);
|
|
}
|
|
|
|
}
|
|
|
|
function handleMenuKeyDown(event)
|
|
{
|
|
if(!event){ event = window.event; } //cross browser issues exist
|
|
|
|
if(event.shiftKey || event.ctrlKey) return false;
|
|
|
|
switch(event.key) {
|
|
case "ArrowUp":
|
|
keyAction = ACT_UP;
|
|
break;
|
|
case "ArrowDown":
|
|
keyAction = ACT_DOWN;
|
|
break;
|
|
case "Enter":
|
|
break;
|
|
case "Escape":
|
|
break;
|
|
default:
|
|
keyAction = ACT_UNKNOWN;
|
|
//debug("keycode = " + code);
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//==============
|
|
// select menu
|
|
//==============
|
|
function menuDialog(_titleName, _itemList, _stage, _scale, _closeIconEnable, _closeCallBack, _args)
|
|
{
|
|
var TITLE_TEXT_SIZE = 48 * _scale;
|
|
var ITEM_TEXT_SIZE = 40 * _scale;
|
|
|
|
var TITLE_TEXT_COLOR = "white";
|
|
var TITLE_TEXT_SHADOW_COLOR = "gold";
|
|
|
|
var ITEM_TEXT_COLOR = "white";
|
|
var ITEM_TEXT_SHADOW_COLOR = "gold";
|
|
|
|
var TITLE_AREA_Y = TITLE_TEXT_SIZE * 2.5 | 0;
|
|
|
|
var ITEM_AREA_Y = ITEM_TEXT_SIZE * 3/2 | 0;
|
|
var ITEM_GAP_Y = ITEM_TEXT_SIZE * 2/3 | 0;
|
|
|
|
var BOTTOM_AREA_Y = ITEM_AREA_Y/2|0;
|
|
|
|
var BUTTON_BORDER_SIZE = 8 * _scale;
|
|
var BUTTON_ROUND_RADIUD = 2+ 4 * _scale;
|
|
|
|
var COVER_BACKGROUND_COLOR = "black";
|
|
|
|
var BUTTON_BACKGROUND_BORDER_COLOR = "white";
|
|
var BUTTON_BACKGROUND_COLOR = "#5b0680"; //"#890ee0";
|
|
var BUTTON_BACKGROUND_SHADOW = "gold";
|
|
var BUTTON_BACKGROUND_BORDER_SIZE = 8 * _scale;;
|
|
|
|
var BUTTON_BORDER_COLOR = "gold";
|
|
var BUTTON_COLOR = "#5d7cff";
|
|
|
|
var CLOSE_ICON_ACTIVE_COLOR = "#ff5050";
|
|
|
|
var screenX1 = _stage.canvas.width;
|
|
var screenY1 = _stage.canvas.height;
|
|
|
|
var titleTextObj, titleWidth, titleHeight;
|
|
var itemText = [], maxItemTextWidth, itemTextHeight;
|
|
var menuX, menuY;
|
|
var startX, startY;
|
|
|
|
var coverBackgroundObj, background1Obj, background2Obj, menuButtonObj;
|
|
var closeIconObj = null;
|
|
var saveKeyStateObj;
|
|
var activeItemBackup = _itemList[0].activeItem; //recover menu active item if press ESC or close
|
|
|
|
init();
|
|
|
|
function init()
|
|
{
|
|
createText();
|
|
coverParentStage();
|
|
creatBackground();
|
|
createTitle();
|
|
createItemList();
|
|
if(_closeIconEnable) {
|
|
closeIconObj = new closeIconClass(startX+menuX, startY, _stage, _scale, CLOSE_ICON_ACTIVE_COLOR, closeBox, null);
|
|
}
|
|
|
|
_stage.enableMouseOver(120);
|
|
_stage.update();
|
|
|
|
saveKeyStateObj = saveKeyHandler(handleMenuKeyDown);
|
|
}
|
|
|
|
function coverParentStage()
|
|
{
|
|
coverBackgroundObj = new createjs.Shape();
|
|
coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, screenX1, screenY1).endFill();
|
|
coverBackgroundObj.alpha = 0.6;
|
|
_stage.addChild(coverBackgroundObj);
|
|
}
|
|
|
|
function createText()
|
|
{
|
|
var textLength;
|
|
|
|
titleTextObj = new createjs.Text(_titleName,
|
|
"bold " + TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR);
|
|
titleWidth = titleTextObj.getBounds().width;
|
|
titleHeight = titleTextObj.getBounds().height;
|
|
|
|
maxItemTextWidth =0;
|
|
for(var i = 1; i < _itemList.length; i++) {
|
|
itemText[i-1] = new createjs.Text(_itemList[i].name,
|
|
"bold " + ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR);
|
|
textLength = itemText[i-1].getBounds().width;
|
|
if(maxItemTextWidth < textLength) maxItemTextWidth = textLength;
|
|
}
|
|
maxItemTextWidth += ITEM_TEXT_SIZE;
|
|
menuX = (maxItemTextWidth > titleWidth? maxItemTextWidth: titleWidth) + TITLE_TEXT_SIZE * 2;
|
|
menuY = TITLE_AREA_Y + BOTTOM_AREA_Y + (ITEM_AREA_Y+ITEM_GAP_Y)*(_itemList.length-1);
|
|
|
|
startX = (screenX1-menuX)/2|0;
|
|
startY = (screenY1-menuY)/2|0;
|
|
}
|
|
|
|
function creatBackground()
|
|
{
|
|
background1Obj = new createjs.Shape();
|
|
background1Obj.graphics.beginFill(BUTTON_BACKGROUND_BORDER_COLOR)
|
|
.drawRoundRect(startX, startY, menuX, menuY, 8*_scale).endFill();
|
|
background1Obj.shadow = new createjs.Shadow(BUTTON_BACKGROUND_SHADOW, 3, 3, 5 );
|
|
|
|
background2Obj = new createjs.Shape();
|
|
background2Obj.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(startX+BUTTON_BACKGROUND_BORDER_SIZE, startY+BUTTON_BACKGROUND_BORDER_SIZE,
|
|
menuX-BUTTON_BACKGROUND_BORDER_SIZE*2, menuY-BUTTON_BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill();
|
|
_stage.addChild(background1Obj, background2Obj);
|
|
}
|
|
|
|
function createTitle()
|
|
{
|
|
titleTextObj.x = startX + (menuX - titleWidth)/2|0;
|
|
titleTextObj.y = startY + (TITLE_AREA_Y - titleHeight)/2|0;
|
|
titleTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 0, 0, 10 );
|
|
_stage.addChild(titleTextObj);
|
|
}
|
|
|
|
function createItemList()
|
|
{
|
|
menuButtonObj = []
|
|
for(var i = 0; i < itemText.length; i++) {
|
|
menuButtonObj[i] = new createjs.Container();
|
|
|
|
//child id = 0
|
|
var border = new createjs.Shape();
|
|
border.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE,
|
|
maxItemTextWidth+BUTTON_BORDER_SIZE*2, ITEM_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
//child id = 1
|
|
var button = new createjs.Shape();
|
|
button.graphics.beginFill(BUTTON_COLOR).drawRoundRect(0, 0,
|
|
maxItemTextWidth, ITEM_AREA_Y,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
//child id = 2
|
|
itemText[i].textAlign = "center";
|
|
itemText[i].x = maxItemTextWidth/2|0;
|
|
itemText[i].y = (ITEM_AREA_Y - itemText[i].getBounds().height)/2|0;
|
|
|
|
menuButtonObj[i].addChild(border, button,itemText[i]);
|
|
menuButtonObj[i].x = startX+(menuX - maxItemTextWidth)/2|0;
|
|
menuButtonObj[i].y = startY+TITLE_AREA_Y+(ITEM_AREA_Y+ITEM_GAP_Y) * i;
|
|
menuButtonObj[i].myId = i;
|
|
|
|
menuButtonObj[i].on('click', buttonClick);
|
|
menuButtonObj[i].on('mouseover', buttonMouseOver);
|
|
menuButtonObj[i].on('mouseout', buttonMouseOut);
|
|
_stage.addChild(menuButtonObj[i]);
|
|
}
|
|
buttonActive(menuButtonObj[_itemList[0].activeItem]);
|
|
}
|
|
|
|
function closeBox()
|
|
{
|
|
_itemList[0].activeItem = activeItemBackup; //recover menu active item
|
|
restoreKeyHandler(saveKeyStateObj);
|
|
removeAllObj();
|
|
_stage.cursor = 'default';
|
|
_stage.enableMouseOver(0);
|
|
if(_closeCallBack) _closeCallBack(_args);
|
|
}
|
|
|
|
function removeAllObj()
|
|
{
|
|
_stage.removeChild(coverBackgroundObj, titleTextObj, background1Obj, background2Obj);
|
|
for(var i = 0; i < itemText.length; i++) {
|
|
_stage.removeChild(menuButtonObj[i]);
|
|
}
|
|
if(closeIconObj) _stage.removeChild(closeIconObj);
|
|
_stage.update();
|
|
}
|
|
|
|
function buttonClick()
|
|
{
|
|
restoreKeyHandler(saveKeyStateObj);
|
|
removeAllObj();
|
|
_stage.cursor = 'default';
|
|
_stage.enableMouseOver(0);
|
|
if(_itemList[_itemList[0].activeItem+1].activeFun) {
|
|
_itemList[_itemList[0].activeItem+1].activeFun(_itemList[0].activeItem, _args);
|
|
}
|
|
}
|
|
|
|
function buttonActive(buttonObj)
|
|
{
|
|
var border = buttonObj.getChildAt(0);
|
|
var text = buttonObj.getChildAt(2);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BORDER_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE,
|
|
maxItemTextWidth+BUTTON_BORDER_SIZE*2, ITEM_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
text.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 2, 2, 10 );
|
|
}
|
|
|
|
function buttonInactive(buttonObj)
|
|
{
|
|
var border = buttonObj.getChildAt(0);
|
|
var text = buttonObj.getChildAt(2);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE,
|
|
maxItemTextWidth+BUTTON_BORDER_SIZE*2, ITEM_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
text.shadow = null;
|
|
}
|
|
|
|
function buttonMouseOver()
|
|
{
|
|
if(this.myId != _itemList[0].activeItem) {
|
|
buttonInactive(menuButtonObj[_itemList[0].activeItem]);
|
|
buttonActive(this);
|
|
_itemList[0].activeItem = this.myId;
|
|
}
|
|
_stage.cursor = 'pointer';
|
|
_stage.update();
|
|
}
|
|
|
|
function buttonMouseOut()
|
|
{
|
|
_stage.cursor = 'default';
|
|
_stage.update();
|
|
}
|
|
|
|
function handleMenuKeyDown(event)
|
|
{
|
|
if(!event){ event = window.event; } //cross browser issues exist
|
|
|
|
if(event.shiftKey || event.ctrlKey) return false;
|
|
|
|
switch(event.key) {
|
|
case "ArrowUp":
|
|
buttonInactive(menuButtonObj[_itemList[0].activeItem]);
|
|
if(--_itemList[0].activeItem < 0) _itemList[0].activeItem = menuButtonObj.length-1;
|
|
buttonActive(menuButtonObj[_itemList[0].activeItem]);
|
|
_stage.update();
|
|
break;
|
|
case "ArrowDown":
|
|
buttonInactive(menuButtonObj[_itemList[0].activeItem]);
|
|
if(++_itemList[0].activeItem > (menuButtonObj.length-1)) _itemList[0].activeItem = 0;
|
|
buttonActive(menuButtonObj[_itemList[0].activeItem]);
|
|
_stage.update();
|
|
break;
|
|
case "Enter":
|
|
buttonClick();
|
|
break;
|
|
case "Escape":
|
|
if(closeIconObj != null) closeBox();
|
|
break;
|
|
default:
|
|
//debug("keycode = " + code);
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function mainMenuClose(callbackFun)
|
|
{
|
|
if(callbackFun) callbackFun();
|
|
}
|
|
|
|
var playVersionInfo = [
|
|
{ id:1, verData: classicData, name: gameVersionName[0], info: classicInfo },
|
|
{ id:3, verData: proData, name: gameVersionName[2], info: proInfo },
|
|
{ id:4, verData: revengeData, name: gameVersionName[3], info: revengeInfo },
|
|
{ id:5, verData: fanBookData, name: gameVersionName[4], info: fanBookInfo },
|
|
{ id:2, verData: championData, name: gameVersionName[1], info: championInfo }
|
|
];
|
|
|
|
//var customItemInfo = { id:999, name:" Custom Levels " };
|
|
var customItemIdx = -1;
|
|
var maxPlayId;
|
|
|
|
var gameVersionMenuList = [
|
|
{ activeItem: 0 } //game version menu ID
|
|
];
|
|
|
|
function getCustomItemInfo(withLevel)
|
|
{
|
|
var customItemName = " Custom Levels ";
|
|
if(withLevel) {
|
|
if (editLevels == 1) {
|
|
return customItemName + "(1 Level)";
|
|
} else if(editLevels > 1) {
|
|
return customItemName + "(" + editLevels + " Levels)";
|
|
}
|
|
}
|
|
return customItemName;
|
|
}
|
|
|
|
function initMenuVariable()
|
|
{
|
|
maxPlayId = 0;
|
|
|
|
for(var i = 0; i < playVersionInfo.length; i++) {
|
|
//ex: { name: "Classic Lode Runner (150 Levels) ", activeFun: subGameMenu },
|
|
gameVersionMenuList.push(
|
|
{ name: playVersionInfo[i].name + " (" + playVersionInfo[i].verData.length + " Levels) ",
|
|
activeFun: subGameMenu
|
|
}
|
|
);
|
|
if(maxPlayId < playVersionInfo[i].id) maxPlayId = playVersionInfo[i].id;
|
|
}
|
|
var customItemName = getCustomItemInfo(1);
|
|
gameVersionMenuList.push({name: customItemName, activeFun: subEditMenu});
|
|
customItemIdx = gameVersionMenuList.length-1;
|
|
}
|
|
|
|
function getPlayVerData(id)
|
|
{
|
|
for(var i = 0; i < playVersionInfo.length; i++) {
|
|
if(playVersionInfo[i].id == id) return playVersionInfo[i].verData;
|
|
}
|
|
|
|
error("Error: versionData can not find, id = " + id );
|
|
return playVersionInfo[0].verData;
|
|
}
|
|
|
|
function getPlayVerInfo(id)
|
|
{
|
|
for(var i = 0; i < playVersionInfo.length; i++) {
|
|
if(playVersionInfo[i].id == id) return playVersionInfo[i].info;
|
|
}
|
|
|
|
error("Error: version info can not find, id = " + id );
|
|
return playVersionInfo[0].info;
|
|
}
|
|
|
|
function defaultLevelData()
|
|
{
|
|
return playVersionInfo[0].verData;
|
|
}
|
|
|
|
function menuIdToPlayData(menuId)
|
|
{
|
|
if(menuId == playVersionInfo.length) return PLAY_DATA_USERDEF; //user created
|
|
else if (menuId < playVersionInfo.length) return playVersionInfo[menuId].id;
|
|
|
|
error("design error, menuId =" + menuId );
|
|
|
|
return playVersionInfo[0].id;
|
|
}
|
|
|
|
var playDataNameUserDef = "Custom Levels";
|
|
function playDataToTitleName(verId)
|
|
{
|
|
if(verId == PLAY_DATA_USERDEF) return playDataNameUserDef;
|
|
|
|
for(var i = 0; i < playVersionInfo.length; i++) {
|
|
if(playVersionInfo[i].id == verId) return playVersionInfo[i].name;
|
|
}
|
|
|
|
error("design error, id =" + verId );
|
|
return "Unknown";
|
|
}
|
|
|
|
function mainMenu(callbackFun)
|
|
{
|
|
gameVersionMenuList[customItemIdx].name = getCustomItemInfo(1);
|
|
menuDialog(" Select Game Version ", gameVersionMenuList, mainStage, tileScale, 0, mainMenuClose, callbackFun);
|
|
}
|
|
|
|
function gameVersionMenu(id, callbackFun)
|
|
{
|
|
gameVersionMenuList[customItemIdx].name = getCustomItemInfo(1);
|
|
menuDialog(" Select Game Version ", gameVersionMenuList, mainStage, tileScale, 1, mainMenuClose, callbackFun);
|
|
}
|
|
|
|
//set main menu id from playData
|
|
function playData2GameVersionMenuId()
|
|
{
|
|
if(playData == PLAY_DATA_USERDEF) {
|
|
gameVersionMenuList[0].activeItem = playVersionInfo.length;
|
|
return gameVersionMenuList[0].activeItem;
|
|
} else {
|
|
for(var i = 0; i < playVersionInfo.length; i++) {
|
|
if(playVersionInfo[i].id == playData) {
|
|
gameVersionMenuList[0].activeItem = i;
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
error("design error, value =" + playData );
|
|
gameVersionMenuList[0].activeItem = 0;
|
|
return 0;
|
|
}
|
|
|
|
//=========================================
|
|
// Add menu item if the item is not exist
|
|
//=========================================
|
|
function addMenuItem(menuList, addItemObj, addPosition)
|
|
{
|
|
if(addPosition >= 0) {
|
|
menuList.splice(addPosition, 0, addItemObj); //add item to position
|
|
} else {
|
|
menuList.push(addItemObj); //append
|
|
}
|
|
}
|
|
|
|
function gameMenu(callbackFun)
|
|
{
|
|
var titleName;
|
|
|
|
var demoItemObj = { name: " Demo Mode ", activeFun: demoPlay };
|
|
var editPlayItemObj = { name: " Play Mode ", activeFun: editPlay };
|
|
var editBackupItemObj = { name: " Backup ", activeFun: backupDialog };
|
|
var editRestoreItemObj = { name: " Restore ", activeFun: restoreDialog };
|
|
|
|
var gameMenuList = [
|
|
{ activeItem: 0 },
|
|
{ name: " Challenge Mode ", activeFun: classicPlay },
|
|
{ name: " Training Mode ", activeFun: modernPlay },
|
|
// { name: " Demo Mode ", activeFun: demoPlay },
|
|
{ name: " Change Game Version ", activeFun: gameVersionMenu }
|
|
];
|
|
|
|
var editMenuList = [
|
|
{ activeItem: 0 }, //[0]
|
|
{ name: " Edit Mode", activeFun: editEdit }, //[1]
|
|
// { name: " Play ", activeFun: editPlay },
|
|
{ name: " Change Game Version ", activeFun: gameVersionMenu } //[2]
|
|
];
|
|
|
|
switch(true) {
|
|
case (gameVersionMenuList[0].activeItem == playVersionInfo.length):
|
|
titleName = getCustomItemInfo(0);
|
|
if(playMode == PLAY_EDIT || playMode == PLAY_TEST) {
|
|
editMenuList[0].activeItem = 0; //edit.edit
|
|
} else
|
|
editMenuList[0].activeItem = 1; // edit.play
|
|
|
|
addMenuItem(editMenuList, editRestoreItemObj, 2);
|
|
|
|
if(editLevels > 0) {
|
|
addMenuItem(editMenuList, editBackupItemObj, 2);
|
|
addMenuItem(editMenuList, editPlayItemObj, 2);
|
|
}
|
|
menuDialog(titleName, editMenuList, mainStage, tileScale, 1, mainMenuClose, callbackFun);
|
|
return;
|
|
case (gameVersionMenuList[0].activeItem < playVersionInfo.length):
|
|
titleName = playVersionInfo[gameVersionMenuList[0].activeItem].name;
|
|
if(playerDemoData.length > 0) addMenuItem(gameMenuList, demoItemObj, 3);
|
|
break
|
|
default:
|
|
error("design error, value =" + gameVersionMenuList[0].activeItem );
|
|
return;
|
|
}
|
|
|
|
//set active menu id for play mode
|
|
switch(playMode) {
|
|
case PLAY_CLASSIC:
|
|
gameMenuList[0].activeItem = 0;
|
|
break;
|
|
case PLAY_MODERN:
|
|
case PLAY_DEMO_ONCE:
|
|
gameMenuList[0].activeItem = 1;
|
|
break;
|
|
case PLAY_DEMO:
|
|
gameMenuList[0].activeItem = 2;
|
|
break;
|
|
}
|
|
|
|
menuDialog(" " + titleName + " ", gameMenuList, mainStage, tileScale, 1, mainMenuClose, callbackFun);
|
|
return;
|
|
}
|
|
|
|
function subGameMenu(id, callbackFun)
|
|
{
|
|
gameVersionMenuList[0].activeItem = id;
|
|
|
|
playData = menuIdToPlayData(gameVersionMenuList[0].activeItem);
|
|
|
|
//================================================
|
|
// get demo data for current playData from server
|
|
//------------------------------------------------
|
|
if(demoPlayData != playData) initDemoData();
|
|
//================================================
|
|
|
|
classicPlay(id, callbackFun); //set as classic mode
|
|
}
|
|
|
|
function subEditMenu(id, callbackFun)
|
|
{
|
|
gameVersionMenuList[0].activeItem = id;
|
|
//menuDialog(" Your Own Levels ", editMenuList, mainStage, tileScale, 1, mainMenu, callbackFun);
|
|
editEdit(id, callbackFun); //set as edit mode
|
|
}
|
|
|
|
function classicPlay(id, callbackFun)
|
|
{
|
|
if(callbackFun != null) callbackFun();
|
|
if(playMode == PLAY_EDIT) canvasReSize();
|
|
playMode = PLAY_CLASSIC;
|
|
|
|
soundStop(soundDig);
|
|
soundStop(soundFall);
|
|
disableStageClickEvent();
|
|
document.onkeydown = handleKeyDown;
|
|
setLastPlayMode();
|
|
selectIconObj.disable(1);
|
|
demoIconObj.disable(1);
|
|
pasteIconObj.disable();
|
|
initShowDataMsg();
|
|
startGame();
|
|
}
|
|
|
|
function modernPlay(id, callbackFun)
|
|
{
|
|
if(callbackFun != null) callbackFun();
|
|
if(playMode == PLAY_EDIT) canvasReSize();
|
|
playMode = PLAY_MODERN;
|
|
|
|
soundStop(soundDig);
|
|
soundStop(soundFall);
|
|
disableStageClickEvent();
|
|
document.onkeydown = handleKeyDown;
|
|
pasteIconObj.disable();
|
|
setLastPlayMode();
|
|
initShowDataMsg();
|
|
startGame();
|
|
}
|
|
|
|
function demoPlay(id, callbackFun)
|
|
{
|
|
if(callbackFun != null) callbackFun();
|
|
if(playMode == PLAY_EDIT) canvasReSize();
|
|
|
|
playMode = PLAY_DEMO;
|
|
|
|
soundStop(soundDig);
|
|
soundStop(soundFall);
|
|
demoSoundOff = 1; //always sound off when start demo
|
|
anyKeyStopDemo();
|
|
initShowDataMsg();
|
|
demoIconObj.disable(1);
|
|
pasteIconObj.disable();
|
|
startGame();
|
|
}
|
|
|
|
function editPlay(id, callbackFun)
|
|
{
|
|
if(callbackFun != null) callbackFun();
|
|
if(playMode == PLAY_EDIT) canvasReSize();
|
|
playMode = PLAY_MODERN;
|
|
playData = PLAY_DATA_USERDEF;
|
|
|
|
disableStageClickEvent();
|
|
document.onkeydown = handleKeyDown;
|
|
setLastPlayMode();
|
|
//selectIconObj.disable(1);
|
|
demoIconObj.disable(1);
|
|
pasteIconObj.disable();
|
|
if (id < 0) { //id < 0 ==> means call from restore custom levels
|
|
initShowDataMsg(0); //no tips message
|
|
setTimeout(function() { showTipsText("RESTORE COMPLETE", 2500);}, 50);
|
|
startGame(1); // no cycle
|
|
} else {
|
|
initShowDataMsg();
|
|
startGame();
|
|
}
|
|
}
|
|
|
|
function editEdit(id, callbackFun)
|
|
{
|
|
if(callbackFun != null) callbackFun();
|
|
disableStageClickEvent();
|
|
demoIconObj.disable(1);
|
|
pasteIconObj.disable();
|
|
if (id < 0) { //id < 0 ==> means call from restore custom levels
|
|
initShowDataMsg(0);
|
|
setTimeout(function() { showTipsText("RESTORE COMPLETE", 2500);}, 50);
|
|
} else {
|
|
initShowDataMsg();
|
|
}
|
|
startEditMode();
|
|
}
|
|
|
|
function helpMenu(callbackFun)
|
|
{
|
|
var id = 0;
|
|
if(playMode == PLAY_EDIT) id = 1;
|
|
|
|
if(playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) {
|
|
infoObj.showInfo(demoHelp, callbackFun, null);
|
|
} else {
|
|
helpObj.showHelp(id, callbackFun, tileScale, null);
|
|
}
|
|
}
|
|
|
|
function activeSelectMenu(activeFun, postFun)
|
|
{
|
|
if(playMode == PLAY_EDIT) {
|
|
var editLevel = testLevelInfo.level> editLevels?0:testLevelInfo.level;
|
|
|
|
selectDialog(playDataNameUserDef, checkBitmap, editLevelData, editLevel, screenX1, screenY1,
|
|
mainStage, tileScale, activeFun, editSelectMenuClose, postFun)
|
|
} else {
|
|
|
|
var titleName = playDataToTitleName(playData);
|
|
|
|
if(playMode == PLAY_DEMO) titleName = "DEMO: " + titleName;
|
|
|
|
selectDialog(titleName, checkBitmap, levelData, curLevel, screenX1, screenY1,
|
|
mainStage, tileScale, activeFun, null, postFun)
|
|
}
|
|
}
|
|
|
|
// if _level < 0 means "share level" pass dialog
|
|
function levelPassDialog(_level, _getGold, _guardDead, _time, _hiScore,
|
|
_button1Bitmap, _button2Bitmap, _button3Bitmap,
|
|
_stage, _scale, _callBack)
|
|
{
|
|
var TITLE_TEXT_SIZE = 48 * _scale;
|
|
var ITEM_TEXT_SIZE = 40 * _scale;
|
|
var GOLD_X = 32 * _scale;
|
|
|
|
var TITLE_TEXT_COLOR = "white";
|
|
var TITLE_SHADOW_COLOR = "yellow";
|
|
|
|
var ITEM_TEXT_COLOR = "white";
|
|
var TIME_NAME_COLOR = "#fad292";
|
|
var SCORE_NAME_COLOR = TIME_NAME_COLOR;
|
|
var HISCORE_NAME_COLOR = TIME_NAME_COLOR;
|
|
|
|
var TEXT_GAP_Y = ITEM_TEXT_SIZE * 2/3 | 0;
|
|
|
|
var COVER_BACKGROUND_COLOR = "black";
|
|
|
|
var BACKGROUND_BORDER_COLOR = "white"
|
|
var BACKGROUND_COLOR = "#5b0680";
|
|
var BACKGROUND_SHADOW = "gold";
|
|
var BACKGROUND_BORDER_SIZE = 8 * _scale;
|
|
|
|
var BUTTON_BORDER_SIZE = 8 * _scale;
|
|
var BUTTON_ROUND_RADIUD = 2+ 4 * _scale;
|
|
var BUTTON_BORDER_COLOR = "gold";
|
|
var BUTTON_COLOR = "#eeffff"
|
|
var BUTTON_BACKGROUND_COLOR = BACKGROUND_COLOR;
|
|
|
|
var buttonX = _button1Bitmap.getBounds().width * _scale,
|
|
buttonY = _button1Bitmap.getBounds().height * _scale;
|
|
|
|
var titleTextObj, goldTextObj, guardTextObj, timeTextObj;
|
|
var goldObj, guardObj, timeNameObj;
|
|
var scoreNameObj, scoreTextObj,
|
|
hiScoreNameObj, hiScoreTextObj;
|
|
|
|
var coverBackgroundObj, background1Obj, background2Obj, menuButtonObj;
|
|
var screenX1 = _stage.canvas.width;
|
|
var screenY1 = _stage.canvas.height;
|
|
|
|
var menuX, menuY, startX, startY
|
|
var timeNameX, maxTextSize;
|
|
var menuButton = [];
|
|
var bitmap = [ _button1Bitmap, _button2Bitmap, _button3Bitmap ];
|
|
|
|
var centerX, xOffset, yOffset;
|
|
|
|
var levelScore = 0, goldPoint = 0, guardPoint = 0, timePoint = MAX_TIME_COUNT;
|
|
var countTime = 85, onePointValue = 100, countAddValue = 47;
|
|
|
|
init();
|
|
|
|
function init()
|
|
{
|
|
initContent();
|
|
coverParentStage();
|
|
creatBackground();
|
|
createContent();
|
|
_stage.enableMouseOver(120);
|
|
_stage.update();
|
|
setTimeout(function() { goldScoreCounting(1);}, 200);
|
|
}
|
|
|
|
function initContent()
|
|
{
|
|
titleTextObj = new createjs.Text("LEVEL " + ("00"+_level).slice(-3),
|
|
"bold "+TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR);
|
|
titleTextObj.shadow = new createjs.Shadow(TITLE_SHADOW_COLOR, 0, 0, 10 );
|
|
|
|
goldTextObj = new createjs.Text("000", ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR);
|
|
|
|
guardTextObj = new createjs.Text("000", ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR);
|
|
|
|
timeTextObj = new createjs.Text(("00"+MAX_TIME_COUNT).slice(-3), ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR);
|
|
|
|
timeNameObj = new createjs.Text("TIME", "bold " + ITEM_TEXT_SIZE + "px Helvetica", TIME_NAME_COLOR);
|
|
|
|
scoreNameObj = new createjs.Text("SCORE", "bold " + ITEM_TEXT_SIZE + "px Helvetica", SCORE_NAME_COLOR);
|
|
scoreTextObj = new createjs.Text("000000", ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR);
|
|
|
|
hiScoreNameObj = new createjs.Text("HI-SCORE", "bold " + ITEM_TEXT_SIZE + "px Helvetica", HISCORE_NAME_COLOR);
|
|
hiScoreTextObj = new createjs.Text( ("00000"+_hiScore).slice(-6),
|
|
ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR);
|
|
|
|
timeNameX = timeNameObj.getBounds().width;
|
|
maxTextSize = hiScoreNameObj.getBounds().width + hiScoreTextObj.getBounds().width;
|
|
menuX = maxTextSize + TITLE_TEXT_SIZE * 5;
|
|
menuY = TITLE_TEXT_SIZE * 2 + (ITEM_TEXT_SIZE+TEXT_GAP_Y) * 5 + buttonY*3;
|
|
|
|
startX = (screenX1-menuX)/2|0;
|
|
startY = (screenY1-menuY)/2|0;
|
|
}
|
|
|
|
function coverParentStage()
|
|
{
|
|
coverBackgroundObj = new createjs.Shape();
|
|
coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, screenX1, screenY1).endFill();
|
|
coverBackgroundObj.alpha = 0.6;
|
|
_stage.addChild(coverBackgroundObj);
|
|
}
|
|
|
|
function creatBackground()
|
|
{
|
|
background1Obj = new createjs.Shape();
|
|
background1Obj.graphics.beginFill(BACKGROUND_BORDER_COLOR)
|
|
.drawRoundRect(startX, startY, menuX, menuY, 8*_scale).endFill();
|
|
background1Obj.shadow = new createjs.Shadow(BACKGROUND_SHADOW, 3, 3, 5 );
|
|
|
|
background2Obj = new createjs.Shape();
|
|
background2Obj.graphics.beginFill(BACKGROUND_COLOR)
|
|
.drawRoundRect(startX+BACKGROUND_BORDER_SIZE, startY+BACKGROUND_BORDER_SIZE,
|
|
menuX-BACKGROUND_BORDER_SIZE*2, menuY-BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill();
|
|
_stage.addChild(background1Obj, background2Obj);
|
|
}
|
|
|
|
function createContent()
|
|
{
|
|
titleTextObj.x = startX + (menuX - titleTextObj.getBounds().width)/2|0;
|
|
titleTextObj.y = startY + TITLE_TEXT_SIZE;
|
|
_stage.addChild(titleTextObj);
|
|
|
|
var centerGap = 8*_scale;
|
|
|
|
centerX = startX+ menuX/2|0;
|
|
xOffset = centerX;
|
|
yOffset = startY+TITLE_TEXT_SIZE*3;
|
|
|
|
goldObj = drawText(xOffset, yOffset-TEXT_GAP_Y/3, "@", _stage); //@: gold
|
|
var xOffset = centerX - GOLD_X - centerGap;
|
|
goldObj[0].x = xOffset;
|
|
goldObj[0].alpha = 0;
|
|
|
|
goldTextObj.x = centerX + centerGap;
|
|
goldTextObj.y = yOffset;
|
|
goldTextObj.alpha = 0;
|
|
_stage.addChild(goldTextObj);
|
|
|
|
yOffset += (ITEM_TEXT_SIZE + TEXT_GAP_Y);
|
|
guardObj = drawText(xOffset, yOffset-TEXT_GAP_Y/3, "#", _stage); //#: trap (陷井)
|
|
guardObj[0].alpha = 0;
|
|
|
|
guardTextObj.x =centerX + centerGap;
|
|
guardTextObj.y = yOffset;
|
|
guardTextObj.alpha = 0;
|
|
_stage.addChild(guardTextObj);
|
|
|
|
var xOffset = centerX - timeNameX - centerGap;
|
|
yOffset += (ITEM_TEXT_SIZE + TEXT_GAP_Y);
|
|
timeNameObj.x = xOffset;
|
|
timeNameObj.y = yOffset;
|
|
timeNameObj.alpha = 0;
|
|
|
|
timeTextObj.x = centerX + centerGap;
|
|
timeTextObj.y = yOffset;
|
|
timeTextObj.alpha = 0;
|
|
_stage.addChild(timeNameObj, timeTextObj);
|
|
|
|
xOffset = centerX - scoreNameObj.getBounds().width - centerGap;
|
|
yOffset += (ITEM_TEXT_SIZE + TEXT_GAP_Y);
|
|
scoreNameObj.x = xOffset;
|
|
scoreNameObj.y = yOffset;
|
|
scoreTextObj.x = centerX + centerGap;
|
|
scoreTextObj.y = yOffset;
|
|
_stage.addChild(scoreNameObj, scoreTextObj);
|
|
|
|
xOffset = centerX - hiScoreNameObj.getBounds().width - centerGap;
|
|
yOffset += (ITEM_TEXT_SIZE+ TEXT_GAP_Y/3);
|
|
hiScoreNameObj.x = xOffset;
|
|
hiScoreNameObj.y = yOffset;
|
|
hiScoreTextObj.x = centerX + centerGap;
|
|
hiScoreTextObj.y = yOffset;
|
|
_stage.addChild(hiScoreNameObj, hiScoreTextObj);
|
|
|
|
yOffset += (ITEM_TEXT_SIZE + buttonY); //yOffset for menu button
|
|
}
|
|
|
|
function updateHiScore()
|
|
{
|
|
if(_hiScore < levelScore) {
|
|
hiScoreTextObj.text = ("00000" + (levelScore)).slice(-6);
|
|
hiScoreTextObj.color = "gold";
|
|
}
|
|
}
|
|
|
|
function goldScoreCounting(firstTime)
|
|
{
|
|
var endCount = 0;
|
|
if(firstTime) {
|
|
goldObj[0].alpha = 1;
|
|
goldTextObj.alpha = 1;
|
|
soundPlay("scoreBell");
|
|
if(_getGold <= 0) {
|
|
endCount = 1;
|
|
} else {
|
|
setTimeout(function() { goldScoreCounting(0); }, countTime );
|
|
}
|
|
} else {
|
|
var addCount = countAddValue, endCount = 0;
|
|
if(goldPoint + addCount >= _getGold) {
|
|
endCount = 1;
|
|
addCount = _getGold - goldPoint;
|
|
}
|
|
soundPlay("scoreCount");
|
|
goldPoint += addCount;
|
|
levelScore += (addCount * onePointValue);
|
|
goldTextObj.text = ("00" + (goldPoint)).slice(-3);
|
|
scoreTextObj.text = ("00000" + (levelScore)).slice(-6);
|
|
updateHiScore();
|
|
|
|
if(!endCount) {
|
|
setTimeout(function() { goldScoreCounting(0); }, countTime );
|
|
}
|
|
}
|
|
|
|
if(endCount) {
|
|
setTimeout(function() { guardScoreCounting(1); }, countTime*4);
|
|
}
|
|
_stage.update();
|
|
}
|
|
|
|
function guardScoreCounting(firstTime)
|
|
{
|
|
var endCount = 0;
|
|
if(firstTime) {
|
|
guardObj[0].alpha = 1;
|
|
guardTextObj.alpha = 1;
|
|
soundPlay("scoreBell");
|
|
if(_guardDead <= 0) {
|
|
endCount = 1;
|
|
} else {
|
|
setTimeout(function() { guardScoreCounting(0); }, countTime );
|
|
}
|
|
} else {
|
|
var addCount = countAddValue, endCount = 0;
|
|
if(guardPoint + addCount >= _guardDead) {
|
|
endCount = 1;
|
|
addCount = _guardDead - guardPoint;
|
|
}
|
|
soundPlay("scoreCount");
|
|
guardPoint += addCount;
|
|
levelScore += (addCount * onePointValue);
|
|
guardTextObj.text = ("00" + (guardPoint)).slice(-3);
|
|
scoreTextObj.text = ("00000" + (levelScore)).slice(-6);
|
|
updateHiScore();
|
|
|
|
if(!endCount) {
|
|
setTimeout(function() { guardScoreCounting(0); }, countTime );
|
|
}
|
|
}
|
|
|
|
if(endCount) {
|
|
setTimeout(function() { timeScoreCounting(1); }, countTime*4 );
|
|
}
|
|
_stage.update();
|
|
}
|
|
|
|
function timeScoreCounting(firstTime)
|
|
{
|
|
var endCount = 0;
|
|
if(firstTime) {
|
|
timeNameObj.alpha = 1;
|
|
timeTextObj.alpha = 1;
|
|
soundPlay("scoreBell");
|
|
if(_time >= MAX_TIME_COUNT) {
|
|
endCount = 1;
|
|
} else {
|
|
setTimeout(function() { timeScoreCounting(0); }, countTime );
|
|
}
|
|
} else {
|
|
var addCount = countAddValue, endCount = 0;
|
|
if(timePoint - addCount <= _time) {
|
|
endCount = 1;
|
|
addCount = timePoint - _time;
|
|
}
|
|
soundPlay("scoreCount");
|
|
timePoint -= addCount;
|
|
levelScore += (addCount * onePointValue);
|
|
timeTextObj.text = ("00" + (timePoint)).slice(-3);
|
|
scoreTextObj.text = ("00000" + (levelScore)).slice(-6);
|
|
updateHiScore();
|
|
|
|
if(!endCount) {
|
|
setTimeout(function() { timeScoreCounting(0); }, countTime );
|
|
}
|
|
}
|
|
|
|
if(endCount) {
|
|
soundPlay("scoreEnding");
|
|
setTimeout(function() { createButton(); }, 100 );
|
|
}
|
|
_stage.update();
|
|
}
|
|
|
|
function createButton()
|
|
{
|
|
var border, button;
|
|
|
|
for(var i = 0; i < 3; i++ ) {
|
|
menuButton[i] = new createjs.Container();
|
|
border = new createjs.Shape();
|
|
button = new createjs.Shape();
|
|
|
|
xOffset = centerX - buttonX*3 + (buttonX *5/2*i)|0;
|
|
|
|
//id = 0
|
|
border.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2,
|
|
buttonX+4*BUTTON_BORDER_SIZE, buttonY+4*BUTTON_BORDER_SIZE,BUTTON_ROUND_RADIUD).endFill();
|
|
//id = 1
|
|
button.graphics.beginFill(BUTTON_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE,
|
|
buttonX+BUTTON_BORDER_SIZE*2, buttonY+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
//id = 2
|
|
bitmap[i].setTransform(0, 0, _scale, _scale);
|
|
|
|
menuButton[i].x = xOffset;
|
|
menuButton[i].y = yOffset;
|
|
menuButton[i].addChild(border, button, bitmap[i]);
|
|
|
|
menuButton[i].on('click', buttonClick);
|
|
menuButton[i].on('mouseover', buttonMouseOver);
|
|
menuButton[i].on('mouseout', buttonMouseOut);
|
|
menuButton[i].myId = i;
|
|
_stage.addChild(menuButton[i]);
|
|
|
|
}
|
|
_stage.update();
|
|
}
|
|
|
|
function buttonClick()
|
|
{
|
|
removeAllObj();
|
|
_stage.cursor = 'default';
|
|
_stage.enableMouseOver(0);
|
|
if(_callBack) _callBack(this.myId);
|
|
//debug(this.myId);
|
|
}
|
|
|
|
function buttonMouseOver()
|
|
{
|
|
var border = this.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BORDER_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2,
|
|
buttonX+BUTTON_BORDER_SIZE*4, buttonY+BUTTON_BORDER_SIZE*4,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
_stage.cursor = 'pointer';
|
|
_stage.update();
|
|
}
|
|
|
|
function buttonMouseOut()
|
|
{
|
|
var border = this.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2,
|
|
buttonX+BUTTON_BORDER_SIZE*4, buttonY+BUTTON_BORDER_SIZE*4,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
_stage.cursor = 'default';
|
|
_stage.update();
|
|
}
|
|
|
|
function removeAllObj()
|
|
{
|
|
_stage.removeChild(coverBackgroundObj, background1Obj, background2Obj, titleTextObj);
|
|
|
|
_stage.removeChild(goldObj[0], goldTextObj);
|
|
_stage.removeChild(guardObj[0], guardTextObj);
|
|
_stage.removeChild(timeNameObj, timeTextObj);
|
|
_stage.removeChild(scoreNameObj, scoreTextObj);
|
|
_stage.removeChild(hiScoreNameObj, hiScoreTextObj);
|
|
|
|
for(var i = 0; i < 3; i++) {
|
|
_stage.removeChild(menuButton[i]);
|
|
}
|
|
_stage.update();
|
|
}
|
|
|
|
}
|
|
|
|
function yesNoDialog(_txtMsg, _yesBitmap, _noBitmap, _stage, _scale, _callBack)
|
|
{
|
|
var TEXT_MSG_SIZE = 48 * _scale;
|
|
var TEXT_GAP_Y = TEXT_MSG_SIZE * 3/4 | 0;
|
|
|
|
var TEXT_MSG_COLOR = "white";
|
|
var TEXT_MSG_SHADOW_COLOR = "yellow";
|
|
|
|
var COVER_BACKGROUND_COLOR = "black";
|
|
|
|
var BACKGROUND_BORDER_COLOR = "white"
|
|
var BACKGROUND_COLOR = "#5b0680";
|
|
var BACKGROUND_SHADOW = "gold";
|
|
var BACKGROUND_BORDER_SIZE = 8 * _scale;
|
|
|
|
var BUTTON_BORDER_SIZE = 8 * _scale;
|
|
var BUTTON_ROUND_RADIUD = 2+ 4 * _scale;
|
|
var BUTTON_BORDER_COLOR = "gold";
|
|
var BUTTON_COLOR = "#eeffff"
|
|
var BUTTON_BACKGROUND_COLOR = BACKGROUND_COLOR;
|
|
|
|
var saveStateObj;
|
|
var textObj;
|
|
|
|
var coverBackgroundObj, background1Obj, background2Obj;
|
|
var screenX1 = _stage.canvas.width;
|
|
var screenY1 = _stage.canvas.height;
|
|
|
|
var buttonX = _yesBitmap.getBounds().width * _scale,
|
|
buttonY = _yesBitmap.getBounds().height * _scale;
|
|
|
|
var menuX, menuY, startX, startY
|
|
var menuButton = [];
|
|
var bitmap = [ _yesBitmap, _noBitmap ];
|
|
|
|
init();
|
|
|
|
function init()
|
|
{
|
|
saveKeyState();
|
|
initTxtMsg();
|
|
coverParentStage();
|
|
creatBackground();
|
|
createTxtMsg();
|
|
createButton();
|
|
|
|
_stage.enableMouseOver(60);
|
|
_stage.update();
|
|
}
|
|
|
|
function saveKeyState()
|
|
{
|
|
saveStateObj = saveKeyHandler(noKeyDown);
|
|
}
|
|
|
|
function restoreKeyState()
|
|
{
|
|
restoreKeyHandler(saveStateObj);
|
|
}
|
|
|
|
function initTxtMsg()
|
|
{
|
|
var maxTextSize = 0, tmpTextSize;
|
|
|
|
textObj = [];
|
|
for(var i = 0; i < _txtMsg.length; i++) {
|
|
textObj[i] = new createjs.Text(_txtMsg[i], "bold " + TEXT_MSG_SIZE + "px Helvetica",TEXT_MSG_COLOR);
|
|
if( i == 0 ) //only first line message has shadow
|
|
textObj[i].shadow = new createjs.Shadow(TEXT_MSG_SHADOW_COLOR, 0, 0, 10 );
|
|
tmpTextSize = textObj[i].getBounds().width;
|
|
if(maxTextSize < tmpTextSize) maxTextSize = tmpTextSize;
|
|
}
|
|
if(maxTextSize < buttonX * 4) maxTextSize = buttonX * 4;
|
|
|
|
menuY = (TEXT_GAP_Y + TEXT_MSG_SIZE) * _txtMsg.length + TEXT_MSG_SIZE * 2 + buttonY;
|
|
menuX = maxTextSize + TEXT_MSG_SIZE * 2;
|
|
|
|
startX = (screenX1-menuX)/2|0;
|
|
startY = (screenY1-menuY)/2|0;
|
|
}
|
|
|
|
function coverParentStage()
|
|
{
|
|
coverBackgroundObj = new createjs.Shape();
|
|
coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, screenX1, screenY1).endFill();
|
|
coverBackgroundObj.alpha = 0.6;
|
|
_stage.addChild(coverBackgroundObj);
|
|
}
|
|
|
|
function creatBackground()
|
|
{
|
|
background1Obj = new createjs.Shape();
|
|
background1Obj.graphics.beginFill(BACKGROUND_BORDER_COLOR)
|
|
.drawRoundRect(startX, startY, menuX, menuY, 8*_scale).endFill();
|
|
background1Obj.shadow = new createjs.Shadow(BACKGROUND_SHADOW, 3, 3, 5 );
|
|
|
|
background2Obj = new createjs.Shape();
|
|
background2Obj.graphics.beginFill(BACKGROUND_COLOR)
|
|
.drawRoundRect(startX+BACKGROUND_BORDER_SIZE, startY+BACKGROUND_BORDER_SIZE,
|
|
menuX-BACKGROUND_BORDER_SIZE*2, menuY-BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill();
|
|
_stage.addChild(background1Obj, background2Obj);
|
|
}
|
|
|
|
function createTxtMsg()
|
|
{
|
|
for(var i = 0; i < textObj.length; i++) {
|
|
textObj[i].x = startX + (menuX - textObj[i].getBounds().width)/2|0
|
|
textObj[i].y = startY + (TEXT_GAP_Y + TEXT_MSG_SIZE) * i + TEXT_GAP_Y;
|
|
_stage.addChild(textObj[i]);
|
|
}
|
|
}
|
|
|
|
function createButton()
|
|
{
|
|
var border, button;
|
|
var centerX = startX+ menuX/2|0;
|
|
|
|
for(var i = 0; i < 2; i++ ) {
|
|
menuButton[i] = new createjs.Container();
|
|
border = new createjs.Shape();
|
|
button = new createjs.Shape();
|
|
|
|
//id = 0
|
|
border.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2,
|
|
buttonX+4*BUTTON_BORDER_SIZE, buttonY+4*BUTTON_BORDER_SIZE,BUTTON_ROUND_RADIUD).endFill();
|
|
//id = 1
|
|
button.graphics.beginFill(BUTTON_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE,
|
|
buttonX+BUTTON_BORDER_SIZE*2, buttonY+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
//id = 2
|
|
bitmap[i].setTransform(0, 0, _scale, _scale);
|
|
|
|
menuButton[i].x = centerX - buttonX*2.5 + (buttonX*4*i);
|
|
menuButton[i].y = textObj[textObj.length-1].y + TEXT_MSG_SIZE*2;
|
|
menuButton[i].addChild(border, button, bitmap[i]);
|
|
|
|
menuButton[i].on('click', buttonClick);
|
|
menuButton[i].on('mouseover', buttonMouseOver);
|
|
menuButton[i].on('mouseout', buttonMouseOut);
|
|
menuButton[i].myId = i;
|
|
_stage.addChild(menuButton[i]);
|
|
|
|
}
|
|
_stage.update();
|
|
}
|
|
|
|
function buttonClick()
|
|
{
|
|
restoreKeyState();
|
|
removeAllObj();
|
|
_stage.cursor = 'default';
|
|
_stage.enableMouseOver(0);
|
|
if(_callBack) _callBack(!this.myId+0);
|
|
//debug(this.myId);
|
|
}
|
|
|
|
function buttonMouseOver()
|
|
{
|
|
var border = this.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BORDER_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2,
|
|
buttonX+BUTTON_BORDER_SIZE*4, buttonY+BUTTON_BORDER_SIZE*4,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
_stage.cursor = 'pointer';
|
|
_stage.update();
|
|
}
|
|
|
|
function buttonMouseOut()
|
|
{
|
|
var border = this.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2,
|
|
buttonX+BUTTON_BORDER_SIZE*4, buttonY+BUTTON_BORDER_SIZE*4,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
_stage.cursor = 'default';
|
|
_stage.update();
|
|
}
|
|
|
|
function removeAllObj()
|
|
{
|
|
_stage.removeChild(coverBackgroundObj, background1Obj, background2Obj);
|
|
|
|
for(var i = 0; i < textObj.length; i++) {
|
|
_stage.removeChild(textObj[i]);
|
|
}
|
|
|
|
for(var i = 0; i < menuButton.length; i++) {
|
|
_stage.removeChild(menuButton[i]);
|
|
}
|
|
|
|
_stage.update();
|
|
}
|
|
}
|
|
|
|
|
|
function backupDialog(id, _callBackFun)
|
|
{
|
|
var _stage = mainStage;
|
|
var _scale = tileScale;
|
|
|
|
var TITLE_TEXT_SIZE = 48 * _scale;
|
|
var MSG_TEXT_SIZE = 40 * _scale;
|
|
var BUTTON_TEXT_SIZE = 40 * _scale;
|
|
|
|
var BUTTON_BORDER_SIZE = 8 * _scale;
|
|
var BUTTON_ROUND_RADIUD = 2+ 4 * _scale;
|
|
|
|
var COVER_BACKGROUND_COLOR = "black";
|
|
|
|
var BUTTON_BACKGROUND_BORDER_COLOR = "white";
|
|
var BUTTON_BACKGROUND_SHADOW = "gold";
|
|
var BUTTON_BACKGROUND_COLOR = "#5b0680"; //"#890ee0";
|
|
var BUTTON_BACKGROUND_BORDER_SIZE = 8 * _scale;;
|
|
|
|
var TITLE_TEXT_COLOR = "white";
|
|
var TITLE_TEXT_SHADOW_COLOR = "gold";
|
|
|
|
var MSG_TEXT_COLOR = "white";
|
|
|
|
var BUTTON_TEXT_COLOR = "white"
|
|
var BUTTON_TEXT_SHADOW_COLOR = "gold";
|
|
|
|
var BUTTON_BORDER0_COLOR = "white"; //"#890ee0";
|
|
var BUTTON_COLOR = "#5d7cff";
|
|
var BUTTON_BORDER1_COLOR = "gold";
|
|
|
|
var CLOSE_ICON_ACTIVE_COLOR = "#ff5050";
|
|
|
|
var MSG_AREA_Y = MSG_TEXT_SIZE * 3/2 | 0;
|
|
var MSG_GAP_Y = MSG_TEXT_SIZE * 2/3 | 0;
|
|
|
|
var coverBackgroundObj;
|
|
var background1Obj, background2Obj;
|
|
var titleTextObj, msgTextObj;
|
|
|
|
var buttonTextObj, buttonObj;
|
|
|
|
var closeIconObj;
|
|
var saveKeyStateObj;
|
|
|
|
var buttonSizeX;
|
|
var menuX, menuY;
|
|
var startX, startY;
|
|
|
|
var screenX1 = _stage.canvas.width;
|
|
var screenY1 = _stage.canvas.height;
|
|
|
|
init();
|
|
|
|
function init()
|
|
{
|
|
saveKeyState();
|
|
coverParentStage();
|
|
initContent();
|
|
creatBackground();
|
|
createContent();
|
|
closeIconObj = new closeIconClass(startX+menuX, startY, _stage, _scale, CLOSE_ICON_ACTIVE_COLOR, closeDialog, null);
|
|
|
|
_stage.enableMouseOver(120);
|
|
_stage.update();
|
|
}
|
|
|
|
function saveKeyState()
|
|
{
|
|
saveKeyStateObj = saveKeyHandler(handleEscKeyDown);
|
|
}
|
|
|
|
function restoreKeyState()
|
|
{
|
|
restoreKeyHandler(saveKeyStateObj);
|
|
}
|
|
|
|
function coverParentStage()
|
|
{
|
|
coverBackgroundObj = new createjs.Shape();
|
|
coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, screenX1, screenY1).endFill();
|
|
coverBackgroundObj.alpha = 0.6;
|
|
_stage.addChild(coverBackgroundObj);
|
|
}
|
|
|
|
function initContent()
|
|
{
|
|
titleTextObj = new createjs.Text(" Backup ", "bold "+TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR);
|
|
titleTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 0, 0, 10 );
|
|
|
|
msgTextObj = new createjs.Text("Back up all custom levels to a file", "bold " + MSG_TEXT_SIZE + "px Helvetica", MSG_TEXT_COLOR);
|
|
|
|
buttonTextObj = new createjs.Text("Backup", "bold " + BUTTON_TEXT_SIZE + "px Helvetica", BUTTON_TEXT_COLOR);
|
|
|
|
buttonSizeX = buttonTextObj.getBounds().width + BUTTON_TEXT_SIZE;
|
|
menuX = msgTextObj.getBounds().width + TITLE_TEXT_SIZE * 2;
|
|
menuY = TITLE_TEXT_SIZE * 2.5 + (MSG_TEXT_SIZE *2) + MSG_GAP_Y * 4|0;
|
|
|
|
startX = (screenX1-menuX)/2|0;
|
|
startY = (screenY1-menuY)/2|0;
|
|
}
|
|
|
|
function creatBackground()
|
|
{
|
|
background1Obj = new createjs.Shape();
|
|
background1Obj.graphics.beginFill(BUTTON_BACKGROUND_BORDER_COLOR)
|
|
.drawRoundRect(startX, startY, menuX, menuY, 8*_scale).endFill();
|
|
background1Obj.shadow = new createjs.Shadow(BUTTON_BACKGROUND_SHADOW, 3, 3, 5 );
|
|
|
|
background2Obj = new createjs.Shape();
|
|
background2Obj.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(startX+BUTTON_BACKGROUND_BORDER_SIZE, startY+BUTTON_BACKGROUND_BORDER_SIZE,
|
|
menuX-BUTTON_BACKGROUND_BORDER_SIZE*2, menuY-BUTTON_BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill();
|
|
_stage.addChild(background1Obj, background2Obj);
|
|
}
|
|
|
|
function createContent()
|
|
{
|
|
titleTextObj.x = startX + (menuX - titleTextObj.getBounds().width)/2|0;
|
|
titleTextObj.y = startY + TITLE_TEXT_SIZE*3/4;
|
|
_stage.addChild(titleTextObj);
|
|
|
|
var yOffset = (TITLE_TEXT_SIZE*2.2)|0;
|
|
|
|
msgTextObj.x = startX + (menuX - msgTextObj.getBounds().width)/2|0;
|
|
msgTextObj.y = startY + yOffset;
|
|
_stage.addChild(msgTextObj);
|
|
|
|
buttonObj = new createjs.Container();
|
|
|
|
//child id = 0
|
|
var border = new createjs.Shape();
|
|
border.graphics.beginFill(BUTTON_BORDER0_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE/2, -BUTTON_BORDER_SIZE/2, buttonSizeX+BUTTON_BORDER_SIZE, MSG_AREA_Y+BUTTON_BORDER_SIZE ,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
//child id = 1
|
|
var button = new createjs.Shape();
|
|
button.graphics.beginFill(BUTTON_COLOR).drawRoundRect(0, 0, buttonSizeX, MSG_AREA_Y,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
//child id = 2
|
|
buttonTextObj.textAlign = "center";
|
|
buttonTextObj.x = buttonSizeX/2|0;
|
|
buttonTextObj.y = (MSG_AREA_Y - msgTextObj.getBounds().height)/2|0;
|
|
|
|
yOffset += (MSG_GAP_Y*2 + TITLE_TEXT_SIZE/2)|0;
|
|
buttonObj.addChild(border, button, buttonTextObj);
|
|
buttonObj.x = startX + (menuX - buttonSizeX)/2|0;
|
|
buttonObj.y = startY+ yOffset;
|
|
|
|
buttonObj.on('click', buttonClick);
|
|
buttonObj.on('mouseover', buttonMouseOver);
|
|
buttonObj.on('mouseout', buttonMouseOut);
|
|
_stage.addChild(buttonObj);
|
|
}
|
|
|
|
function buttonClick()
|
|
{
|
|
var downloadfileName = downloadCustomLevelData();
|
|
restoreKeyState();
|
|
removeAllObj();
|
|
_stage.cursor = 'default';
|
|
_stage.enableMouseOver(0);
|
|
if(_callBackFun) _callBackFun();
|
|
|
|
setTimeout(function() { showTipsText("BACKUP IS COMPLETE", 2500);}, 50);
|
|
}
|
|
|
|
function removeAllObj()
|
|
{
|
|
_stage.removeChild(coverBackgroundObj, background1Obj, background2Obj);
|
|
_stage.removeChild(titleTextObj, msgTextObj, buttonObj);
|
|
_stage.removeChild(closeIconObj);
|
|
_stage.update();
|
|
}
|
|
|
|
function buttonMouseOver()
|
|
{
|
|
var border = buttonObj.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BORDER1_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, buttonSizeX+BUTTON_BORDER_SIZE*2, MSG_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
buttonTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 2, 2, 10 );
|
|
_stage.cursor = 'pointer';
|
|
_stage.update();
|
|
}
|
|
|
|
function buttonMouseOut()
|
|
{
|
|
var border = buttonObj.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BORDER0_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE/2, -BUTTON_BORDER_SIZE/2, buttonSizeX+BUTTON_BORDER_SIZE, MSG_AREA_Y+BUTTON_BORDER_SIZE, BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
buttonTextObj.shadow = null;
|
|
_stage.cursor = 'default';
|
|
_stage.update();
|
|
}
|
|
|
|
function closeDialog()
|
|
{
|
|
restoreKeyState();
|
|
removeAllObj();
|
|
_stage.cursor = 'default';
|
|
_stage.enableMouseOver(0);
|
|
if(_callBackFun) _callBackFun();
|
|
}
|
|
|
|
function getBackupFileName(d)
|
|
{
|
|
//var d = new Date();
|
|
|
|
//LR-05.10.21.141804.lrwg
|
|
return 'LR'+ ('0'+(d.getMonth()+1)).slice(-2) + ('0'+d.getDate()).slice(-2) + ('0'+d.getFullYear()).slice(-2) + '-'+ ('0'+d.getHours()).slice(-2) + ('0'+d.getMinutes()).slice(-2) + ('0'+d.getSeconds()).slice(-2) + '-' + ('00'+editLevels).slice(-3) + '.lrwg';
|
|
}
|
|
|
|
function downloadCustomLevelData()
|
|
{
|
|
var date = new Date();
|
|
var fileName = getBackupFileName(date);
|
|
|
|
download(fileName, backupCustomLevelData(date));
|
|
|
|
return fileName;
|
|
|
|
function download(filename, text) {
|
|
//reference: https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server
|
|
var element = document.createElement('a');
|
|
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
|
|
element.setAttribute('download', filename);
|
|
|
|
element.style.display = 'none';
|
|
document.body.appendChild(element);
|
|
|
|
element.click();
|
|
|
|
document.body.removeChild(element);
|
|
}
|
|
|
|
}
|
|
|
|
function handleEscKeyDown(event)
|
|
{
|
|
if(!event){ event = window.event; } //cross browser issues exist
|
|
|
|
if(event.shiftKey || event.ctrlKey) return false;
|
|
|
|
switch(event.key) {
|
|
case "Escape":
|
|
closeDialog();
|
|
break;
|
|
default:
|
|
//debug("keycode = " + code);
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
}
|
|
|
|
function restoreDialog(id, _callBackFun)
|
|
{
|
|
//LODE RUNNER WEB GAME.Wed May 12 2021 19:04:16 GMT+0800 (台北標準時間).PLAYER.XXXXX\n
|
|
|
|
var _scale = tileScale;
|
|
|
|
var MAX_DISPLAY_FILENAME_LEN = 26;
|
|
|
|
var TITLE_TEXT_SIZE = 48 * _scale;
|
|
var MSG_TEXT_SIZE = 40 * _scale;
|
|
var BUTTON_TEXT_SIZE = 40 * _scale;
|
|
var FILEINFO_TEXT_SIZE = 36 * _scale;
|
|
var MAPNO_TEXT_SIZE = 20 * _scale;
|
|
var TOTALLEVEL_TEXT_SIZE = 28 * _scale;
|
|
|
|
var BUTTON_BORDER_SIZE = 8 * _scale;
|
|
var BUTTON_ROUND_RADIUD = 2+ 4 * _scale;
|
|
|
|
var COVER_BACKGROUND_COLOR = "black";
|
|
|
|
var BUTTON_BACKGROUND_BORDER_COLOR = "white";
|
|
var BUTTON_BACKGROUND_SHADOW = "gold";
|
|
var BUTTON_BACKGROUND_COLOR = "#5b0680"; //"#890ee0";
|
|
var BUTTON_BACKGROUND_BORDER_SIZE = 8 * _scale;
|
|
|
|
var PREVIEWMAP_BUTTON_COLOR = "white";
|
|
var PREVIEWMAP_BUTTON_BORDER_SIZE = 4 * _scale;
|
|
var PREVIEWMAP_BUTTON_GRAY_ALPHA = 0.2;
|
|
|
|
var TITLE_TEXT_COLOR = "white";
|
|
var TITLE_TEXT_SHADOW_COLOR = "gold";
|
|
|
|
var MSG_TEXT_COLOR = "white";
|
|
|
|
var WRONG_TEXT_COLOR = "#f54B42";
|
|
var WRONG_TEXT_OUTLINE_COLOR = "#FFFFB0";
|
|
var WRONG_TEXT_SHADOW_COLOR = "#404040";
|
|
|
|
var BUTTON_TEXT_COLOR = "white"
|
|
var BUTTON_TEXT_SHADOW_COLOR = "gold";
|
|
|
|
var BUTTON_BORDER0_COLOR = "white";
|
|
var BUTTON_COLOR = "#5d7cff";
|
|
var BUTTON_BORDER1_COLOR = "gold";
|
|
|
|
var OPENBUTTON_BACKGROUND_COLOR = BUTTON_BACKGROUND_COLOR,
|
|
OPENBUTTON_COLOR = "#FFFFFF",
|
|
OPENBUTTON_BORDER_COLOR = "gold";
|
|
|
|
var OPENBUTTON_BORDER_SIZE = 8 * _scale,
|
|
OPENBUTTON_ROUND_RADIUD = 2+ 4 * _scale;
|
|
|
|
var FILEINFO_TEXT_COLOR = "#EEEEEE";
|
|
|
|
var CLOSE_ICON_ACTIVE_COLOR = "#ff5050";
|
|
|
|
var MSG_AREA_Y = MSG_TEXT_SIZE * 3/2 | 0;
|
|
var MSG_GAP_Y = MSG_TEXT_SIZE * 2/3 | 0;
|
|
|
|
var PREVIEW_MAP_SCALE = tileScale * 0.13;
|
|
var previewMapX = NO_OF_TILES_X*BASE_TILE_X*PREVIEW_MAP_SCALE,
|
|
previewMapY = NO_OF_TILES_Y*BASE_TILE_Y*PREVIEW_MAP_SCALE;
|
|
var previewMapGapX = 16*tileScale,
|
|
previewMapPerLine = 5;
|
|
|
|
var coverBackgroundObj;
|
|
|
|
var restoreCanvas;
|
|
var dialogStage;
|
|
|
|
var background1Obj, background2Obj;
|
|
var titleTextObj, msgTextObj;
|
|
var fileTextObj, fileNameTextObj, fileNameBackgroundObj;
|
|
var openFolderButtonObj;
|
|
var wrongText1Obj, wrongText2Obj;
|
|
var fileInfoTextObj;
|
|
var buttonTextObj, buttonObj;
|
|
var fileNameObj = null;
|
|
|
|
var closeIconObj;
|
|
var saveKeyStateObj;
|
|
|
|
var maxFileNameSize, totalFileNameSizeX, totalPreviewMapSizeX;
|
|
var previewNoYOffset, previewMapYOffset;
|
|
|
|
var buttonSizeX;
|
|
var menuX, menuY;
|
|
var fileNameX, fileNameY;
|
|
var wrongMsgEnable = 0;
|
|
|
|
var openFolderButtonScale = 0.9;
|
|
var openFolderButtonX = openFolderBitmap.getBounds().width * tileScale * openFolderButtonScale,
|
|
openFolderButtonY = openFolderBitmap.getBounds().height * tileScale * openFolderButtonScale;
|
|
|
|
var nextButtonX = nextBitmap.getBounds().width * tileScale,
|
|
nextButtonY = nextBitmap.getBounds().height * tileScale;
|
|
|
|
var inputFileElement = null;
|
|
|
|
var tmpCustomLevels;
|
|
var levelMapNoObj = levelMapObjs = [];
|
|
var totalLevelTextObj = null;
|
|
var nextMapButtonObj, prevMapButtonObj;
|
|
var previewvMapFirst = previewMapLast = -1;
|
|
|
|
init();
|
|
|
|
function init()
|
|
{
|
|
saveKeyState();
|
|
coverParentStage();
|
|
createInputFileElement();
|
|
initContent();
|
|
createCanvas();
|
|
createDialogStage();
|
|
|
|
creatBackground();
|
|
createContent();
|
|
closeIconObj = new closeIconClass(menuX, 0, dialogStage, _scale, CLOSE_ICON_ACTIVE_COLOR, closeDialog, null);
|
|
}
|
|
|
|
function saveKeyState()
|
|
{
|
|
saveKeyStateObj = saveKeyHandler(handleEscKeyDown);
|
|
}
|
|
|
|
function restoreKeyState()
|
|
{
|
|
restoreKeyHandler(saveKeyStateObj);
|
|
}
|
|
|
|
function coverParentStage()
|
|
{
|
|
coverBackgroundObj = new createjs.Shape();
|
|
coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, mainStage.canvas.width, mainStage.canvas.height).endFill();
|
|
coverBackgroundObj.alpha = 0.6;
|
|
mainStage.addChild(coverBackgroundObj); // mainStage
|
|
mainStage.update();
|
|
}
|
|
|
|
function createInputFileElement()
|
|
{
|
|
inputFileElement = document.createElement('input');
|
|
inputFileElement.type = 'file';
|
|
inputFileElement.accept = '.lrwg';
|
|
inputFileElement.style.display = 'none';
|
|
document.body.appendChild(inputFileElement);
|
|
inputFileElement.addEventListener('change', readRestoreFile);
|
|
}
|
|
|
|
function initContent()
|
|
{
|
|
titleTextObj = new createjs.Text("Restore", "bold "+TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR);
|
|
titleTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 0, 0, 10 );
|
|
|
|
msgTextObj = new createjs.Text("Restore custom levels from backup files", "bold " + MSG_TEXT_SIZE + "px Helvetica", MSG_TEXT_COLOR);
|
|
|
|
fileTextObj = new createjs.Text("File:", "bold " + MSG_TEXT_SIZE + "px Helvetica", MSG_TEXT_COLOR);
|
|
|
|
wrongText1Obj = new createjs.Text("Wrong file format !", "bold " + MSG_TEXT_SIZE + "px Helvetica", WRONG_TEXT_OUTLINE_COLOR);
|
|
wrongText1Obj.outline = _scale;
|
|
wrongText2Obj = new createjs.Text("Wrong file format !", "bold " + MSG_TEXT_SIZE + "px Helvetica", WRONG_TEXT_COLOR);
|
|
wrongText2Obj.shadow = new createjs.Shadow(WRONG_TEXT_SHADOW_COLOR, _scale, _scale*2, 1);
|
|
|
|
//get maximun file name text size (width)
|
|
var tmpObj = new createjs.Text("X", "bold "+ MSG_TEXT_SIZE + "px Courier New", MSG_TEXT_COLOR);
|
|
maxFileNameSize = tmpObj.getBounds().width * MAX_DISPLAY_FILENAME_LEN;
|
|
|
|
fileInfoTextObj = new createjs.Text("Preview","bold " + FILEINFO_TEXT_SIZE + "px Helvetica", FILEINFO_TEXT_COLOR);
|
|
|
|
totalFileNameSizeX = fileTextObj.getBounds().width + maxFileNameSize + (tileWScale*2/3) + openFolderButtonX;
|
|
totalPreviewMapSizeX = (previewMapX+previewMapGapX) * previewMapPerLine + previewMapGapX;
|
|
|
|
menuX = TITLE_TEXT_SIZE * 2 + (totalFileNameSizeX > totalPreviewMapSizeX?totalFileNameSizeX:totalPreviewMapSizeX) |0;
|
|
menuY = (TITLE_TEXT_SIZE * 2.5 + (MSG_TEXT_SIZE+MSG_GAP_Y)*2) + ((MSG_TEXT_SIZE+MSG_GAP_Y)*2+ previewMapY + TITLE_TEXT_SIZE) + (MSG_GAP_Y*3 + BUTTON_TEXT_SIZE) |0;
|
|
|
|
buttonTextObj = new createjs.Text(" Restore ", "bold " + BUTTON_TEXT_SIZE + "px Helvetica", BUTTON_TEXT_COLOR);
|
|
|
|
buttonSizeX = buttonTextObj.getBounds().width + BUTTON_TEXT_SIZE;
|
|
}
|
|
|
|
function createCanvas()
|
|
{
|
|
restoreCanvas = document.createElement('canvas');
|
|
restoreCanvas.id = "restoreDialog";
|
|
restoreCanvas.width = menuX+10; //10 px for shadow
|
|
restoreCanvas.height = menuY+10; //10 px for shadow
|
|
|
|
var left = (screenX1 - restoreCanvas.width)/2|0,
|
|
top = (screenY1 - restoreCanvas.height)/2|0;
|
|
|
|
restoreCanvas.style.left = left + "px";
|
|
restoreCanvas.style.top = top + "px";
|
|
restoreCanvas.style.position = "absolute";
|
|
document.body.appendChild(restoreCanvas);
|
|
}
|
|
|
|
function createDialogStage()
|
|
{
|
|
dialogStage = new createjs.Stage(restoreCanvas);
|
|
dialogStage.enableMouseOver(60);
|
|
//createjs.Ticker.setFPS(20);
|
|
createjs.Ticker.addEventListener("tick", dialogStage);
|
|
}
|
|
|
|
function creatBackground()
|
|
{
|
|
background1Obj = new createjs.Shape();
|
|
background1Obj.graphics.beginFill(BUTTON_BACKGROUND_BORDER_COLOR)
|
|
.drawRoundRect(0, 0, menuX, menuY, 8*_scale).endFill();
|
|
background1Obj.shadow = new createjs.Shadow(BUTTON_BACKGROUND_SHADOW, 3, 3, 5 );
|
|
|
|
background2Obj = new createjs.Shape();
|
|
background2Obj.graphics.beginFill(BUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(BUTTON_BACKGROUND_BORDER_SIZE, BUTTON_BACKGROUND_BORDER_SIZE,
|
|
menuX-BUTTON_BACKGROUND_BORDER_SIZE*2, menuY-BUTTON_BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill();
|
|
dialogStage.addChild(background1Obj, background2Obj);
|
|
}
|
|
|
|
function createContent()
|
|
{
|
|
titleTextObj.x = (menuX - titleTextObj.getBounds().width)/2|0;
|
|
titleTextObj.y = TITLE_TEXT_SIZE*3/4|0;
|
|
dialogStage.addChild(titleTextObj);
|
|
|
|
var yOffset = TITLE_TEXT_SIZE*2.2|0;
|
|
|
|
msgTextObj.x = (menuX - msgTextObj.getBounds().width)/2|0;
|
|
msgTextObj.y = yOffset;
|
|
dialogStage.addChild(msgTextObj);
|
|
|
|
yOffset += (MSG_TEXT_SIZE+MSG_GAP_Y)|0;
|
|
fileTextObj.x = (menuX - totalFileNameSizeX)/2|0;
|
|
fileTextObj.y = yOffset;
|
|
dialogStage.addChild(fileTextObj);
|
|
|
|
fileNameX = fileTextObj.x + fileTextObj.getBounds().width + (tileWScale/3)|0;
|
|
fileNameY = yOffset;
|
|
|
|
fileNameBackgroundObj = new createjs.Shape();
|
|
fileNameBackgroundObj.graphics.beginFill("white").drawRect(
|
|
fileNameX, fileNameY, maxFileNameSize, MSG_TEXT_SIZE).endFill();
|
|
fileNameBackgroundObj.alpha = 0.2;
|
|
|
|
dialogStage.addChild(fileNameBackgroundObj);
|
|
|
|
addOpenButton(fileNameX+maxFileNameSize+(tileWScale*1/3)|0, fileNameY+(MSG_TEXT_SIZE-openFolderButtonY)/2|0);
|
|
|
|
yOffset += (MSG_TEXT_SIZE+MSG_GAP_Y)|0; // fileInfo Box yOffset
|
|
|
|
var fileInfoBackgroundObj = new createjs.Shape();
|
|
var fileInfoTextBarObj = new createjs.Shape();
|
|
var fileInfoBoxSizeY = (MSG_TEXT_SIZE+MSG_GAP_Y)*2 + previewMapY + MSG_TEXT_SIZE | 0;
|
|
var fileInfoBoxYOffset = yOffset;
|
|
|
|
fileInfoBackgroundObj.graphics.beginFill("white").drawRoundRect(TITLE_TEXT_SIZE, yOffset, menuX-TITLE_TEXT_SIZE*2, fileInfoBoxSizeY, 16*_scale).endFill();
|
|
fileInfoBackgroundObj.alpha = 0.5;
|
|
dialogStage.addChild(fileInfoBackgroundObj);
|
|
|
|
fileInfoTextObj.x = (menuX-fileInfoTextObj.getBounds().width)/2;
|
|
fileInfoTextObj.y = yOffset+ (MSG_GAP_Y/2)|0; // prevew text yOffset
|
|
dialogStage.addChild(fileInfoTextObj);
|
|
|
|
previewNoYOffset = fileInfoTextObj.y + (MSG_TEXT_SIZE+MSG_GAP_Y/2)|0;
|
|
previewMapYOffset = previewNoYOffset + MSG_GAP_Y;
|
|
|
|
//set Wrong file format x,y
|
|
wrongText1Obj.x = wrongText2Obj.x = (menuX-wrongText1Obj.getBounds().width)/2|0;
|
|
wrongText1Obj.y = wrongText2Obj.y = fileInfoBoxYOffset + (fileInfoBoxSizeY- wrongText1Obj.getBounds().height)/2; //Y center of preview box Y shift title
|
|
|
|
createPreviewMapButton();
|
|
|
|
// create Restore button
|
|
buttonObj = new createjs.Container();
|
|
|
|
//child id = 0
|
|
var border = new createjs.Shape();
|
|
border.graphics.beginFill(BUTTON_BORDER0_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE/2, -BUTTON_BORDER_SIZE/2, buttonSizeX+BUTTON_BORDER_SIZE, MSG_AREA_Y+BUTTON_BORDER_SIZE ,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
//child id = 1
|
|
var button = new createjs.Shape();
|
|
button.graphics.beginFill(BUTTON_COLOR).drawRoundRect(0, 0, buttonSizeX, MSG_AREA_Y,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
//child id = 2
|
|
buttonTextObj.textAlign = "center";
|
|
buttonTextObj.x = buttonSizeX/2|0;
|
|
buttonTextObj.y = (MSG_AREA_Y - msgTextObj.getBounds().height)/2|0;
|
|
|
|
buttonObj.addChild(border, button, buttonTextObj);
|
|
buttonObj.x = (menuX - buttonSizeX)/2|0;
|
|
buttonObj.y = fileInfoBoxYOffset + fileInfoBoxSizeY + MSG_GAP_Y|0;
|
|
|
|
buttonObj.on('click', buttonClick);
|
|
buttonObj.on('mouseover', buttonMouseOver);
|
|
buttonObj.on('mouseout', buttonMouseOut);
|
|
buttonObj.alpha = 0;
|
|
dialogStage.addChild(buttonObj);
|
|
}
|
|
|
|
function createPreviewMapButton()
|
|
{
|
|
var nextMapX = nextMapBitmap.getBounds().width*_scale,
|
|
nextMapY = nextMapBitmap.getBounds().height*_scale*2/3;
|
|
var borderNext = new createjs.Shape();
|
|
var borderPrev = new createjs.Shape();
|
|
|
|
nextMapButtonObj = new createjs.Container();
|
|
prevMapButtonObj = new createjs.Container();
|
|
|
|
//Preview Map Next button
|
|
borderNext.graphics.beginFill(PREVIEWMAP_BUTTON_COLOR)
|
|
.drawRoundRect(-PREVIEWMAP_BUTTON_BORDER_SIZE/2|0, -PREVIEWMAP_BUTTON_BORDER_SIZE/2|0, nextMapX+PREVIEWMAP_BUTTON_BORDER_SIZE, nextMapY+PREVIEWMAP_BUTTON_BORDER_SIZE, BUTTON_ROUND_RADIUD).endFill();
|
|
borderNext.alpha =PREVIEWMAP_BUTTON_GRAY_ALPHA;
|
|
nextMapBitmap.setTransform(0, 0, _scale, _scale*2/3);
|
|
nextMapButtonObj.x = TITLE_TEXT_SIZE + (previewMapGapX + previewMapX)*previewMapPerLine - nextMapX-PREVIEWMAP_BUTTON_BORDER_SIZE/2;
|
|
nextMapButtonObj.y = previewMapYOffset + previewMapY + previewMapGapX/2;
|
|
nextMapButtonObj.myId = 1;
|
|
nextMapButtonObj.addChild(borderNext, nextMapBitmap);
|
|
nextMapButtonObj.on('click', PreviewButtonClick);
|
|
nextMapButtonObj.on('mouseover', PreviewButtonMouseOver);
|
|
nextMapButtonObj.on('mouseout', PreviewButtonMouseOut);
|
|
nextMapButtonObj.alpha = 0;
|
|
dialogStage.addChild(nextMapButtonObj);
|
|
|
|
//Preview Map Prev Button
|
|
borderPrev.graphics.beginFill(PREVIEWMAP_BUTTON_COLOR)
|
|
.drawRoundRect(-PREVIEWMAP_BUTTON_BORDER_SIZE/2|0, -PREVIEWMAP_BUTTON_BORDER_SIZE/2|0, nextMapX+PREVIEWMAP_BUTTON_BORDER_SIZE, nextMapY+PREVIEWMAP_BUTTON_BORDER_SIZE, BUTTON_ROUND_RADIUD).endFill();
|
|
borderPrev.alpha =PREVIEWMAP_BUTTON_GRAY_ALPHA;
|
|
prevMapBitmap.setTransform(0, 0, _scale, _scale*2/3);
|
|
prevMapButtonObj.x = TITLE_TEXT_SIZE + previewMapGapX + PREVIEWMAP_BUTTON_BORDER_SIZE/2;
|
|
prevMapButtonObj.y = previewMapYOffset + previewMapY + previewMapGapX/2;
|
|
prevMapButtonObj.myId = 2;
|
|
prevMapButtonObj.addChild(borderPrev, prevMapBitmap);
|
|
prevMapButtonObj.on('click', PreviewButtonClick);
|
|
prevMapButtonObj.on('mouseover', PreviewButtonMouseOver);
|
|
prevMapButtonObj.on('mouseout', PreviewButtonMouseOut);
|
|
prevMapButtonObj.alpha = 0;
|
|
dialogStage.addChild(prevMapButtonObj);
|
|
|
|
function PreviewButtonClick()
|
|
{
|
|
var myId = this.myId;
|
|
var totalLevels = tmpCustomLevels.length;
|
|
switch(myId) {
|
|
case 1: //next page
|
|
previewMapFirst += previewMapPerLine;
|
|
previewMapLast += previewMapPerLine;
|
|
if (previewMapLast >= totalLevels) previewMapLast = totalLevels-1;
|
|
break;
|
|
case 2: //previous page
|
|
previewMapFirst -= previewMapPerLine;
|
|
previewMapLast = previewMapFirst + previewMapPerLine-1;
|
|
if (previewMapLast >= totalLevels) previewMapLast = totalLevels-1;
|
|
break;
|
|
default:
|
|
error("Error: Design Error myId = " + myId );
|
|
return;
|
|
}
|
|
removePreviewMap();
|
|
displayPreviewMap(myId);
|
|
}
|
|
|
|
function PreviewButtonMouseOver()
|
|
{
|
|
var backgroundObj = this.getChildAt(0);
|
|
|
|
backgroundObj.alpha = 1;
|
|
dialogStage.cursor = 'pointer';
|
|
dialogStage.update();
|
|
}
|
|
|
|
function PreviewButtonMouseOut()
|
|
{
|
|
var backgroundObj = this.getChildAt(0);
|
|
|
|
backgroundObj.alpha = PREVIEWMAP_BUTTON_GRAY_ALPHA;
|
|
dialogStage.cursor = 'default';
|
|
dialogStage.update();
|
|
}
|
|
|
|
}
|
|
|
|
function removePreviewObj()
|
|
{
|
|
if (wrongMsgEnable) {
|
|
dialogStage.removeChild(wrongText1Obj, wrongText2Obj);
|
|
//dialogStage.removeChild(wrongText2Obj);
|
|
wrongMsgEnable = 0;
|
|
}
|
|
removePreviewMap();
|
|
disableMapButton();
|
|
dialogStage.removeChild(totalLevelTextObj);
|
|
dialogStage.update();
|
|
}
|
|
|
|
function readRestoreFile(e)
|
|
{
|
|
var file;
|
|
var readFiler;
|
|
var fileSize, totalLevels, fileChecksum;
|
|
|
|
removePreviewObj();
|
|
buttonObj.alpha = 0; //disable restore button (hide)
|
|
|
|
if (e.target.files.length <= 0) {
|
|
displayFileName("");
|
|
return;
|
|
}
|
|
file = e.target.files[0];
|
|
displayFileName(file.name);
|
|
|
|
// (1) First only read header for check file format
|
|
readHeaderInfo();
|
|
|
|
//reference: https://developer.mozilla.org/en-US/docs/Web/API/FileReader
|
|
function readHeaderInfo()
|
|
{
|
|
var readHeader = new FileReader();
|
|
var blob = file.slice(0, 150); //read 0 - 150 bytes
|
|
|
|
readHeader.onloadend = function(e) {
|
|
if (e.target.readyState == FileReader.DONE) {
|
|
checkHeaderInfo(e.target.result);
|
|
}
|
|
};
|
|
|
|
readHeader.readAsText(blob);
|
|
}
|
|
|
|
function checkHeaderInfo(headerInfo)
|
|
{
|
|
//LODE RUNNER WEB GAME.Sun May 16 2021 11:12:20 GMT+0800 (台北標準時間).SISS.MTAyMDAwNDA5YTg1NExS
|
|
var maxFileSize = 150 + NO_OF_TILES_X * NO_OF_TILES_Y * 256;
|
|
var newLinePos = headerInfo.indexOf('\n');
|
|
if(newLinePos < 0) {
|
|
displayAlertMsg("wrong header");
|
|
return;
|
|
}
|
|
|
|
var lastDotPos = headerInfo.substr(0, newLinePos).lastIndexOf('.');
|
|
if (lastDotPos < 0 || newLinePos - lastDotPos != 21) {
|
|
displayAlertMsg("wrong fileInfo");
|
|
return;
|
|
} else {
|
|
try {
|
|
var fileInfo = atob(headerInfo.substr(lastDotPos+1, newLinePos-lastDotPos-1));
|
|
} catch(e) {
|
|
// wrong base64
|
|
displayAlertMsg("wrong base64");
|
|
return;
|
|
}
|
|
var verInfo = fileInfo.charAt(0);
|
|
if ( verInfo != '1' && verInfo != '2') {
|
|
displayAlertMsg("wrong fileInfo.version (" + verInfo + ")");
|
|
return;
|
|
}
|
|
if (headerInfo.indexOf(LRWG_FILE_START_INFO) != 0) {
|
|
displayAlertMsg("wrong startInfo");
|
|
return;
|
|
}
|
|
totalLevels = parseInt(fileInfo.substr(1,2), 16);
|
|
fileSize = parseInt(fileInfo.substr(3,6), 16);
|
|
fileChecksum = parseInt(fileInfo.substr(9,4), 16);
|
|
if (totalLevels > MAX_EDIT_LEVEL || totalLevels <= 0) {
|
|
displayAlertMsg("wrong edit levels (" + totalLevels + ")");
|
|
return;
|
|
}
|
|
if (file.size > maxFileSize) {
|
|
displayAlertMsg("Error: file size too large (" + file.size + ")");
|
|
return;
|
|
}
|
|
if (fileSize != file.size) {
|
|
displayAlertMsg("wrong file size");
|
|
return;
|
|
}
|
|
|
|
// (2) Read all file
|
|
readAllFile = new FileReader();
|
|
|
|
readAllFile.onloadend = function(e) {
|
|
if (e.target.readyState == FileReader.DONE) {
|
|
readCustomLevels(e.target.result, verInfo);
|
|
}
|
|
}
|
|
readAllFile.readAsText(file);
|
|
}
|
|
}
|
|
|
|
function readCustomLevels(fileData, verInfo)
|
|
{
|
|
var firstNewLinePos = fileData.indexOf('\n');
|
|
var dataChecksum = 0;
|
|
var levelData = fileData.substr(firstNewLinePos); //skip header
|
|
|
|
for(var i = 0; i < levelData.length; i++) {
|
|
dataChecksum += levelData.charCodeAt(i);
|
|
}
|
|
if (fileChecksum != (dataChecksum & 0xFFFF)) {
|
|
displayAlertMsg("wrong file checksum");
|
|
return;
|
|
}
|
|
|
|
tmpCustomLevels = [];
|
|
|
|
if (verInfo == '1') {
|
|
// v1: level format
|
|
// -------------------------------
|
|
// level map format:
|
|
//
|
|
// +----- startLevelPos
|
|
// V
|
|
// \n tile * NO_OF_TILES_X
|
|
// \n tile * NO_OF_TILES_X
|
|
// ....
|
|
// \n tile * NO_OF_TILES_X
|
|
// \n checksum
|
|
// ------------------------------
|
|
var oneLevelSize = (NO_OF_TILES_X+1) * NO_OF_TILES_Y+2; // +2: checksum + '\n'
|
|
|
|
if(levelData.length != totalLevels * oneLevelSize) {
|
|
displayAlertMsg("wrong levels data size (1)");
|
|
return;
|
|
}
|
|
|
|
for(var curLevel = 0; curLevel < totalLevels; curLevel++) {
|
|
var startLevelPos = curLevel * oneLevelSize + 1; // +1: skip first '\n'
|
|
var curLevelMap = '';
|
|
for(var tileY = 0; tileY < NO_OF_TILES_Y; tileY++) {
|
|
// (startLevelPos+1), +1 : skip \n
|
|
curLevelMap += levelData.substr(startLevelPos+tileY*(NO_OF_TILES_X+1), NO_OF_TILES_X);
|
|
}
|
|
var checksum = levelData.charAt(startLevelPos+oneLevelSize-2);
|
|
var levelChecksum = getShareChecksum(curLevelMap);
|
|
if (checksum != levelChecksum) {
|
|
displayAlertMsg("wrong level checksum (" + (curLevel+1) + ")");
|
|
return;
|
|
}
|
|
tmpCustomLevels.push(curLevelMap);
|
|
}
|
|
} else {
|
|
// v2: level format
|
|
// -----------------------------
|
|
// \n zipLevelData
|
|
// \n zipLevelData
|
|
// .......
|
|
// \n zipLevelData
|
|
// -----------------------------
|
|
var startLevelPos = 1; // begin from pos = 1
|
|
var nextNewLinePos;
|
|
var zipLevelData, curLevelMap;
|
|
for(var curLevel = 0; curLevel < totalLevels; curLevel++) {
|
|
nextNewLinePos = levelData.indexOf('\n', startLevelPos);
|
|
if (nextNewLinePos < 0) {
|
|
displayAlertMsg("wrong level data @" + (curLevel+1));
|
|
return;
|
|
}
|
|
curLevelMap = unzipLevelMap(levelData.substr(startLevelPos, nextNewLinePos-startLevelPos));
|
|
if (!curLevelMap) {
|
|
displayAlertMsg("wrong ziplevel data @" + (curLevel+1));
|
|
return;
|
|
}
|
|
tmpCustomLevels.push(curLevelMap);
|
|
startLevelPos = nextNewLinePos+1;
|
|
}
|
|
if (levelData.length != startLevelPos) {
|
|
displayAlertMsg("wrong levels data size (2)");
|
|
return;
|
|
}
|
|
}
|
|
|
|
// SUCCESS
|
|
displayFileInfo();
|
|
buttonObj.alpha = 1; //enable restore button
|
|
}
|
|
|
|
function displayAlertMsg(errMsg)
|
|
{
|
|
debug(errMsg);
|
|
wrongMsgEnable = 1;
|
|
dialogStage.addChild(wrongText1Obj, wrongText2Obj);
|
|
dialogStage.update();
|
|
}
|
|
}
|
|
|
|
function displayFileName(fileName)
|
|
{
|
|
if (fileNameObj) {
|
|
dialogStage.removeChild(fileNameObj);
|
|
fileNameObj = null;
|
|
}
|
|
if (fileName.length <= 0) {
|
|
dialogStage.update();
|
|
return;
|
|
}
|
|
|
|
if (stringDisplayWidth(fileName) > MAX_DISPLAY_FILENAME_LEN) {
|
|
fileName = cutFileName(fileName);
|
|
}
|
|
fileNameObj = new createjs.Text(fileName, "bold " + MSG_TEXT_SIZE + "px Helvetica", MSG_TEXT_COLOR);
|
|
|
|
if(fileNameObj.getBounds().width > maxFileNameSize) {
|
|
fileNameObj = new createjs.Text(fileName, "bold " + MSG_TEXT_SIZE + "px Courier New", MSG_TEXT_COLOR);
|
|
}
|
|
|
|
fileNameObj.x = fileNameX;
|
|
fileNameObj.y = fileNameY;
|
|
dialogStage.addChild(fileNameObj);
|
|
dialogStage.update();
|
|
|
|
function stringDisplayWidth(str)
|
|
{
|
|
// 0x00-0xFF assume 1 char others assume 2 chars
|
|
//reference: https://blog.typeart.cc/JavaScript計算含中英文字的字串長度/
|
|
return str.replace(/[^\x00-\xff]/g,"xx").length;
|
|
}
|
|
|
|
function cutFileName(str)
|
|
{
|
|
var oneSideSize = (MAX_DISPLAY_FILENAME_LEN - 3)/2|0;
|
|
var leftName = '', rightName = '';
|
|
|
|
for(var i = 0, width=0; width < oneSideSize; i++, width++) {
|
|
var charCode = str.charCodeAt(i);
|
|
if (charCode <= 0xFF) {
|
|
leftName += str.charAt(i);
|
|
} else {
|
|
if(++width < oneSideSize) {
|
|
leftName += str.charAt(i);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
for(var i = str.length-1, width=0; width < oneSideSize; i--, width++) {
|
|
var charCode = str.charCodeAt(i);
|
|
if (charCode <= 0xFF) {
|
|
rightName = str.charAt(i) + rightName;
|
|
} else {
|
|
if(++width < oneSideSize) {
|
|
rightName = str.charAt(i) + rightName;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return leftName + "...." + rightName;
|
|
}
|
|
}
|
|
|
|
function addOpenButton(xOffset, yOffset)
|
|
{
|
|
openFolderButtonObj = new createjs.Container();
|
|
border = new createjs.Shape();
|
|
button = new createjs.Shape();
|
|
|
|
//id = 0
|
|
border.graphics.beginFill(OPENBUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(-OPENBUTTON_BORDER_SIZE, -OPENBUTTON_BORDER_SIZE, openFolderButtonX+OPENBUTTON_BORDER_SIZE*2, openFolderButtonY+OPENBUTTON_BORDER_SIZE*2, OPENBUTTON_ROUND_RADIUD).endFill();
|
|
//id = 1
|
|
button.graphics.beginFill(OPENBUTTON_COLOR)
|
|
.drawRect(-OPENBUTTON_BORDER_SIZE/3, -OPENBUTTON_BORDER_SIZE/3, openFolderButtonX+OPENBUTTON_BORDER_SIZE*2/3, openFolderButtonY+OPENBUTTON_BORDER_SIZE*2/3).endFill();
|
|
button.alpha = 0.9;
|
|
|
|
//id = 2
|
|
openFolderBitmap.setTransform(0, 0, _scale*openFolderButtonScale, _scale*openFolderButtonScale);
|
|
|
|
openFolderButtonObj.x = xOffset;
|
|
openFolderButtonObj.y = yOffset;
|
|
openFolderButtonObj.addChild(border, button, openFolderBitmap);
|
|
|
|
openFolderButtonObj.on('click', openButtonClick);
|
|
openFolderButtonObj.on('mouseover', openButtonMouseOver);
|
|
openFolderButtonObj.on('mouseout', openButtonMouseOut);
|
|
dialogStage.addChild(openFolderButtonObj);
|
|
|
|
function openButtonClick()
|
|
{
|
|
inputFileElement.click();
|
|
openButtonMouseOut();
|
|
}
|
|
|
|
function openButtonMouseOver()
|
|
{
|
|
var border = openFolderButtonObj.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(OPENBUTTON_BORDER_COLOR)
|
|
.drawRoundRect(-OPENBUTTON_BORDER_SIZE, -OPENBUTTON_BORDER_SIZE,
|
|
openFolderButtonX+OPENBUTTON_BORDER_SIZE*2, openFolderButtonY+OPENBUTTON_BORDER_SIZE*2, OPENBUTTON_ROUND_RADIUD).endFill();
|
|
|
|
dialogStage.cursor = 'pointer';
|
|
dialogStage.update();
|
|
}
|
|
|
|
function openButtonMouseOut()
|
|
{
|
|
var border = openFolderButtonObj.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(OPENBUTTON_BACKGROUND_COLOR)
|
|
.drawRoundRect(-OPENBUTTON_BORDER_SIZE, -OPENBUTTON_BORDER_SIZE,
|
|
openFolderButtonX+OPENBUTTON_BORDER_SIZE*2, openFolderButtonY+OPENBUTTON_BORDER_SIZE*2, OPENBUTTON_ROUND_RADIUD).endFill();
|
|
|
|
dialogStage.cursor = 'default';
|
|
dialogStage.update();
|
|
}
|
|
|
|
}
|
|
|
|
function removePreviewMap()
|
|
{
|
|
for(var i=0 ; i < levelMapObjs.length; i++) {
|
|
dialogStage.removeChild(levelMapObjs[i]);
|
|
}
|
|
|
|
for(var i=0 ; i < levelMapNoObj.length; i++) {
|
|
dialogStage.removeChild(levelMapNoObj[i]);
|
|
}
|
|
}
|
|
|
|
function disableMapButton()
|
|
{
|
|
prevMapButtonObj.alpha = 0; //disable next map button (hide)
|
|
nextMapButtonObj.alpha = 0; //disable prev map button (hide)
|
|
}
|
|
|
|
function displayPreviewMap(myId=0)
|
|
{
|
|
var borderSize = _scale < 1?1:_scale;
|
|
var scaleX = scaleY = PREVIEW_MAP_SCALE;
|
|
|
|
levelMapObjs = [];
|
|
levelMapNoObj = [];
|
|
for(var level=previewMapFirst, i=0; level <= previewMapLast; level++, i++) {
|
|
var levelMap = new createjs.Container();
|
|
var border = new createjs.Shape();
|
|
var background = new createjs.Shape();
|
|
var mapOffsetX = TITLE_TEXT_SIZE + previewMapGapX + (previewMapX+previewMapGapX) * i;
|
|
|
|
levelMapNoObj[i] = new createjs.Text(("00"+(level+1)).slice(-3), "bold " + MAPNO_TEXT_SIZE + "px Helvetica", "black");
|
|
levelMapNoObj[i].x = mapOffsetX;
|
|
levelMapNoObj[i].y = previewNoYOffset;
|
|
levelMapNoObj[i].alpha = 0.6;
|
|
dialogStage.addChild(levelMapNoObj[i]);
|
|
|
|
border.graphics.beginFill("white")
|
|
.drawRoundRect(-borderSize, -borderSize, previewMapX+2*borderSize, previewMapY+2*borderSize, borderSize);
|
|
background.graphics.beginFill("black").drawRect(0, 0, previewMapX, previewMapY);
|
|
|
|
levelMap.addChild(border, background, level2Bitmap(tmpCustomLevels[level], scaleX, scaleY));
|
|
levelMapObjs[i] = levelMap;
|
|
levelMapObjs[i].x = mapOffsetX;
|
|
levelMapObjs[i].y = previewMapYOffset|0;
|
|
dialogStage.addChild(levelMapObjs[i]);
|
|
}
|
|
|
|
if (previewMapFirst <= 0) {
|
|
prevMapButtonObj.alpha = 0; //disable
|
|
} else prevMapButtonObj.alpha = 1; //enable
|
|
|
|
if (previewMapLast+1 >= tmpCustomLevels.length) {
|
|
nextMapButtonObj.alpha = 0; //disable
|
|
} else nextMapButtonObj.alpha = 1; //enable
|
|
dialogStage.update();
|
|
}
|
|
|
|
function displayFileInfo()
|
|
{
|
|
var totalLevels = tmpCustomLevels.length;
|
|
var levelText = totalLevels > 1? " Levels": " Level";
|
|
|
|
previewMapFirst = 0;
|
|
previewMapLast = previewMapPerLine-1;
|
|
if(previewMapLast+1 >= totalLevels) previewMapLast = totalLevels-1;
|
|
displayPreviewMap();
|
|
|
|
totalLevelTextObj = new createjs.Text("Total: " + tmpCustomLevels.length + levelText, "bold " + TOTALLEVEL_TEXT_SIZE + "px Helvetica", "black");
|
|
totalLevelTextObj.x = (menuX-totalLevelTextObj.getBounds().width)/2|0;
|
|
totalLevelTextObj.y = previewMapYOffset + previewMapY + previewMapGapX*2;
|
|
totalLevelTextObj.alpha = 0.6;
|
|
dialogStage.addChild(totalLevelTextObj);
|
|
|
|
dialogStage.update();
|
|
}
|
|
|
|
function level2Bitmap(levelMap, scaleX, scaleY)
|
|
{
|
|
var container = new createjs.Container();
|
|
var guardCount = 0, runner = 0;
|
|
var bitmap;
|
|
|
|
//--------------------------------------------
|
|
// Parser map from right-bottom to left-top
|
|
// for drop guards if too manys
|
|
//--------------------------------------------
|
|
var index = NO_OF_TILES_Y * NO_OF_TILES_X - 1;
|
|
for(var y = NO_OF_TILES_Y-1; y >= 0; y--) {
|
|
for(var x = NO_OF_TILES_X-1; x >= 0; x--) {
|
|
var id = levelMap.charAt(index--);
|
|
|
|
var curTile;
|
|
switch(id) {
|
|
default:
|
|
case ' ': //empty
|
|
continue;
|
|
case '#': //Normal Brick
|
|
curTile = getThemeBitmap("brick");
|
|
break;
|
|
case '@': //Solid Brick
|
|
curTile = getThemeBitmap("solid");
|
|
break;
|
|
case 'H': //Ladder
|
|
curTile = getThemeBitmap("ladder");
|
|
break;
|
|
case '-': //Line of rope
|
|
curTile = getThemeBitmap("rope");
|
|
break;
|
|
case 'X': //False brick
|
|
curTile = getThemeBitmap("brick");
|
|
break;
|
|
case 'S': //Ladder appears at end of level
|
|
continue;
|
|
case '$': //Gold chest
|
|
curTile = getThemeBitmap("gold");
|
|
break;
|
|
case '0': //Guard
|
|
if(++guardCount > MAX_NEW_GUARD) {
|
|
continue; //too many guard , set this tile as empty
|
|
}
|
|
curTile = new createjs.Sprite(guardData, "runLeft");
|
|
curTile.stop();
|
|
break;
|
|
case '&': //Player
|
|
if(++runner > 1) {
|
|
continue; //too many runner, set this tile as empty
|
|
}
|
|
curTile = new createjs.Sprite(runnerData, "runRight");
|
|
curTile.stop();
|
|
break;
|
|
}
|
|
curTile.setTransform(x*BASE_TILE_X*scaleX, y*BASE_TILE_Y*scaleX, scaleX, scaleY);
|
|
container.addChild(curTile);
|
|
}
|
|
}
|
|
container.cache(0, 0, previewMapX, previewMapY);
|
|
bitmap = new createjs.Bitmap( container.cacheCanvas); // change "cont.getCacheDataURL()" to "cont.cacheCanvas"
|
|
container.removeAllChildren();
|
|
return bitmap;
|
|
}
|
|
|
|
function restoreConfirm(rc)
|
|
{
|
|
var tmpTestInfo = {level: 1}; // "level:1" for data safe
|
|
var oldEditLevels = editLevels; // 1 -
|
|
|
|
if(rc) { //yes restore custom levels
|
|
|
|
//------------------------------------------------------------------------------------
|
|
//(1) clear edit levels
|
|
getTestLevel(tmpTestInfo);
|
|
clearEditLevelInfo(); //clear edit level info
|
|
clearStorage(STORAGE_USER_SCORE_INFO); //clear user score info
|
|
clearTestLevel(); //clear test level
|
|
initEditLevelInfo();
|
|
|
|
//(2) add levelmap to storage
|
|
editLevelData = [];
|
|
for(var i=0; i < tmpCustomLevels.length; i++) {
|
|
setEditLevel(++editLevels, tmpCustomLevels[i]); //editLevels: 1 - MAX_EDIT_LEVEL
|
|
}
|
|
|
|
//(3) save edit info
|
|
setEditLevelInfo();
|
|
if(tmpTestInfo.level > oldEditLevels && editLevels < MAX_EDIT_LEVEL && !levelMapIsEmpty(tmpTestInfo.levelMap)) {
|
|
//still have space for save new editing level
|
|
tmpTestInfo.level = editLevels+1;
|
|
setTestLevel(tmpTestInfo);
|
|
}
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
restoreKeyState();
|
|
curLevel = 1;
|
|
setModernInfo(); // set current level = 1 for play mode
|
|
if(playMode == PLAY_EDIT) {
|
|
editEdit(-1, _callBackFun);
|
|
} else {
|
|
editPlay(-1, _callBackFun);
|
|
}
|
|
} else {
|
|
restoreKeyState();
|
|
if(_callBackFun) _callBackFun();
|
|
|
|
}
|
|
}
|
|
|
|
//restore button click
|
|
function buttonClick()
|
|
{
|
|
removeCanvas();
|
|
removeCoverBackground();
|
|
yesNoDialog(["Warning", "Overwrite existing custom levels ?"], yesBitmap, noBitmap, mainStage, tileScale, restoreConfirm);
|
|
}
|
|
|
|
//restore button mouse over
|
|
function buttonMouseOver()
|
|
{
|
|
var border = buttonObj.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BORDER1_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, buttonSizeX+BUTTON_BORDER_SIZE*2, MSG_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
buttonTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 2, 2, 10 );
|
|
dialogStage.cursor = 'pointer';
|
|
dialogStage.update();
|
|
}
|
|
|
|
//restore button mouse out
|
|
function buttonMouseOut()
|
|
{
|
|
var border = buttonObj.getChildAt(0);
|
|
|
|
border.graphics.clear();
|
|
border.graphics.beginFill(BUTTON_BORDER0_COLOR)
|
|
.drawRoundRect(-BUTTON_BORDER_SIZE/2, -BUTTON_BORDER_SIZE/2, buttonSizeX+BUTTON_BORDER_SIZE, MSG_AREA_Y+BUTTON_BORDER_SIZE, BUTTON_ROUND_RADIUD).endFill();
|
|
|
|
buttonTextObj.shadow = null;
|
|
dialogStage.cursor = 'default';
|
|
dialogStage.update();
|
|
}
|
|
|
|
function removeCanvas()
|
|
{
|
|
dialogStage.removeAllChildren();
|
|
dialogStage.enableMouseOver(0);
|
|
createjs.Ticker.removeEventListener(dialogStage);
|
|
document.body.removeChild(restoreCanvas);
|
|
}
|
|
|
|
function removeCoverBackground()
|
|
{
|
|
mainStage.removeChild(coverBackgroundObj);
|
|
}
|
|
|
|
function closeDialog()
|
|
{
|
|
restoreKeyState();
|
|
removeCanvas();
|
|
removeCoverBackground();
|
|
if(_callBackFun) _callBackFun();
|
|
}
|
|
|
|
function handleEscKeyDown(event)
|
|
{
|
|
if(!event){ event = window.event; } //cross browser issues exist
|
|
|
|
if(event.shiftKey || event.ctrlKey) return false;
|
|
|
|
switch(event.key) {
|
|
case "Escape":
|
|
closeDialog();
|
|
break;
|
|
default:
|
|
//debug("keycode = " + code);
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
}
|