diff --git a/assets/images/monsters/Arcane Crystal.png b/assets/images/monsters/Arcane Crystal.png new file mode 100644 index 0000000..d01a59c Binary files /dev/null and b/assets/images/monsters/Arcane Crystal.png differ diff --git a/assets/images/monsters/Blue Slime.png b/assets/images/monsters/Blue Slime.png new file mode 100644 index 0000000..faf02eb Binary files /dev/null and b/assets/images/monsters/Blue Slime.png differ diff --git a/assets/images/monsters/Drakelor.png b/assets/images/monsters/Drakelor.png new file mode 100644 index 0000000..577b635 Binary files /dev/null and b/assets/images/monsters/Drakelor.png differ diff --git a/assets/images/monsters/Ghost.png b/assets/images/monsters/Ghost.png new file mode 100644 index 0000000..c3a37eb Binary files /dev/null and b/assets/images/monsters/Ghost.png differ diff --git a/assets/images/monsters/Illusion.png b/assets/images/monsters/Illusion.png new file mode 100644 index 0000000..b62030c Binary files /dev/null and b/assets/images/monsters/Illusion.png differ diff --git a/assets/images/monsters/Raven.png b/assets/images/monsters/Raven.png new file mode 100644 index 0000000..089cb72 Binary files /dev/null and b/assets/images/monsters/Raven.png differ diff --git a/assets/images/monsters/Red Slime.png b/assets/images/monsters/Red Slime.png new file mode 100644 index 0000000..5ceafa8 Binary files /dev/null and b/assets/images/monsters/Red Slime.png differ diff --git a/assets/images/monsters/Scamp.png b/assets/images/monsters/Scamp.png new file mode 100644 index 0000000..03dcf66 Binary files /dev/null and b/assets/images/monsters/Scamp.png differ diff --git a/assets/images/monsters/Scorpion.png b/assets/images/monsters/Scorpion.png new file mode 100644 index 0000000..ce9f4bf Binary files /dev/null and b/assets/images/monsters/Scorpion.png differ diff --git a/assets/images/monsters/Shade.png b/assets/images/monsters/Shade.png new file mode 100644 index 0000000..c3a37eb Binary files /dev/null and b/assets/images/monsters/Shade.png differ diff --git a/assets/images/monsters/Shadow.png b/assets/images/monsters/Shadow.png new file mode 100644 index 0000000..c3a37eb Binary files /dev/null and b/assets/images/monsters/Shadow.png differ diff --git a/assets/images/monsters/Silver Slime.png b/assets/images/monsters/Silver Slime.png new file mode 100644 index 0000000..1e1b8b6 Binary files /dev/null and b/assets/images/monsters/Silver Slime.png differ diff --git a/data/dk.db b/data/dk.db index f34a5f3..11508ac 100644 Binary files a/data/dk.db and b/data/dk.db differ diff --git a/internal/actions/fight.go b/internal/actions/fight.go index d1ce302..f41e75c 100644 --- a/internal/actions/fight.go +++ b/internal/actions/fight.go @@ -32,19 +32,16 @@ func (r *FightResult) EndFightWithVictory(monster *monsters.Monster, user *users r.FightUpdates["reward_gold"] = rewardGold r.FightUpdates["reward_exp"] = rewardExp + newLevel, newStr, newDex, newExp := user.CalculateLevelUp(rewardExp) + r.UserUpdates = map[string]any{ "fight_id": 0, "currently": "Exploring", "gold": user.Gold + rewardGold, - "exp": user.Exp + rewardExp, - } - - // Handle level up - newLevel, newStats := calculateLevelUp(user.Level, user.Exp+rewardExp, user.Strength, user.Dexterity) - if newLevel > user.Level { - r.UserUpdates["level"] = newLevel - r.UserUpdates["strength"] = newStats.Strength - r.UserUpdates["dexterity"] = newStats.Dexterity + "exp": newExp, + "level": newLevel, + "strength": newStr, + "dexterity": newDex, } r.Ended = true @@ -295,17 +292,11 @@ func calculateRewards(monster *monsters.Monster, user *users.User) (int, int) { // More generous reward range: 90-100% of max instead of 83-100% minExp := (monster.MaxExp * 9) / 10 maxExp := monster.MaxExp - exp := rand.Intn(maxExp-minExp+1) + minExp - if exp < 1 { - exp = 1 // Guaranteed minimum - } + exp := max(rand.Intn(maxExp-minExp+1)+minExp, 1) minGold := (monster.MaxGold * 9) / 10 maxGold := monster.MaxGold - gold := rand.Intn(maxGold-minGold+1) + minGold - if gold < 1 { - gold = 1 // Guaranteed minimum - } + gold := max(rand.Intn(maxGold-minGold+1)+minGold, 1) // Apply bonuses expBonus := (user.ExpBonus * exp) / 100 diff --git a/internal/models/users/users.go b/internal/models/users/users.go index f9f77b1..5e6c621 100644 --- a/internal/models/users/users.go +++ b/internal/models/users/users.go @@ -279,29 +279,42 @@ func (u *User) ExpNeededForNextLevel() int { return exp.Calc(u.Level + 1) } -func (u *User) GrantExp(expAmount int) { - u.Exp += expAmount - u.checkLevelUp() +func (u *User) GrantExp(expAmount int) map[string]any { + newLevel, newStr, newDex, newExp := u.CalculateLevelUp(expAmount) + + updates := map[string]any{ + "exp": newExp, + } + + // Only include level/stats if they actually changed + if newLevel > u.Level { + updates["level"] = newLevel + updates["strength"] = newStr + updates["dexterity"] = newDex + } + + return updates } -func (u *User) checkLevelUp() { - expNeeded := u.ExpNeededForNextLevel() +func (u *User) CalculateLevelUp(expGain int) (newLevel, newStr, newDex, newExp int) { + level := u.Level + str := u.Strength + dex := u.Dexterity + totalExp := u.Exp + expGain - if u.Exp >= expNeeded { - // Level up - u.Level++ - u.Strength++ - u.Dexterity++ - - // Reset exp and carry over excess - excessExp := u.Exp - expNeeded - u.Exp = 0 - - // Recursive level up if enough excess exp - if excessExp > 0 { - u.GrantExp(excessExp) + for { + expNeeded := exp.Calc(level + 1) + if totalExp < expNeeded { + break } + + level++ + str++ + dex++ + totalExp -= expNeeded } + + return level, str, dex, totalExp } func (u *User) ExpProgress() float64 { diff --git a/templates/fight/fight.html b/templates/fight/fight.html index 26399de..7199156 100644 --- a/templates/fight/fight.html +++ b/templates/fight/fight.html @@ -5,7 +5,7 @@