Przeglądaj źródła

fixes #558

tags/v0.2.0^2
big bad waffle 6 lat temu
rodzic
commit
0bcfe63d11
13 zmienionych plików z 265 dodań i 144 usunięć
  1. +25
    -0
      src/client/js/components/inventory.js
  2. +4
    -10
      src/client/ui/templates/inventory/inventory.js
  3. +10
    -2
      src/client/ui/templates/tooltipItem/styles.less
  4. +6
    -2
      src/client/ui/templates/tooltipItem/templateTooltip.html
  5. +17
    -4
      src/client/ui/templates/tooltipItem/tooltipItem.js
  6. +2
    -13
      src/server/components/equipment.js
  7. +128
    -104
      src/server/components/inventory.js
  8. +7
    -4
      src/server/items/config/armorMaterials.js
  9. +10
    -0
      src/server/items/config/types.js
  10. +4
    -3
      src/server/items/generator.js
  11. +41
    -0
      src/server/items/generators/attrRequire.js
  12. +10
    -2
      src/server/items/generators/types.js
  13. +1
    -0
      src/server/mods/class-necromancer/index.js

+ 25
- 0
src/client/js/components/inventory.js Wyświetl plik

@@ -59,6 +59,31 @@ define([


events.emit('onGetItems', this.items, rerender); events.emit('onGetItems', this.items, rerender);
} }
},

equipItemErrors: function (item) {
var errors = [];
var stats = this.obj.stats.values;

var playerLevel = (stats.originalLevel || stats.level);
if (item.level > playerLevel)
errors.push('level');

if ((item.requires) && (stats[item.requires[0].stat] < item.requires[0].value))
errors.push('stats');

if (item.factions) {
if (item.factions.some(function (f) {
return f.noEquip;
}))
errors.push('faction');
}

return errors;
},

canEquipItem: function (item) {
return (this.equipItemErrors.length == 0);
} }
}; };
}); });

+ 4
- 10
src/client/ui/templates/inventory/inventory.js Wyświetl plik

@@ -503,7 +503,7 @@ define([
for (var s in equippedOffhand.stats) { for (var s in equippedOffhand.stats) {
if (!compare.stats[s]) if (!compare.stats[s])
compare.stats[s] = 0; compare.stats[s] = 0;
compare.stats[s] += equippedOffhand.stats[s] compare.stats[s] += equippedOffhand.stats[s]
} }
} }
@@ -530,7 +530,7 @@ define([


compare = equippedTwoHanded; compare = equippedTwoHanded;
} }
}
}
} }


events.emit('onShowItemTooltip', item, ttPos, compare, false, this.shiftDown); events.emit('onShowItemTooltip', item, ttPos, compare, false, this.shiftDown);
@@ -589,18 +589,12 @@ define([


if (!item) if (!item)
return; return;
else if ((action == 'equip') && ((item.material) || (item.quest) || (item.type == 'mtx') || (item.level > playerLevel)))
else if ((action == 'equip') && ((item.material) || (item.quest) || (item.type == 'mtx') || (!window.player.inventory.canEquipItem(item))))
return; return;
else if ((action == 'learnAbility') && (item.level > playerLevel))
else if ((action == 'learnAbility') && (!window.player.inventory.canEquipItem(item)))
return; return;
else if ((action == 'activateMtx') && (item.type != 'mtx')) else if ((action == 'activateMtx') && (item.type != 'mtx'))
return; return;
if ((item.factions) && (action == 'equip')) {
if (item.factions.some(function (f) {
return f.noEquip;
}))
return;
}


var cpn = 'inventory'; var cpn = 'inventory';
if (action == 'equip') if (action == 'equip')


+ 10
- 2
src/client/ui/templates/tooltipItem/styles.less Wyświetl plik

@@ -28,7 +28,7 @@
} }
} }


.stats {
> .stats {
color: darken(@white, 20%); color: darken(@white, 20%);
margin-bottom: 8px; margin-bottom: 8px;


@@ -55,13 +55,21 @@
margin-bottom: 8px; margin-bottom: 8px;
} }


.level {
.requires {
margin-top: 8px; margin-top: 8px;
color: darken(@white, 40%); color: darken(@white, 40%);


&.high-level { &.high-level {
color: @red; color: @red;
} }

.high-level {
color: @red;
}

> *:not(.high-level) {
color: darken(@white, 40%);
}
} }


.material { .material {


+ 6
- 2
src/client/ui/templates/tooltipItem/templateTooltip.html Wyświetl plik

@@ -5,11 +5,15 @@
</div> </div>
<div class="stats">$STATS$</div> <div class="stats">$STATS$</div>
<div class="effects">$EFFECTS$</div> <div class="effects">$EFFECTS$</div>
<div class="faction">faction: $faction$</div>
<div class="material">crafting material</div> <div class="material">crafting material</div>
<div class="quest">quest item</div> <div class="quest">quest item</div>
<div class="spellName">$SPELLNAME$</div> <div class="spellName">$SPELLNAME$</div>
<div class="damage">$DAMAGE$</div> <div class="damage">$DAMAGE$</div>
<div class="level">level: $LEVEL$</div>
<div class="requires">
requires:
<div class="level">level: $LEVEL$</div>
<div class="stats">$ATTRIBUTE$: $ATTRIBUTEVALUE$</div>
<div class="faction">faction: $faction$</div>
</div>
<div class="worth"></div> <div class="worth"></div>
<div class="info"><br />[shift] to compare</div> <div class="info"><br />[shift] to compare</div>

+ 17
- 4
src/client/ui/templates/tooltipItem/tooltipItem.js Wyświetl plik

@@ -154,6 +154,13 @@ define([
.replace('$SLOT$', item.slot) .replace('$SLOT$', item.slot)
.replace('$STATS$', stats) .replace('$STATS$', stats)
.replace('$LEVEL$', level); .replace('$LEVEL$', level);

if (item.requires) {
html = html
.replace('$ATTRIBUTE$', item.requires[0].stat)
.replace('$ATTRIBUTEVALUE$', item.requires[0].value);
}

if (item.power) if (item.power)
html = html.replace('$POWER$', ' ' + (new Array(item.power + 1)).join('+')); html = html.replace('$POWER$', ' ' + (new Array(item.power + 1)).join('+'));


@@ -194,6 +201,11 @@ define([
else else
this.tooltip.find('.level').show(); this.tooltip.find('.level').show();


if (!item.requires)
this.tooltip.find('.stats').hide();
else
this.tooltip.find('.stats').show();

if ((!item.type) || (item.type == item.name)) if ((!item.type) || (item.type == item.name))
this.tooltip.find('.type').hide(); this.tooltip.find('.type').hide();
else { else {
@@ -205,10 +217,11 @@ define([
if (item.power) if (item.power)
this.tooltip.find('.power').show(); this.tooltip.find('.power').show();


var playerStats = window.player.stats.values;
var level = playerStats.originalLevel || playerStats.level;
if (item.level > level)
this.tooltip.find('.level').addClass('high-level');
var equipErrors = window.player.inventory.equipItemErrors(item);
equipErrors.forEach(function (e) {
this.tooltip.find('.requires').addClass('high-level');
this.tooltip.find('.requires .' + e).addClass('high-level');
}, this);


if ((item.material) || (item.quest)) { if ((item.material) || (item.quest)) {
this.tooltip.find('.level').hide(); this.tooltip.find('.level').hide();


+ 2
- 13
src/server/components/equipment.js Wyświetl plik

@@ -37,14 +37,9 @@ define([
var item = this.obj.inventory.findItem(itemId); var item = this.obj.inventory.findItem(itemId);
if (!item) if (!item)
return; return;
else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (item.level > (stats.originalLevel || stats.level))) {
else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (!this.obj.inventory.canEquipItem(item))) {
item.eq = false; item.eq = false;
return; return;
} else if ((item.factions) && (this.obj.player)) {
if (!this.obj.reputation.canEquipItem(item)) {
item.eq = false;
return;
}
} }


var currentEqId = this.eq[item.slot]; var currentEqId = this.eq[item.slot];
@@ -61,18 +56,12 @@ define([
itemId = itemId.itemId; itemId = itemId.itemId;
} }


var level = (this.obj.stats.originalValues || this.obj.stats.values).level;
var item = this.obj.inventory.findItem(itemId); var item = this.obj.inventory.findItem(itemId);
if (!item) if (!item)
return; return;
else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (item.level > level)) {
else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (!this.obj.inventory.canEquipItem(item))) {
item.eq = false; item.eq = false;
return; return;
} else if ((item.factions) && (this.obj.player)) {
if (!this.obj.reputation.canEquipItem(item)) {
item.eq = false;
return;
}
} }


if (!slot) if (!slot)


+ 128
- 104
src/server/components/inventory.js Wyświetl plik

@@ -18,6 +18,7 @@ define([
itemEffects itemEffects
) { ) {
return { return {
//Properties
type: 'inventory', type: 'inventory',


inventorySize: 50, inventorySize: 50,
@@ -25,6 +26,8 @@ define([


blueprint: null, blueprint: null,


//Base Methods

init: function (blueprint, isTransfer) { init: function (blueprint, isTransfer) {
var items = blueprint.items || []; var items = blueprint.items || [];
var iLen = items.length; var iLen = items.length;
@@ -68,51 +71,74 @@ define([
this.hookItemEvents(); this.hookItemEvents();
}, },


hookItemEvents: function (items) {
var items = items || this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var item = items[i];
save: function () {
return {
type: 'inventory',
items: this.items
};
},


if (item.effects) {
item.effects.forEach(function (e) {
if (e.mtx) {
var mtxUrl = mtx.get(e.mtx);
var mtxModule = require(mtxUrl);
simplify: function (self) {
if (!self)
return null;


e.events = mtxModule.events;
} 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);
var reputation = this.obj.reputation;


e.events = effectModule.events;
}
});
}
return {
type: 'inventory',
items: this.items
.map(function (i) {
var item = extend(true, {}, i);


if ((item.pos == null) && (!item.eq)) {
var pos = i;
for (var j = 0; j < iLen; j++) {
if (!items.some(fj => (fj.pos == j))) {
pos = j;
break;
if (item.effects) {
item.effects = item.effects.map(e => ({
factionId: e.factionId,
text: e.text,
properties: e.properties,
mtx: e.mtx,
type: e.type,
rolls: e.rolls
}));
} }
}
item.pos = pos;
} else if ((!item.eq) && (items.some(ii => ((ii != item) && (ii.pos == item.pos))))) {
var pos = item.pos;
for (var j = 0; j < iLen; j++) {
if (!items.some(fi => ((fi != item) && (fi.pos == j)))) {
pos = j;
break;

if (item.factions) {
item.factions = item.factions.map(function (f) {
var faction = reputation.getBlueprint(f.id);
var factionTier = reputation.getTier(f.id);

var noEquip = null;
if (factionTier < f.tier)
noEquip = true;

if (!faction)
console.log(f);

return {
id: f.id,
name: faction.name,
tier: f.tier,
tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
noEquip: noEquip
};
}, this);
} }
}
item.pos = pos;
}

return item;
})
};
},

update: function () {
var items = this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var item = items[i];
if (!item.cd)
continue;

item.cd--;

this.obj.syncer.setArray(true, 'inventory', 'getItems', item);
} }
}, },


@@ -439,6 +465,7 @@ define([
callback: this.onCheckCharExists.bind(this, msg, item) callback: this.onCheckCharExists.bind(this, msg, item)
}); });
}, },

onCheckCharExists: function (msg, item, res) { onCheckCharExists: function (msg, item, res) {
if (!res) { if (!res) {
this.resolveCallback(msg, 'Recipient does not exist'); this.resolveCallback(msg, 'Recipient does not exist');
@@ -454,6 +481,54 @@ define([


//Helpers //Helpers


hookItemEvents: function (items) {
var items = items || this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var item = items[i];

if (item.effects) {
item.effects.forEach(function (e) {
if (e.mtx) {
var mtxUrl = mtx.get(e.mtx);
var mtxModule = require(mtxUrl);

e.events = mtxModule.events;
} 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 ((item.pos == null) && (!item.eq)) {
var pos = i;
for (var j = 0; j < iLen; j++) {
if (!items.some(fj => (fj.pos == j))) {
pos = j;
break;
}
}
item.pos = pos;
} else if ((!item.eq) && (items.some(ii => ((ii != item) && (ii.pos == item.pos))))) {
var pos = item.pos;
for (var j = 0; j < iLen; j++) {
if (!items.some(fi => ((fi != item) && (fi.pos == j)))) {
pos = j;
break;
}
}
item.pos = pos;
}
}
},

setItemPosition: function (id) { setItemPosition: function (id) {
var item = this.findItem(id); var item = this.findItem(id);
if (!item) if (!item)
@@ -950,75 +1025,24 @@ define([
this.items = []; this.items = [];
}, },


save: function () {
return {
type: 'inventory',
items: this.items
};
},
canEquipItem: function (item) {
var stats = this.obj.stats.values;


simplify: function (self) {
if (!self)
return null;
var playerLevel = (stats.originalLevel || stats.level);
if (item.level > playerLevel)
return false;


var reputation = this.obj.reputation;
if ((item.requires) && (stats[item.requires[0].stat] < item.requires[0].value))
return false;


return {
type: 'inventory',
items: this.items
.map(function (i) {
var item = extend(true, {}, i);

if (item.effects) {
item.effects = item.effects.map(e => ({
factionId: e.factionId,
text: e.text,
properties: e.properties,
mtx: e.mtx,
type: e.type,
rolls: e.rolls
}));
}

if (item.factions) {
item.factions = item.factions.map(function (f) {
var faction = reputation.getBlueprint(f.id);
var factionTier = reputation.getTier(f.id);

var noEquip = null;
if (factionTier < f.tier)
noEquip = true;

if (!faction)
console.log(f);

return {
id: f.id,
name: faction.name,
tier: f.tier,
tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
noEquip: noEquip
};
}, this);
}

return item;
})
};
},

update: function () {
var items = this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var item = items[i];
if (!item.cd)
continue;

item.cd--;

this.obj.syncer.setArray(true, 'inventory', 'getItems', item);
if (item.factions) {
if (item.factions.some(function (f) {
return f.noEquip;
}))
return false;
} }

return true;
} }
}; };
}); });

+ 7
- 4
src/server/items/config/armorMaterials.js Wyświetl plik

@@ -1,23 +1,26 @@
define([ define([
], function(
], function (
) { ) {
return { return {
plate: { plate: {
attrRequire: 'str',
statMult: { statMult: {
armor: 1 armor: 1
} }
}, },
leather: { leather: {
attrRequire: 'dex',
statMult: { statMult: {
armor: 0.6 armor: 0.6
} }
}, },
cloth: { cloth: {
attrRequire: 'int',
statMult: { statMult: {
armor: 0.35 armor: 0.35
} }
} }
}; };
});
});

+ 10
- 0
src/server/items/config/types.js Wyświetl plik

@@ -159,6 +159,7 @@ define([
}, },
oneHanded: { oneHanded: {
'Sword': { 'Sword': {
attrRequire: 'str',
sprite: [9, 0], sprite: [9, 0],
spellName: 'melee', spellName: 'melee',
spellConfig: { spellConfig: {
@@ -173,6 +174,7 @@ define([
} }
}, },
'Dagger': { 'Dagger': {
attrRequire: 'dex',
sprite: [9, 2], sprite: [9, 2],
spellName: 'melee', spellName: 'melee',
spellConfig: { spellConfig: {
@@ -186,6 +188,7 @@ define([
} }
}, },
'Axe': { 'Axe': {
attrRequire: 'str',
sprite: [9, 3], sprite: [9, 3],
spellName: 'melee', spellName: 'melee',
spellConfig: { spellConfig: {
@@ -200,6 +203,7 @@ define([
} }
}, },
'Wand': { 'Wand': {
attrRequire: 'int',
sprite: [9, 8], sprite: [9, 8],
spellName: 'projectile', spellName: 'projectile',
spellConfig: { spellConfig: {
@@ -217,6 +221,7 @@ define([
}, },
twoHanded: { twoHanded: {
'Gnarled Staff': { 'Gnarled Staff': {
attrRequire: 'int',
sprite: [9, 1], sprite: [9, 1],
spellName: 'projectile', spellName: 'projectile',
spellConfig: { spellConfig: {
@@ -233,6 +238,7 @@ define([
} }
}, },
'Spear': { 'Spear': {
attrRequire: 'str',
sprite: [9, 6], sprite: [9, 6],
spellName: 'melee', spellName: 'melee',
range: 2, range: 2,
@@ -250,19 +256,23 @@ define([
}, },
offHand: { offHand: {
'Wooden Shield': { 'Wooden Shield': {
attrRequire: 'str',
sprite: [13, 0], sprite: [13, 0],
armorMult: 0.3, armorMult: 0.3,
blockAttackMult: 1 blockAttackMult: 1
}, },
'Gilded Shield': { 'Gilded Shield': {
attrRequire: 'str',
sprite: [13, 1], sprite: [13, 1],
armorMult: 0.6, armorMult: 0.6,
blockAttackMult: 0.5 blockAttackMult: 0.5
}, },
'Brittle Tome': { 'Brittle Tome': {
attrRequire: 'int',
sprite: [13, 2] sprite: [13, 2]
}, },
'Ancient Tome': { 'Ancient Tome': {
attrRequire: 'int',
sprite: [13, 3] sprite: [13, 3]
} }
}, },


+ 4
- 3
src/server/items/generator.js Wyświetl plik

@@ -9,11 +9,12 @@ define([
'items/generators/quantity', 'items/generators/quantity',
'items/generators/spellbook', 'items/generators/spellbook',
'items/generators/currency', 'items/generators/currency',
'items/generators/effects'
'items/generators/effects',
'items/generators/attrRequire'
], function ( ], function (
g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11
g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12
) { ) {
var generators = [g1, g2, g3, g4, g5, g6, g11, g7];
var generators = [g1, g2, g3, g4, g5, g6, g11, g12, g7];
var materialGenerators = [g6, g8]; var materialGenerators = [g6, g8];
var spellGenerators = [g1, g9, g7]; var spellGenerators = [g1, g9, g7];
var currencyGenerators = [g10]; var currencyGenerators = [g10];


+ 41
- 0
src/server/items/generators/attrRequire.js Wyświetl plik

@@ -0,0 +1,41 @@
define([
'./stats'
], function (
generatorStats
) {
return {
minSlotPerfection: 0.5,
maxSlotPerfection: 1,
minLevelMult: 0.,
maxLevelMult: 1,

generate: function (item, blueprint) {
if (!blueprint.attrRequire)
return;

if (!item.requires)
item.requires = [];

var tempItem = {
quality: 0,
level: 20,
stats: {}
};

var perfection = ~~(11 * (this.minSlotPerfection + (Math.random() * (this.maxSlotPerfection - this.minSlotPerfection))));

generatorStats.generate(tempItem, {
forceStats: [blueprint.attrRequire],
perfection: perfection
});

var statValue = tempItem.stats[Object.keys(tempItem.stats)[0]];
statValue += ~~(item.level * (this.minLevelMult + ~~(Math.random() * (this.maxLevelMult - this.minLevelMult))));

item.requires.push({
stat: blueprint.attrRequire,
value: statValue
});
}
};
});

+ 10
- 2
src/server/items/generators/types.js Wyświetl plik

@@ -26,8 +26,16 @@ define([
if (typeBlueprint.range) if (typeBlueprint.range)
item.range = typeBlueprint.range; item.range = typeBlueprint.range;


if ((typeBlueprint.material) && (blueprint.statMult.armor))
blueprint.statMult.armor *= armorMaterials[typeBlueprint.material].statMult.armor;
if (typeBlueprint.material) {
var material = armorMaterials[typeBlueprint.material];
blueprint.attrRequire = material.attrRequire;

if (blueprint.statMult.armor)
blueprint.statMult.armor *= material.statMult.armor
}

if (typeBlueprint.attrRequire)
blueprint.attrRequire = typeBlueprint.attrRequire;


if (typeBlueprint.armorMult) if (typeBlueprint.armorMult)
blueprint.statMult.armor = typeBlueprint.armorMult; blueprint.statMult.armor = typeBlueprint.armorMult;


+ 1
- 0
src/server/mods/class-necromancer/index.js Wyświetl plik

@@ -130,6 +130,7 @@ define([
types.oneHanded[s] = { types.oneHanded[s] = {
sprite: [i, 0], sprite: [i, 0],
spellName: 'melee', spellName: 'melee',
attrRequire: ['int'],
spellConfig: { spellConfig: {
statType: ['str', 'int'], statType: ['str', 'int'],
statMult: 0.76, statMult: 0.76,


Ładowanie…
Anuluj
Zapisz