webxoss-client/Selector.js

284 lines
7.4 KiB
JavaScript
Raw Normal View History

2016-10-23 07:28:51 +02:00
'use strict';
function Selector (game,spectating) {
this.game = game;
this.msgs = [];
this.selectedIndexes = [];
this._autoPopMsg = null;
this.spectating = spectating;
}
// Selector.prototype.getMsgByLabel = function (label) {
// for (var i = 0; i < this.msgs.length; i++) {
// var msg = this.msgs[i];
// if (msg.label === label) {
// return msg;
// }
// }
// debugger;
// return null;
// };
Selector.prototype.addMsg = function (msg) {
this.msgs.push(this.parseMsg(msg));
};
Selector.prototype.parseMsg = function (msg) {
var newMsg = {
label: msg.label,
min: msg.min,
max: msg.max,
careOrder: msg.careOrder
};
newMsg.title = Localize.labelToTitle(msg.label);
newMsg.cards = msg.options.map(function (sid) {
return this.game.getObjBySid(sid);
},this);
newMsg.extraCards = msg.extraCards.map(function (sid,idx) {
var card = this.game.getObjBySid(sid);
card.pid = msg.extraPids[idx];
return card;
},this);
if (!newMsg.extraCards.length) {
newMsg.extraCards = newMsg.cards.slice();
}
newMsg.descriptions = msg.descriptions.map(function (desc) {
return Localize.desc(desc);
},this);
return newMsg;
};
// Selector.prototype.parseDesc = function (desc) {
// var arr = desc.split('-');
// var pid = arr[0];
// var type = arr[1];
// var idx = arr[2];
// var info = CardInfo[pid];
// return Localize.desc(info,type,idx);
// };
Selector.prototype.showButtons = function () {
this.msgs.forEach(function (msg) {
var cards = msg.extraCards;
if (!cards.length) {
this.game.buttonZone.addButton(Localize.noOptions(msg.label),this.selectBind(msg));
} else if (msg.label === 'USE_ACTION_EFFECT') {
var datas = [];
msg.cards.forEach(function (card,idx) {
var buttonCarrier;
var description = msg.descriptions[idx];
if (card.shouldUseDialog()) {
2017-02-28 17:50:01 +01:00
if (card.zone.constructor === TileZone) {
2016-10-23 07:28:51 +02:00
buttonCarrier = this.game.buttonZone;
} else {
buttonCarrier = card.zone;
}
} else {
buttonCarrier = card;
}
2017-02-28 17:50:01 +01:00
if (card.zone.name === 'EnerZone') {
buttonCarrier = card.zone.cards.length > 4 ? card.zone : card;
}
2016-10-23 07:28:51 +02:00
var data;
for (var i = 0; i < datas.length; i++) {
var data= datas[i];
if (data.buttonCarrier === buttonCarrier) {
data.cards.push(card);
data.descriptions.push(description);
data.indexes.push(idx);
return;
};
}
datas.push({
buttonCarrier: buttonCarrier,
cards: [card],
descriptions: [description],
indexes: [idx]
});
// card.addButton(msg.title,function () {
// var descriptions = [];
// var indexMap = [];
// msg.descriptions.forEach(function (description,idx) {
// if (msg.cards[idx] === card) {
// indexMap.push(idx);
// descriptions.push(description);
// }
// },this);
// if (descriptions.length <= 1) {
// this.send(msg,[indexMap[0]]);
// } else {
// this.game.dialog.selectText(msg.title,descriptions,true,function (idx) {
// this.send(msg,[indexMap[idx]]);
// }.bind(this));
// }
// }.bind(this));
},this);
datas.forEach(function (data) {
data.buttonCarrier.addButton(msg.title,function () {
if ((data.cards.length === 1) && (data.buttonCarrier.constructor === Card)) {
this.send(msg,[data.indexes[0]]);
} else {
var arg = {
min: 1,
max: 1,
texts: data.descriptions,
canClose: true,
careOrder: false,
targets: data.cards
}
this.game.dialog.selectSomeCards(msg.title,data.cards,arg,function (selectedIndexes) {
var i = selectedIndexes[0];
this.send(msg,[data.indexes[i]]);
}.bind(this));
}
}.bind(this));
},this);
} else {
var useDialog = msg.descriptions.length || cards.some(function (card) {
return card.shouldUseDialog();
},this);
if (useDialog) {
this._autoPopMsg = msg;
var zone = cards[0].zone;
var sameZone = cards.every(function (card) {
return card.zone === zone;
},this);
if (!sameZone || zone.constructor === TileZone) {
zone = this.game.buttonZone;
} else if (msg.label === 'GROW') {
// 根据 有k 的反馈,把成长按钮放到LRIG上.
zone = this.game.player.lrigZone;
}
zone.addButton(msg.title,this.popDialogBind(msg));
if (!msg.min) {
this.game.buttonZone.addButton(Localize.giveUp(msg.label),this.sendBind(msg));
}
} else {
this.showMsgButtons(msg);
}
}
},this);
};
Selector.prototype.select = function (msg,idx) {
if (this.spectating) return;
if (isNum(idx)) {
this.selectedIndexes.push(idx);
}
if (this.selectedIndexes.length >= msg.max) {
this.send(msg);
return;
}
this.removeButtons();
this.showMsgButtons(msg);
};
Selector.prototype.selectBind = function (msg,idx) {
return this.select.bind(this,msg,idx);
};
Selector.prototype.unselect = function (msg,idx) {
if (this.spectating) return;
removeFromArr(idx,this.selectedIndexes);
this.removeButtons();
if (this.selectedIndexes.length) {
this.showMsgButtons(msg);
} else {
this.showButtons();
}
};
Selector.prototype.unselectBind = function (msg,idx) {
return this.unselect.bind(this,msg,idx);
};
Selector.prototype.showMsgButtons = function (msg) {
msg.cards.forEach(function (card,idx) {
if (inArr(idx,this.selectedIndexes)) {
card.addButton('-'+msg.title,this.unselectBind(msg,idx));
} else {
card.addButton(msg.title,this.selectBind(msg,idx));
}
},this);
if (this.selectedIndexes.length >= msg.min) {
var txt;
if (this.selectedIndexes.length) {
txt = Localize('buttonTitle','END_SELECT');
} else {
txt = Localize.giveUp(msg.label);
}
this.game.buttonZone.addButton(txt,this.sendBind(msg));
}
};
Selector.prototype.send = function (msg,selectedIndexes) {
if (this.spectating) return;
if (!isArr(selectedIndexes)) {
selectedIndexes = this.selectedIndexes;
}
this.game.input(msg.label,selectedIndexes.slice());
console.log('game.input("'+msg.label+'",['+selectedIndexes.toString()+']);');
this.clear();
};
Selector.prototype.sendBind = function (msg) {
return this.send.bind(this,msg);
};
Selector.prototype.popDialog = function (msg) {
var title = Localize.labelToDialogTitle(msg.label);
var cards = msg.extraCards;
// if (msg.min === 1 && msg.max === 1) {
// if (msg.descriptions.length) {
// var sample = cards[0];
// var sameCard = cards.every(function (card) {
// return card === sample;
// },this);
// if (sameCard) {
// this.game.dialog.selectText(title,msg.descriptions,true,function (idx) {
// this.send(msg,[idx]);
// }.bind(this));
// return;
// }
// } else {
// this.game.dialog.selectCard(title,msg.cards,true,function (idx) {
// this.send(msg,[idx]);
// }.bind(this));
// return;
// }
// }
var arg = {
min: msg.min,
max: msg.max,
texts: msg.descriptions,
canClose: true,
careOrder: msg.careOrder,
targets: msg.cards
};
this.game.dialog.selectSomeCards(title,cards,arg,this.sendBind(msg));
};
Selector.prototype.popDialogBind = function (msg) {
return this.popDialog.bind(this,msg);
};
Selector.prototype.removeButtons = function () {
this.game.removeButtons();
};
Selector.prototype.autoPop = function () {
if (this.msgs.length === 1 && this._autoPopMsg) {
if (this._autoPopMsg.label === 'SPELL_CUT_IN') return;
this.popDialog(this._autoPopMsg);
}
};
Selector.prototype.clear = function () {
this.removeButtons();
this.game.dialog.close();
this.selectedIndexes.length = 0;
this.msgs.length = 0;
this._autoPopMsg = null;
};