working on making levelling smoother

This commit is contained in:
2018-10-23 15:56:21 +11:00
parent 5173807d5f
commit 3745a1efc4
2 changed files with 124 additions and 57 deletions

View File

@@ -21,6 +21,7 @@ exports.ProcessGameplayCommands = function(client, message, dialog) {
if (checkInResponse === "available") {
shared.SendPublicMessage(client, message.author, message.channel, dialog("checkin", checkinAmount));
shared.AddXP(client, message.author, 1); //1XP
exports.HandleLevelUp(client, message.member, message.channel, dialog);
} else {
shared.SendPublicMessage(client, message.channel, dialog("checkinLocked", message.author.id, checkInResponse));
}
@@ -67,61 +68,8 @@ exports.ProcessGameplayCommands = function(client, message, dialog) {
shared.SendPublicMessage(client, message.author, message.channel, dialog("giveSuccessful", targetMember.id, amount));
return true;
case "stats": //TODO: fold this code into a function
// Sees if the user is supposed to level up
let levelUp = shared.LevelUp(client, message.member); //TODO: process automatically
// Grabs all parameters from server
//TODO: improve this once the server-side has been updated
let attacker = String(dataRequest.loadServerData("userStats",message.author.id)).split(",");
if (attacker[0] == "failure") {
shared.SendPublicMessage(client, message.author, message.channel, "The server returned an error.");
return true;
}
let attackerStrength = parseFloat(attacker[1]); //TODO: constants representing the player structure instead of [0]
let attackerSpeed = parseFloat(attacker[2]);
let attackerStamina = parseFloat(attacker[3]);
let attackerHealth = parseFloat(attacker[4]);
let attackerMaxStamina = parseFloat(attacker[5]);
let attackerMaxHealth = parseFloat(attacker[6]);
let attackerWallet = parseFloat(attacker[7]);
let attackerXP = parseFloat(attacker[8]);
let attackerLVL = Math.floor(parseFloat(attacker[9]));
let attackerLvlPercent = parseFloat(attacker[10]);
let attackerStatPoints = parseFloat(attacker[11]);
// Forms stats into a string
var levelText = `:level: **${attackerLVL}**`; //NOTE: I don't like backticks
var levelProgress = `(${attackerLvlPercent}%)`;
var crystalText = `:crystals: **${attackerWallet}**`;
var cannisterText = `:cannister: **${attackerStatPoints}**`;
var userStats = "```" + `STR: ${attackerStrength} | SPD: ${attackerSpeed} | STAM: ${attackerStamina}/${attackerMaxStamina} | HP: ${attackerHealth}/${attackerMaxHealth}` + "```";
// Says level is maxed out if it is LVL 30+
if (attackerLVL >= process.env.RANK_3_THRESHOLD) {
levelProgress = "(MAX)";
}
// Creates embed & sends it
const embed = new Discord.RichEmbed()
.setAuthor(`${message.member.displayName}`, message.author.avatarURL)
.setColor(message.member.displayColor)
.setDescription(`${levelText} ${levelProgress} | ${crystalText} | ${cannisterText}`)
.addField("Stats", userStats)
.setFooter("Commands: !help | !lore | !checkin | !give");
message.channel.send(embed);
//handle levelling up
if (levelUp === "levelUp" || levelUp === "RankUp") {
if (attackerLVL >= process.env.RANK_3_THRESHOLD) {
shared.SendPublicMessage(client, message.author, message.channel, dialog("levelUpCap", dialog("levelUpCapRemark"), attackerLVL));
} else {
shared.SendPublicMessage(client, message.author, message.channel, dialog("LevelUp", dialog("levelUpRemark"), attackerLVL, attackerStatPoints));
}
}
case "stats":
exports.ProcessStatsCommand(client, message.member, message.channel, dialog);
return true;
}
@@ -162,3 +110,120 @@ exports.ProcessFactionChangeAttempt = function(client, message, factionRole, dia
.catch(console.error);
return true;
}
//ProcessStatsCommand
//client - discord.js client
//member - discord.js member
//channel - discord.js channel
//dialog - dialog function
exports.ProcessStatsCommand = function(client, member, channel, dialog) {
exports.HandleLevelUp(client, member, channel, dialog);
let stats = exports.GetStats(member.user);
exports.PrintStats(client, member, channel, stats);
}
//GetStats
//user - discord.js user OR username
exports.GetStats = function(user) { //Grabs all parameters from server
//handle user strings
if (typeof(user) === "string") {
user = client.users.find(item => item.username === user || item.id === user);
}
let userStatsResponse = String(dataRequest.loadServerData("userStats",user.id)).split(",");
if (userStatsResponse[0] == "failure") {
throw "server returned an error to userStats request";
}
let strength = parseFloat(userStatsResponse[1]); //TODO: constants representing the player structure instead of [0]
let speed = parseFloat(userStatsResponse[2]);
let stamina = parseFloat(userStatsResponse[3]);
let health = parseFloat(userStatsResponse[4]);
let maxStamina = parseFloat(userStatsResponse[5]);
let maxHealth = parseFloat(userStatsResponse[6]);
let wallet = parseFloat(userStatsResponse[7]);
let experience = parseFloat(userStatsResponse[8]);
let level = Math.floor(parseFloat(userStatsResponse[9]));
let levelPercent = parseFloat(userStatsResponse[10]);
let statPoints = parseFloat(userStatsResponse[11]);
return {
strength: strength,
speed: speed,
stamina: stamina,
health: health,
maxStamina: maxStamina,
maxHealth: maxHealth,
wallet: wallet,
experience: experience,
level: level,
levelPercent: levelPercent,
statPoints: statPoints
};
}
//PrintStats
//client - discord.js client
//member - discord.js member OR username OR id
//channel - discord.js channel OR channel name OR id
//stats - stats generated by GetStats
exports.PrintStats = function(client, member, channel, stats) {
//handle member strings
if (typeof(member) === "string") { //TODO: fold these into their own functions EVERYWHERE.
//get the member
let user = client.users.find(item => item.username === member || item.id === member);
member = guild.members.get(user.id);
}
//handle channel strings
if (typeof(channel) === "string") {
channel = client.channels.find(item => item.name === channel || item.id === channel);
}
// Forms stats into a string
let levelText = `:level: **${stats.level}**`; //NOTE: I don't like backticks
let levelProgress = `(${stats.levelPercent}%)`;
let crystalText = `:crystals: **${stats.wallet}**`;
let cannisterText = `:cannister: **${stats.statPoints}**`;
let userStats = "```" + `STR: ${stats.strength} | SPD: ${stats.speed} | STAM: ${stats.stamina}/${stats.maxStamina} | HP: ${stats.health}/${stats.maxHealth}` + "```";
// Says level is maxed out if it is LVL 30+
if (stats.level >= process.env.RANK_3_THRESHOLD) {
levelProgress = "(MAX)";
}
// Creates embed & sends it
const embed = new Discord.RichEmbed()
.setAuthor(`${member.user.username}`, member.user.avatarURL)
.setColor(member.displayColor)
.setDescription(`${levelText} ${levelProgress} | ${crystalText} | ${cannisterText}`)
.addField("Stats", userStats)
.setFooter("Commands: !help | !lore | !checkin | !give");
channel.send(embed);
}
//HandleLevelUp
//client - discord.js client
//member - discord.js member
//channel - discord.js channel
//dialog - dialog function
exports.HandleLevelUp = function(client, member, channel, dialog) {
// Sees if the user is supposed to level up
let [levelUpResponse, level, statPoints] = shared.LevelUp(client, member);
//handle channel strings
if (typeof(channel) === "string") {
channel = client.channels.find(item => item.name === channel || item.id === channel);
}
//handle levelling up
if (levelUpResponse === "levelUp" || levelUpResponse === "RankUp") {
if (level >= process.env.RANK_3_THRESHOLD) {
shared.SendPublicMessage(client, member.user, channel, dialog("levelUpCap", dialog("levelUpCapRemark"), level));
} else {
shared.SendPublicMessage(client, member.user, channel, dialog("LevelUp", dialog("levelUpRemark"), level, statPoints));
}
}
}

View File

@@ -42,9 +42,11 @@ exports.LevelUp = function(client, member) { //NOTE: why is this called separate
let rankUp = exports.RankUp(client, member, level);
if (rankUp == "rankUp") {
return rankUp;
return [rankUp, level, statPoints];
} else if (responseMessage === "levelup") {
return "levelUp";
return ["levelUp", level, statPoints];
} else {
return ["", level, statPoints];
}
}