|
- let generatorStats = require('./generators/stats');
- let generatorSlots = require('./generators/slots');
- let generatorTypes = require('./generators/types');
- let generatorSpells = require('./generators/spellbook');
- let salvager = require('./salvager');
- let configCurrencies = require('./config/currencies');
- let configSlots = require('./config/slots');
- let generator = require('./generator');
-
- module.exports = {
- enchant: function (obj, item, msg) {
- let inventory = obj.inventory;
- let config = this.getEnchantMaterials(item, msg.action);
-
- let success = true;
- config.materials.forEach(function (m) {
- let hasMaterial = inventory.items.find(i => i.name === m.name);
- if (hasMaterial)
- hasMaterial = hasMaterial.quantity >= m.quantity;
- if (!hasMaterial)
- success = false;
- });
-
- if (!success) {
- inventory.resolveCallback(msg);
- return;
- }
-
- let result = {
- item: item,
- addStatMsgs: []
- };
-
- config.materials.forEach(function (m) {
- let invMaterial = inventory.items.find(i => i.name === m.name);
- inventory.destroyItem(invMaterial.id, m.quantity);
- });
-
- if (msg.action === 'reroll') {
- let enchantedStats = item.enchantedStats || {};
- delete item.enchantedStats;
- delete msg.addStatMsgs;
-
- if ((item.stats) && (item.stats.lvlRequire)) {
- item.level += item.stats.lvlRequire;
- delete item.originalLevel;
- }
-
- item.stats = {};
- let bpt = {
- slot: item.slot,
- type: item.type,
- sprite: item.sprite,
- spritesheet: item.spritesheet
- };
- generatorSlots.generate(item, bpt);
- generatorTypes.generate(item, bpt);
- generatorStats.generate(item, bpt);
-
- for (let p in enchantedStats) {
- if (!item.stats[p])
- item.stats[p] = 0;
-
- item.stats[p] += enchantedStats[p];
-
- if (p === 'lvlRequire') {
- item.level -= enchantedStats[p];
- if (item.level < 1)
- item.level = 1;
- }
- }
- item.enchantedStats = enchantedStats;
- } else if (msg.action === 'relevel') {
- if (item.slot === 'tool')
- return;
-
- let offset = 1 + ~~(Math.random() * 2);
-
- if (!item.originalLevel)
- item.level = Math.min(20, item.level + offset);
- else {
- offset = Math.min(20 - item.originalLevel, offset);
- item.originalLevel = Math.min(20, item.originalLevel + offset);
- item.level = Math.min(20, item.level + offset);
- }
- } else if (msg.action === 'reslot') {
- if (item.effects)
- return;
-
- if (item.originalLevel)
- item.level = item.originalLevel;
-
- let enchantedStats = item.enchantedStats || {};
- delete item.enchantedStats;
- delete msg.addStatMsgs;
-
- let newItem = generator.generate({
- slot: configSlots.getRandomSlot(item.slot),
- level: item.level,
- quality: item.quality,
- stats: Object.keys(item.stats || {})
- });
-
- delete item.spritesheet;
- delete item.stats;
- delete item.spell;
-
- for (let p in enchantedStats) {
- if (!newItem.stats[p])
- newItem.stats[p] = 0;
-
- newItem.stats[p] += enchantedStats[p];
-
- if (p === 'lvlRequire') {
- newItem.level -= enchantedStats[p];
- if (newItem.level < 1)
- newItem.level = 1;
- }
- }
- newItem.enchantedStats = enchantedStats;
-
- extend(true, item, newItem);
- } else if (msg.action === 'reforge') {
- if (!item.spell)
- return;
-
- let spellName = item.spell.name.toLowerCase();
- let oldSpell = item.spell;
- delete item.spell;
-
- generatorSpells.generate(item, {
- spellName: spellName
- });
- item.spell = extend(true, oldSpell, item.spell);
- } else if (msg.action === 'scour') {
- if (!item.power)
- return;
-
- for (let p in item.enchantedStats) {
- let value = item.enchantedStats[p];
-
- if (item.stats[p]) {
- result.addStatMsgs.push({
- stat: p,
- value: -value
- });
- item.stats[p] -= value;
- if (item.stats[p] <= 0)
- delete item.stats[p];
-
- if (p === 'lvlRequire') {
- item.level += value;
- delete item.originalLevel;
- }
- }
- }
-
- delete item.enchantedStats;
- delete item.power;
- } else {
- let newPower = (item.power || 0) + 1;
- if (newPower > 3) {
- inventory.resolveCallback(msg);
- return;
- }
-
- item.power = newPower;
- this.addStat(item, result);
- }
-
- obj.syncer.setArray(true, 'inventory', 'getItems', item);
-
- inventory.resolveCallback(msg, result);
- },
-
- addStat: function (item, result) {
- generatorStats.generate(item, {
- statCount: 1
- }, result);
- },
-
- getEnchantMaterials: function (item, action) {
- let result = null;
-
- if (action === 'reroll')
- result = [configCurrencies.getCurrencyFromAction('reroll')];
- else if (action === 'relevel')
- result = [configCurrencies.getCurrencyFromAction('relevel')];
- else if (action === 'reslot')
- result = [configCurrencies.getCurrencyFromAction('reslot')];
- else if (action === 'reforge')
- result = [configCurrencies.getCurrencyFromAction('reforge')];
- else if (action === 'scour')
- result = [configCurrencies.getCurrencyFromAction('scour')];
- else {
- let powerLevel = item.power || 0;
- let mult = null;
- if (powerLevel < 3)
- mult = [5, 10, 20][powerLevel];
- else
- return;
-
- result = salvager.salvage(item, true);
- result.forEach(r => r.quantity = Math.max(1, ~~(r.quantity * mult)));
- }
-
- return {
- materials: result
- };
- }
- };
|