feat: expoential exp drop-off/gain
authorxangelo <me@xangelo.ca>
Fri, 25 Aug 2023 15:04:25 +0000 (11:04 -0400)
committerxangelo <me@xangelo.ca>
Fri, 25 Aug 2023 15:04:25 +0000 (11:04 -0400)
When you are over 3 levels of the monster you are fighting you start
gaining less exp.

When you are under 3 levels of the monster you are fighting, you start
gaining more exp.

src/server/fight.ts

index 9b377e6885512795c40e31eef46023dcb243236f..855589a2d06efb7b980447e70602e16c57b0b247 100644 (file)
@@ -23,6 +23,19 @@ export async function blockPlayerInFight(req: AuthRequest, res: Response, next:
   res.send(Alert.ErrorAlert(`You are currently in a fight with a ${fight.name}`));
 }
 
+function exponentialExp(exp: number, monsterLevel: number, playerLevel: number): number {
+  let finalExp = exp;
+
+  if((monsterLevel+3) < playerLevel) {
+    finalExp = Math.floor(exp * Math.pow(Math.E, ((monsterLevel + 3) - playerLevel)/5));
+  }
+  else if(monsterLevel > (playerLevel + 3)) {
+    finalExp = Math.floor(exp * Math.pow(Math.E, ((playerLevel + 3) - monsterLevel)/5));
+  }
+
+  return Math.floor(finalExp);
+}
+
 export async function fightRound(player: Player, monster: MonsterWithFaction,  data: {action: 'attack' | 'cast' | 'flee', target: 'head' | 'body' | 'arms' | 'legs'}) {
   const playerSkills = await getPlayerSkillsAsObject(player.id);
   const roundData: FightRound = {
@@ -196,11 +209,13 @@ export async function fightRound(player: Player, monster: MonsterWithFaction,  d
     roundData.monster.hp = 0;
     roundData.winner = 'player';
 
-    roundData.rewards.exp = monster.exp;
+    const expGained = exponentialExp(monster.exp, monster.level, player.level);
+
+    roundData.rewards.exp = expGained;
     roundData.rewards.gold = monster.gold;
 
     player.gold += monster.gold;
-    player.exp += monster.exp;
+    player.exp += expGained;
 
     if(player.exp >= expToLevel(player.level + 1)) {
       player.exp -= expToLevel(player.level + 1)