|
- let generator = require('../../items/generator');
- let skins = require('../../config/skins');
- let factions = require('../../config/factions');
- let itemEffects = require('../../items/itemEffects');
-
- module.exports = {
- baseItems: [],
-
- cdMax: 10,
-
- blueprint: null,
-
- init: function (blueprint) {
- this.baseItems = this.items;
- this.items = {};
-
- this.faction = blueprint.faction;
- this.blueprint = blueprint;
- },
-
- getItems: function (requestedBy) {
- let name = requestedBy.name;
- let requestLevel = requestedBy.stats.values.level;
-
- let list = this.items[name];
- if (!list) {
- list = {
- items: [],
- level: requestLevel,
- cd: this.cdMax
- };
-
- this.items[name] = list;
- this.regenList(list);
- } else if (list.level !== requestLevel)
- this.regenList(list);
-
- let reputation = requestedBy.reputation;
-
- let result = list.items
- .map(function (i) {
- let item = extend(true, {}, i);
-
- if (item.effects) {
- item.stats = {
- stats: '???'
- };
- item.quality = 0;
- item.name = item.type;
-
- item.effects = item.effects
- .map(function (e) {
- if (e.factionId) {
- return {
- factionId: e.factionId,
- text: e.text,
- properties: e.properties
- };
- }
- let effectUrl = itemEffects.get(e.type);
- let effectModule = require('../../' + effectUrl);
-
- return {
- text: effectModule.events.onGetText(item)
- };
- });
- }
-
- if (item.factions) {
- item.factions = item.factions.map(function (f) {
- let faction = reputation.getBlueprint(f.id);
- let factionTier = reputation.getTier(f.id);
-
- let noEquip = null;
- if (factionTier < f.tier)
- noEquip = true;
-
- return {
- name: faction.name,
- tier: f.tier,
- tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
- noEquip: noEquip
- };
- }, this);
- }
-
- return item;
- });
-
- return result;
- },
-
- regenList: function (list) {
- let blueprint = this.blueprint;
-
- list.items = null;
- list.items = [];
-
- let faction = factions.getFaction(blueprint.faction.id);
- let statGenerator = faction.uniqueStat;
-
- let itemCount = blueprint.items.min + ~~(Math.random() * (blueprint.items.max - blueprint.items.min));
- for (let i = 0; i < itemCount; i++) {
- let minLevel = blueprint.items.minLevel || Math.max(1, list.level * 0.75);
- let maxLevel = blueprint.items.maxLevel || (list.level * 1.25);
- let level = ~~(minLevel + (Math.random() * (maxLevel - minLevel)));
-
- let item = generator.generate({
- noSpell: true,
- magicFind: 150,
- slot: blueprint.items.slot,
- level: level
- });
-
- let randomQuality = ~~(Math.random() * 5);
- item.worth = Math.pow(item.level, 1.5) + (Math.pow((randomQuality + 1), 2) * 10);
-
- let id = 0;
- list.items.forEach(function (checkItem) {
- if (checkItem.id >= id)
- id = checkItem.id + 1;
- });
-
- item.id = id;
-
- generator.removeStat(item);
- statGenerator.generate(item);
-
- item.factions = [{}];
- item.factions[0].id = blueprint.faction.id;
- item.factions[0].tier = blueprint.faction.tier;
-
- list.items.push(item);
- }
-
- let baseItems = this.baseItems;
- let bLen = baseItems.length;
- for (let i = 0; i < bLen; i++)
- list.items.push(baseItems[i]);
-
- let extra = blueprint.items.extra;
- if (!extra)
- return;
-
- let eLen = extra.length;
- for (let i = 0; i < eLen; i++) {
- let e = extra[i];
-
- let item = extend(true, {}, e);
-
- if (item.type === 'skin') {
- let skinBlueprint = skins.getBlueprint(item.id);
- item.skinId = item.id;
- item.name = skinBlueprint.name;
- item.sprite = skinBlueprint.sprite;
- } else if (item.generate) {
- let generated = generator.generate(item);
- if (item.worth)
- generated.worth = item.worth;
- if (item.infinite)
- generated.infinite = true;
-
- if (item.factions)
- generated.factions = item.factions;
-
- item = generated;
- }
-
- let id = 0;
- list.items.forEach(function (checkItem) {
- if (checkItem.id >= id)
- id = checkItem.id + 1;
- });
-
- item.id = id;
-
- list.items.push(item);
- }
- },
-
- canBuy: function (itemId, requestedBy, action) {
- let item = null;
- if (action === 'buy')
- item = this.findItem(itemId, requestedBy.name);
- else if (action === 'buyback')
- item = this.findBuyback(itemId, requestedBy.name);
-
- let result = true;
- if (item.factions)
- result = requestedBy.reputation.canEquipItem(item);
-
- if (!result) {
- requestedBy.instance.syncer.queue('onGetMessages', {
- id: requestedBy.id,
- messages: [{
- class: 'color-redA',
- message: 'your reputation is too low to buy that item',
- type: 'info'
- }]
- }, [requestedBy.serverId]);
- }
-
- return result;
- },
-
- findItem: function (itemId, sourceName) {
- let list = this.items[sourceName];
- if (!list)
- return null;
-
- return list.items.find(i => i.id === itemId);
- },
-
- removeItem: function (itemId, sourceName) {
- let list = this.items[sourceName];
- if (!sourceName)
- return null;
-
- return list.items.spliceFirstWhere(i => i.id === itemId);
- }
- };
|