/** * Generates an array or items * for a given type * * @param {string} entryType * @param {Object} model * @return {Array} */ function getItemsOfType(entryType, model) { let allItems = getItems(model); let items = _(allItems) .filter({entryType: entryType}) .uniq() .value() || []; return generateTextualItems(items, model); }
static validSpells(player) { return _(Spells) .values() .filter(spellData => { return _.filter(spellData.tiers, tier => { return (tier.profession === player.professionName || (player.$secondaryProfessions && _.includes(player.$secondaryProfessions, tier.profession))) && tier.level <= player.level; }).length > 0; }) .value(); }
.every(requirement => { if (requirement.startsWith('a')) { const name = _(requirement).trimStart().replace('aReq', '').replace(/_/g, ' '); const tier = item[requirement]; return this.$achievements.hasAchievement(name) && this.$achievements.hasAchievementAtTier(name, tier); } else if (requirement.startsWith('c')) { const name = _(requirement).trimStart().replace('cReq', '').replace(/_/g, ' '); const number = item[requirement]; return this.$collectibles.hasTotalCollectibleAtNumber(name, number); } else if (requirement.startsWith('s')) { let statisticName = _(requirement).trimStart().replace('sReq', '').replace(/\*/g, ' ').split(' '); const requiredNumber = item[requirement]; if (statisticName[0] === 'Boss_Kills') statisticName[0] = 'BossKills'; if (statisticName[0] === 'Regions' || statisticName[0] === 'Maps' || statisticName[0] === 'BossKills') statisticName.unshift('Character'); statisticName = statisticName.join('.').replace(/_/g, ' '); return this.$statistics.getStat(statisticName) >= requiredNumber; } return false; }) : false;
static operateOn(player) { const member = _(player.party.players) .sortBy(['level']) .head(); const percent = Event.chance.floating({ fixed: 5, min: 0.01, max: 0.03 }); const xpMod = Math.floor(member._xp.maximum * percent); const eventText = this.eventText('blessXpParty', player, { xp: xpMod, partyName: player.party.name }); _.each(player.party.players, member => { const totalXp = member.gainXp(xpMod, false); // recalculate for the modified value const myPercent = xpMod/member._xp.maximum; this.emitMessage({ affected: [member], eventText: `${eventText} [+${totalXp.toLocaleString()} xp, ~${(myPercent*100).toFixed(2)}%]`, category: MessageCategories.XP }); if(!member.$statistics) return; member.$statistics.batchIncrement(['Character.Events', 'Character.Event.XPBlessParty']); }); }
canEquip(item, rangeBoostMultiplier = 1, useCheckRangeMultiplier = true) { const myItem = this.equipment[item.type]; const checkScore = item.score; const myScore = myItem ? myItem.score : -1000; const itemFindRange = rangeBoostMultiplier * this.liveStats.itemFindRange; let checkRangeMultiplier = this.$personalities && this.$personalities.isActive('SharpEye') ? 0.65 : 0.05; if(!useCheckRangeMultiplier) { checkRangeMultiplier = 0; } const metRequirements = (this.isPlayer) ? _(item) .keys() .filter(stat => _.includes(stat, 'Req')) .every(requirement => { if (requirement.startsWith('a')) { const name = _(requirement).trimStart().replace('aReq', '').replace(/_/g, ' '); const tier = item[requirement]; return this.$achievements.hasAchievement(name) && this.$achievements.hasAchievementAtTier(name, tier); } else if (requirement.startsWith('c')) { const name = _(requirement).trimStart().replace('cReq', '').replace(/_/g, ' '); const number = item[requirement]; return this.$collectibles.hasTotalCollectibleAtNumber(name, number); } else if (requirement.startsWith('s')) { let statisticName = _(requirement).trimStart().replace('sReq', '').replace(/\*/g, ' ').split(' '); const requiredNumber = item[requirement]; if (statisticName[0] === 'Boss_Kills') statisticName[0] = 'BossKills'; if (statisticName[0] === 'Regions' || statisticName[0] === 'Maps' || statisticName[0] === 'BossKills') statisticName.unshift('Character'); statisticName = statisticName.join('.').replace(/_/g, ' '); return this.$statistics.getStat(statisticName) >= requiredNumber; } return false; }) : false; return checkScore > 0 && checkScore > (myScore * checkRangeMultiplier) && checkScore <= itemFindRange && metRequirements; }
import GameJoin from './game-join' import GameChatlist from './game-chatlist' let turnPhaseOrderIndex = 0 let GameView = React.createClass({ mixins: [State], onNewOrder(move) { move.id = turnPhaseOrderIndex++ let order = move let prevOrder = _.find(this.state.pendingOrders, {armyId: order.armyId}); if (prevOrder === undefined) { prevOrder = {at: order.at, to: order.at} } this.setState({pendingOrders: _(this.state.pendingOrders) .reject({armyId: order.armyId}) .reject({to: prevOrder.at}) .reject({to: prevOrder.to}) .concat(order) .value() }) }, removeDependentMoves(pendingOrders, order) { return _(pendingOrders) .reject({to: order.at}) .reject({from: order.at}) }, getInitialState() {
let messagesThatFailed = _.reject(this.pending, (msg) => _(this.messages).pluck('id').contains(msg.id))