mirror of
https://github.com/webxoss/webxoss-client.git
synced 2024-11-20 05:49:55 +01:00
644 lines
No EOL
17 KiB
JavaScript
644 lines
No EOL
17 KiB
JavaScript
'use strict';
|
|
|
|
function Game (io,audio,ongameover,spectating) {
|
|
this.io = io;
|
|
this.audio = audio;
|
|
this.ongameover = ongameover;
|
|
this.io.listener = function (data) {
|
|
console.log(data);
|
|
this.addMsgs(data);
|
|
this.update();
|
|
}.bind(this);
|
|
|
|
this.onidle = null;
|
|
|
|
// this._waiting = false;
|
|
|
|
// 老是清不干净,干脆粗暴地删掉元素.
|
|
this.gameDiv = document.getElementById('GameDiv');
|
|
this.canvasContainer = document.getElementById('BattleField');
|
|
this.canvasContainer.innerHTML = '';
|
|
this.canvas = document.createElement('canvas');
|
|
this.canvas.width = 576;
|
|
this.canvas.height = 734;
|
|
this.canvasContainer.appendChild(this.canvas);
|
|
this.stage = new createjs.Stage(this.canvas);
|
|
this.stage.enableDOMEvents(true);
|
|
this.stage.enableMouseOver(10);
|
|
|
|
this.dialog = new Dialog(this);
|
|
this.selector = new Selector(this,spectating);
|
|
|
|
this.objList = [];
|
|
|
|
this.background = new GameBackground(this);
|
|
this.stage.addChild(this.background);
|
|
|
|
this.cards = [];
|
|
this.cardLayer = new createjs.Container();
|
|
this.stage.addChild(this.cardLayer);
|
|
|
|
this.zones = [];
|
|
this.zoneLayer = new createjs.Container();
|
|
this.stage.addChild(this.zoneLayer);
|
|
|
|
this.msgQueue = [];
|
|
this._packageCount = 0;
|
|
// this._done = false;
|
|
|
|
this.imageManager = new ImageManager();
|
|
this.cardDetail = new CardDetail(this.imageManager);
|
|
|
|
this.initZones();
|
|
|
|
this.skip = false; // 跳过动画
|
|
}
|
|
|
|
// Game.prototype.destroy = function () {
|
|
// this.gameDiv.classList.remove('colored');
|
|
// ['white','black','red','blue','green'].forEach(function (color) {
|
|
// this.gameDiv.classList.remove('self-'+color);
|
|
// this.gameDiv.classList.remove('opponent-'+color);
|
|
// },this);
|
|
// this.stage.autoClear = true;
|
|
// this.stage.removeAllChildren();
|
|
// this.stage.update();
|
|
// this.stage.enableDOMEvents(false);
|
|
// this.stage.removeAllChildren();
|
|
// this.stage.removeAllEventListeners();
|
|
// };
|
|
|
|
// =========================
|
|
// Game.prototype.initZones
|
|
// 定义在ZonePosition.js
|
|
// =========================
|
|
|
|
Game.prototype.setSid = function (obj,sid) {
|
|
obj.sid = sid;
|
|
this.objList[sid] = obj;
|
|
};
|
|
|
|
Game.prototype.getObjBySid = function (sid) {
|
|
return this.objList[sid];
|
|
};
|
|
|
|
Game.prototype.addCard = function (card) {
|
|
this.cards.push(card);
|
|
this.cardLayer.addChild(card);
|
|
};
|
|
|
|
Game.prototype.addZone = function (zone) {
|
|
this.zones.push(zone);
|
|
this.zoneLayer.addChild(zone);
|
|
};
|
|
|
|
Game.prototype.handleInit = function (msg) {
|
|
this.setSid(this.player,msg.player);
|
|
this.setSid(this.opponent,msg.opponent);
|
|
|
|
function setZones (player,zones) {
|
|
this.setSid(player.mainDeck,zones.mainDeck);
|
|
this.setSid(player.lrigDeck,zones.lrigDeck);
|
|
this.setSid(player.handZone,zones.handZone);
|
|
this.setSid(player.lrigZone,zones.lrigZone);
|
|
this.setSid(player.signiZones[0],zones.signiZones[0]);
|
|
this.setSid(player.signiZones[1],zones.signiZones[1]);
|
|
this.setSid(player.signiZones[2],zones.signiZones[2]);
|
|
this.setSid(player.enerZone,zones.enerZone);
|
|
this.setSid(player.checkZone,zones.checkZone);
|
|
this.setSid(player.trashZone,zones.trashZone);
|
|
this.setSid(player.lrigTrashZone,zones.lrigTrashZone);
|
|
this.setSid(player.lifeClothZone,zones.lifeClothZone);
|
|
this.setSid(player.excludedZone,zones.excludedZone);
|
|
zones.mainDeckCards.forEach(function (sid) {
|
|
var card = new Card(this,false);
|
|
this.setSid(card,sid);
|
|
card.move(0,player.mainDeck,true,false,false);
|
|
},this);
|
|
zones.lrigDeckCards.forEach(function (sid,i) {
|
|
var card = new Card(this,true);
|
|
this.setSid(card,sid);
|
|
var info = zones.lrigDeckCardInfos[i];
|
|
card.move(info.pid,player.lrigDeck,true,false,false,info.isSide);
|
|
},this);
|
|
}
|
|
|
|
setZones.call(this,this.player,msg.playerZones);
|
|
setZones.call(this,this.opponent,msg.opponentZones);
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleSetColor = function (msg) {
|
|
// this.gameDiv.classList.add('colored');
|
|
document.body.setAttribute('self',msg.selfColor);
|
|
document.body.setAttribute('opponent',msg.opponentColor);
|
|
var zoneTextColorMap = {
|
|
'white': 'black',
|
|
'black': 'yellow',
|
|
'red': 'white',
|
|
'blue': 'yellow',
|
|
'green': 'white'
|
|
};
|
|
this.zones.forEach(function (zone) {
|
|
var color = zone.opposite? zoneTextColorMap[msg.opponentColor] : zoneTextColorMap[msg.selfColor];
|
|
zone.setTextColor(color);
|
|
},this);
|
|
var audio = this.audio;
|
|
audio.bgmFadeOut(function () {
|
|
audio.playBgm(msg.selfColor);
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handlePackedMsgStart = function () {
|
|
// this.audio.playBgm();
|
|
this._packageCount++;
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handlePackedMsgEnd = function () {
|
|
this._packageCount--;
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleMoveCard = function (msg) {
|
|
var card = this.getObjBySid(msg.card);
|
|
var zone = this.getObjBySid(msg.zone);
|
|
card.move(msg.pid,zone,msg.up,msg.faceup,msg.bottom,msg.isSide);
|
|
return false;
|
|
};
|
|
|
|
Game.prototype.handleUpCard = function (msg) {
|
|
var card = this.getObjBySid(msg.card);
|
|
card.up();
|
|
return false;
|
|
};
|
|
|
|
Game.prototype.handleDownCard = function (msg) {
|
|
var card = this.getObjBySid(msg.card);
|
|
card.down();
|
|
return false;
|
|
};
|
|
|
|
Game.prototype.handleFaceupCard = function (msg) {
|
|
var card = this.getObjBySid(msg.card);
|
|
card.pid = msg.pid;
|
|
card.faceup();
|
|
return false;
|
|
};
|
|
|
|
Game.prototype.handleFacedownCard = function (msg) {
|
|
var card = this.getObjBySid(msg.card);
|
|
card.facedown();
|
|
return false;
|
|
};
|
|
|
|
Game.prototype.handleShuffle = function (msg) {
|
|
msg.cards.forEach(function (sid) {
|
|
var card = this.getObjBySid(sid);
|
|
card.pid = 0;
|
|
},this);
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleSelect = function (msg) {
|
|
console.log(msg);
|
|
if (this.skip) return true;
|
|
this.selector.addMsg(msg);
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handlePayEner = function (msg) {
|
|
console.log('handlePayEner',msg);
|
|
|
|
if (this.skip) return true;
|
|
|
|
var cards = msg.cards.map(function (sid) {
|
|
return this.getObjBySid(sid);
|
|
},this);
|
|
|
|
var game = this;
|
|
var onCancel = null;
|
|
if (msg.cancelable) {
|
|
onCancel = function () {
|
|
game.input('PAY_ENER',null);
|
|
}
|
|
}
|
|
this.dialog.selectEner(Localize('buttonTitle','PAY_ENER'),cards,msg.colors,msg,function (selectedIndexes) {
|
|
game.input('PAY_ENER',selectedIndexes);
|
|
},onCancel);
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleShowCards = function (msg) {
|
|
if (this.skip) return true;
|
|
var cards = msg.cards.map(function (sid,idx) {
|
|
var card = this.getObjBySid(sid);
|
|
card.pid = msg.pids[idx];
|
|
return card;
|
|
},this);
|
|
var game = this;
|
|
var label = msg.label || 'CONFIRM';
|
|
this.dialog.showCards(Localize('buttonTitle',label),cards,function () {
|
|
game.input('OK');
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleShowCardsById = function (msg) {
|
|
if (this.skip) return true;
|
|
var cards = msg.ids.map(function (pid,idx) {
|
|
return {pid: pid};
|
|
},this);
|
|
var game = this;
|
|
var label = msg.label || 'CONFIRM';
|
|
this.dialog.showCards(Localize('buttonTitle',label),cards,function () {
|
|
game.input('OK');
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleShowColors = function (msg) {
|
|
if (this.skip) return true;
|
|
var colors = msg.colors.map(function (color) {
|
|
return Localize.color(color);
|
|
});
|
|
var game = this;
|
|
this.dialog.showText(Localize('buttonTitle','COLOR'),colors.join(','),function () {
|
|
game.input('OK');
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleShowTypes = function (msg) {
|
|
if (this.skip) return true;
|
|
var types = msg.types.map(function (type) {
|
|
return Localize('cardType',type);
|
|
});
|
|
var game = this;
|
|
this.dialog.showText(Localize('prop','cardType'),types.join(','),function () {
|
|
game.input('OK');
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleShowEffects = function (msg) {
|
|
if (this.skip) return true;
|
|
var text = msg.effects.map(function (desc) {
|
|
return Localize.desc(desc);
|
|
}).join('\n');
|
|
var game = this;
|
|
this.dialog.showText(Localize('gameText','SHOW_EFFECTS_DIALOG_TITLE'),text,function () {
|
|
game.input('OK');
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleShowText = function (msg) {
|
|
if (this.skip) return true;
|
|
var text = '';
|
|
if (msg.type === 'number') {
|
|
text = msg.content;
|
|
} else {
|
|
debugger;
|
|
}
|
|
var game = this;
|
|
this.dialog.showText(Localize.labelToDialogTitle(msg.title),text,function () {
|
|
game.input('OK');
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleInformCards = function (msg) {
|
|
msg.cards.forEach(function (sid,idx) {
|
|
var card = this.getObjBySid(sid);
|
|
card.pid = msg.pids[idx];
|
|
},this);
|
|
return true;
|
|
};
|
|
|
|
// Game.prototype.handlePower = function (msg) {
|
|
// msg.cards.forEach(function (sid,idx) {
|
|
// var card = this.getObjBySid(sid);
|
|
// card.zone.power = msg.powers[idx];
|
|
// },this);
|
|
// return true;
|
|
// };
|
|
|
|
Game.prototype.handleCardStates = function (msg) {
|
|
var signiInfos = msg.signiInfos;
|
|
var lrigInfos = msg.lrigInfos;
|
|
var zoneInfos = msg.zoneInfos;
|
|
signiInfos.forEach(function (signiInfo) {
|
|
var card = this.getObjBySid(signiInfo.card);
|
|
card.zone.power = signiInfo.power;
|
|
card.removeStates();
|
|
card.addStates(signiInfo.states);
|
|
},this);
|
|
lrigInfos.forEach(function (lrigInfo) {
|
|
var card = this.getObjBySid(lrigInfo.card);
|
|
card.removeStates();
|
|
card.addStates(lrigInfo.states);
|
|
},this);
|
|
if (zoneInfos) { // 向前兼容
|
|
zoneInfos.forEach(function (zoneInfo) {
|
|
var zone = this.getObjBySid(zoneInfo.zone);
|
|
zone.removeStates();
|
|
zone.addStates(zoneInfo.states);
|
|
},this);
|
|
}
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleActivate = function (msg) {
|
|
var card = this.getObjBySid(msg.card);
|
|
card.shine();
|
|
return false;
|
|
};
|
|
|
|
Game.prototype.handleCardSelected = function (msg) {
|
|
var card = this.getObjBySid(msg.card);
|
|
card.flash();
|
|
return false;
|
|
};
|
|
|
|
Game.prototype.handleSelectNumber = function (msg) {
|
|
if (this.skip) return true;
|
|
var label = msg.label;
|
|
var min = msg.min;
|
|
var max = msg.max;
|
|
var defaultValue = msg.defaultValue || 0;
|
|
var title = Localize.labelToDialogTitle(label);
|
|
// var options = [];
|
|
// var n = min;
|
|
// while (n <= max) {
|
|
// options.push(n++);
|
|
// }
|
|
// var game = this;
|
|
// this.dialog.selectText(title,options,false,function (idx) {
|
|
// game.input(label,min+idx);
|
|
// });
|
|
var game = this;
|
|
this.dialog.selectNumber(title,min,max,defaultValue,false,function (num) {
|
|
game.input(label,num);
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleSelectText = function (msg) {
|
|
if (this.skip) return true;
|
|
var label = msg.label;
|
|
var title = Localize.labelToDialogTitle(label);
|
|
var type = msg.type || 'gameText';
|
|
var options = msg.texts.map(function (text) {
|
|
return Localize(type,text);
|
|
},this);
|
|
var game = this;
|
|
this.dialog.selectText(title,options,false,function (idx) {
|
|
game.input(label,idx);
|
|
});
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleSelectCardId = function (msg) {
|
|
if (this.skip) return true;
|
|
try {
|
|
var game = this;
|
|
var label = msg.label;
|
|
var title = Localize.labelToDialogTitle(label);
|
|
this.dialog.selectCardId(title,function (pid) {
|
|
game.input(label,pid);
|
|
});
|
|
} catch (e) {
|
|
window.alert(e.name + e.message);
|
|
}
|
|
// console.log('game.input(' + label + ',pid)');
|
|
// debugger;
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleConfirm = function (msg) {
|
|
if (this.skip) return true;
|
|
var title = Localize.labelToDialogTitle('CONFIRM');
|
|
var text = Localize('gameText',msg.text);
|
|
var game = this;
|
|
this.dialog.confirm(title,text,function (answer) {
|
|
game.input('OK',answer);
|
|
});
|
|
return true;
|
|
};
|
|
|
|
// Game.prototype.handleWaitForOpponent = function (msg) {
|
|
// if (this._waiting) {
|
|
// this.buttonZone.setText(Localize.waitingMsg());
|
|
// } else {
|
|
// this._waiting = true;
|
|
// this.buttonZone.setText(Localize.waitingMsg(msg.operation));
|
|
// }
|
|
// this.background.setWaiting(true);
|
|
// return true;
|
|
// };
|
|
|
|
// Game.prototype.handleRockPaperScissors = function (msg) {
|
|
// var title = Localize('ROCK_PAPER_SCISSORS');
|
|
// var options = [
|
|
// Localize('ROCK'),
|
|
// Localize('PAPER'),
|
|
// Localize('SCISSORS')
|
|
// ];
|
|
// var game = this;
|
|
// this.dialog.selectText(title,options,false,function (idx) {
|
|
// game.input('ROCK_PAPER_SCISSORS',idx);
|
|
// });
|
|
// return true;
|
|
// };
|
|
|
|
Game.prototype.handleWin = function (msg) {
|
|
this.win();
|
|
};
|
|
|
|
Game.prototype.win = function (surrender) {
|
|
// var gameCount = sessionStorage.getItem('game count') || 0;
|
|
// gameCount++;
|
|
// sessionStorage.setItem('game count',gameCount);
|
|
// this.audio.playBgm();
|
|
// this.dialog.showText('WIN',text,function () {
|
|
// this.supportWebxoss(this.ongameover);
|
|
// }.bind(this));
|
|
this.ongameover(true,surrender,this.getMessagePacks());
|
|
};
|
|
|
|
// Game.prototype.supportWebxoss = function (callback) {
|
|
// if (this.shouldPopSupport()) {
|
|
// var title = 'SUPPORT WEBXOSS';
|
|
// var body = this.dialog.newElement('div');
|
|
// var link = this.dialog.newElement('a');
|
|
// link.target = '_blank';
|
|
// link.style.color = 'red';
|
|
// link.style.textDecoration = 'underline';
|
|
// link.href = Localize('index','SUPPORT_URL');
|
|
// link.textContent = 'help';
|
|
// link.onclick = function () {
|
|
// localStorage.setItem('support','webxoss~');
|
|
// return true;
|
|
// }
|
|
// body.appendChild(document.createTextNode('WEBXOSS needs your '));
|
|
// body.appendChild(link);
|
|
// body.appendChild(document.createTextNode('!'));
|
|
// body.style.color = 'green';
|
|
// this.dialog.pop(title,body,false,callback);
|
|
// } else {
|
|
// callback();
|
|
// }
|
|
// };
|
|
|
|
// Game.prototype.shouldPopSupport = function () {
|
|
// if (localStorage.getItem('support') === 'webxoss~') return false;
|
|
// var gameCount = sessionStorage.getItem('game count') || 0;
|
|
// if (gameCount >= 4) return true;
|
|
// return false;
|
|
// };
|
|
|
|
Game.prototype.handleLose = function (msg) {
|
|
this.lose();
|
|
};
|
|
|
|
Game.prototype.lose = function (surrender) {
|
|
// var gameCount = sessionStorage.getItem('game count') || 0;
|
|
// gameCount++;
|
|
// sessionStorage.setItem('game count',gameCount);
|
|
// this.audio.playBgm();
|
|
// this.dialog.showText('LOSE',text,this.ongameover);
|
|
this.ongameover(false,surrender,this.getMessagePacks());
|
|
};
|
|
|
|
Game.prototype.getMessagePacks = function () {
|
|
// var datas = this.io.getDatas();
|
|
// return {
|
|
// format: 'WEBXOSS Replay',
|
|
// version: '1',
|
|
// content: {
|
|
// clietVersion: this.version,
|
|
// messagePacks: this.io.getDatas();
|
|
// }
|
|
// };
|
|
return this.io.getDatas();
|
|
};
|
|
|
|
Game.prototype.handleMsg = function (msg) {
|
|
if (!msg) return false;
|
|
var handlerMap = {
|
|
'INIT': this.handleInit,
|
|
'SET_COLOR': this.handleSetColor,
|
|
'PACKED_MSG_START': this.handlePackedMsgStart,
|
|
'PACKED_MSG_END': this.handlePackedMsgEnd,
|
|
'MOVE_CARD': this.handleMoveCard,
|
|
'UP_CARD': this.handleUpCard,
|
|
'DOWN_CARD': this.handleDownCard,
|
|
'FACEUP_CARD': this.handleFaceupCard,
|
|
'FACEDOWN_CARD': this.handleFacedownCard,
|
|
'SHUFFLE': this.handleShuffle,
|
|
'SELECT': this.handleSelect,
|
|
'PAY_ENER': this.handlePayEner,
|
|
'SHOW_CARDS': this.handleShowCards,
|
|
'SHOW_CARDS_BY_ID': this.handleShowCardsById,
|
|
'SHOW_COLORS': this.handleShowColors,
|
|
'SHOW_TYPES': this.handleShowTypes,
|
|
'SHOW_EFFECTS': this.handleShowEffects,
|
|
'SHOW_TEXT': this.handleShowText,
|
|
'INFORM_CARDS': this.handleInformCards,
|
|
// 'POWER': this.handlePower,
|
|
'CARD_STATES': this.handleCardStates,
|
|
'ACTIVATE': this.handleActivate,
|
|
'CARD_SELECTED': this.handleCardSelected,
|
|
'SELECT_NUMBER': this.handleSelectNumber,
|
|
'SELECT_TEXT': this.handleSelectText,
|
|
'SELECT_CARD_ID': this.handleSelectCardId,
|
|
'CONFIRM': this.handleConfirm,
|
|
// 'ROCK_PAPER_SCISSORS': this.handleRockPaperScissors,
|
|
// 'WAIT_FOR_OPPONENT': this.handleWaitForOpponent,
|
|
'WIN': this.handleWin,
|
|
'LOSE': this.handleLose
|
|
};
|
|
var handler = handlerMap[msg.type];
|
|
if (handler) {
|
|
return handler.call(this,msg.content) || this.skip;
|
|
}
|
|
console.warn(msg);
|
|
window.alert('Unknown message type: "' + msg.type + '" .');
|
|
return true;
|
|
};
|
|
|
|
Game.prototype.handleMsgQueue = function () {
|
|
if (!this.msgQueue.length) return;
|
|
// this._waiting = false;
|
|
this.buttonZone.setText('');
|
|
this.background.setWaiting(false);
|
|
|
|
var done = true;
|
|
var msg;
|
|
while (msg = this.msgQueue.shift()) {
|
|
if (!this.handleMsg(msg)) done = false;
|
|
if (!done && !this._packageCount) break;
|
|
}
|
|
if (!this.msgQueue.length) {
|
|
this.handleIdle();
|
|
}
|
|
};
|
|
|
|
Game.prototype.handleIdle = function () {
|
|
this.selector.removeButtons();
|
|
this.selector.showButtons();
|
|
this.selector.autoPop();
|
|
if (!this.selector.msgs.length) {
|
|
this.buttonZone.setText(Localize.waitingMsg());
|
|
this.background.setWaiting(true);
|
|
}
|
|
if (this.onidle) this.onidle();
|
|
};
|
|
|
|
Game.prototype.addMsgs = function (msgs) {
|
|
this.selector.clear();
|
|
this.msgQueue = this.msgQueue.concat(msgs);
|
|
if (!msgs.length) {
|
|
this.handleIdle();
|
|
}
|
|
};
|
|
|
|
Game.prototype.input = function (label,data) {
|
|
if (data === undefined) {
|
|
data = [];
|
|
}
|
|
this.removeButtons();
|
|
this.io.send({
|
|
label: label,
|
|
input: data
|
|
});
|
|
this.background.setWaiting(true);
|
|
};
|
|
|
|
Game.prototype.removeButtons = function () {
|
|
this.cards.forEach(function (card) {
|
|
card.removeButtons();
|
|
},this);
|
|
this.zones.forEach(function (zone) {
|
|
zone.removeButtons();
|
|
},this);
|
|
// this.dialog.close();
|
|
};
|
|
|
|
Game.prototype.update = function () {
|
|
var changed = false;
|
|
concat(this.cards,this.zones,this.background).forEach(function (obj) {
|
|
if (obj.update()) changed = true;
|
|
},this);
|
|
|
|
if (changed) {
|
|
this.cardLayer.sortChildren(function (a,b) {
|
|
return a.zIndex - b.zIndex;
|
|
});
|
|
this.stage.update();
|
|
} else {
|
|
this.handleMsgQueue();
|
|
}
|
|
}; |