Browse Source

fixes #558

tags/v0.2.0^2
big bad waffle 6 years ago
parent
commit
0bcfe63d11
13 changed files with 265 additions and 144 deletions
  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 View File

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

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 View File

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

compare = equippedTwoHanded;
}
}
}
}

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

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

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


+ 10
- 2
src/client/ui/templates/tooltipItem/styles.less View File

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

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

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

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

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

.high-level {
color: @red;
}

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

.material {


+ 6
- 2
src/client/ui/templates/tooltipItem/templateTooltip.html View File

@@ -5,11 +5,15 @@
</div>
<div class="stats">$STATS$</div>
<div class="effects">$EFFECTS$</div>
<div class="faction">faction: $faction$</div>
<div class="material">crafting material</div>
<div class="quest">quest item</div>
<div class="spellName">$SPELLNAME$</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="info"><br />[shift] to compare</div>

+ 17
- 4
src/client/ui/templates/tooltipItem/tooltipItem.js View File

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

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

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

@@ -194,6 +201,11 @@ define([
else
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))
this.tooltip.find('.type').hide();
else {
@@ -205,10 +217,11 @@ define([
if (item.power)
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)) {
this.tooltip.find('.level').hide();


+ 2
- 13
src/server/components/equipment.js View File

@@ -37,14 +37,9 @@ define([
var item = this.obj.inventory.findItem(itemId);
if (!item)
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;
return;
} else if ((item.factions) && (this.obj.player)) {
if (!this.obj.reputation.canEquipItem(item)) {
item.eq = false;
return;
}
}

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

var level = (this.obj.stats.originalValues || this.obj.stats.values).level;
var item = this.obj.inventory.findItem(itemId);
if (!item)
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;
return;
} else if ((item.factions) && (this.obj.player)) {
if (!this.obj.reputation.canEquipItem(item)) {
item.eq = false;
return;
}
}

if (!slot)


+ 128
- 104
src/server/components/inventory.js View File

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

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

blueprint: null,

//Base Methods

init: function (blueprint, isTransfer) {
var items = blueprint.items || [];
var iLen = items.length;
@@ -68,51 +71,74 @@ define([
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)
});
},

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

//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) {
var item = this.findItem(id);
if (!item)
@@ -950,75 +1025,24 @@ define([
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 View File

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

+ 10
- 0
src/server/items/config/types.js View File

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


+ 4
- 3
src/server/items/generator.js View File

@@ -9,11 +9,12 @@ define([
'items/generators/quantity',
'items/generators/spellbook',
'items/generators/currency',
'items/generators/effects'
'items/generators/effects',
'items/generators/attrRequire'
], 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 spellGenerators = [g1, g9, g7];
var currencyGenerators = [g10];


+ 41
- 0
src/server/items/generators/attrRequire.js View File

@@ -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 View File

@@ -26,8 +26,16 @@ define([
if (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)
blueprint.statMult.armor = typeBlueprint.armorMult;


+ 1
- 0
src/server/mods/class-necromancer/index.js View File

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


Loading…
Cancel
Save