@myhpmp/core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/exp-calculator.d.ts +4 -0
- package/dist/exp-calculator.js +12 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +3 -0
- package/dist/level-system.d.ts +18 -0
- package/dist/level-system.js +56 -0
- package/dist/tier.d.ts +13 -0
- package/dist/tier.js +33 -0
- package/package.json +28 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function calcTokenExp(tokens) {
|
|
2
|
+
return Math.floor(tokens / 1000);
|
|
3
|
+
}
|
|
4
|
+
export function calcSessionExp() {
|
|
5
|
+
return 25;
|
|
6
|
+
}
|
|
7
|
+
export function calcStreakBonus(streakDays) {
|
|
8
|
+
return Math.min(streakDays, 30) * 5;
|
|
9
|
+
}
|
|
10
|
+
export function calcWeeklyBonus(weeklyUsagePercent) {
|
|
11
|
+
return weeklyUsagePercent >= 70 ? 100 : 0;
|
|
12
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { getLevelInfo, getTierForLevel, getStars, TIERS } from './level-system.js';
|
|
2
|
+
export type { Tier, LevelInfo } from './level-system.js';
|
|
3
|
+
export { calcTokenExp, calcSessionExp, calcStreakBonus, calcWeeklyBonus } from './exp-calculator.js';
|
|
4
|
+
export { getTierEmoji, getTierTitle, TIER_EMOJIS, TIER_TITLES, TIER_TITLE_KEYS } from './tier.js';
|
|
5
|
+
export type { TierTitle } from './tier.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { getLevelInfo, getTierForLevel, getStars, TIERS } from './level-system.js';
|
|
2
|
+
export { calcTokenExp, calcSessionExp, calcStreakBonus, calcWeeklyBonus } from './exp-calculator.js';
|
|
3
|
+
export { getTierEmoji, getTierTitle, TIER_EMOJIS, TIER_TITLES, TIER_TITLE_KEYS } from './tier.js';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface Tier {
|
|
2
|
+
tierIndex: number;
|
|
3
|
+
startLevel: number;
|
|
4
|
+
endLevel: number;
|
|
5
|
+
expPerLevel: number;
|
|
6
|
+
}
|
|
7
|
+
export interface LevelInfo {
|
|
8
|
+
level: number;
|
|
9
|
+
totalExp: number;
|
|
10
|
+
currentLevelExp: number;
|
|
11
|
+
expForNextLevel: number;
|
|
12
|
+
tier: Tier;
|
|
13
|
+
stars: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const TIERS: Tier[];
|
|
16
|
+
export declare function getLevelInfo(totalExp: number): LevelInfo;
|
|
17
|
+
export declare function getTierForLevel(level: number): Tier;
|
|
18
|
+
export declare function getStars(level: number): number;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export const TIERS = [
|
|
2
|
+
{ tierIndex: 0, startLevel: 1, endLevel: 5, expPerLevel: 100 },
|
|
3
|
+
{ tierIndex: 1, startLevel: 6, endLevel: 10, expPerLevel: 300 },
|
|
4
|
+
{ tierIndex: 2, startLevel: 11, endLevel: 15, expPerLevel: 600 },
|
|
5
|
+
{ tierIndex: 3, startLevel: 16, endLevel: 20, expPerLevel: 1200 },
|
|
6
|
+
{ tierIndex: 4, startLevel: 21, endLevel: 30, expPerLevel: 3500 },
|
|
7
|
+
{ tierIndex: 5, startLevel: 31, endLevel: 40, expPerLevel: 8000 },
|
|
8
|
+
{ tierIndex: 6, startLevel: 41, endLevel: 50, expPerLevel: 15000 },
|
|
9
|
+
{ tierIndex: 7, startLevel: 51, endLevel: Infinity, expPerLevel: 25000 },
|
|
10
|
+
];
|
|
11
|
+
export function getLevelInfo(totalExp) {
|
|
12
|
+
let remaining = totalExp;
|
|
13
|
+
let level = 1;
|
|
14
|
+
for (const tier of TIERS) {
|
|
15
|
+
const levelsInTier = tier.endLevel === Infinity ? Infinity : tier.endLevel - tier.startLevel + 1;
|
|
16
|
+
for (let i = 0; i < levelsInTier; i++) {
|
|
17
|
+
if (remaining < tier.expPerLevel) {
|
|
18
|
+
return {
|
|
19
|
+
level,
|
|
20
|
+
totalExp,
|
|
21
|
+
currentLevelExp: remaining,
|
|
22
|
+
expForNextLevel: tier.expPerLevel,
|
|
23
|
+
tier: getTierForLevel(level),
|
|
24
|
+
stars: getStars(level),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
remaining -= tier.expPerLevel;
|
|
28
|
+
level++;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
level,
|
|
33
|
+
totalExp,
|
|
34
|
+
currentLevelExp: remaining,
|
|
35
|
+
expForNextLevel: TIERS[7].expPerLevel,
|
|
36
|
+
tier: TIERS[7],
|
|
37
|
+
stars: getStars(level),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function getTierForLevel(level) {
|
|
41
|
+
for (const tier of TIERS) {
|
|
42
|
+
if (level >= tier.startLevel && level <= tier.endLevel) {
|
|
43
|
+
return tier;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return TIERS[7];
|
|
47
|
+
}
|
|
48
|
+
export function getStars(level) {
|
|
49
|
+
const tier = getTierForLevel(level);
|
|
50
|
+
const tierSize = tier.endLevel === Infinity ? 10 : tier.endLevel - tier.startLevel + 1;
|
|
51
|
+
const positionInTier = level - tier.startLevel;
|
|
52
|
+
if (tierSize <= 5) {
|
|
53
|
+
return positionInTier + 1;
|
|
54
|
+
}
|
|
55
|
+
return Math.floor(positionInTier / 2) + 1;
|
|
56
|
+
}
|
package/dist/tier.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Tier emoji mapping (indexed by tierIndex) */
|
|
2
|
+
export declare const TIER_EMOJIS: Record<number, string>;
|
|
3
|
+
/** Tier title keys (indexed by start level) */
|
|
4
|
+
export declare const TIER_TITLE_KEYS: readonly [1, 6, 11, 16, 21, 31, 41, 51];
|
|
5
|
+
export interface TierTitle {
|
|
6
|
+
ko: string;
|
|
7
|
+
en: string;
|
|
8
|
+
emoji: string;
|
|
9
|
+
}
|
|
10
|
+
/** Complete tier title data */
|
|
11
|
+
export declare const TIER_TITLES: Record<number, TierTitle>;
|
|
12
|
+
export declare function getTierEmoji(tierIndex: number): string;
|
|
13
|
+
export declare function getTierTitle(tierIndex: number, locale: string): string;
|
package/dist/tier.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Tier emoji mapping (indexed by tierIndex) */
|
|
2
|
+
export const TIER_EMOJIS = {
|
|
3
|
+
0: 'đą',
|
|
4
|
+
1: 'âď¸',
|
|
5
|
+
2: 'đĄď¸',
|
|
6
|
+
3: 'đ§',
|
|
7
|
+
4: 'đŽ',
|
|
8
|
+
5: 'đ',
|
|
9
|
+
6: 'đ',
|
|
10
|
+
7: 'âĄ',
|
|
11
|
+
};
|
|
12
|
+
/** Tier title keys (indexed by start level) */
|
|
13
|
+
export const TIER_TITLE_KEYS = [1, 6, 11, 16, 21, 31, 41, 51];
|
|
14
|
+
/** Complete tier title data */
|
|
15
|
+
export const TIER_TITLES = {
|
|
16
|
+
0: { ko: 'ě´ëł´ 모íę°', en: 'Novice Adventurer', emoji: 'đą' },
|
|
17
|
+
1: { ko: 'ę˛Źěľ ě ěŹ', en: 'Apprentice Warrior', emoji: 'âď¸' },
|
|
18
|
+
2: { ko: 'ěë ¨ 기ěŹ', en: 'Skilled Knight', emoji: 'đĄď¸' },
|
|
19
|
+
3: { ko: 'ë§ë˛ěŹ', en: 'Mage', emoji: 'đ§' },
|
|
20
|
+
4: { ko: 'ëë§ë˛ěŹ', en: 'Archmage', emoji: 'đŽ' },
|
|
21
|
+
5: { ko: 'ěíŹëŠě´ě§', en: 'Grand Archmage', emoji: 'đ' },
|
|
22
|
+
6: { ko: 'ě ě¤ě ě˝ëëë곤', en: 'Legendary Code Dragon', emoji: 'đ' },
|
|
23
|
+
7: { ko: 'ě´ěě', en: 'Transcendent', emoji: 'âĄ' },
|
|
24
|
+
};
|
|
25
|
+
export function getTierEmoji(tierIndex) {
|
|
26
|
+
return TIER_EMOJIS[tierIndex] ?? 'đą';
|
|
27
|
+
}
|
|
28
|
+
export function getTierTitle(tierIndex, locale) {
|
|
29
|
+
const title = TIER_TITLES[tierIndex];
|
|
30
|
+
if (!title)
|
|
31
|
+
return '';
|
|
32
|
+
return locale === 'ko' ? title.ko : title.en;
|
|
33
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@myhpmp/core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Shared core logic for My HP/MP â level system, EXP calculator, tier data, i18n",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"test": "vitest run",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": ["myhpmp", "rpg", "level", "exp", "gamification"],
|
|
17
|
+
"author": "imironjin",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/myhpmp/core.git"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/myhpmp/core",
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"typescript": "^5.7.0",
|
|
26
|
+
"vitest": "^3.1.0"
|
|
27
|
+
}
|
|
28
|
+
}
|