From 387279ee935f792dd452b0b460d52c319f783372 Mon Sep 17 00:00:00 2001 From: big bad waffle Date: Tue, 6 Feb 2018 14:37:48 +0200 Subject: [PATCH 1/3] fixes #525 --- .../createCharacter/createCharacter.js | 2 +- .../ui/templates/createCharacter/styles.less | 4 +--- src/server/config/animations.js | 4 +--- src/server/config/classes.js | 17 +---------------- src/server/config/skins.js | 18 +++++++++--------- src/server/mods/class-necromancer/index.js | 6 +++--- src/server/mods/event-halloween/index.js | 2 +- 7 files changed, 17 insertions(+), 36 deletions(-) diff --git a/src/client/ui/templates/createCharacter/createCharacter.js b/src/client/ui/templates/createCharacter/createCharacter.js index a289a6ba..f80a95ab 100644 --- a/src/client/ui/templates/createCharacter/createCharacter.js +++ b/src/client/ui/templates/createCharacter/createCharacter.js @@ -167,7 +167,7 @@ define([ this.costume = (this.costume + 1) % spriteList.length; this.skinId = spriteList[this.costume].id; - el.html((this.costume + 1) + '/' + spriteList.length); + el.html(spriteList[this.costume].name); this.setSprite(); }, diff --git a/src/client/ui/templates/createCharacter/styles.less b/src/client/ui/templates/createCharacter/styles.less index 1f5b4d6c..67b548fb 100644 --- a/src/client/ui/templates/createCharacter/styles.less +++ b/src/client/ui/templates/createCharacter/styles.less @@ -47,9 +47,7 @@ } .txtCostume { - &:before { - content: 'costume '; - } + } } diff --git a/src/server/config/animations.js b/src/server/config/animations.js index 5b61bbc4..da64e8fe 100644 --- a/src/server/config/animations.js +++ b/src/server/config/animations.js @@ -40,9 +40,7 @@ define([ frames: 5, frameDelay: 3 } - } - }, - cleric: { + }, '4': { hitStaff: { sheet: 'animChar', diff --git a/src/server/config/classes.js b/src/server/config/classes.js index e2faa472..7590fa97 100644 --- a/src/server/config/classes.js +++ b/src/server/config/classes.js @@ -9,10 +9,6 @@ define([ x: 0, y: 0 }, - cleric: { - x: 1, - y: 0 - }, wizard: { x: 2, y: 0 @@ -24,7 +20,6 @@ define([ }, spells: { wizard: ['magic missile', 'ice spear'], - cleric: ['smite', 'consecrate'], warrior: ['slash', 'charge'], thief: ['flurry', 'smokebomb'] }, @@ -38,15 +33,6 @@ define([ int: 1 } }, - cleric: { - values: { - hpMax: 60 - }, - vitScale: 10, - gainStats: { - int: 1 - } - }, warrior: { values: { hpMax: 80 @@ -68,9 +54,8 @@ define([ }, weapons: { wizard: 'Gnarled Staff', - cleric: 'Wand', thief: 'Dagger', - warrior: 'Axe' + warrior: 'Sword' }, getSpritesheet: function (className) { diff --git a/src/server/config/skins.js b/src/server/config/skins.js index 97b94c98..39e84824 100644 --- a/src/server/config/skins.js +++ b/src/server/config/skins.js @@ -31,13 +31,13 @@ define([ 'cleric 1': { name: 'Cleric 1', sprite: [4, 0], - class: 'cleric', + class: 'wizard', default: true }, 'cleric 2': { name: 'Cleric 2', sprite: [5, 0], - class: 'cleric', + class: 'wizard', default: true }, 'thief 1': { @@ -70,7 +70,7 @@ define([ name: 'Diviner', spritesheet: 'images/skins/0001.png', sprite: [1, 0], - class: 'cleric' + class: 'wizard' }, '1.3': { name: 'Cutthroat', @@ -88,7 +88,7 @@ define([ name: 'Occultist', spritesheet: 'images/skins/0001.png', sprite: [4, 0], - class: 'necromancer' + class: 'wizard' }, //Templar Skin Pack @@ -96,31 +96,31 @@ define([ name: 'Crusader 1', spritesheet: 'images/skins/0010.png', sprite: [0, 0], - class: ['cleric', 'warrior'] + class: ['wizard', 'warrior'] }, '2.2': { name: 'Crusader 2', spritesheet: 'images/skins/0010.png', sprite: [1, 0], - class: ['cleric', 'warrior'] + class: ['wizard', 'warrior'] }, '2.3': { name: 'Crusader 3', spritesheet: 'images/skins/0010.png', sprite: [2, 0], - class: ['cleric', 'warrior'] + class: ['wizard', 'warrior'] }, '2.4': { name: 'Crusader 4', spritesheet: 'images/skins/0010.png', sprite: [3, 0], - class: ['cleric', 'warrior'] + class: ['wizard', 'warrior'] }, '2.5': { name: 'Grand Crusader', spritesheet: 'images/skins/0010.png', sprite: [4, 0], - class: ['cleric', 'warrior'] + class: ['wizard', 'warrior'] } }; diff --git a/src/server/mods/class-necromancer/index.js b/src/server/mods/class-necromancer/index.js index e81c3297..82466d51 100644 --- a/src/server/mods/class-necromancer/index.js +++ b/src/server/mods/class-necromancer/index.js @@ -85,7 +85,7 @@ define([ }, beforeGetClasses: function (classes) { - classes.spells.necromancer = ['harvest life', 'summon skeleton']; + /*classes.spells.necromancer = ['harvest life', 'summon skeleton']; classes.stats.necromancer = { values: { hpMax: 65 @@ -102,7 +102,7 @@ define([ spritesheet: `${this.folderName}/images/avatar.png`, x: 0, y: 0 - }; + };*/ }, beforeGetSpellTemplate: function (spell) { @@ -118,7 +118,7 @@ define([ skins['necromancer 1'] = { name: 'Necromancer 1', sprite: [0, 0], - class: 'necromancer', + class: 'wizard', spritesheet: `${this.folderName}/images/inGameSprite.png`, default: true }; diff --git a/src/server/mods/event-halloween/index.js b/src/server/mods/event-halloween/index.js index 6d022ed1..cd521109 100644 --- a/src/server/mods/event-halloween/index.js +++ b/src/server/mods/event-halloween/index.js @@ -106,7 +106,7 @@ define([ skins['pumpkin-head necromancer'] = { name: 'Pumpkin-Head Necromancer', sprite: [0, 0], - class: 'necromancer', + class: 'wizard', spritesheet: `${this.folderName}/images/skins.png` }; }, From 5270a955f9d9e35464ebc31004a020f55a0ff6ae Mon Sep 17 00:00:00 2001 From: big bad waffle Date: Tue, 6 Feb 2018 16:27:57 +0200 Subject: [PATCH 2/3] started making skins class agnostic --- .../createCharacter/createCharacter.js | 6 +- src/server/components/auth.js | 4 +- src/server/config/classes.js | 1 + src/server/config/roleSkins.js | 53 +++++++ src/server/config/roles.js | 24 +++- src/server/config/skins.js | 134 +++++++----------- src/server/mods/class-necromancer/index.js | 5 +- src/server/mods/event-halloween/index.js | 2 +- .../event-xmas/maps/tutorial/events/xmas.js | 2 +- 9 files changed, 130 insertions(+), 101 deletions(-) create mode 100644 src/server/config/roleSkins.js diff --git a/src/client/ui/templates/createCharacter/createCharacter.js b/src/client/ui/templates/createCharacter/createCharacter.js index f80a95ab..c38111bf 100644 --- a/src/client/ui/templates/createCharacter/createCharacter.js +++ b/src/client/ui/templates/createCharacter/createCharacter.js @@ -142,7 +142,7 @@ define([ changeClass: function (e) { var el = $(e.target); - var classes = Object.keys(this.classSprites); + var classes = ['wizard', 'warrior', 'thief']; var nextIndex = (classes.indexOf(el.html()) + 1) % classes.length; this.costume = -1; @@ -160,7 +160,7 @@ define([ changeCostume: function (e) { var el = $(e.target); - var spriteList = this.classSprites[this.class]; + var spriteList = this.classSprites; if (!spriteList) return; @@ -173,7 +173,7 @@ define([ }, setSprite: function () { - var classSprite = this.classSprites[this.class][this.costume]; + var classSprite = this.classSprites[this.costume]; var costume = classSprite.sprite.split(','); var spirteX = -costume[0] * 8; var spriteY = -costume[1] * 8; diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 011f83b0..741e9a28 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -273,8 +273,8 @@ define([ var list = [...this.skins, ...roles.getSkins(this.username)]; var skinList = skins.getSkinList(list); - if (!skinList[character.class].some(s => (s.id == character.skinId))) { - character.skinId = character.class + ' 1'; + if (!skinList.some(s => (s.id == character.skinId))) { + character.skinId = '1.0'; character.cell = skins.getCell(character.skinId); character.sheetName = skins.getSpritesheet(character.skinId); diff --git a/src/server/config/classes.js b/src/server/config/classes.js index 7590fa97..1ef28abe 100644 --- a/src/server/config/classes.js +++ b/src/server/config/classes.js @@ -4,6 +4,7 @@ define([ events ) { var classes = { + list: ['warrior', 'wizard', 'thief'], portraits: { warrior: { x: 0, diff --git a/src/server/config/roleSkins.js b/src/server/config/roleSkins.js new file mode 100644 index 00000000..16eb63a2 --- /dev/null +++ b/src/server/config/roleSkins.js @@ -0,0 +1,53 @@ +define([ + +], function ( + +) { + var empty = []; + var regular = ['1.0', '1.2', '1.6']; + + var mtx = [ + ['10.0', '10.1', '10.2', '10.3', '10.4'], + ['11.0', '11.1', '11.2', '11.3', '11.4'] + ]; + var pA = []; + var pB = []; + var pC = []; + var pD = []; + + mtx.forEach(function (m) { + m.forEach(function (s, i) { + var has = [pD]; + if (i <= 2) + has.push(pC); + if (i <= 1) + has.push(pB); + if (i == 0) + has.push(pA); + + has.forEach(function (h) { + h.push(s); + }); + }); + }); + + return [ + //Regular Player + empty.concat(...regular), [], + [], + [], + [], + //Moderator + empty.concat(...regular), + //Patron Level 1 + empty.concat(...regular, ...pA), + //Patron Level 2 + empty.concat(...regular, ...pB), + //Patron Level 3 + empty.concat(...regular, ...pC), + //Patron Level 4 + empty.concat(...regular, ...pD), + //Admin + ['*'] + ]; +}); diff --git a/src/server/config/roles.js b/src/server/config/roles.js index 56739aa6..9e355a63 100644 --- a/src/server/config/roles.js +++ b/src/server/config/roles.js @@ -1,7 +1,7 @@ define([ - + './roleSkins' ], function ( - + roleSkins ) { return { accounts: { @@ -15,9 +15,7 @@ define([ sprite: [12, 0], keyId: 'world' }], - skins: [ - '1.1', '1.2', '1.3', '1.4', '1.5', 'bearded wizard', '2.1', '2.2', '2.3', '2.4', '2.5' - ] + skins: [] } }, @@ -77,7 +75,21 @@ define([ }, getSkins: function (account) { - return this.accounts[account] ? this.accounts[account].skins : []; + var skins = []; + var account = this.accounts[account] || { + skins: [] + }; + (account.skins || []).forEach(function (s) { + skins.push(s); + }); + + var roleSkinList = roleSkins[account.level || 0]; + roleSkinList.forEach(function (s) { + skins.push(s); + }); + + skins = skins.filter((s, i) => (skins.indexOf(s) == i)); + return skins; }, sendMessage: function (player, msg) { diff --git a/src/server/config/skins.js b/src/server/config/skins.js index 39e84824..20e90168 100644 --- a/src/server/config/skins.js +++ b/src/server/config/skins.js @@ -4,123 +4,96 @@ define([ events ) { var config = { - 'wizard 1': { + '1.0': { name: 'Wizard 1', - sprite: [2, 0], - class: 'wizard', - default: true + sprite: [2, 0] }, - 'wizard 2': { + '1.1': { name: 'Wizard 2', - sprite: [3, 0], - class: 'wizard', - default: true + sprite: [3, 0] }, - 'warrior 1': { + '1.2': { name: 'Warrior 1', - sprite: [1, 1], - class: 'warrior', - default: true + sprite: [1, 1] }, - 'warrior 2': { + '1.3': { name: 'Warrior 2', - sprite: [2, 1], - class: 'warrior', - default: true + sprite: [2, 1] }, - 'cleric 1': { + '1.4': { name: 'Cleric 1', - sprite: [4, 0], - class: 'wizard', - default: true + sprite: [4, 0] }, - 'cleric 2': { + '1.5': { name: 'Cleric 2', - sprite: [5, 0], - class: 'wizard', - default: true + sprite: [5, 0] }, - 'thief 1': { + '1.6': { name: 'Thief 1', - sprite: [6, 0], - class: 'thief', - default: true + sprite: [6, 0] }, - 'thief 2': { + '1.7': { name: 'Thief 2', - sprite: [7, 0], - class: 'thief', - default: true + sprite: [7, 0] }, - 'gaekatla druid': { + '2.0': { name: 'Skin: Gaekatlan Druid', - sprite: [0, 4], - class: 'cleric' + sprite: [0, 4] }, //Elite Skin Pack - '1.1': { + '10.0': { name: 'Sorcerer', spritesheet: 'images/skins/0001.png', - sprite: [0, 0], - class: 'wizard' + sprite: [0, 0] }, - '1.2': { + '10.1': { name: 'Diviner', spritesheet: 'images/skins/0001.png', - sprite: [1, 0], - class: 'wizard' + sprite: [1, 0] }, - '1.3': { + '10.2': { name: 'Cutthroat', spritesheet: 'images/skins/0001.png', - sprite: [2, 0], - class: 'thief' + sprite: [2, 0] }, - '1.4': { + '10.3': { name: 'Man of War', spritesheet: 'images/skins/0001.png', - sprite: [3, 0], - class: 'warrior' + sprite: [3, 0] }, - '1.5': { + '10.4': { name: 'Occultist', spritesheet: 'images/skins/0001.png', - sprite: [4, 0], - class: 'wizard' + sprite: [4, 0] }, //Templar Skin Pack - '2.1': { + '11.0': { name: 'Crusader 1', spritesheet: 'images/skins/0010.png', - sprite: [0, 0], - class: ['wizard', 'warrior'] + sprite: [0, 0] }, - '2.2': { + '11.1': { name: 'Crusader 2', spritesheet: 'images/skins/0010.png', - sprite: [1, 0], - class: ['wizard', 'warrior'] + sprite: [1, 0] }, - '2.3': { + '11.2': { name: 'Crusader 3', spritesheet: 'images/skins/0010.png', - sprite: [2, 0], - class: ['wizard', 'warrior'] + sprite: [2, 0] }, - '2.4': { + '11.3': { name: 'Crusader 4', spritesheet: 'images/skins/0010.png', - sprite: [3, 0], - class: ['wizard', 'warrior'] + sprite: [3, 0] }, - '2.5': { + '11.4': { name: 'Grand Crusader', spritesheet: 'images/skins/0010.png', - sprite: [4, 0], - class: ['wizard', 'warrior'] + sprite: [4, 0] } }; @@ -136,7 +109,7 @@ define([ getSkinList: function (skins) { var list = Object.keys(config) .filter(function (s) { - return ((config[s].default) || (skins.some(f => (f == s)))); + return ((config[s].default) || (skins.some(f => ((f == s) || (f == '*'))))); }) .map(function (s) { var res = extend(true, {}, config[s]); @@ -144,35 +117,26 @@ define([ return res; }); - var result = {}; + var result = []; list.forEach(function (skin) { - var classList = skin.class; - if (!classList.push) - classList = [classList]; - - classList.forEach(function (className) { - if (!result[className]) - result[className] = []; - - result[className].push({ - name: skin.name, - id: skin.id, - sprite: skin.sprite[0] + ',' + skin.sprite[1], - spritesheet: skin.spritesheet - }); - }, this); - }); + result.push({ + name: skin.name, + id: skin.id, + sprite: skin.sprite[0] + ',' + skin.sprite[1], + spritesheet: skin.spritesheet + }); + }, this); return result; }, getCell: function (skinId) { - var skin = config[skinId]; + var skin = config[skinId] || config['1.0']; return (skin.sprite[1] * 8) + skin.sprite[0]; }, getSpritesheet: function (skinId) { - var skin = config[skinId]; + var skin = config[skinId] || config['1.0']; return skin.spritesheet || 'characters'; } }; diff --git a/src/server/mods/class-necromancer/index.js b/src/server/mods/class-necromancer/index.js index 82466d51..d91af509 100644 --- a/src/server/mods/class-necromancer/index.js +++ b/src/server/mods/class-necromancer/index.js @@ -115,12 +115,11 @@ define([ }, beforeGetSkins: function (skins) { - skins['necromancer 1'] = { + skins['1.8'] = { name: 'Necromancer 1', sprite: [0, 0], class: 'wizard', - spritesheet: `${this.folderName}/images/inGameSprite.png`, - default: true + spritesheet: `${this.folderName}/images/inGameSprite.png` }; }, diff --git a/src/server/mods/event-halloween/index.js b/src/server/mods/event-halloween/index.js index cd521109..22df4625 100644 --- a/src/server/mods/event-halloween/index.js +++ b/src/server/mods/event-halloween/index.js @@ -103,7 +103,7 @@ define([ }, onBeforeGetSkins: function (skins) { - skins['pumpkin-head necromancer'] = { + skins['3.0'] = { name: 'Pumpkin-Head Necromancer', sprite: [0, 0], class: 'wizard', diff --git a/src/server/mods/event-xmas/maps/tutorial/events/xmas.js b/src/server/mods/event-xmas/maps/tutorial/events/xmas.js index 38fb43cc..1ba22f90 100644 --- a/src/server/mods/event-xmas/maps/tutorial/events/xmas.js +++ b/src/server/mods/event-xmas/maps/tutorial/events/xmas.js @@ -183,7 +183,7 @@ define([ }, forceItems: [{ type: 'skin', - id: 'bearded wizard', + id: '3.1', infinite: true, worth: { currency: `Unique Snowflake`, From b0936b9f5477646e2e3c96c4f5c2788f1638d554 Mon Sep 17 00:00:00 2001 From: big bad waffle Date: Wed, 7 Feb 2018 11:02:21 +0200 Subject: [PATCH 3/3] vikar now sells basic runes --- .../createCharacter/createCharacter.js | 12 +- .../ui/templates/createCharacter/styles.less | 10 +- .../components/extensions/factionVendor.js | 16 +- src/server/config/maps/tutorial/dialogues.js | 24 +- src/server/config/maps/tutorial/zone.js | 1324 +++++++++-------- src/server/items/generator.js | 2 +- src/server/items/generators/worth.js | 3 + src/server/mods/class-necromancer/index.js | 25 + src/server/world/worker.js | 1 + 9 files changed, 780 insertions(+), 637 deletions(-) diff --git a/src/client/ui/templates/createCharacter/createCharacter.js b/src/client/ui/templates/createCharacter/createCharacter.js index c38111bf..f423affd 100644 --- a/src/client/ui/templates/createCharacter/createCharacter.js +++ b/src/client/ui/templates/createCharacter/createCharacter.js @@ -59,8 +59,8 @@ define([ this.costume = -1; - this.class = Object.keys(result)[0] || ''; - this.find('.txtClass').html(this.class); + this.class = 'wizard'; + this.find('.txtClass').html('Wizard'); this.changeCostume({ target: this.find('.txtCostume') @@ -143,18 +143,14 @@ define([ changeClass: function (e) { var el = $(e.target); var classes = ['wizard', 'warrior', 'thief']; - var nextIndex = (classes.indexOf(el.html()) + 1) % classes.length; + var nextIndex = (classes.indexOf(this.class) + 1) % classes.length; this.costume = -1; var newClass = classes[nextIndex]; - el.html(newClass); + el.html(newClass[0].toUpperCase() + newClass.substr(1)); this.class = newClass; - - this.changeCostume({ - target: this.find('.txtCostume') - }); }, changeCostume: function (e) { diff --git a/src/client/ui/templates/createCharacter/styles.less b/src/client/ui/templates/createCharacter/styles.less index 67b548fb..3bf4618c 100644 --- a/src/client/ui/templates/createCharacter/styles.less +++ b/src/client/ui/templates/createCharacter/styles.less @@ -46,8 +46,16 @@ } } + .txtClass { + &:before { + content: 'Class: '; + } + } + .txtCostume { - + &:before { + content: 'Skin: '; + } } } diff --git a/src/server/components/extensions/factionVendor.js b/src/server/components/extensions/factionVendor.js index c98a303f..d4767bc7 100644 --- a/src/server/components/extensions/factionVendor.js +++ b/src/server/components/extensions/factionVendor.js @@ -159,10 +159,24 @@ define([ var skinBlueprint = skins.getBlueprint(item.id); item.name = skinBlueprint.name; item.sprite = skinBlueprint.sprite; + } else if (item.generate) { + var generated = generator.generate(item); + if (item.worth) + generated.worth = item.worth; + if (item.infinite) + generated.infinite = true; + item = generated; } - list.items.push(item); + var id = 0; + list.items.forEach(function (checkItem) { + if (checkItem.id >= id) + id = checkItem.id + 1; + }); + + item.id = id; + list.items.push(item); } }, diff --git a/src/server/config/maps/tutorial/dialogues.js b/src/server/config/maps/tutorial/dialogues.js index 7eb127e7..b8aad660 100644 --- a/src/server/config/maps/tutorial/dialogues.js +++ b/src/server/config/maps/tutorial/dialogues.js @@ -193,7 +193,7 @@ module.exports = { '1': { msg: [{ msg: `Is there anything I can help you with today?`, - options: [1.1] + options: [1.1, 1.2, 1.3] }], options: { '1.1': { @@ -203,6 +203,14 @@ module.exports = { return !!fullSet; }, goto: 'tradeCards' + }, + '1.2': { + msg: `I would like to buy some runes`, + goto: 'tradeBuy' + }, + '1.3': { + msg: `I have some items I would like to sell`, + goto: 'tradeSell' } } }, @@ -232,6 +240,20 @@ module.exports = { return `Thank you.`; } + }, + tradeBuy: { + cpn: 'trade', + method: 'startBuy', + args: [{ + targetName: 'vikar' + }] + }, + tradeSell: { + cpn: 'trade', + method: 'startSell', + args: [{ + targetName: 'vikar' + }] } }, priest: { diff --git a/src/server/config/maps/tutorial/zone.js b/src/server/config/maps/tutorial/zone.js index dc8aff98..a11ef195 100644 --- a/src/server/config/maps/tutorial/zone.js +++ b/src/server/config/maps/tutorial/zone.js @@ -1,633 +1,707 @@ -module.exports = { - name: 'tutorial', - level: [1, 10], - resources: { - Moonbell: { - type: 'herb', - max: 5 - }, - Skyblossom: { - type: 'herb', - max: 3 - }, - Emberleaf: { - type: 'herb', - max: 1 - } - }, - objects: { - 'sun carp school': { - max: 9, - type: 'fish', - quantity: [6, 12] - }, - estriddoor: { - properties: { - cpnDoor: { - locked: true, - key: 'estrid' - } - } - }, - shophermit: { - properties: { - cpnNotice: { - actions: { - enter: { - cpn: 'dialogue', - method: 'talk', - args: [{ - targetName: 'hermit' - }] - }, - exit: { - cpn: 'dialogue', - method: 'stopTalk' - } - } - } - } - }, - shopestrid: { - properties: { - cpnNotice: { - actions: { - enter: { - cpn: 'dialogue', - method: 'talk', - args: [{ - targetName: 'estrid' - }] - }, - exit: { - cpn: 'dialogue', - method: 'stopTalk' - } - } - } - } - }, - shopvikar: { - properties: { - cpnNotice: { - actions: { - enter: { - cpn: 'dialogue', - method: 'talk', - args: [{ - targetName: 'vikar' - }] - }, - exit: { - cpn: 'dialogue', - method: 'stopTalk' - } - } - } - } - }, - shoppriest: { - properties: { - cpnNotice: { - actions: { - enter: { - cpn: 'dialogue', - method: 'talk', - args: [{ - targetName: 'priest' - }] - }, - exit: { - cpn: 'dialogue', - method: 'stopTalk' - } - } - } - } - }, - 'estuary entrance': { - components: { - cpnParticles: { - simplify: function () { - return { - type: 'particles', - blueprint: { - color: { - start: ['48edff', '80f643'], - end: ['80f643', '48edff'] - }, - scale: { - start: { - min: 2, - max: 10 - }, - end: { - min: 0, - max: 2 - } - }, - speed: { - start: { - min: 4, - max: 16 - }, - end: { - min: 2, - max: 8 - } - }, - lifetime: { - min: 1, - max: 4 - }, - randomScale: true, - randomSpeed: true, - chance: 0.075, - randomColor: true, - spawnType: 'rect', - spawnRect: { - x: -32, - y: -48, - w: 64, - h: 64 - } - } - } - } - } - } - }, - greencandle: { - components: { - cpnLight: { - simplify: function () { - return { - type: 'light', - blueprint: { - color: { - start: ['80f643'], - end: ['4ac441', '51fc9a', 'd07840'] - }, - lifetime: { - min: 2, - max: 6 - } - } - } - } - } - } - }, - fountain: { - components: { - cpnParticles: { - simplify: function () { - return { - type: 'particles', - blueprint: { - color: { - start: ['48edff', '3fa7dd'], - end: ['3a71ba', '42548d'] - }, - scale: { - start: { - min: 2, - max: 10 - }, - end: { - min: 0, - max: 2 - } - }, - speed: { - start: { - min: 4, - max: 16 - }, - end: { - min: 2, - max: 8 - } - }, - lifetime: { - min: 2, - max: 5 - }, - randomScale: true, - randomSpeed: true, - chance: 0.8, - randomColor: true, - spawnType: 'rect', - spawnRect: { - x: -10, - y: -21, - w: 20, - h: 8 - } - } - } - } - } - } - }, - alchgreenpot: { - components: { - cpnParticles: { - simplify: function () { - return { - type: 'particles', - blueprint: { - color: { - start: ['80f643', '80f643'], - end: ['4ac441', '4ac441'] - }, - scale: { - start: { - min: 2, - max: 10 - }, - end: { - min: 0, - max: 2 - } - }, - speed: { - start: { - min: 4, - max: 16 - }, - end: { - min: 2, - max: 8 - } - }, - lifetime: { - min: 1, - max: 4 - }, - randomScale: true, - randomSpeed: true, - chance: 0.1, - randomColor: true, - spawnType: 'rect', - spawnRect: { - x: -15, - y: -20, - w: 30, - h: 8 - } - } - } - } - } - } - }, - alchredpot: { - components: { - cpnParticles: { - simplify: function () { - return { - type: 'particles', - blueprint: { - color: { - start: ['ff4252', 'ff4252'], - end: ['a82841', 'a82841'] - }, - scale: { - start: { - min: 2, - max: 10 - }, - end: { - min: 0, - max: 2 - } - }, - speed: { - start: { - min: 4, - max: 16 - }, - end: { - min: 2, - max: 8 - } - }, - lifetime: { - min: 1, - max: 4 - }, - randomScale: true, - randomSpeed: true, - chance: 0.2, - randomColor: true, - spawnType: 'rect', - spawnRect: { - x: -15, - y: -28, - w: 30, - h: 8 - } - } - } - } - } - } - } - }, - mobs: { - default: { - regular: { - drops: { - chance: 40, - rolls: 1 - } - } - }, - 'crazed seagull': { - level: 1, + module.exports = { + name: 'tutorial', + level: [1, 10], + resources: { + Moonbell: { + type: 'herb', + max: 5 + }, + Skyblossom: { + type: 'herb', + max: 3 + }, + Emberleaf: { + type: 'herb', + max: 1 + } + }, + objects: { + 'sun carp school': { + max: 9, + type: 'fish', + quantity: [6, 12] + }, + estriddoor: { + properties: { + cpnDoor: { + locked: true, + key: 'estrid' + } + } + }, + shophermit: { + properties: { + cpnNotice: { + actions: { + enter: { + cpn: 'dialogue', + method: 'talk', + args: [{ + targetName: 'hermit' + }] + }, + exit: { + cpn: 'dialogue', + method: 'stopTalk' + } + } + } + } + }, + shopestrid: { + properties: { + cpnNotice: { + actions: { + enter: { + cpn: 'dialogue', + method: 'talk', + args: [{ + targetName: 'estrid' + }] + }, + exit: { + cpn: 'dialogue', + method: 'stopTalk' + } + } + } + } + }, + shopvikar: { + properties: { + cpnNotice: { + actions: { + enter: { + cpn: 'dialogue', + method: 'talk', + args: [{ + targetName: 'vikar' + }] + }, + exit: { + cpn: 'dialogue', + method: 'stopTalk' + } + } + } + } + }, + shoppriest: { + properties: { + cpnNotice: { + actions: { + enter: { + cpn: 'dialogue', + method: 'talk', + args: [{ + targetName: 'priest' + }] + }, + exit: { + cpn: 'dialogue', + method: 'stopTalk' + } + } + } + } + }, + 'estuary entrance': { + components: { + cpnParticles: { + simplify: function () { + return { + type: 'particles', + blueprint: { + color: { + start: ['48edff', '80f643'], + end: ['80f643', '48edff'] + }, + scale: { + start: { + min: 2, + max: 10 + }, + end: { + min: 0, + max: 2 + } + }, + speed: { + start: { + min: 4, + max: 16 + }, + end: { + min: 2, + max: 8 + } + }, + lifetime: { + min: 1, + max: 4 + }, + randomScale: true, + randomSpeed: true, + chance: 0.075, + randomColor: true, + spawnType: 'rect', + spawnRect: { + x: -32, + y: -48, + w: 64, + h: 64 + } + } + } + } + } + } + }, + greencandle: { + components: { + cpnLight: { + simplify: function () { + return { + type: 'light', + blueprint: { + color: { + start: ['80f643'], + end: ['4ac441', '51fc9a', 'd07840'] + }, + lifetime: { + min: 2, + max: 6 + } + } + } + } + } + } + }, + fountain: { + components: { + cpnParticles: { + simplify: function () { + return { + type: 'particles', + blueprint: { + color: { + start: ['48edff', '3fa7dd'], + end: ['3a71ba', '42548d'] + }, + scale: { + start: { + min: 2, + max: 10 + }, + end: { + min: 0, + max: 2 + } + }, + speed: { + start: { + min: 4, + max: 16 + }, + end: { + min: 2, + max: 8 + } + }, + lifetime: { + min: 2, + max: 5 + }, + randomScale: true, + randomSpeed: true, + chance: 0.8, + randomColor: true, + spawnType: 'rect', + spawnRect: { + x: -10, + y: -21, + w: 20, + h: 8 + } + } + } + } + } + } + }, + alchgreenpot: { + components: { + cpnParticles: { + simplify: function () { + return { + type: 'particles', + blueprint: { + color: { + start: ['80f643', '80f643'], + end: ['4ac441', '4ac441'] + }, + scale: { + start: { + min: 2, + max: 10 + }, + end: { + min: 0, + max: 2 + } + }, + speed: { + start: { + min: 4, + max: 16 + }, + end: { + min: 2, + max: 8 + } + }, + lifetime: { + min: 1, + max: 4 + }, + randomScale: true, + randomSpeed: true, + chance: 0.1, + randomColor: true, + spawnType: 'rect', + spawnRect: { + x: -15, + y: -20, + w: 30, + h: 8 + } + } + } + } + } + } + }, + alchredpot: { + components: { + cpnParticles: { + simplify: function () { + return { + type: 'particles', + blueprint: { + color: { + start: ['ff4252', 'ff4252'], + end: ['a82841', 'a82841'] + }, + scale: { + start: { + min: 2, + max: 10 + }, + end: { + min: 0, + max: 2 + } + }, + speed: { + start: { + min: 4, + max: 16 + }, + end: { + min: 2, + max: 8 + } + }, + lifetime: { + min: 1, + max: 4 + }, + randomScale: true, + randomSpeed: true, + chance: 0.2, + randomColor: true, + spawnType: 'rect', + spawnRect: { + x: -15, + y: -28, + w: 30, + h: 8 + } + } + } + } + } + } + } + }, + mobs: { + default: { + regular: { + drops: { + chance: 40, + rolls: 1 + } + } + }, + 'crazed seagull': { + level: 1, - rare: { - count: 0 - }, + rare: { + count: 0 + }, - regular: { - drops: { - chance: 100, - rolls: 1, - noRandom: true, - blueprints: [{ - maxLevel: 2, - name: 'Family Heirloom', - quality: 2, - slot: 'neck', - type: 'Pendant', - noSalvage: true, - stats: ['vit', 'regenHp', 'regenMana'] - }] - } - } - }, - seagull: { - level: 2, - regular: { - drops: { - chance: 60, - rolls: 1 - } - }, - rare: { - count: 0 - }, - questItem: { - name: 'Gull Feather', - sprite: [0, 0] - } - }, - bunny: { - level: 3, - regular: { - drops: { - chance: 56, - rolls: 1 - } - }, - rare: { - name: 'Thumper' - }, - questItem: { - name: "Rabbit's Foot", - sprite: [0, 1] - } - }, - elk: { - level: 4, - regular: { - drops: { - chance: 50, - rolls: 1 - } - }, - rare: { - name: 'Ironhorn' - }, - questItem: { - name: "Elk Antler", - sprite: [0, 2] - } - }, - flamingo: { - level: 5, - regular: { - drops: { - chance: 45, - rolls: 1 - } - } - }, - crab: { - level: 6, + regular: { + drops: { + chance: 100, + rolls: 1, + noRandom: true, + blueprints: [{ + maxLevel: 2, + name: 'Family Heirloom', + quality: 2, + slot: 'neck', + type: 'Pendant', + noSalvage: true, + stats: ['vit', 'regenHp', 'regenMana'] + }] + } + } + }, + seagull: { + level: 2, + regular: { + drops: { + chance: 60, + rolls: 1 + } + }, + rare: { + count: 0 + }, + questItem: { + name: 'Gull Feather', + sprite: [0, 0] + } + }, + bunny: { + level: 3, + regular: { + drops: { + chance: 56, + rolls: 1 + } + }, + rare: { + name: 'Thumper' + }, + questItem: { + name: "Rabbit's Foot", + sprite: [0, 1] + } + }, + elk: { + level: 4, + regular: { + drops: { + chance: 50, + rolls: 1 + } + }, + rare: { + name: 'Ironhorn' + }, + questItem: { + name: "Elk Antler", + sprite: [0, 2] + } + }, + flamingo: { + level: 5, + regular: { + drops: { + chance: 45, + rolls: 1 + } + } + }, + crab: { + level: 6, - rare: { - name: 'Squiggles' - }, - questItem: { - name: 'Severed Pincer', - sprite: [0, 3] - } - }, - 'titan crab': { - level: 7, - rare: { - name: 'The Pincer King' - } - }, - 'mud crab': { - level: 9 - }, - frog: { - level: 8, - rare: { - name: 'The Muck Prince' - } - }, - eagle: { - level: 10, - faction: 'hostile', - rare: { - name: 'Fleshripper' - } - }, - hermit: { - level: 10, - walkDistance: 0, - attackable: false, - rare: { - count: 0 - }, - properties: { - cpnTrade: { - items: { - min: 3, - max: 5 - }, - forceItems: [{ - name: 'Flimsy Fishing Rod', - type: 'Fishing Rod', - slot: 'tool', - quality: 0, - worth: 5, - sprite: [11, 0], - infinite: true, - noSalvage: true - }], - level: { - min: 1, - max: 5 - }, - markup: { - buy: 0.25, - sell: 2.5 - } - } - } - }, - guard: { - level: 50, - attackable: false, + rare: { + name: 'Squiggles' + }, + questItem: { + name: 'Severed Pincer', + sprite: [0, 3] + } + }, + 'titan crab': { + level: 7, + rare: { + name: 'The Pincer King' + } + }, + 'mud crab': { + level: 9 + }, + frog: { + level: 8, + rare: { + name: 'The Muck Prince' + } + }, + eagle: { + level: 10, + faction: 'hostile', + rare: { + name: 'Fleshripper' + } + }, + hermit: { + level: 10, + walkDistance: 0, + attackable: false, + rare: { + count: 0 + }, + properties: { + cpnTrade: { + items: { + min: 3, + max: 5 + }, + forceItems: [{ + name: 'Flimsy Fishing Rod', + type: 'Fishing Rod', + slot: 'tool', + quality: 0, + worth: 5, + sprite: [11, 0], + infinite: true, + noSalvage: true + }], + level: { + min: 1, + max: 5 + }, + markup: { + buy: 0.25, + sell: 2.5 + } + } + } + }, + guard: { + level: 50, + attackable: false, - walkDistance: 0, + walkDistance: 0, - rare: { - count: 0 - } - }, - estrid: { - level: 25, - attackable: false, - walkDistance: 5, + rare: { + count: 0 + } + }, + estrid: { + level: 25, + attackable: false, + walkDistance: 5, - rare: { - count: 0 - }, + rare: { + count: 0 + }, - properties: { - cpnTrade: { - items: { - min: 5, - max: 10 - }, - level: { - min: 5, - max: 15 - }, - markup: { - buy: 0.25, - sell: 2.5 - } - } - } - }, - vikar: { - walkDistance: 0, - attackable: false, - rare: { - count: 0 - } - }, - luta: { - walkDistance: 0, - attackable: false, - rare: { - count: 0 - } - }, - rodriguez: { - attackable: false, - level: 10, - rare: { - count: 0 - } - }, - pig: { - attackable: false, - level: 3, - rare: { - count: 0 - } - }, - goat: { - attackable: false, - level: 3, - rare: { - count: 0 - } - }, - cow: { - attackable: false, - level: 3, - rare: { - count: 0 - } - }, - priest: { - level: 50, - attackable: false, - walkDistance: 0, - rare: { - count: 0 - }, + properties: { + cpnTrade: { + items: { + min: 5, + max: 10 + }, + level: { + min: 5, + max: 15 + }, + markup: { + buy: 0.25, + sell: 2.5 + } + } + } + }, + vikar: { + walkDistance: 0, + attackable: false, + rare: { + count: 0 + }, - properties: { - cpnTrade: { - items: { - min: 5, - max: 10, - extra: [{ - type: 'skin', - id: 'gaekatla druid', - worth: 100, - factions: [{ - id: 'gaekatla', - tier: 7 - }] - }, { - worth: 100, - infinite: true, - generate: true, - name: `Cowl of Obscurity`, - level: [4, 13], - quality: 4, - noSpell: true, - slot: 'head', - sprite: [2, 0], - spritesheet: '../../../images/legendaryItems.png', - type: 'Silk Cowl', - description: `Imbued with the powers of Gaekatla herself.`, - stats: ['hpMax', 'hpMax', 'int', 'int'], - effects: [{ - type: 'healOnCrit', - rolls: { - i_chance: [20, 60], - i_percentage: [3, 7] - } - }], - factions: [{ - id: 'gaekatla', - tier: 7 - }] - }] - }, - faction: { - id: 'gaekatla', - tier: 5 - }, - markup: { - buy: 0.25, - sell: 10 - } - } - } - } - } -}; + properties: { + cpnTrade: { + items: { + min: 0, + max: 0, + extra: [{ + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'magic missile', + worth: 3 + }, { + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'ice spear', + worth: 3 + }, { + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'smite', + worth: 3 + }, { + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'consecrate', + worth: 3 + }, { + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'slash', + worth: 3 + }, { + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'charge', + worth: 3 + }, { + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'flurry', + worth: 3 + }, { + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'smokebomb', + worth: 3 + }] + }, + faction: { + id: 'fjolgard', + tier: 5 + }, + markup: { + buy: 0.25, + sell: 10 + } + } + } + }, + luta: { + walkDistance: 0, + attackable: false, + rare: { + count: 0 + } + }, + rodriguez: { + attackable: false, + level: 10, + rare: { + count: 0 + } + }, + pig: { + attackable: false, + level: 3, + rare: { + count: 0 + } + }, + goat: { + attackable: false, + level: 3, + rare: { + count: 0 + } + }, + cow: { + attackable: false, + level: 3, + rare: { + count: 0 + } + }, + priest: { + level: 50, + attackable: false, + walkDistance: 0, + rare: { + count: 0 + }, + + properties: { + cpnTrade: { + items: { + min: 5, + max: 10, + extra: [{ + type: 'skin', + id: 'gaekatla druid', + worth: 100, + factions: [{ + id: 'gaekatla', + tier: 7 + }] + }, { + worth: 100, + infinite: true, + generate: true, + name: `Cowl of Obscurity`, + level: [4, 13], + quality: 4, + noSpell: true, + slot: 'head', + sprite: [2, 0], + spritesheet: '../../../images/legendaryItems.png', + type: 'Silk Cowl', + description: `Imbued with the powers of Gaekatla herself.`, + stats: ['hpMax', 'hpMax', 'int', 'int'], + effects: [{ + type: 'healOnCrit', + rolls: { + i_chance: [20, 60], + i_percentage: [3, 7] + } + }], + factions: [{ + id: 'gaekatla', + tier: 7 + }] + }] + }, + faction: { + id: 'gaekatla', + tier: 5 + }, + markup: { + buy: 0.25, + sell: 10 + } + } + } + } + } + }; diff --git a/src/server/items/generator.js b/src/server/items/generator.js index 77429aaf..80fb7814 100644 --- a/src/server/items/generator.js +++ b/src/server/items/generator.js @@ -15,7 +15,7 @@ define([ ) { var generators = [g1, g2, g3, g4, g5, g6, g11, g7]; var materialGenerators = [g6, g8]; - var spellGenerators = [g1, g9]; + var spellGenerators = [g1, g9, g7]; var currencyGenerators = [g10]; var generator = { diff --git a/src/server/items/generators/worth.js b/src/server/items/generators/worth.js index a9644b65..c54b28ba 100644 --- a/src/server/items/generators/worth.js +++ b/src/server/items/generators/worth.js @@ -6,6 +6,9 @@ define([ return { generate: function (item, blueprint) { item.worth = ~~(Math.pow(item.level, 1.5) + (Math.pow((item.quality + 1), 2) * 10)); + + if (item.spell) + item.worth *= 5; } }; }); diff --git a/src/server/mods/class-necromancer/index.js b/src/server/mods/class-necromancer/index.js index d91af509..14de0bb3 100644 --- a/src/server/mods/class-necromancer/index.js +++ b/src/server/mods/class-necromancer/index.js @@ -21,6 +21,31 @@ define([ this.events.on('onBeforeGetSpellTemplate', this.beforeGetSpellTemplate.bind(this)); this.events.on('onBeforeGetResourceList', this.beforeGetResourceList.bind(this)); this.events.on('onBeforeGetAnimations', this.beforeGetAnimations.bind(this)); + this.events.on('onAfterGetZone', this.onAfterGetZone.bind(this)); + }, + + onAfterGetZone: function (zone, config) { + if (zone != 'tutorial') + return; + + var newRunes = [{ + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'harvest life', + worth: 3 + }, { + generate: true, + spell: true, + spellQuality: 'basic', + infinite: true, + spellName: 'summon skeleton', + worth: 3 + }]; + + var vikarTrade = config.mobs.vikar.properties.cpnTrade; + Array.prototype.push.apply(vikarTrade.items.extra, newRunes); }, beforeGetAnimations: function (animations) { diff --git a/src/server/world/worker.js b/src/server/world/worker.js index 271076bf..5eff83a9 100644 --- a/src/server/world/worker.js +++ b/src/server/world/worker.js @@ -58,6 +58,7 @@ requirejs([ return; console.log('Error Logged: ' + e.toString()); + console.log(e.stack); io.set({ ent: new Date(),