1
0

Fixed problems with code style etc

This commit is contained in:
Daniel O'Brien 2013-11-14 04:25:47 +11:00
parent 39f6b12b62
commit bf2dc38f35
3 changed files with 90 additions and 53 deletions

View File

@ -44,8 +44,12 @@ extern bool g_BlockIsSolid[256];
/// Can torches be placed on this block? /// Can torches be placed on this block?
extern bool g_BlockIsTorchPlaceable[256]; extern bool g_BlockIsTorchPlaceable[256];
/// Max Erperience that possible to be incremented at once /// Experience Orb setup
#define MAX_EXPERIENCE_ORB_SIZE 2000 //ie from a ender dragon enum
{
//open to suggestion on naming convention here :)
MAX_EXPERIENCE_ORB_SIZE = 2000
} ;

View File

@ -66,10 +66,7 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
, m_EatingFinishTick(-1) , m_EatingFinishTick(-1)
, m_IsChargingBow(false) , m_IsChargingBow(false)
, m_BowCharge(0) , m_BowCharge(0)
, m_XpLevel(0)
, m_XpP(0.f)
, m_XpTotal(0) , m_XpTotal(0)
, m_XpNextLevelTotal(0)
{ {
LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d", LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d",
a_PlayerName.c_str(), a_Client->GetIPString().c_str(), a_PlayerName.c_str(), a_Client->GetIPString().c_str(),
@ -265,6 +262,70 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk)
int cPlayer::CalcLevelFromXp(int a_XpTotal)
{
//level 0 to 15
if(a_XpTotal <= XP_TO_LEVEL15)
{
return (int) a_XpTotal / XP_PER_LEVEL_TO15;
}
//level 30+
if(a_XpTotal > XP_TO_LEVEL30)
{
return (int) (151.5 + sqrt( 22952.25 - (14 * (2220 - a_XpTotal)))) / 7;
}
//level 16 to 30
return (int) ( 29.5 + sqrt( 870.25 - (6 * ( 360 - a_XpTotal )))) / 3;
}
int cPlayer::XpAtLevel(int a_Level)
{
//level 0 to 15
if(a_Level <= 15)
{
return a_Level * XP_PER_LEVEL_TO15;
}
//level 30+
if(a_Level >= 31)
{
return (int) ( (3.5 * a_Level * a_Level) - (151.5 * a_Level) + 2220 );
}
//level 16 to 30
return (int) ( (1.5 * a_Level * a_Level) - (29.5 * a_Level) + 360 );
}
int cPlayer::GetExperienceLevel()
{
return CalcLevelFromXp(m_XpTotal);
}
float cPlayer::GetExperiencePercentage()
{
int currentLevel = CalcLevelFromXp(m_XpTotal);
return (float)m_XpTotal / (float)XpAtLevel(1+currentLevel);
}
bool cPlayer::SetExperience(int a_XpTotal) bool cPlayer::SetExperience(int a_XpTotal)
{ {
if(!(a_XpTotal >= 0) || (a_XpTotal > (INT_MAX - m_XpTotal))) if(!(a_XpTotal >= 0) || (a_XpTotal > (INT_MAX - m_XpTotal)))
@ -273,53 +334,30 @@ bool cPlayer::SetExperience(int a_XpTotal)
return false; //oops, they gave us a dodgey number return false; //oops, they gave us a dodgey number
} }
m_XpTotal = a_XpTotal; m_XpTotal = a_XpTotal;
//now calculate XpP and XpLevel return true;
//First Calc current level using quadratic eqn
m_XpLevel = CalcLevelFromXp(m_XpTotal);
//calculate total Xp for next level
m_XpNextLevelTotal = XpAtLevel(m_XpLevel+1);
//calulate Xp Percentage
m_XpP = (float)m_XpLevel / (float)m_XpNextLevelTotal;
return true;//aka happy :)
} }
bool cPlayer::AddExperience(int a_Xp_delta) int cPlayer::AddExperience(int a_Xp_delta)
{ {
if(a_Xp_delta > MAX_EXPERIENCE_ORB_SIZE || a_Xp_delta < 0) if(a_Xp_delta > MAX_EXPERIENCE_ORB_SIZE || a_Xp_delta < 0)
{ {
//value was too large or negative, abort and report //value was too large or negative, abort and report
LOGWARNING("Attempt was made to increment Xp by %d, max is %d and must be positive", LOGWARNING("Attempt was made to increment Xp by %d, max is %d and must be positive",
a_Xp_delta, MAX_EXPERIENCE_ORB_SIZE); a_Xp_delta, MAX_EXPERIENCE_ORB_SIZE);
return false; return -1; //should we instead just return the current Xp?
} }
LOGD("Player \"%s\" earnt %d experience", m_PlayerName.c_str(), a_Xp_delta); LOGD("Player \"%s\" earnt %d experience", m_PlayerName.c_str(), a_Xp_delta);
//update Xp, note there is no min
m_XpTotal += a_Xp_delta; m_XpTotal += a_Xp_delta;
//update Xp percentage return m_XpTotal;
if(m_XpTotal >= m_XpNextLevelTotal)
{
//oh actually, update their level first
m_XpLevel++;
m_XpNextLevelTotal = XpAtLevel(m_XpLevel+1);
}
m_XpP = (float)m_XpLevel / (float)m_XpNextLevelTotal;
return true;
} }

View File

@ -64,26 +64,25 @@ public:
/// Returns the currently equipped boots; empty item if none /// Returns the currently equipped boots; empty item if none
virtual cItem GetEquippedBoots(void) const override { return m_Inventory.GetEquippedBoots(); } virtual cItem GetEquippedBoots(void) const override { return m_Inventory.GetEquippedBoots(); }
/** Sets the experience total - XpTotal, updates XpLevel and XpP as appropriate /** Sets the experience total
Returns true on success Returns true on success
should really only be called at init or player death should really only be called at init or player death
*/ */
bool SetExperience(int a_XpTotal); bool SetExperience(int a_XpTotal);
/* Adds Xp, will not inc more than MAX_EXPERIENCE_ORB_SIZE! /* Adds Xp, will not inc more than MAX_EXPERIENCE_ORB_SIZE!
Returns true on success Returns the new total experience, -1 on error
Updates XpLevel and XpP appropriately
*/ */
bool AddExperience(int a_Xp_delta); int AddExperience(int a_Xp_delta);
/// Gets the experience total - XpTotal /// Gets the experience total - XpTotal
inline int GetExperienceTotal(void) { return m_XpTotal; } inline int GetExperienceTotal(void) { return m_XpTotal; }
/// Gets the current level - XpLevel /// Gets the current level - XpLevel
inline int GetExperienceLevel(void) { return m_XpLevel; } int GetExperienceLevel(void);
/// Gets the experience bar percentage - XpP /// Gets the experience bar percentage - XpP
inline float GetExperiencePercentage(void) { return m_XpP; } float GetExperiencePercentage(void);
/// Starts charging the equipped bow /// Starts charging the equipped bow
void StartChargingBow(void); void StartChargingBow(void);
@ -329,6 +328,14 @@ protected:
std::string m_PlayerName; std::string m_PlayerName;
std::string m_LoadedWorldName; std::string m_LoadedWorldName;
/// Xp Level stuff
enum
{
XP_TO_LEVEL15 = 255,
XP_PER_LEVEL_TO15 = 17,
XP_TO_LEVEL30 = 825
} ;
/// Player's air level (for swimming) /// Player's air level (for swimming)
int m_AirLevel; int m_AirLevel;
@ -400,26 +407,14 @@ protected:
/// The world tick in which eating will be finished. -1 if not eating /// The world tick in which eating will be finished. -1 if not eating
Int64 m_EatingFinishTick; Int64 m_EatingFinishTick;
/// Player Xp levels etc /// Player Xp level
int m_XpLevel; //store this and m_XpP to save calculating each time
float m_XpP; //between 0 & 1
int m_XpTotal; int m_XpTotal;
int m_XpNextLevelTotal; //save calculating this often
//Xp level defines
#define XP_TO_LEVEL15 255
#define XP_PER_LEVEL_TO15 17
#define XP_TO_LEVEL30 825
/// Caculates the Xp at a given level, ref: http://minecraft.gamepedia.com/XP /// Caculates the Xp at a given level, ref: http://minecraft.gamepedia.com/XP
inline int XpAtLevel(int level) { return (int) ((level <= 15)? (15*level) : static int XpAtLevel(int a_Level);
((level <= 31)? (1.5*level*level - 29.5*level + 360) :
(3.5*level*level - 151.5*level + 2220))); }
/// inverse of XpAtLevel, ref: http://minecraft.gamepedia.com/XP values are as per this with pre-calculations /// inverse of XpAtLevel, ref: http://minecraft.gamepedia.com/XP values are as per this with pre-calculations
inline int CalcLevelFromXp(int XpTotal) { return (int) ((XpTotal <= XP_TO_LEVEL15)? XpTotal / XP_PER_LEVEL_TO15 : //level 0-15 or... static int CalcLevelFromXp(int a_XpTotal);
(XpTotal <= XP_TO_LEVEL30)? ( 29.5 + sqrt( 870.25 - (6 * ( 360 - XpTotal )))) / 3 : //level 15-30
(151.5 + sqrt( 22952.25 - (14 * (2220 - XpTotal)))) / 7); }//level 30+
bool m_IsChargingBow; bool m_IsChargingBow;
int m_BowCharge; int m_BowCharge;