put experience pure functions in a lib and adapt the doc

This commit is contained in:
Romain Beaumont 2015-12-10 01:47:57 +01:00
parent 865327b482
commit ad7253d36d
4 changed files with 109 additions and 86 deletions

View file

@ -5,6 +5,16 @@
- [API](#api)
- [Classes](#classes)
- [Entity](#entity)
- [flying-squid.Command](#flying-squidcommand)
- [flying-squid.Behavior](#flying-squidbehavior)
- [Libs](#libs)
- [flying-squid.generations](#flying-squidgenerations)
- [flying-squid.version](#flying-squidversion)
- [flying-squid.experience](#flying-squidexperience)
- [getXpLevel(xp)](#getxplevelxp)
- [getXpRequired(level, toLevel=level+1)](#getxprequiredlevel-tolevellevel1)
- [getBaseXpFromLevel(level)](#getbasexpfromlevellevel)
- [distanceToXpLevel(xp, toLevel=startLevel+1, startLevel=xp level)](#distancetoxplevelxp-tolevelstartlevel1-startlevelxp-level)
- [MCServer](#mcserver)
- [Flying-squid.createMCServer(options)](#flying-squidcreatemcserveroptions)
- [Properties](#properties)
@ -45,10 +55,6 @@
- [server.playNoteBlock(world, position, pitch)](#serverplaynoteblockworld-position-pitch)
- [server.getNote(note)](#servergetnotenote)
- [server.emitParticle(particle, world, position, opt)](#serveremitparticleparticle-world-position-opt)
- [serv.getXpLevel(xp)](#servgetxplevelxp)
- [serv.getXpRequired(level, toLevel=level+1)](#servgetxprequiredlevel-tolevellevel1)
- [serv.getBaseXpFromLevel(level)](#servgetbasexpfromlevellevel)
- [serv.distanceToXpLevel(xp, toLevel=startLevel+1, startLevel=xp level)](#servdistancetoxplevelxp-tolevelstartlevel1-startlevelxp-level)
- [Low level methods](#low-level-methods)
- [server._writeAll(packetName, packetFields)](#server_writeallpacketname-packetfields)
- [server._writeArray(packetName, packetFields, playerArray)](#server_writearraypacketname-packetfields-playerarray)
@ -157,6 +163,42 @@
### Entity
See [prismarine-entity](https://github.com/PrismarineJS/prismarine-entity)
### flying-squid.Command
### flying-squid.Behavior
### Libs
Collections of pure functions
### flying-squid.generations
### flying-squid.version
### flying-squid.experience
#### getXpLevel(xp)
Get level given XP amount
#### getXpRequired(level, toLevel=level+1)
Get's the amount of xp required to get from level to toLevel (or level to level+1)
#### getBaseXpFromLevel(level)
Gets the minimum amount of xp required to be at that level (or "base xp" for that level)
#### distanceToXpLevel(xp, toLevel=startLevel+1, startLevel=xp level)
Gets a number between 0 and 1 (used in player.displayXp as the green bar at the bottom) that is the progress of xp between startLevel and toLevel.
By default, startLevel will be the xp's lowest possible level: getXpLevel(xp)
By default, toLevel is startLevel + 1.
This means when startLevel and toLevel are at their defaults, this function returns the progress to the next level of XP (from 0.0 to 1.0)
## MCServer
### Flying-squid.createMCServer(options)
@ -365,27 +407,6 @@ Opt:
- size: vec3 of the size. (0,0,0) will be at an exact position, (10,10,10) will be very spread out (particles less dense)
- count: Number of particles. 100,000,000+ will crash the client. Try not to go over 100,000 (sincerely, minecraft clients)
#### serv.getXpLevel(xp)
Get level given XP amount
#### serv.getXpRequired(level, toLevel=level+1)
Get's the amount of xp required to get from level to toLevel (or level to level+1)
#### serv.getBaseXpFromLevel(level)
Gets the minimum amount of xp required to be at that level (or "base xp" for that level)
#### serv.distanceToXpLevel(xp, toLevel=startLevel+1, startLevel=xp level)
Gets a number between 0 and 1 (used in player.displayXp as the green bar at the bottom) that is the progress of xp between startLevel and toLevel.
By default, startLevel will be the xp's lowest possible level: serv.getXpLevel(xp)
By default, toLevel is startLevel + 1.
This means when startLevel and toLevel are at their defaults, this function returns the progress to the next level of XP (from 0.0 to 1.0)
### Low level methods

View file

@ -12,7 +12,8 @@ module.exports = {
Behavior:require("./lib/behavior"),
Command:require("./lib/command"),
version:require("./lib/version"),
generations:require("./lib/generations")
generations:require("./lib/generations"),
experience:require("./lib/experience")
};
function createMCServer(options) {

48
src/lib/experience.js Normal file
View file

@ -0,0 +1,48 @@
module.exports={distanceToXpLevel,getXpLevel,getXpRequired,getBaseXpFromLevel};
function distanceToXpLevel(xp, toLevel) {
var level = getXpLevel(xp);
if (!toLevel) toLevel = level+1;
var levelBaseXp = getBaseXpFromLevel(level);
var requiredXp = getXpRequired(level, toLevel);
return (xp - levelBaseXp) / requiredXp;
}
function getXpLevel(xp) {
// I have to use quadratic equation to reverse the equation from getBaseXpFromLevel(). Ugh.
var a;
var b;
var c;
if (xp < 352) { // 352 == Experience at level 16
a = 1;
b = 6;
c = 0;
} else if (xp < 1507) { // 1507 == Experience at level 31
a = 2.5;
b = -40.5;
c = 360;
} else { // Level 32+
a = 4.5;
b = -162.5;
c = 2220;
}
c -= xp;
return Math.floor((-b + Math.sqrt(b*b - 4*a*c)) / (2 * a)); // Math class was useful I guess mmph
}
function getXpRequired(level, toLevel) {
if (!toLevel) toLevel = level + 1;
return getBaseXpFromLevel(toLevel) - getBaseXpFromLevel(level);
}
function getBaseXpFromLevel(level){
// The equations in this function are stupid and directly from the MC Wiki
// http://minecraft.gamepedia.com/Experience#Leveling_up
if (level <= 16) {
return level*level + 6*level;
} else if (level <= 31) {
return 2.5*level*level - 40.5*level + 360;
} else { // 32+
return 4.5*level*level - 162.5*level + 2220;
}
}

View file

@ -1,4 +1,6 @@
module.exports.player = function(player, serv) {
var {distanceToXpLevel,getXpLevel,getBaseXpFromLevel}=require("flying-squid").experience;
module.exports.player = function(player) {
player.xp = 0;
player.displayXp = 0;
player.xpLevel = 0;
@ -9,24 +11,24 @@ module.exports.player = function(player, serv) {
level: player.level,
totalExperience: player.xp
});
}
};
player.setXpLevel = (level) => {
player.xpLevel = level;
player.sendXp();
}
};
player.setDisplayXp = (num) => {
player.displayXp = Math.max(0, Math.min(1, player.displayXp));
player.sendXp();
}
};
player.setXp = (xp, { setLevel=true, setDisplay=true, send=true }={}) => {
player.xp = xp;
if (setLevel) player.level = serv.getXpLevel(xp);
if (setDisplay) player.displayXp = serv.distanceToXpLevel(xp);
if (setLevel) player.level = getXpLevel(xp);
if (setDisplay) player.displayXp = distanceToXpLevel(xp);
if (send) player.sendXp();
}
};
player.commands.add({
base: 'xp',
@ -46,61 +48,12 @@ module.exports.player = function(player, serv) {
user.setXp(user.xp + amt);
player.chat('Gave ' + user.username + ' ' + amt + ' xp');
} else {
var currLevel = serv.getXpLevel(player.xp);
var baseCurrLevel = serv.getBaseXpFromLevel(currLevel);
var currLevel = getXpLevel(player.xp);
var baseCurrLevel = getBaseXpFromLevel(currLevel);
var extraXp = player.xp - baseCurrLevel;
user.setXp(serv.getBaseXpFromLevel(currLevel + amt) + extraXp);
user.setXp(getBaseXpFromLevel(currLevel + amt) + extraXp);
player.chat('Gave ' + user.username + ' ' + amt + ' levels');
}
}
});
}
module.exports.server = function(serv) {
serv.distanceToXpLevel = (xp, toLevel) => {
var level = serv.getXpLevel(xp);
if (!toLevel) toLevel = level+1;
var levelBaseXp = serv.getBaseXpFromLevel(level);
var requiredXp = serv.getXpRequired(level, toLevel);
return (xp - levelBaseXp) / requiredXp;
}
serv.getXpLevel = (xp) => {
// I have to use quadratic equation to reverse the equation from serv.getBaseXpFromLevel(). Ugh.
var a;
var b;
var c;
if (xp < 352) { // 352 == Experience at level 16
a = 1;
b = 6;
c = 0;
} else if (xp < 1507) { // 1507 == Experience at level 31
a = 2.5;
b = -40.5;
c = 360;
} else { // Level 32+
a = 4.5;
b = -162.5;
c = 2220;
}
c -= xp;
return Math.floor((-b + Math.sqrt(b*b - 4*a*c)) / (2 * a)); // Math class was useful I guess mmph
}
serv.getXpRequired = (level, toLevel) => {
if (!toLevel) toLevel = level + 1;
return serv.getBaseXpFromLevel(toLevel) - serv.getBaseXpFromLevel(level);
}
serv.getBaseXpFromLevel = (level) => {
// The equations in this function are stupid and directly from the MC Wiki
// http://minecraft.gamepedia.com/Experience#Leveling_up
if (level <= 16) {
return level*level + 6*level;
} else if (level <= 31) {
return 2.5*level*level - 40.5*level + 360;
} else { // 32+
return 4.5*level*level - 162.5*level + 2220;
}
}
}
};