private int[] calculateExpAndSp(int diff, int damage) { double xp = 0; double sp = 0; if (Config.ALT_GAME_EXPONENT_XP != 0 || Config.ALT_GAME_EXPONENT_SP != 0) { xp = (double)getExpReward() * damage / getMaxHp(); if (Config.ALT_GAME_EXPONENT_XP != 0) xp *= Math.pow(2., -diff / Config.ALT_GAME_EXPONENT_XP); sp = (double)getSpReward() * damage / getMaxHp(); if (Config.ALT_GAME_EXPONENT_SP != 0) sp *= Math.pow(2., -diff / Config.ALT_GAME_EXPONENT_SP); } else { // mob is 2 to 9 levels below attacker lvl if ((diff > 1) && (diff <= 9)) { xp = (double)getExpReward() * damage / getMaxHp(); sp = (double)getSpReward() * damage / getMaxHp(); xp = xp - diff * xp / 10; sp = sp - diff * sp / 10; } //attacker's level below or equal to mob lvl else if (diff <= 1) { xp = (double)getExpReward() * damage / getMaxHp(); sp = (double)getSpReward() * damage / getMaxHp(); } //mob is more than 9 levels below attacker lvl else if (diff > 9) { xp = 0; sp = 0; } if (xp <= 0) { xp = 0; sp = 0; } else if (sp <= 0 && xp > 0) { sp = 0; } } int[] tmp = { (int)xp, (int)sp }; return tmp; }