feat: increase max refinement level to 25 and rebalance success rates and PvP rewards
This commit is contained in:
parent
793bba5a6a
commit
cc26613377
|
|
@ -11,12 +11,13 @@ The Refinement mini-game allows users to strengthen their virtual weapons, parti
|
|||
- **Progression**: Level- **재련 비용**: `floor(10 × 1.6^level)G` (레벨별 기하급수적 증가)
|
||||
- **판매 가격**: `floor(현재_단계_비용 × 2)G`
|
||||
- **재련 성공 확률**:
|
||||
- 0→4강: 100% ~ 90% (비교적 안전)
|
||||
- 0→4강: 100% ~ 90%
|
||||
- 4→5강: **5%** (급락)
|
||||
- 5→10강: 4% ~ 0.5% (사실상 불가)
|
||||
- 10강 이상: **0.1%** (신화의 영역)
|
||||
- **전투 보상**: `floor(승리자_현재_강화_비용 × 2.0) + (레벨_차이 × 5000)G`
|
||||
- **판매 가격**: `floor(현재_단계_비용 × 2)G`
|
||||
- 5→10강: 4% ~ 1%
|
||||
- 11→20강: **0.1%** (신화)
|
||||
- 21→25강: **0.01%** (기적)
|
||||
- **전투 보상**: `(패배자_단계_비용 × (패배자_레벨/승리자_레벨) × 2.0) × (0.8~1.2 랜덤)`
|
||||
- **최대 단계**: **25강** (Lvl 25)
|
||||
- **전투 규칙**:
|
||||
- 0강 무기 소유자는 전투를 걸 수 없으며, 공격 대상으로 지정될 수도 없습니다.
|
||||
- 전투 참여 시(공격/방어 모두) 내구도 -1.
|
||||
|
|
|
|||
|
|
@ -261,11 +261,11 @@ export default {
|
|||
.setColor(Colors.White)
|
||||
.setDescription('무기를 강화하고 다른 유저와 전투하며 강력한 전사가 되어보세요!')
|
||||
.addFields(
|
||||
{ name: '🛠️ 재련 (/refine try)', value: '골드를 소모하여 무기 수치를 올립니다. 단계가 높을수록 실패 시 파괴될 확률이 증가합니다. (최대 20단계)' },
|
||||
{ name: '⚔️ 전투 (/refine battle)', value: '다른 유저를 일방적으로 공격합니다. 승리 시 보상을 받습니다. 전투 참여자 모두 내구도가 1씩 감소합니다.' },
|
||||
{ name: '🛠️ 재련 (/refine try)', value: '골드를 소모하여 무기 수치를 올립니다. 5강부터 확률이 급락하며 **최대 25강**까지 가능합니다.' },
|
||||
{ name: '⚔️ 전투 (/refine battle)', value: '다른 유저를 공격합니다. 승리자의 레벨이 패배자보다 높을수록 보상이 줄어들며, 약자가 강자를 잡으면 **잭팟**이 터집니다! (보상 80%~120% 랜덤)' },
|
||||
{ name: '🛡️ 내구도 및 파괴', value: '내구도가 0이 되면 전투 불능이 되며, 이 상태에서 또 공격하면 무기가 즉시 파기됩니다! 재련 시도 로 무기를 수리하세요.' },
|
||||
{ name: '📅 출석 (/refine checkin)', value: '매일 한 번 골드를 수령할 수 있습니다.' },
|
||||
{ name: '💰 판매 (/refine sell)', value: '강화된 무기를 팔고 0단계로 돌아갑니다. 단계가 높을수록 큰돈을 만질 수 있습니다.' },
|
||||
{ name: '💰 판매 (/refine sell)', value: '무기를 팔고 0단계로 돌아갑니다. 25강 무기는 수백만 골드의 가치를 가집니다.' },
|
||||
{ name: '🔥 피버 타임', value: '서버가 가장 활발한 시간대에 재련 성공 확률이 10% 증가합니다!' }
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ export interface BattleResult {
|
|||
}
|
||||
|
||||
export class RefinementService {
|
||||
private static MAX_LEVEL = 20;
|
||||
private static MAX_LEVEL = 25;
|
||||
private static START_GOLD = 1000;
|
||||
private static CHECKIN_GOLD = 500;
|
||||
|
||||
|
|
@ -67,9 +67,9 @@ export class RefinementService {
|
|||
else if (level === 6) baseSuccessRate = 0.04;
|
||||
else if (level === 7) baseSuccessRate = 0.03;
|
||||
else if (level === 8) baseSuccessRate = 0.02;
|
||||
else if (level === 9) baseSuccessRate = 0.01;
|
||||
else if (level < 15) baseSuccessRate = 0.005; // 0.5%
|
||||
else baseSuccessRate = 0.001; // 0.1% (신화적인 영역)
|
||||
else if (level < 10) baseSuccessRate = 0.01;
|
||||
else if (level < 20) baseSuccessRate = 0.001; // 0.1%
|
||||
else baseSuccessRate = 0.0001; // 0.01% (신화적 구간: 21-25강)
|
||||
|
||||
const successRate = baseSuccessRate + (fever.active ? fever.bonusRate : 0);
|
||||
|
||||
|
|
@ -144,11 +144,19 @@ export class RefinementService {
|
|||
const winnerId = isAttackerWin ? attackerId : targetId;
|
||||
const loserId = isAttackerWin ? targetId : attackerId;
|
||||
|
||||
// 보상 계산: 승리자의 현재 강화 비용의 200% + |차이| * 5,000G
|
||||
// 보상 계산: 승리자 역배율 적용 (TargetCost × TargetLevel/WinnerLevel × 2.0)
|
||||
const levelDiff = Math.abs(attacker.weaponLevel - target.weaponLevel);
|
||||
const winnerLevel = isAttackerWin ? attacker.weaponLevel : target.weaponLevel;
|
||||
const winnerCost = this.calculateCost(winnerLevel);
|
||||
const reward = Math.floor(winnerCost * 2.0) + (levelDiff * 5000);
|
||||
const loserLevel = isAttackerWin ? target.weaponLevel : attacker.weaponLevel;
|
||||
const loserCost = this.calculateCost(loserLevel);
|
||||
|
||||
// 승자 레벨이 높을수록 보상 삭감 계수 (1.0 ~ 0.04 사이)
|
||||
const ratio = Math.min(1.0, loserLevel / winnerLevel);
|
||||
const baseReward = Math.floor(loserCost * ratio * 2.0);
|
||||
|
||||
// 랜덤폭 (Min 80% ~ Max 120%)
|
||||
const randomFactor = 0.8 + Math.random() * 0.4;
|
||||
const reward = Math.floor(baseReward * randomFactor) + (levelDiff * 100);
|
||||
|
||||
// 내구도 감소 (양쪽 모두 -1)
|
||||
const newAttackerDurability = Math.max(0, attacker.durability - 1);
|
||||
|
|
|
|||
Loading…
Reference in New Issue