From b30c2b654495ce601a42e3b7094aa509fc9b554d Mon Sep 17 00:00:00 2001 From: big bad waffle Date: Mon, 4 Dec 2017 16:28:08 +0200 Subject: [PATCH] legendary item effects --- src/client/js/components/inventory.js | 14 ++++++-- .../ui/templates/inventory/inventory.js | 8 ++--- src/server/components/inventory.js | 26 ++++++++------- src/server/config/effects/effectSlowed.js | 27 +++++++-------- src/server/config/itemEffects/freezeOnHit.js | 23 +++++++++++++ src/server/items/generator.js | 9 +++-- src/server/items/generators/effects.js | 33 +++++++++++++++++++ src/server/items/generators/level.js | 18 ++++++---- src/server/items/generators/worth.js | 12 +++---- src/server/items/itemEffects.js | 24 ++++++++++++++ .../mods/event-xmas/factions/theWinterMan.js | 2 +- src/server/mods/feature-cards/cards.js | 27 +++++++++++++++ 12 files changed, 173 insertions(+), 50 deletions(-) create mode 100644 src/server/config/itemEffects/freezeOnHit.js create mode 100644 src/server/items/generators/effects.js create mode 100644 src/server/items/itemEffects.js diff --git a/src/client/js/components/inventory.js b/src/client/js/components/inventory.js index 03a0b1f4..faa781c8 100644 --- a/src/client/js/components/inventory.js +++ b/src/client/js/components/inventory.js @@ -19,8 +19,12 @@ define([ events.emit('onGetItems', this.items); }, extend: function (blueprint) { - if (blueprint.destroyItems) + var rerender = false; + + if (blueprint.destroyItems) { + rerender = true; events.emit('onDestroyItems', blueprint.destroyItems); + } if (blueprint.getItems) { var items = this.items; @@ -40,6 +44,8 @@ define([ return (item.id == nId); }); if (findItem) { + rerender = (findItem.pos != nItem.pos); + for (var p in findItem) { delete findItem[p]; } @@ -49,13 +55,15 @@ define([ newItems.splice(i, 1); i--; nLen--; - } else + } else { + rerender = true; nItem.isNew = true; + } } this.items.push.apply(this.items, blueprint.getItems || []); - events.emit('onGetItems', this.items); + events.emit('onGetItems', this.items, rerender); } } }; diff --git a/src/client/ui/templates/inventory/inventory.js b/src/client/ui/templates/inventory/inventory.js index 6f8d02cd..d1bf715c 100644 --- a/src/client/ui/templates/inventory/inventory.js +++ b/src/client/ui/templates/inventory/inventory.js @@ -393,19 +393,17 @@ define([ events.emit('onShowItemTooltip', item, ttPos, compare, false, this.shiftDown); }, - onGetItems: function (items) { + onGetItems: function (items, rerender) { this.items = items; - if (this.shown) + if ((this.shown) && (rerender)) this.build(); }, onDestroyItems: function (itemIds) { itemIds.forEach(function (id) { var item = this.items.find(i => i.id == id); - if (item == this.hoverItem) { - //this.hoverItem = null; + if (item == this.hoverItem) this.hideTooltip(); - } this.items.spliceWhere(i => i.id == id); }, this); diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index e99f8df3..f3a928a8 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -6,7 +6,8 @@ define([ 'config/classes', 'mtx/mtx', 'config/factions', - 'misc/events' + 'misc/events', + 'items/itemEffects' ], function ( generator, salvager, @@ -15,7 +16,8 @@ define([ classes, mtx, factions, - events + events, + itemEffects ) { return { type: 'inventory', @@ -93,15 +95,16 @@ define([ var mtxModule = require(mtxUrl); e.events = mtxModule.events; - return; + } else if (e.factionId) { + var faction = factions.getFaction(e.factionId); + var statGenerator = faction.uniqueStat; + statGenerator.generate(item); + } else { + var effectUrl = itemEffects.get(e.type); + var effectModule = require(effectUrl); + + e.events = effectModule.events; } - - if (!e.factionId) - return; - - var faction = factions.getFaction(e.factionId); - var statGenerator = faction.uniqueStat; - statGenerator.generate(item); }); } @@ -913,7 +916,8 @@ define([ factionId: e.factionId, text: e.text, properties: e.properties, - mtx: e.mtx + mtx: e.mtx, + name: e.name })); } diff --git a/src/server/config/effects/effectSlowed.js b/src/server/config/effects/effectSlowed.js index ebff39e6..8679a65f 100644 --- a/src/server/config/effects/effectSlowed.js +++ b/src/server/config/effects/effectSlowed.js @@ -1,35 +1,36 @@ define([ - -], function( - + +], function ( + ) { return { type: 'slowed', + chance: 0.3, events: { - beforeMove: function(targetPos) { - if (Math.random() < 0.3) + beforeMove: function (targetPos) { + if (Math.random() < this.chance) return; targetPos.success = false; }, - beforeDealDamage: function(damage) { + beforeDealDamage: function (damage) { if (!damage) return; - - if (Math.random() < 0.3) + + if (Math.random() < this.chance) return; - + damage.failed = true; }, - beforeCastSpell: function(successObj) { - if (Math.random() < 0.3) + beforeCastSpell: function (successObj) { + if (Math.random() < this.chance) return; - + successObj.success = false; } } }; -}); \ No newline at end of file +}); diff --git a/src/server/config/itemEffects/freezeOnHit.js b/src/server/config/itemEffects/freezeOnHit.js new file mode 100644 index 00000000..89aed737 --- /dev/null +++ b/src/server/config/itemEffects/freezeOnHit.js @@ -0,0 +1,23 @@ +define([ + +], function ( + +) { + return { + events: { + afterDealDamage: function (item, damage, target) { + var rolls = item.effects.find(e => (e.type == 'freezeOnHit')).rolls; + + var chanceRoll = Math.random() * 100; + if (chanceRoll >= rolls.chance) + return; + + target.effects.addEffect({ + type: 'slowed', + chance: 1, + ttl: rolls.duration + }); + } + } + }; +}); diff --git a/src/server/items/generator.js b/src/server/items/generator.js index 371500a6..c201cbcf 100644 --- a/src/server/items/generator.js +++ b/src/server/items/generator.js @@ -8,13 +8,12 @@ define([ 'items/generators/worth', 'items/generators/quantity', 'items/generators/spellbook', - 'items/generators/currency' + 'items/generators/currency', + 'items/generators/effects' ], function ( - g1, g2, g3, g4, g5, g6, g7, g8, - g9, - g10 + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11 ) { - var generators = [].slice.apply(arguments, [0, 7]); + var generators = [g1, g2, g3, g4, g5, g6, g11, g7]; var materialGenerators = [g6, g8]; var spellGenerators = [g1, g9]; var currencyGenerators = [g10]; diff --git a/src/server/items/generators/effects.js b/src/server/items/generators/effects.js new file mode 100644 index 00000000..b36095d8 --- /dev/null +++ b/src/server/items/generators/effects.js @@ -0,0 +1,33 @@ +define([ + +], function ( + +) { + return { + generate: function (item, blueprint) { + if (!blueprint.effects) + return; + + item.effects = blueprint.effects.map(function (e) { + var rolls = e.rolls; + var newRolls = {}; + for (var p in rolls) { + var isInt = (p.indexOf('i_') == 0); + var fieldName = p.replace('i_', ''); + + var range = rolls[p]; + var value = range[0] + (Math.random() * (range[1] - range[0])); + if (isInt) + value = ~~value; + + newRolls[fieldName] = value; + } + + return { + type: e.type, + rolls: newRolls + }; + }); + } + }; +}); diff --git a/src/server/items/generators/level.js b/src/server/items/generators/level.js index 80d853a3..78f7b36d 100644 --- a/src/server/items/generators/level.js +++ b/src/server/items/generators/level.js @@ -1,11 +1,17 @@ define([ - -], function( - + +], function ( + ) { return { - generate: function(item, blueprint) { - item.level = ~~(blueprint.level || 1); + generate: function (item, blueprint) { + var level = blueprint.level; + if (level instanceof Array) { + item.level = level[0] + ~~(Math.random() * (level[1] - level[0])); + return; + } + + item.level = ~~(level || 1); } }; -}); \ No newline at end of file +}); diff --git a/src/server/items/generators/worth.js b/src/server/items/generators/worth.js index 75512033..a9644b65 100644 --- a/src/server/items/generators/worth.js +++ b/src/server/items/generators/worth.js @@ -1,11 +1,11 @@ define([ - -], function( - + +], function ( + ) { return { - generate: function(item, blueprint) { - item.worth = Math.pow(item.level, 1.5) + (Math.pow((item.quality + 1), 2) * 10); + generate: function (item, blueprint) { + item.worth = ~~(Math.pow(item.level, 1.5) + (Math.pow((item.quality + 1), 2) * 10)); } }; -}); \ No newline at end of file +}); diff --git a/src/server/items/itemEffects.js b/src/server/items/itemEffects.js new file mode 100644 index 00000000..88b63881 --- /dev/null +++ b/src/server/items/itemEffects.js @@ -0,0 +1,24 @@ + define([ + 'misc/events' + ], function ( + events + ) { + var list = { + + }; + + return { + init: function () { + events.emit('onBeforeGetItemEffectList', list); + }, + + get: function (name) { + var res = list[name]; + + if (!res) + return 'config/itemEffects/' + name; + + return res; + } + }; + }); diff --git a/src/server/mods/event-xmas/factions/theWinterMan.js b/src/server/mods/event-xmas/factions/theWinterMan.js index f64f2a94..c5b018f4 100644 --- a/src/server/mods/event-xmas/factions/theWinterMan.js +++ b/src/server/mods/event-xmas/factions/theWinterMan.js @@ -6,7 +6,7 @@ define([ return { id: 'theWinterMan', name: 'The Winter Man', - description: ``, + description: `Bearer of Gifts, Friend of the Downtrodden and the Watcher in the Snow.`, rewards: { diff --git a/src/server/mods/feature-cards/cards.js b/src/server/mods/feature-cards/cards.js index 3a54b597..9e776102 100644 --- a/src/server/mods/feature-cards/cards.js +++ b/src/server/mods/feature-cards/cards.js @@ -23,6 +23,12 @@ define([ reward: 'Perfect Level 10 Ring', setSize: 3, mobName: 'flamingo' + }, + 'Benthic Incantation': { + chance: 0.05, + reward: `Princess Morgawsa's Trident`, + setSize: 7, + zone: 'estuary' } }; @@ -132,6 +138,27 @@ define([ perfection: 1, slot: 'finger' }); + }, + + "Princess Morgawsa's Trident": function () { + return itemGenerator.generate({ + name: `Princess Morgawsa's Trident`, + level: [10, 15], + quality: 4, + noSpell: true, + slot: 'twoHanded', + sprite: [0, 0], + spritesheet: '../../../images/legendaryItems.png', + type: 'Trident', + spellName: 'magic missile', + effects: [{ + type: 'freezeOnHit', + rolls: { + i_chance: [2, 5], + i_duration: [2, 4] + } + }] + }); } } };