Skip to content

Commit 0bda9c3

Browse files
committed
fix(dungeon): level loot
1 parent cf50ad9 commit 0bda9c3

4 files changed

Lines changed: 22 additions & 8 deletions

File tree

worldboss-app/src/data/items/weapons.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module.exports = {
1717
name: 'Épée rouillée',
1818
type: 'weapon',
1919
rarity: 'common',
20-
stats: { atk: 5 },
20+
stats: { atk: 4 },
2121
skill: 'tomb_slash',
2222
passive: null,
2323
price: 100,
@@ -50,7 +50,7 @@ module.exports = {
5050
name: 'Arc en bois',
5151
type: 'weapon',
5252
rarity: 'common',
53-
stats: { atk: 4, crit: 10 },
53+
stats: { atk: 4, crit: 5 },
5454
skill: 'bone_arrow',
5555
passive: null,
5656
price: 60,

worldboss-app/src/data/progression.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ const PROGRESSION_CONFIG = {
55
// XP cost per rank = RANK_XP_BASE × (rank + 1)
66
RANK_XP_BASE: 500,
77

8+
// ── Dungeon access ───────────────────────────────────────────────────────
9+
// Max levels above a dungeon's requirement a player can still enter it
10+
// e.g. 1 → level 4 can replay dungeon 3, but not dungeon 2
11+
DUNGEON_LEVEL_TOLERANCE: 1,
12+
813
// ── Prime (raid) tuning ───────────────────────────────────────────────────
914
// Average level must exceed (prime.levelRequired + PRIME_REPLAY_THRESHOLD) to trigger replayMode
1015
PRIME_REPLAY_THRESHOLD: 5,

worldboss-app/src/data/skills/offensive.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ module.exports = {
1616

1717
bone_bolt: {
1818
name: 'Trait osseux',
19-
wiki: { emoji: '🦴', mult: 1.5, extra: 'Froid Osseux' },
19+
wiki: { emoji: '🦴', mult: 1.2, extra: 'Froid Osseux' },
2020
oncePerCombat: false,
2121
cooldown: 2,
2222
resolve(player, target, logs, { playerAttack }) {
23-
const result = playerAttack(player, target, 1.5);
23+
const result = playerAttack(player, target, 1.2);
2424
target.hp = Math.max(0, target.hp - result.damage);
2525
const dot = { id: 'bone_chill', label: 'Froid Osseux', value: 3, turns: 2 };
2626
const existing = (target.dots ?? []).findIndex((d) => d.id === 'bone_chill');
@@ -192,7 +192,7 @@ module.exports = {
192192
oncePerCombat: false,
193193
cooldown: 1,
194194
resolve(player, target, logs, { playerAttack }) {
195-
const result = playerAttack(player, target, 1.4);
195+
const result = playerAttack(player, target, 1.2);
196196
target.hp = Math.max(0, target.hp - result.damage);
197197
target.def = Math.max(0, target.def - 2);
198198
logs.push(`🦴 **Coup d'os** : ${result.log} + DEF réduite de **2**.`);
@@ -239,7 +239,7 @@ module.exports = {
239239
resolve(player, target, logs, { playerAttack }) {
240240
const savedDef = target.def;
241241
target.def = Math.floor(target.def * 0.7);
242-
const result = playerAttack(player, target, 1.4);
242+
const result = playerAttack(player, target, 1.2);
243243
target.def = savedDef;
244244
target.hp = Math.max(0, target.hp - result.damage);
245245
logs.push(`🏹 **Flèche d'os** : ${result.log} *(ignore 30% DEF)*. `);
@@ -252,7 +252,7 @@ module.exports = {
252252
oncePerCombat: false,
253253
cooldown: 2,
254254
resolve(player, target, logs, { playerAttack }) {
255-
const result = playerAttack(player, target, 1.6);
255+
const result = playerAttack(player, target, 1.5);
256256
target.hp = Math.max(0, target.hp - result.damage);
257257
const dot = { id: 'bleed', label: 'Saignement', value: 4, turns: 3 };
258258
const existing = (target.dots ?? []).findIndex((d) => d.id === 'bleed');

worldboss-app/src/services/dungeon.service.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const { buildCombatEmbed, buildCombatRow, buildDungeonNextRow, errorEmbed } = re
1111
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder, MessageFlags } = require('discord.js');
1212
const { DUNGEONS, ALLIES } = require('../data/dungeons');
1313
const { setCombatState } = require('../cache/redis');
14+
const { PROGRESSION_CONFIG } = require('../data/progression');
1415

1516
async function showDungeonSelection(interaction, characterId) {
1617
const character = await prisma.character.findUnique({ where: { id: characterId } });
@@ -22,7 +23,11 @@ async function showDungeonSelection(interaction, characterId) {
2223
});
2324
const completedChapters = new Set(completedRuns.map((r) => r.chapter));
2425

25-
const available = Object.values(DUNGEONS).filter((d) => character.level >= d.levelRequired);
26+
const { DUNGEON_LEVEL_TOLERANCE } = PROGRESSION_CONFIG;
27+
const available = Object.values(DUNGEONS).filter((d) =>
28+
character.level >= d.levelRequired &&
29+
character.level <= d.levelRequired + DUNGEON_LEVEL_TOLERANCE,
30+
);
2631

2732
if (available.length === 0) {
2833
return interaction.reply({
@@ -64,9 +69,13 @@ async function startDungeon(interaction, chapter, characterId) {
6469
}
6570

6671
const character = await prisma.character.findUnique({ where: { id: characterId } });
72+
const { DUNGEON_LEVEL_TOLERANCE } = PROGRESSION_CONFIG;
6773
if (character.level < dungeon.levelRequired) {
6874
return interaction.update({ embeds: [errorEmbed(`Niveau ${dungeon.levelRequired} requis.`)], components: [] });
6975
}
76+
if (character.level > dungeon.levelRequired + DUNGEON_LEVEL_TOLERANCE) {
77+
return interaction.update({ embeds: [errorEmbed(`Vous êtes trop expérimenté pour ce donjon (niveau ${dungeon.levelRequired}).`)], components: [] });
78+
}
7079

7180
// Cancel any existing run for this chapter before starting a new one
7281
await prisma.dungeonRun.updateMany({

0 commit comments

Comments
 (0)