V0.1.6.1 See merge request Isleward/isleward!214tags/v0.1.7^2
@@ -73,4 +73,4 @@ body { | |||
-webkit-border-radius: 10px; | |||
border-radius: 0px; | |||
background: @lightGray; | |||
} | |||
} |
@@ -18,6 +18,9 @@ define([ | |||
}, | |||
update: function() { | |||
if (this.obj.moveAnimation) | |||
this.obj.pather.clearPath(); | |||
if (input.isKeyDown('esc')) { | |||
client.request({ | |||
cpn: 'player', | |||
@@ -72,6 +75,9 @@ define([ | |||
this.addQueue(newX, newY); | |||
}, | |||
addQueue: function(x, y) { | |||
if (this.obj.moveAnimation) | |||
return; | |||
this.obj.dirty = true; | |||
this.obj.pather.add(x, y); | |||
@@ -7,6 +7,7 @@ define([ | |||
) { | |||
var scale = 40; | |||
var scaleMult = 5; | |||
var round = Math.round.bind(Math); | |||
return { | |||
type: 'pather', | |||
@@ -28,11 +29,11 @@ define([ | |||
events.on('onDeath', this.onDeath.bind(this)); | |||
events.on('onClearQueue', this.onDeath.bind(this)); | |||
this.pathPos.x = this.obj.x; | |||
this.pathPos.y = this.obj.y; | |||
this.pathPos.x = round(this.obj.x); | |||
this.pathPos.y = round(this.obj.y); | |||
}, | |||
onDeath: function() { | |||
clearPath: function() { | |||
this.path.forEach(function(p) { | |||
renderer.destroyObject({ | |||
layerName: 'effects', | |||
@@ -41,8 +42,13 @@ define([ | |||
}); | |||
this.path = []; | |||
this.pathPos.x = this.obj.x; | |||
this.pathPos.y = this.obj.y; | |||
}, | |||
onDeath: function() { | |||
this.clearPath(); | |||
this.pathPos.x = round(this.obj.x); | |||
this.pathPos.y = round(this.obj.y); | |||
}, | |||
add: function(x, y) { | |||
@@ -66,8 +72,8 @@ define([ | |||
var y = this.obj.y; | |||
if (this.path.length == 0) { | |||
this.pathPos.x = x; | |||
this.pathPos.y = y; | |||
this.pathPos.x = round(x); | |||
this.pathPos.y = round(y); | |||
} | |||
if ((x == this.lastX) && (y == this.lastY)) | |||
@@ -95,8 +101,8 @@ define([ | |||
setPath: function(path) { | |||
this.path = this.path.concat(path); | |||
this.pathPos.x = path[path.length - 1].x; | |||
this.pathPos.y = path[path.length - 1].y; | |||
this.pathPos.x = round(path[path.length - 1].x); | |||
this.pathPos.y = round(path[path.length - 1].y); | |||
} | |||
}; | |||
}); |
@@ -33,7 +33,6 @@ define([ | |||
'help', | |||
'dialogue', | |||
'buffs', | |||
'partyLoot', | |||
'tooltips', | |||
'tooltipInfo', | |||
'tooltipItem', | |||
@@ -48,7 +47,8 @@ define([ | |||
'overlay', | |||
'death', | |||
'leaderboard', | |||
'reputation' | |||
'reputation', | |||
'mail' | |||
].forEach(function(u) { | |||
this.build(u); | |||
}, this); | |||
@@ -281,6 +281,10 @@ define([ | |||
text: 'augment', | |||
callback: this.openAugmentUi.bind(this, item) | |||
}, | |||
mail: { | |||
text: 'mail', | |||
callback: this.openMailUi.bind(this, item) | |||
}, | |||
divider: '----------' | |||
}; | |||
@@ -320,6 +324,9 @@ define([ | |||
config.push(menuItems.destroy); | |||
} | |||
if ((!item.noDrop) && (!item.quest) && (!item.noSalvage)) | |||
config.push(menuItems.mail); | |||
if (config.length > 0) | |||
events.emit('onContextMenu', config, e); | |||
@@ -459,6 +466,12 @@ define([ | |||
}); | |||
}, | |||
openMailUi: function(item) { | |||
events.emit('onSetMailItem', { | |||
item: item | |||
}); | |||
}, | |||
onKeyDown: function(key) { | |||
if (key == 'i') | |||
this.toggle(); | |||
@@ -29,7 +29,6 @@ | |||
.right { | |||
height: @boxHeight; | |||
float: left; | |||
background-color: #3a3b4a; | |||
width: @rightWidth; | |||
@@ -110,6 +109,19 @@ | |||
} | |||
} | |||
.news { | |||
margin-top: 40px; | |||
color: @white; | |||
width: 400px; | |||
text-align: center; | |||
filter: | |||
drop-shadow(0px -4px 0px @blackD) | |||
drop-shadow(0px 4px 0px @blackD) | |||
drop-shadow(4px 0px 0px @blackD) | |||
drop-shadow(-4px 0px 0px @blackD); | |||
} | |||
.spacer-h { | |||
height: 61px; | |||
} | |||
@@ -11,6 +11,7 @@ | |||
</div> | |||
<div class="message"></div> | |||
</div> | |||
<div class="news">[ Fishing Tournament every day at 7PM GMT ]</div> | |||
<div class="extra"> | |||
<div class="el button btnPatreon" location="http://patreon.com/bigbadwaffle">Pledge on Patreon</div> | |||
<div class="el button btnPaypal" location="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BR2CC82WUAVEA">Donate on Paypal</div> | |||
@@ -0,0 +1,102 @@ | |||
define([ | |||
'js/system/events', | |||
'js/system/client', | |||
'html!ui/templates/mail/template', | |||
'css!ui/templates/mail/styles' | |||
], function( | |||
events, | |||
client, | |||
template, | |||
styles | |||
) { | |||
return { | |||
tpl: template, | |||
centered: true, | |||
modal: true, | |||
item: null, | |||
postRender: function() { | |||
this.onEvent('onSetMailItem', this.onSetItem.bind(this)); | |||
this.find('.btnSend').on('click', this.onSendClick.bind(this)); | |||
}, | |||
onSendClick: function() { | |||
if (!this.item) | |||
return; | |||
var recipient = this.find('.txtRecipient').val(); | |||
if (recipient.length == 0) | |||
return; | |||
client.request({ | |||
cpn: 'player', | |||
method: 'performAction', | |||
data: { | |||
cpn: 'inventory', | |||
method: 'mailItem', | |||
data: { | |||
itemId: this.item.id, | |||
recipient: recipient | |||
} | |||
}, | |||
callback: this.onSend.bind(this) | |||
}); | |||
}, | |||
onSend: function(res) { | |||
if (res.length > 0) { | |||
events.emit('onGetAnnouncement', { | |||
msg: res, | |||
type: 'failure' | |||
}); | |||
return; | |||
} | |||
this.hide(); | |||
}, | |||
onSetItem: function(msg) { | |||
this.toggle(); | |||
this.item = msg.item; | |||
var item = msg.item; | |||
var imgX = -item.sprite[0] * 64; | |||
var imgY = -item.sprite[1] * 64; | |||
var spritesheet = item.spritesheet || '../../../images/items.png'; | |||
if (item.material) | |||
spritesheet = '../../../images/materials.png'; | |||
else if (item.quest) | |||
spritesheet = '../../../images/questItems.png'; | |||
var el = this.find('.item'); | |||
el | |||
.data('item', item) | |||
/*.on('mousemove', this.onHover.bind(this, el, item)) | |||
.on('mouseleave', this.hideTooltip.bind(this, el, item))*/ | |||
.find('.icon') | |||
.css('background', 'url(' + spritesheet + ') ' + imgX + 'px ' + imgY + 'px'); | |||
if (item.quantity) { | |||
var quantityText = item.quantity; | |||
el.find('.quantity').html(item.quantity); | |||
} | |||
}, | |||
toggle: function() { | |||
this.shown = !this.el.is(':visible'); | |||
if (this.shown) { | |||
this.show(); | |||
} else | |||
this.hide(); | |||
} | |||
} | |||
}); |
@@ -0,0 +1,113 @@ | |||
@import "../../../css/ui.less"; | |||
.uiMail { | |||
display: none; | |||
background-color: @blackB; | |||
border: 5px solid #c0c3cf; | |||
padding: 10px; | |||
.top { | |||
margin-bottom: 10px; | |||
.heading { | |||
color: @orange; | |||
text-align: center; | |||
} | |||
} | |||
.bottom { | |||
.col { | |||
float: left; | |||
width: 80px; | |||
height: 80px; | |||
&:nth-child(2) { | |||
width: 200px; | |||
padding-top: 4px; | |||
> * { | |||
width: 100%; | |||
height: 31px; | |||
} | |||
.btnSend { | |||
height: 35px; | |||
background-color: @blueB; | |||
text-align: center; | |||
padding-top: 12px; | |||
color: @white; | |||
} | |||
input, input:-webkit-autofill { | |||
box-shadow: 0 0 0px 1000px darken(@blackB, 15%) inset; | |||
color: @white; | |||
-webkit-text-fill-color: @white; | |||
margin-bottom: 5px; | |||
text-align: center; | |||
} | |||
/* We duplicate this for firefox which doesn't like the webkit selector */ | |||
input { | |||
box-shadow: 0 0 0px 1000px darken(@blackB, 15%) inset; | |||
color: @white; | |||
-webkit-text-fill-color: @white; | |||
margin-bottom: 5px; | |||
text-align: center; | |||
} | |||
} | |||
.item { | |||
width: 100%; | |||
height: 100%; | |||
float: left; | |||
position: relative; | |||
cursor: pointer; | |||
box-sizing: border-box; | |||
.quantity { | |||
left: 6px; | |||
bottom: 3px; | |||
position: absolute; | |||
color: @white; | |||
filter: | |||
drop-shadow(0px -2px 0px @blackD) | |||
drop-shadow(0px 2px 0px @blackD) | |||
drop-shadow(2px 0px 0px @blackD) | |||
drop-shadow(-2px 0px 0px @blackD); | |||
-moz-filter: | |||
drop-shadow(0px -2px 0px @blackD) | |||
drop-shadow(0px 2px 0px @blackD) | |||
drop-shadow(2px 0px 0px @blackD) | |||
drop-shadow(-2px 0px 0px @blackD); | |||
&.red { | |||
color: @red; | |||
} | |||
} | |||
.icon { | |||
width: 64px; | |||
height: 64px; | |||
position: absolute; | |||
left: 8px; | |||
top: 8px; | |||
filter: | |||
brightness(100%) | |||
drop-shadow(0px -4px 0px @blackD) | |||
drop-shadow(0px 4px 0px @blackD) | |||
drop-shadow(4px 0px 0px @blackD) | |||
drop-shadow(-4px 0px 0px @blackD); | |||
-moz-filter: | |||
brightness(100%) | |||
drop-shadow(0px -4px 0px @blackD) | |||
drop-shadow(0px 4px 0px @blackD) | |||
drop-shadow(4px 0px 0px @blackD) | |||
drop-shadow(-4px 0px 0px @blackD); | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,17 @@ | |||
<div class="uiMail"> | |||
<div class="top"> | |||
<div class="heading">mail item</div> | |||
</div> | |||
<div class="bottom"> | |||
<div class="col"> | |||
<div class="item"> | |||
<div class="icon"></div> | |||
<div class="quantity"></div> | |||
</div> | |||
</div> | |||
<div class="col"> | |||
<input class="txtRecipient textbox" type="text" placeholder="recipient"> | |||
<div class="btnSend">send</div> | |||
</div> | |||
</div> | |||
</div> |
@@ -29,10 +29,15 @@ define([ | |||
this.el.find('.btnCharSelect').on('click', this.charSelect.bind(this)); | |||
this.el.find('.btnLogOut').on('click', this.logOut.bind(this)); | |||
this.el.find('.btnContinue').on('click', this.toggle.bind(this)); | |||
this.el.find('.btnPatreon').on('click', this.patreon.bind(this)); | |||
this.onEvent('onResize', this.onResize.bind(this)); | |||
}, | |||
patreon: function() { | |||
window.open('http://patreon.com/bigbadwaffle', '_blank'); | |||
}, | |||
charSelect: function() { | |||
client.request({ | |||
module: 'cons', | |||
@@ -3,4 +3,5 @@ | |||
<div class="btn btnScreen">Windowed</div> | |||
<div class="btn btnCharSelect">Character Select</div> | |||
<div class="btn btnLogOut">Log Out</div> | |||
<div class="btn btnPatreon">Pledge on Patreon</div> | |||
</div> |
@@ -1,5 +1,5 @@ | |||
define([ | |||
'misc/fileLister' | |||
'../misc/fileLister' | |||
], function( | |||
fileLister | |||
) { | |||
@@ -22,9 +22,8 @@ define([ | |||
talk: function(msg) { | |||
var target = msg.target; | |||
var targetName = (msg.targetName || '').toLowerCase(); | |||
if ((target == null) && (!targetName)) | |||
if ((target == null) && (!msg.targetName)) | |||
return false; | |||
if ((target != null) && (target.id == null)) { | |||
@@ -32,8 +31,8 @@ define([ | |||
if (!target) | |||
return false; | |||
} | |||
else if (targetName != null) { | |||
target = this.obj.instance.objects.objects.find(o => ((o.name) && (o.name.toLowerCase() == targetName))); | |||
else if (msg.targetName != null) { | |||
target = this.obj.instance.objects.objects.find(o => ((o.name) && (o.name.toLowerCase() == msg.targetName.toLowerCase()))); | |||
if (!target) | |||
return false; | |||
} | |||
@@ -1,9 +1,9 @@ | |||
define([ | |||
'items/generator', | |||
'items/salvager', | |||
'items/enchanter', | |||
'objects/objects', | |||
'config/classes' | |||
'../items/generator', | |||
'../items/salvager', | |||
'../items/enchanter', | |||
'../objects/objects', | |||
'../config/classes' | |||
], function( | |||
generator, | |||
salvager, | |||
@@ -296,6 +296,35 @@ define([ | |||
}, this); | |||
}, | |||
mailItem: function(msg) { | |||
var item = this.findItem(msg.itemId); | |||
if (!item) { | |||
this.resolveCallback(msg); | |||
return; | |||
} | |||
delete item.pos; | |||
var io = require('security/io'); | |||
io.get({ | |||
ent: msg.recipient, | |||
field: 'character', | |||
callback: this.onCheckCharExists.bind(this, msg, item) | |||
}); | |||
}, | |||
onCheckCharExists: function(msg, item, res) { | |||
if (!res) { | |||
this.resolveCallback(msg, 'Recipient does not exist'); | |||
return; | |||
} | |||
this.obj.instance.mail.sendMail(msg.recipient, [ extend(true, {}, item) ]); | |||
this.destroyItem(item.id); | |||
this.resolveCallback(msg); | |||
}, | |||
//Helpers | |||
resolveCallback: function(msg, result) { | |||
@@ -442,19 +471,20 @@ define([ | |||
var items = this.items; | |||
var iLen = items.length; | |||
var nonEqItems = items.filter(f => !f.eq).length; | |||
if ((nonEqItems >= this.inventorySize) && (!hideMessage)) { | |||
this.obj.instance.syncer.queue('onGetMessages', { | |||
id: this.obj.id, | |||
messages: [{ | |||
class: 'q0', | |||
message: 'you bags are too full to loot any more items', | |||
type: 'info' | |||
}] | |||
}, [this.obj.serverId]); | |||
return false; | |||
if (this.inventorySize != -1) { | |||
var nonEqItems = items.filter(f => !f.eq).length; | |||
if ((nonEqItems >= this.inventorySize) && (!hideMessage)) { | |||
this.obj.instance.syncer.queue('onGetMessages', { | |||
id: this.obj.id, | |||
messages: [{ | |||
class: 'q0', | |||
message: 'you bags are too full to loot any more items', | |||
type: 'info' | |||
}] | |||
}, [this.obj.serverId]); | |||
return false; | |||
} | |||
} | |||
for (var i = 0; i < iLen; i++) { | |||
@@ -486,7 +516,7 @@ define([ | |||
var msg = item.name; | |||
if (quantity) | |||
msg += ' x' + quantity; | |||
else if ((item.stats) && (item.stats.weight)) | |||
else if ((item.stats) && (item.stats.weight)) | |||
msg += ` ${item.stats.weight}lb`; | |||
messages.push({ | |||
class: 'q' + item.quality, | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'config/factionBase' | |||
'../config/factionBase' | |||
], function( | |||
factionBase | |||
) { | |||
@@ -548,6 +548,8 @@ define([ | |||
var rewards = loginRewards.generate(stats.loginStreak); | |||
mail.sendMail(this.obj.name, rewards); | |||
} | |||
else | |||
this.obj.instance.mail.getMail(this.obj.name); | |||
stats.lastLogin = time; | |||
} | |||
@@ -1,6 +1,6 @@ | |||
define([ | |||
'items/generator', | |||
'items/generators/stats' | |||
'../items/generator', | |||
'../items/generators/stats' | |||
], function( | |||
generator, | |||
statGenerator | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'misc/events' | |||
'../misc/events' | |||
], function( | |||
events | |||
) { | |||
@@ -24,13 +24,13 @@ define([ | |||
'2': [{ | |||
name: 'Rare Essence', | |||
sprite: [0, 4] | |||
}, { | |||
name: 'Rare Essence', | |||
sprite: [0, 4] | |||
}], | |||
'3': [{ | |||
name: 'Cerulean Pearl', | |||
sprite: [11, 9] | |||
}, { | |||
name: 'Epic Essence', | |||
sprite: [0, 5] | |||
}], | |||
'4': [{ | |||
name: 'Legendary Essence', | |||
@@ -227,6 +227,8 @@ module.exports = { | |||
var inventory = obj.inventory; | |||
var crystals = inventory.items.find(i => (i.name == 'Digested Crystal')); | |||
if (!crystals) | |||
return; | |||
obj.reputation.getReputation('akarei', crystals.quantity * 15); | |||
inventory.destroyItem(crystals.id); | |||
@@ -143,13 +143,17 @@ module.exports = { | |||
var srcInventory = source.inventory; | |||
var tgtInventory = target.inventory; | |||
var fishies = srcInventory.items.filter(i => (i.name.indexOf('Ancient Carp') > -1)); | |||
fishies.forEach(function(f) { | |||
f.owner = source.name; | |||
srcInventory.items | |||
.filter(i => (i.name.indexOf('Ancient Carp') > -1)) | |||
.sort((a, b) => (b.stats.weight - a.stats.weight)) | |||
.forEach(function(f, i) { | |||
if (i == 0) { | |||
f.owner = source.name; | |||
tgtInventory.getItem(extend(true, {}, f)); | |||
} | |||
srcInventory.destroyItem(f.id); | |||
tgtInventory.getItem(f); | |||
}); | |||
srcInventory.destroyItem(f.id); | |||
}); | |||
}, | |||
getRank: function(event, playerName) { | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'misc/events' | |||
'../misc/events' | |||
], function( | |||
events | |||
) { | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'misc/events' | |||
'../misc/events' | |||
], function( | |||
events | |||
) { | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'misc/events' | |||
'../../misc/events' | |||
], function( | |||
events | |||
) { | |||
@@ -1,6 +1,6 @@ | |||
define([ | |||
'items/generators/stats', | |||
'items/salvager' | |||
'./generators/stats', | |||
'./salvager' | |||
], function( | |||
generatorStats, | |||
salvager | |||
@@ -52,6 +52,11 @@ define([ | |||
item.stats[p] -= value; | |||
if (item.stats[p] <= 0) | |||
delete item.stats[p]; | |||
if (p == 'lvlRequire') { | |||
item.level += value; | |||
delete item.originalLevel; | |||
} | |||
} | |||
} | |||
@@ -1,13 +1,13 @@ | |||
define([ | |||
'items/generators/level', | |||
'items/generators/quality', | |||
'items/generators/slots', | |||
'items/generators/types', | |||
'items/generators/stats', | |||
'items/generators/names', | |||
'items/generators/worth', | |||
'items/generators/spellbook', | |||
'items/salvager' | |||
'./generators/level', | |||
'./generators/quality', | |||
'./generators/slots', | |||
'./generators/types', | |||
'./generators/stats', | |||
'./generators/names', | |||
'./generators/worth', | |||
'./generators/spellbook', | |||
'./salvager' | |||
], function( | |||
g1, g2, g3, g4, g5, g6, g7, | |||
g8 | |||
@@ -1,6 +1,6 @@ | |||
define([ | |||
'items/config/prefixes', | |||
'items/config/suffixes' | |||
'../config/prefixes', | |||
'../config/suffixes' | |||
], function( | |||
prefixes, | |||
suffixes | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'items/config/slots' | |||
'../config/slots' | |||
], function( | |||
configSlots | |||
) { | |||
@@ -1,6 +1,6 @@ | |||
define([ | |||
'config/spells', | |||
'config/spellsConfig' | |||
'../../config/spells', | |||
'../../config/spellsConfig' | |||
], function( | |||
spells, | |||
spellsConfig | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'items/generators/statsFishingRod' | |||
'./statsFishingRod' | |||
], function( | |||
statsFishingRod | |||
) { | |||
@@ -1,6 +1,6 @@ | |||
define([ | |||
'items/config/types', | |||
'items/config/armorMaterials' | |||
'../config/types', | |||
'../config/armorMaterials' | |||
], function( | |||
configTypes, | |||
armorMaterials | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'security/io' | |||
'../security/io' | |||
], function( | |||
io | |||
) { | |||
@@ -14,6 +14,16 @@ define([ | |||
getMail: function(playerName) { | |||
var player = this.instance.objects.objects.find(o => (o.name == playerName)); | |||
if (!player) { | |||
process.send({ | |||
method: 'callDifferentThread', | |||
playerName: playerName, | |||
data: { | |||
module: 'mail', | |||
method: 'getMail', | |||
args: [ playerName ] | |||
} | |||
}); | |||
this.processQueue(playerName); | |||
return; | |||
} | |||
@@ -1,6 +1,6 @@ | |||
define([ | |||
'misc/fileLister', | |||
'misc/events' | |||
'./fileLister', | |||
'./events' | |||
], function( | |||
fileLister, | |||
events | |||
@@ -4,7 +4,7 @@ define([ | |||
) { | |||
return { | |||
name: 'Necormancer Class', | |||
name: 'Necromancer Class', | |||
extraScripts: [ | |||
'spells/spellHarvestLife', | |||
@@ -1,5 +1,5 @@ | |||
define([ | |||
'components/components' | |||
'../components/components' | |||
], function( | |||
components | |||
) { | |||
@@ -1,6 +1,6 @@ | |||
define([ | |||
'objects/objBase', | |||
'leaderboard/leaderboard' | |||
'../objects/objBase', | |||
'../leaderboard/leaderboard' | |||
], function( | |||
objBase, | |||
leaderboard | |||
@@ -1,9 +1,7 @@ | |||
define([ | |||
'objects/objects', | |||
'world/atlas' | |||
'objects/objects' | |||
], function( | |||
objects, | |||
atlas | |||
objects | |||
) { | |||
return { | |||
players: [], | |||
@@ -22,7 +22,7 @@ define([ | |||
dialogue: ['talk'], | |||
gatherer: ['gather'], | |||
quests: ['complete'], | |||
inventory: ['moveItem', 'enchantItem', 'getEnchantMaterials', 'learnAbility', 'unlearnAbility', 'dropItem', 'destroyItem', 'salvageItem', 'stashItem', ''], | |||
inventory: ['moveItem', 'enchantItem', 'getEnchantMaterials', 'learnAbility', 'unlearnAbility', 'dropItem', 'destroyItem', 'salvageItem', 'stashItem', 'mailItem'], | |||
equipment: ['equip', 'unequip'], | |||
stash: ['withdraw'], | |||
trade: ['buySell' ], | |||
@@ -2,12 +2,14 @@ define([ | |||
'../misc/fileLister', | |||
'child_process', | |||
'objects/objects', | |||
'config/maps/mapList' | |||
'config/maps/mapList', | |||
'security/connections' | |||
], function( | |||
fileLister, | |||
childProcess, | |||
objects, | |||
mapList | |||
mapList, | |||
connections | |||
) { | |||
return { | |||
nextId: 0, | |||
@@ -103,7 +105,6 @@ define([ | |||
if (!callback) | |||
return; | |||
callback.callback(msg.result); | |||
}, | |||
@@ -160,6 +161,20 @@ define([ | |||
object: function(thread, message) { | |||
objects.updateObject(message); | |||
}, | |||
callDifferentThread: function(thread, message) { | |||
var obj = connections.players.find(p => (p.name == message.playerName)); | |||
if (!obj) | |||
return; | |||
var thread = this.getThreadFromName(obj.zoneName); | |||
if (!thread) | |||
return; | |||
thread.worker.send({ | |||
module: message.data.module, | |||
method: message.data.method, | |||
args: message.data.args | |||
}); | |||
}, | |||
rezone: function(thread, message) { | |||
var obj = message.args.obj; | |||
obj.destroyed = false; | |||
@@ -56,6 +56,8 @@ define([ | |||
scheduler: scheduler | |||
}; | |||
this.instances.push(fakeInstance); | |||
spawners.init(fakeInstance); | |||
scheduler.init(); | |||
@@ -69,6 +69,7 @@ define([ | |||
mob.addComponent('equipment'); | |||
mob.addComponent('inventory', drops); | |||
mob.inventory.inventorySize = -1; | |||
if (this.zone) { | |||
var chats = this.zone.chats; | |||
@@ -130,6 +131,7 @@ define([ | |||
slot: slot, | |||
forceStats: [preferStat] | |||
}); | |||
delete item.spell; | |||
mob.inventory.getItem(item); | |||
mob.equipment.autoEquip(item.id); | |||
}, this); | |||
@@ -158,8 +160,8 @@ define([ | |||
var hpMult = 1 * mob.mob.hpMult; | |||
if (level < 10) { | |||
hpMult *= [0.005, 0.01, 0.1, 0.2, 0.5, 0.65, 0.75, 0.85, 0.95][level - 1]; | |||
dmgMult *= [0.2, 0.45, 0.7, 0.8, 0.9, 0.92, 0.94, 0.96, 0.98][level - 1] | |||
hpMult *= [0.005, 0.01, 0.035, 0.08, 0.16, 0.28, 0.43, 0.62, 0.8][level - 1]; | |||
dmgMult *= [0.1, 0.2, 0.4, 0.7, 1, 1, 1, 1, 1][level - 1] | |||
} | |||
if (mob.isRare) { | |||
@@ -8,8 +8,6 @@ requirejs.config({ | |||
global.io = true; | |||
var instancer = null; | |||
requirejs([ | |||
'extend', 'misc/helpers', 'components/components', 'world/instancer', 'security/io', 'misc/mods' | |||
], function( | |||
@@ -18,6 +16,7 @@ requirejs([ | |||
var onDbReady = function() { | |||
global.extend = extend; | |||
global._ = helpers; | |||
global.instancer = _instancer; | |||
require('../misc/random'); | |||
instancer = _instancer; | |||
@@ -39,7 +38,27 @@ requirejs([ | |||
}); | |||
process.on('message', (m) => { | |||
if (m.method) { | |||
if (m.module) { | |||
var instances = instancer.instances; | |||
var iLen = instances.length; | |||
for (var i = 0; i < iLen; i++) { | |||
var objects = instances[i].objects.objects; | |||
var oLen = objects.length; | |||
var found = false; | |||
for (var j = 0; j < oLen; j++) { | |||
var object = objects[j]; | |||
if (object.name == m.args[0]) { | |||
var module = object.instance[m.module]; | |||
module[m.method].apply(module, m.args); | |||
found = true; | |||
break; | |||
} | |||
} | |||
if (found) | |||
break; | |||
} | |||
} else if (m.method) | |||
instancer[m.method](m.args); | |||
} | |||
}); |
@@ -0,0 +1,8 @@ | |||
var requirejs = require('requirejs'); | |||
var extend = require('extend'); | |||
global.extend = extend; | |||
requirejs(['./tests', '../src/server/misc/helpers'], function(tests) { | |||
tests.init(); | |||
}); |
@@ -0,0 +1,18 @@ | |||
{ | |||
"name": "isleward-tests", | |||
"version": "0.0.1", | |||
"lockfileVersion": 1, | |||
"requires": true, | |||
"dependencies": { | |||
"extend": { | |||
"version": "3.0.1", | |||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", | |||
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" | |||
}, | |||
"requirejs": { | |||
"version": "2.3.5", | |||
"resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz", | |||
"integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==" | |||
} | |||
} | |||
} |
@@ -0,0 +1,10 @@ | |||
{ | |||
"name": "isleward-tests", | |||
"version": "0.0.1", | |||
"description": "isleward-tests", | |||
"dependencies": { | |||
"extend": "^3.0.0", | |||
"requirejs": "^2.3.3" | |||
}, | |||
"devDependencies": {} | |||
} |
@@ -0,0 +1,56 @@ | |||
define([ | |||
'server/mocks/generator' | |||
], function( | |||
mocks | |||
) { | |||
return { | |||
//Do you get the correct reputation when talking to a faction vendor for the first time | |||
startTalk_DiscoverFaction: function() { | |||
var factionBase = require('../src/server/config/factionBase'); | |||
var anglers = require('../src/server/config/factions/anglers'); | |||
var factionBlueprint = extend(true, {}, factionBase, anglers); | |||
var player = mocks.player({ | |||
dialogue: { | |||
}, | |||
reputation: { | |||
getBlueprint: function() { | |||
return factionBlueprint; | |||
} | |||
} | |||
}); | |||
var resultMsg = null; | |||
player.instance.syncer.queue = function(event, msg) { | |||
resultMsg = msg.messages[0].message; | |||
}; | |||
var target = mocks.player({ | |||
dialogue: { | |||
}, | |||
trade: { | |||
faction: { | |||
id: 'anglers' | |||
} | |||
} | |||
}); | |||
player.dialogue.talk({ | |||
target: target | |||
}); | |||
var rep = player.reputation.list[0]; | |||
if (rep.rep != factionBlueprint.initialRep) | |||
return true; | |||
else if (resultMsg.indexOf(' friendly ') == -1) | |||
return true; | |||
else { | |||
var tierName = factionBlueprint.tiers.find(t => (t.rep == rep.rep)).name.toLowerCase(); | |||
if (resultMsg.indexOf(` ${tierName} `) == -1) | |||
return true; | |||
} | |||
} | |||
}; | |||
}); |
@@ -0,0 +1,48 @@ | |||
define([ | |||
'server/mocks/generator' | |||
], function( | |||
mocks | |||
) { | |||
return { | |||
//Does the item exist in the stash after stashing it | |||
stashItem_Exists: function() { | |||
var player = mocks.player({ | |||
inventory: { | |||
items: [{ | |||
id: 0 | |||
}] | |||
}, | |||
stash: { | |||
active: true | |||
} | |||
}); | |||
player.inventory.stashItem(0); | |||
var stashedItem = player.stash.items.find(i => (i.id == 0)) | |||
if (!stashedItem) | |||
return true; | |||
}, | |||
//Does the stashed item have the correct quantity | |||
stashItem_Quantity: function() { | |||
var player = mocks.player({ | |||
inventory: { | |||
items: [{ | |||
id: 0, | |||
quantity: 10 | |||
}] | |||
}, | |||
stash: { | |||
active: true | |||
} | |||
}); | |||
player.inventory.stashItem(0); | |||
var stashedItem = player.stash.items.find(i => (i.id == 0)) | |||
if (stashedItem.quantity != 10) | |||
return true; | |||
} | |||
}; | |||
}); |
@@ -0,0 +1,121 @@ | |||
define([ | |||
'server/mocks/generator' | |||
], function( | |||
mocks | |||
) { | |||
return { | |||
//Is our reputation the correct amount before and after adding | |||
getReputation_GetReputation: function() { | |||
var factionBase = require('../src/server/config/factionBase'); | |||
var fjolgard = require('../src/server/config/factions/fjolgard'); | |||
var factionBlueprint = extend(true, {}, factionBase, fjolgard); | |||
var player = mocks.player({ | |||
reputation: { | |||
factions: { | |||
fjolgard: factionBlueprint | |||
}, | |||
list: [{ | |||
id: 'fjolgard', | |||
rep: 1000, | |||
tier: 0 | |||
}] | |||
}, | |||
equipment: {} | |||
}); | |||
var repBefore = player.reputation.list[0].rep; | |||
player.reputation.getReputation('fjolgard', 1); | |||
if (repBefore + 1 != player.reputation.list[0].rep) | |||
return true; | |||
}, | |||
//Is our reputation the correct amount before and after adding | |||
getReputation_LoseReputation: function() { | |||
var factionBase = require('../src/server/config/factionBase'); | |||
var fjolgard = require('../src/server/config/factions/fjolgard'); | |||
var factionBlueprint = extend(true, {}, factionBase, fjolgard); | |||
var player = mocks.player({ | |||
reputation: { | |||
factions: { | |||
fjolgard: factionBlueprint | |||
}, | |||
list: [{ | |||
id: 'fjolgard', | |||
rep: 1000, | |||
tier: 0 | |||
}] | |||
}, | |||
equipment: {} | |||
}); | |||
var repBefore = player.reputation.list[0].rep; | |||
player.reputation.getReputation('fjolgard', -1); | |||
if (repBefore - 1 != player.reputation.list[0].rep) | |||
return true; | |||
}, | |||
//Do we gain tiers when getting the correct amount of reputation to do so | |||
calculateTier_GainTier: function() { | |||
var factionBase = require('../src/server/config/factionBase'); | |||
var fjolgard = require('../src/server/config/factions/fjolgard'); | |||
var factionBlueprint = extend(true, {}, factionBase, fjolgard); | |||
var player = mocks.player({ | |||
reputation: { | |||
factions: { | |||
fjolgard: factionBlueprint | |||
}, | |||
list: [{ | |||
id: 'fjolgard' | |||
}] | |||
}, | |||
equipment: {} | |||
}); | |||
var f = player.reputation.list[0]; | |||
for (var i = 0; i < factionBlueprint.tiers.length; i++) { | |||
var tier = factionBlueprint.tiers[i]; | |||
f.tier = i - 1; | |||
f.rep = tier.rep - 1; | |||
player.reputation.getReputation('fjolgard', 1); | |||
if (f.tier != i) | |||
return true; | |||
} | |||
}, | |||
//Do we lose tiers when losing the correct amount of reputation to do so | |||
calculateTier_LoseTier: function() { | |||
var factionBase = require('../src/server/config/factionBase'); | |||
var fjolgard = require('../src/server/config/factions/fjolgard'); | |||
var factionBlueprint = extend(true, {}, factionBase, fjolgard); | |||
var player = mocks.player({ | |||
reputation: { | |||
factions: { | |||
fjolgard: factionBlueprint | |||
}, | |||
list: [{ | |||
id: 'fjolgard' | |||
}] | |||
}, | |||
equipment: {} | |||
}); | |||
var f = player.reputation.list[0]; | |||
for (var i = 1; i < factionBlueprint.tiers.length; i++) { | |||
var tier = factionBlueprint.tiers[i]; | |||
f.tier = i; | |||
f.rep = tier.rep; | |||
player.reputation.getReputation('fjolgard', -1); | |||
if (f.tier != i - 1) | |||
return true; | |||
} | |||
} | |||
}; | |||
}); |
@@ -0,0 +1,39 @@ | |||
define([ | |||
], function( | |||
) { | |||
return { | |||
nextId: 0, | |||
player: function(blueprint) { | |||
var result = { | |||
id: this.nextId++, | |||
fireEvent: function() {}, | |||
syncer: {}, | |||
instance: { | |||
syncer: { | |||
queue: function() {} | |||
} | |||
} | |||
}; | |||
blueprint.syncer = {}; | |||
for (var p in blueprint) { | |||
var componentTemplate = require('../src/server/components/' + p); | |||
var component = extend(true, {}, componentTemplate, blueprint[p]); | |||
component.obj = result; | |||
result[p] = component | |||
} | |||
return result; | |||
}, | |||
mob: function(blueprint) { | |||
} | |||
}; | |||
}); |
@@ -0,0 +1,9 @@ | |||
define([ | |||
'server/mocks/generator' | |||
], function( | |||
mocks | |||
) { | |||
return { | |||
}; | |||
}); |
@@ -0,0 +1,55 @@ | |||
define([ | |||
'server/components/inventory' | |||
], function( | |||
inventory | |||
) { | |||
var components = ['inventory', 'reputation', 'dialogue']; | |||
return { | |||
stats: { | |||
succeeded: 0, | |||
failed: 0 | |||
}, | |||
init: function() { | |||
console.log('Testing Started'); | |||
console.log(); | |||
components.forEach(function(c) { | |||
this.runTest(c, require('server/components/' + c)); | |||
}, this); | |||
console.log(); | |||
console.log('Testing Completed'); | |||
console.log('Succeeded: ' + this.stats.succeeded); | |||
console.log('Failed: ' + this.stats.failed); | |||
}, | |||
runTest: function(testName, test) { | |||
for (var t in test) { | |||
try { | |||
if (test[t]()) { | |||
this.logError(testName, t); | |||
this.stats.failed++; | |||
} | |||
else | |||
this.stats.succeeded++; | |||
} | |||
catch (e) { | |||
this.stats.failed++; | |||
this.logError(testName, t, e); | |||
} | |||
} | |||
}, | |||
logError: function(test, method, error) { | |||
var splitMethod = method.split('_'); | |||
method = splitMethod[0]; | |||
var variant = splitMethod[1]; | |||
console.log('Failed: ' + test + '.' + method + ' (' + variant + ')'); | |||
if (error) | |||
console.log(error); | |||
} | |||
}; | |||
}); |