Files
ai-code-app/src/views/play/apps/the-quest/game/theQuestData.ts

684 lines
16 KiB
TypeScript

export type EquipmentSlot =
| 'weapon'
| 'helmet'
| 'shoulders'
| 'chest'
| 'belt'
| 'gloves'
| 'boots'
| 'ring'
| 'necklace'
| 'bracelet'
| 'artifact';
export type InventoryItem = {
id: string;
name: string;
category: 'weapon' | 'armor' | 'accessory' | 'consumable' | 'material';
rarity: 'common' | 'rare' | 'epic';
icon: string;
description: string;
attack?: number;
defense?: number;
critRate?: number;
spellPower?: number;
maxMpBonus?: number;
manaAbsorbChance?: number;
heal?: number;
mpRestore?: number;
healOverTimeTotal?: number;
healOverTimeTicks?: number;
healOverTimeIntervalMs?: number;
autoHealMultiplier?: number;
moveSpeedMultiplier?: number;
effectDurationMs?: number;
quantity?: number;
slot?: EquipmentSlot;
};
export type SkillDefinition = {
id: string;
name: string;
description: string;
manaCost: number;
cooldownMs: number;
damage: number;
range: number;
castTimeMs: number;
accentLabel: string;
color: string;
icon: string;
role: 'attack' | 'buff' | 'summon';
durationMs?: number;
};
export type QuestDefinition = {
id: string;
title: string;
description: string;
progressType: 'kill' | 'collect';
target: string;
requiredCount: number;
turnInNpcId: string;
turnInItemId?: string;
rewardGold: number;
rewardExp: number;
rewardItemId?: string;
};
export type NpcDefinition = {
id: string;
name: string;
role: 'quest' | 'shop' | 'guide';
description: string;
x: number;
y: number;
};
export type EnemyDefinition = {
id: string;
name: string;
role: 'normal' | 'boss';
level: number;
maxHp: number;
maxMp: number;
attack: number;
expReward: number;
goldReward: number;
lootTable: Array<{
itemId: string;
chance: number;
minQuantity?: number;
maxQuantity?: number;
}>;
x: number;
y: number;
patrolRadius: number;
tint: number;
};
export const THE_QUEST_WORLD_SIZE = {
width: 2200,
height: 1600,
} as const;
export const THE_QUEST_STAGE_PORTAL = {
x: 1870,
y: 258,
radius: 118,
} as const;
export const THE_QUEST_SKILLS: SkillDefinition[] = [
{
id: 'energy-bolt',
name: '에너지 볼트',
description: '짧은 쿨다운으로 마력 탄환을 날려 기본 견제를 이어 갑니다.',
manaCost: 0,
cooldownMs: 640,
damage: 16,
range: 214,
castTimeMs: 0,
accentLabel: '기본기',
color: '#9ecfff',
icon: '✦',
role: 'attack',
},
{
id: 'fire-arrow',
name: '파이어 애로우',
description: '시전이 빠른 화염 탄환으로 체력을 깎아 두기 좋은 견제 마법입니다.',
manaCost: 10,
cooldownMs: 2100,
damage: 34,
range: 224,
castTimeMs: 120,
accentLabel: '화염',
color: '#ffb06f',
icon: '➶',
role: 'attack',
},
{
id: 'ice-dagger',
name: '아이스 대거',
description: '날카로운 냉기 단검을 날려 강한 단일 피해를 줍니다.',
manaCost: 16,
cooldownMs: 3200,
damage: 52,
range: 238,
castTimeMs: 180,
accentLabel: '빙결',
color: '#8fe7ff',
icon: '❄',
role: 'attack',
},
{
id: 'lightning',
name: '라이트닝',
description: '가까운 적을 기준으로 번개를 연쇄시켜 다수를 태웁니다.',
manaCost: 24,
cooldownMs: 5200,
damage: 46,
range: 244,
castTimeMs: 220,
accentLabel: '연쇄',
color: '#ffd36f',
icon: '⚡',
role: 'attack',
},
{
id: 'fireball',
name: '파이어볼',
description: '폭발하는 화염구를 떨어뜨려 반경 적을 한 번에 태웁니다.',
manaCost: 30,
cooldownMs: 7600,
damage: 68,
range: 182,
castTimeMs: 280,
accentLabel: '광역',
color: '#ff9a6a',
icon: '☄',
role: 'attack',
},
{
id: 'greater-haste',
name: '그레이터 헤이스트',
description: '이동과 시전 리듬을 끌어올려 위험한 구간을 빠르게 돌파합니다.',
manaCost: 22,
cooldownMs: 11800,
damage: 0,
range: 0,
castTimeMs: 120,
accentLabel: '가속',
color: '#d4c0ff',
icon: '⟡',
role: 'buff',
durationMs: 10000,
},
{
id: 'magic-shield',
name: '매직 실드',
description: '마력 보호막으로 받는 피해를 줄이며 난전을 버팁니다.',
manaCost: 26,
cooldownMs: 12600,
damage: 0,
range: 0,
castTimeMs: 120,
accentLabel: '보호',
color: '#7fcfff',
icon: '⬡',
role: 'buff',
durationMs: 9200,
},
{
id: 'summon-skeleton',
name: '서먼 스켈레톤',
description: '언데드 하수인을 불러 주변 적을 압박하고 마나 순환을 돕습니다.',
manaCost: 34,
cooldownMs: 15000,
damage: 30,
range: 168,
castTimeMs: 180,
accentLabel: '소환',
color: '#d8f0ff',
icon: '☠',
role: 'summon',
durationMs: 15000,
},
];
export const THE_QUEST_ITEMS: InventoryItem[] = [
{
id: 'apprentice-staff',
name: '수습 마도 지팡이',
category: 'weapon',
rarity: 'rare',
icon: '🪄',
description: '기본 주문 위력을 끌어올리고 낮은 확률로 적 MP를 흡수합니다.',
attack: 8,
spellPower: 12,
maxMpBonus: 16,
manaAbsorbChance: 0.16,
slot: 'weapon',
},
{
id: 'scribe-hood',
name: '스크라이브 후드',
category: 'armor',
rarity: 'common',
icon: '🪖',
description: '집중을 돕는 천 후드. 치명과 MP를 살짝 높입니다.',
defense: 4,
critRate: 0.02,
maxMpBonus: 10,
slot: 'helmet',
},
{
id: 'astral-mantle',
name: '아스트랄 맨틀',
category: 'armor',
rarity: 'rare',
icon: '🧥',
description: '별가루를 엮은 로브. 주문 저항과 MP 풀을 함께 보강합니다.',
defense: 8,
maxMpBonus: 18,
slot: 'chest',
},
{
id: 'moon-spaulders',
name: '문 스폴더',
category: 'armor',
rarity: 'rare',
icon: '🪽',
description: '달빛 견갑. 치명 감각과 주문 회전을 보조합니다.',
defense: 4,
critRate: 0.03,
spellPower: 4,
slot: 'shoulders',
},
{
id: 'rune-gloves',
name: '룬 글러브',
category: 'armor',
rarity: 'common',
icon: '🧤',
description: '시전 안정화를 돕는 장갑. 주문 위력이 조금 오릅니다.',
spellPower: 6,
slot: 'gloves',
},
{
id: 'mist-belt',
name: '미스트 벨트',
category: 'armor',
rarity: 'common',
icon: '🧷',
description: '마력 응축 벨트. 방어와 MP를 함께 보정합니다.',
defense: 3,
maxMpBonus: 12,
slot: 'belt',
},
{
id: 'trail-boots',
name: '트레일 부츠',
category: 'armor',
rarity: 'common',
icon: '🥾',
description: '이동용 부츠. 기본 방어를 보강합니다.',
defense: 3,
slot: 'boots',
},
{
id: 'moon-ring',
name: '문링',
category: 'accessory',
rarity: 'epic',
icon: '💍',
description: '달의 조율 반지. 치명과 주문 위력을 크게 높입니다.',
critRate: 0.08,
spellPower: 8,
slot: 'ring',
},
{
id: 'ember-bracelet',
name: '엠버 브레이슬릿',
category: 'accessory',
rarity: 'rare',
icon: '📿',
description: '주문 가속 팔찌. MP와 주문 위력을 함께 높입니다.',
spellPower: 5,
maxMpBonus: 14,
slot: 'bracelet',
},
{
id: 'forest-relic',
name: '포레스트 렐릭',
category: 'accessory',
rarity: 'epic',
icon: '🜂',
description: '숲의 비전이 담긴 유물. 전반적인 마도사 성능을 끌어올립니다.',
attack: 4,
defense: 4,
spellPower: 6,
critRate: 0.04,
slot: 'artifact',
},
{
id: 'moonbranch-staff',
name: '문브랜치 스태프',
category: 'weapon',
rarity: 'rare',
icon: '🪄',
description: '달가지 지팡이. 주문 위력과 마나 흡수 확률이 더 높습니다.',
attack: 10,
spellPower: 16,
maxMpBonus: 20,
manaAbsorbChance: 0.22,
slot: 'weapon',
},
{
id: 'slimecore-cane',
name: '슬라임코어 케인',
category: 'weapon',
rarity: 'epic',
icon: '🔮',
description: '슬라임 코어를 박아 넣은 지팡이. 주문 위력과 흡수량이 크게 오릅니다.',
attack: 12,
spellPower: 20,
maxMpBonus: 28,
manaAbsorbChance: 0.28,
slot: 'weapon',
},
{
id: 'moss-guard',
name: '모스 가드',
category: 'armor',
rarity: 'rare',
icon: '🥋',
description: '이끼 섬유를 엮은 외투. 생존력과 MP를 함께 올립니다.',
defense: 12,
maxMpBonus: 16,
slot: 'chest',
},
{
id: 'owl-visor',
name: '아울 바이저',
category: 'armor',
rarity: 'rare',
icon: '⛑',
description: '시야 보정 바이저. 방어와 치명을 함께 올립니다.',
defense: 6,
critRate: 0.03,
slot: 'helmet',
},
{
id: 'river-striders',
name: '리버 스트라이더',
category: 'armor',
rarity: 'rare',
icon: '👢',
description: '습지 돌파 장화. 안정적인 하체 방어를 제공합니다.',
defense: 5,
slot: 'boots',
},
{
id: 'river-charm',
name: '리버 참',
category: 'accessory',
rarity: 'epic',
icon: '🪬',
description: '강의 기운이 담긴 부적. MP와 치명타 확률을 높입니다.',
critRate: 0.1,
maxMpBonus: 24,
slot: 'necklace',
},
{
id: 'sun-band',
name: '선 밴드',
category: 'accessory',
rarity: 'rare',
icon: '💠',
description: '햇빛 결정 보조 반지. 주문 위력이 추가로 오릅니다.',
spellPower: 7,
slot: 'ring',
},
{
id: 'mist-pendant',
name: '미스트 펜던트',
category: 'accessory',
rarity: 'epic',
icon: '📿',
description: '안개 정수 목걸이. 방어와 MP를 동시에 보강합니다.',
defense: 4,
maxMpBonus: 26,
critRate: 0.05,
slot: 'necklace',
},
{
id: 'hp-potion',
name: '체력 포션',
category: 'consumable',
rarity: 'common',
icon: '🧪',
description: '체력을 순차적으로 180 회복합니다.',
healOverTimeTotal: 180,
healOverTimeTicks: 6,
healOverTimeIntervalMs: 900,
quantity: 5,
},
{
id: 'auto-heal-elixir',
name: '특수 회복 엘릭서',
category: 'consumable',
rarity: 'rare',
icon: '✨',
description: '18초 동안 자동 회복량을 2.5배로 끌어올립니다.',
autoHealMultiplier: 2.5,
effectDurationMs: 18000,
quantity: 2,
},
{
id: 'celerity-potion',
name: '가속 물약',
category: 'consumable',
rarity: 'rare',
icon: '⚡',
description: '14초 동안 모든 이동 속도를 2배로 가속합니다.',
moveSpeedMultiplier: 2,
effectDurationMs: 14000,
quantity: 2,
},
{
id: 'slime-gel',
name: '슬라임 젤',
category: 'material',
rarity: 'common',
icon: '🫧',
description: '연금술 재료. 퀘스트와 촉매 제작에 사용됩니다.',
quantity: 0,
},
];
export const THE_QUEST_QUESTS: QuestDefinition[] = [
{
id: 'slime-hunt',
title: '[메인] 푸른 숲의 정화',
description: '포탈 근처 슬라임 8마리를 정리한 뒤 기사단장 브롬에게 보고하세요.',
progressType: 'kill',
target: 'slime',
requiredCount: 8,
turnInNpcId: 'brom',
rewardGold: 120,
rewardExp: 90,
rewardItemId: 'hp-potion',
},
{
id: 'slime-gel',
title: '[서브] 연금 재료 수집',
description: '슬라임 젤 12개를 모은 뒤 상인 미라에게 직접 전달하세요.',
progressType: 'collect',
target: 'slime-gel',
requiredCount: 12,
turnInNpcId: 'mira',
turnInItemId: 'slime-gel',
rewardGold: 160,
rewardExp: 120,
rewardItemId: 'celerity-potion',
},
];
export const THE_QUEST_NPCS: NpcDefinition[] = [
{
id: 'lyra',
name: '리라',
role: 'guide',
description: '초반 진행과 조작을 안내하는 길드 안내원.',
x: 1080,
y: 730,
},
{
id: 'brom',
name: '브롬',
role: 'quest',
description: '사냥 퀘스트를 제공하는 기사단장.',
x: 1470,
y: 960,
},
{
id: 'mira',
name: '미라',
role: 'shop',
description: '포션과 장비 재료를 취급하는 상인.',
x: 880,
y: 1160,
},
];
export function createInitialEnemies(): EnemyDefinition[] {
return [
{
id: 'slime-1',
name: '슬라임',
role: 'normal',
level: 10,
maxHp: 250,
maxMp: 26,
attack: 18,
expReward: 28,
goldReward: 16,
lootTable: [
{ itemId: 'slime-gel', chance: 1, minQuantity: 1, maxQuantity: 2 },
{ itemId: 'hp-potion', chance: 0.24, minQuantity: 1, maxQuantity: 1 },
{ itemId: 'moonbranch-staff', chance: 0.08, minQuantity: 1, maxQuantity: 1 },
],
x: 1260,
y: 760,
patrolRadius: 72,
tint: 0x6fd0ff,
},
{
id: 'slime-2',
name: '슬라임',
role: 'normal',
level: 10,
maxHp: 250,
maxMp: 24,
attack: 18,
expReward: 28,
goldReward: 16,
lootTable: [
{ itemId: 'slime-gel', chance: 1, minQuantity: 1, maxQuantity: 2 },
{ itemId: 'celerity-potion', chance: 0.18, minQuantity: 1, maxQuantity: 1 },
{ itemId: 'moss-guard', chance: 0.08, minQuantity: 1, maxQuantity: 1 },
],
x: 1410,
y: 900,
patrolRadius: 84,
tint: 0x7be08f,
},
{
id: 'slime-3',
name: '엘더 슬라임',
role: 'normal',
level: 11,
maxHp: 310,
maxMp: 42,
attack: 20,
expReward: 32,
goldReward: 18,
lootTable: [
{ itemId: 'slime-gel', chance: 1, minQuantity: 2, maxQuantity: 3 },
{ itemId: 'hp-potion', chance: 0.3, minQuantity: 1, maxQuantity: 1 },
{ itemId: 'moonbranch-staff', chance: 0.12, minQuantity: 1, maxQuantity: 1 },
],
x: 1540,
y: 840,
patrolRadius: 80,
tint: 0x86d0ff,
},
{
id: 'slime-4',
name: '문글림 슬라임',
role: 'normal',
level: 11,
maxHp: 320,
maxMp: 56,
attack: 21,
expReward: 32,
goldReward: 18,
lootTable: [
{ itemId: 'slime-gel', chance: 1, minQuantity: 2, maxQuantity: 3 },
{ itemId: 'auto-heal-elixir', chance: 0.24, minQuantity: 1, maxQuantity: 1 },
{ itemId: 'river-charm', chance: 0.1, minQuantity: 1, maxQuantity: 1 },
],
x: 1360,
y: 1060,
patrolRadius: 78,
tint: 0x7ce8ff,
},
{
id: 'slime-5',
name: '가디언 슬라임',
role: 'normal',
level: 12,
maxHp: 390,
maxMp: 64,
attack: 24,
expReward: 40,
goldReward: 20,
lootTable: [
{ itemId: 'slime-gel', chance: 1, minQuantity: 2, maxQuantity: 4 },
{ itemId: 'hp-potion', chance: 0.3, minQuantity: 1, maxQuantity: 2 },
{ itemId: 'slimecore-cane', chance: 0.18, minQuantity: 1, maxQuantity: 1 },
{ itemId: 'moss-guard', chance: 0.14, minQuantity: 1, maxQuantity: 1 },
],
x: 1670,
y: 970,
patrolRadius: 90,
tint: 0x65d6ff,
},
{
id: 'slime-6',
name: '에메랄드 슬라임',
role: 'normal',
level: 12,
maxHp: 380,
maxMp: 52,
attack: 23,
expReward: 40,
goldReward: 20,
lootTable: [
{ itemId: 'slime-gel', chance: 1, minQuantity: 2, maxQuantity: 4 },
{ itemId: 'celerity-potion', chance: 0.3, minQuantity: 1, maxQuantity: 1 },
{ itemId: 'moonbranch-staff', chance: 0.12, minQuantity: 1, maxQuantity: 1 },
{ itemId: 'river-charm', chance: 0.14, minQuantity: 1, maxQuantity: 1 },
],
x: 1210,
y: 1180,
patrolRadius: 96,
tint: 0x80f0b0,
},
{
id: 'stage-boss',
name: '포탈 수호자 크라운 슬라임',
role: 'boss',
level: 14,
maxHp: 920,
maxMp: 180,
attack: 38,
expReward: 120,
goldReward: 88,
lootTable: [
{ itemId: 'slime-gel', chance: 1, minQuantity: 4, maxQuantity: 6 },
{ itemId: 'hp-potion', chance: 0.75, minQuantity: 2, maxQuantity: 3 },
{ itemId: 'auto-heal-elixir', chance: 0.54, minQuantity: 1, maxQuantity: 2 },
{ itemId: 'celerity-potion', chance: 0.58, minQuantity: 1, maxQuantity: 2 },
{ itemId: 'mist-pendant', chance: 0.24, minQuantity: 1, maxQuantity: 1 },
{ itemId: 'slimecore-cane', chance: 0.28, minQuantity: 1, maxQuantity: 1 },
],
x: 1820,
y: 360,
patrolRadius: 64,
tint: 0xffb86a,
},
];
}