Initial commit: ssessesse ki battle
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
export const VISIT_SESSION_MS = 30 * 60 * 1000;
|
||||
export const ACTIVITY_INTERVAL_MS = 60000;
|
||||
export const ANALYTICS_BATCH_SIZE = 20;
|
||||
export const ACTIVE_WINDOW_MS = 90000;
|
||||
export const PRESENCE_INTERVAL_MS = 10000;
|
||||
export const RETENTION_MS = 90 * 24 * 60 * 60 * 1000;
|
||||
export const RETRY_QUEUE_LIMIT = 100;
|
||||
export const RETRY_MAX_AGE_MS = VISIT_SESSION_MS;
|
||||
export const RETRY_INTERVAL_MS = 5000;
|
||||
export const MAX_EVENTS_PER_MINUTE = 120;
|
||||
export const RETENTION_SWEEP_MS = 60 * 60 * 1000;
|
||||
export const CLIENT_EVENTS = ['page_view', 'screen_view', 'ui_action', 'client_error', 'game_started', 'game_finished'] as const;
|
||||
export const SCREENS = ['home', 'join', 'waiting', 'match', 'result'] as const;
|
||||
export const UI_ACTIONS = ['bot_start', 'room_create', 'room_join', 'rematch'] as const;
|
||||
export const CLIENT_ERROR_CODES = ['storage_unavailable', 'connection_failed', 'renderer_failed'] as const;
|
||||
export const CAMPAIGN_VALUES = ['friend', 'organic', 'social', 'email', 'launch'] as const;
|
||||
@@ -0,0 +1 @@
|
||||
export const GAME_NAME = '쎄쎄쎄:기공대전';
|
||||
@@ -0,0 +1,40 @@
|
||||
export interface CosmeticColor {
|
||||
id: string;
|
||||
name: string;
|
||||
suit: string;
|
||||
suitDark: string;
|
||||
trim: string;
|
||||
requirement?: { type: 'wins' | 'streak'; value: number };
|
||||
}
|
||||
|
||||
export const EYEWEAR_IDS = ['glasses', 'sunglasses'] as const;
|
||||
export const EQUIPMENT_IDS = ['shoes', 'wristbands', 'headband', ...EYEWEAR_IDS] as const;
|
||||
export type EquipmentId = typeof EQUIPMENT_IDS[number];
|
||||
export const COSMETIC_EQUIPMENT: readonly { id: EquipmentId; name: string; requirement: { type: 'wins' | 'streak'; value: number } }[] = [
|
||||
{ id: 'shoes', name: '신발', requirement: { type: 'wins', value: 5 } },
|
||||
{ id: 'wristbands', name: '아대', requirement: { type: 'streak', value: 3 } },
|
||||
{ id: 'headband', name: '머리띠', requirement: { type: 'wins', value: 20 } },
|
||||
{ id: 'glasses', name: '안경', requirement: { type: 'streak', value: 50 } },
|
||||
{ id: 'sunglasses', name: '선글라스', requirement: { type: 'streak', value: 100 } },
|
||||
];
|
||||
export const HAIR_STYLES = [
|
||||
{ id: 'black', name: '검정 뾰족머리' }, { id: 'white', name: '백발 뾰족머리' }, { id: 'bald', name: '빡빡이' },
|
||||
] as const;
|
||||
export type HairStyle = typeof HAIR_STYLES[number]['id'] | 'default';
|
||||
export const SKIN_TONES = [
|
||||
{ id: 'light', name: '밝은 피부', skin: '#efc8a5', shade: '#bd896b', light: '#ffe4c8' },
|
||||
{ id: 'tan', name: '구릿빛 피부', skin: '#a96f49', shade: '#6e4938', light: '#d29a70' },
|
||||
] as const;
|
||||
export type SkinToneId = typeof SKIN_TONES[number]['id'];
|
||||
|
||||
// Confirmed unlock thresholds; shared by availability checks and previews.
|
||||
export const COSMETIC_COLORS: readonly CosmeticColor[] = [
|
||||
{ id: 'white', name: '흰색', suit: '#f0eee5', suitDark: '#abaea8', trim: '#535f68' },
|
||||
{ id: 'orange', name: '주황', suit: '#aa5740', suitDark: '#613b33', trim: '#d3bf99', requirement: { type: 'wins', value: 5 } },
|
||||
{ id: 'blue', name: '파랑', suit: '#455862', suitDark: '#293840', trim: '#d7d5bf', requirement: { type: 'wins', value: 20 } },
|
||||
{ id: 'red', name: '빨강', suit: '#ad4148', suitDark: '#632c36', trim: '#ebc49c', requirement: { type: 'wins', value: 50 } },
|
||||
{ id: 'green', name: '초록', suit: '#52765a', suitDark: '#304c3b', trim: '#d4ce9e', requirement: { type: 'streak', value: 3 } },
|
||||
{ id: 'purple', name: '보라', suit: '#79608e', suitDark: '#493955', trim: '#ddc6aa', requirement: { type: 'streak', value: 5 } },
|
||||
{ id: 'black', name: '검정', suit: '#34383e', suitDark: '#1c2027', trim: '#b8b6ae', requirement: { type: 'streak', value: 10 } },
|
||||
];
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// Presentation only. The authoritative reveal and result timings stay in gameplay.ts.
|
||||
export const CUTSCENE_TIMING = { impact: 1100, fallen: 2400, beamDissolve: 3000, complete: 3600 } as const;
|
||||
@@ -0,0 +1,14 @@
|
||||
export const ACTIONS = {
|
||||
charge: { name: '으', cost: 0, effect: '생존 시 기 +1', symbol: '✦' },
|
||||
blast: { name: '파', cost: 1, effect: '상대의 으를 맞힘', symbol: '➜' },
|
||||
guard: { name: '막기', cost: 0, effect: '파를 막음', symbol: '⬡' },
|
||||
beam: { name: '에네르기파', cost: 3, effect: '으·파·막기를 맞힘', symbol: '➠' },
|
||||
dodge: { name: '순간이동', cost: 1, effect: '파·에네르기파 회피', symbol: '↝' },
|
||||
} as const;
|
||||
export const ACTION_IDS = Object.keys(ACTIONS) as (keyof typeof ACTIONS)[];
|
||||
export const MATCH_COUNTDOWN_MS = 3000;
|
||||
export const TURN_DURATION_MS = 4000;
|
||||
export const REVEAL_DURATION_MS = 1200;
|
||||
export const RULES_VERSION = '1';
|
||||
export const BOT_VERSION = '1';
|
||||
export const APP_VERSION = '0.1.0';
|
||||
@@ -0,0 +1,8 @@
|
||||
import type { FighterAppearance } from '../src/shared/cosmetics.js';
|
||||
|
||||
export const HOME_TELEPORT_APPEARANCE: FighterAppearance = {
|
||||
characterId: 0,
|
||||
colorId: 'white',
|
||||
hairStyle: 'bald',
|
||||
equipment: ['shoes', 'wristbands', 'sunglasses'],
|
||||
};
|
||||
@@ -0,0 +1,4 @@
|
||||
export const LEGACY_EVENT_TYPES = [
|
||||
'match_started', 'bot_started', 'room_created', 'room_joined', 'room_closed',
|
||||
'rematch_requested', 'request_rejected', 'connection_interrupted', 'connection_resumed', 'record_failed',
|
||||
];
|
||||
@@ -0,0 +1,10 @@
|
||||
export const RANKED_POLL_MS = 500;
|
||||
export const RANKED_QUEUE_TTL_MS = 15000;
|
||||
export const RANKED_FINISHED_TTL_MS = 15 * 60 * 1000;
|
||||
export const RANKED_SAVE_RETRY_MS = 1000;
|
||||
export const RANKED_LEADERBOARD_LIMIT = 100;
|
||||
export const PROFILE_NAME_VERSION = 1;
|
||||
export const PROFILE_NAME_PREFIXES = ['푸른', '밝은', '고요한', '빛나는', '온화한', '맑은', '은빛', '씩씩한'] as const;
|
||||
export const PROFILE_NAME_NOUNS = ['구름', '바람', '별빛', '노을', '하늘', '달빛', '물결', '나무'] as const;
|
||||
export const PROFILE_NAME_SUFFIX_MIN = 1000;
|
||||
export const PROFILE_NAME_SUFFIX_MAX = 10000;
|
||||
@@ -0,0 +1,25 @@
|
||||
export const GAME_SESSION_STORAGE_KEY = 'dragon_ball_game_session_v2';
|
||||
export const GAME_CHECKPOINT_KEY = 'dragon_ball_checkpoint_v2';
|
||||
export const PENDING_RESULT_KEY = 'dragon_ball_pending_result_v2';
|
||||
export const GAME_ROOM_KEY = 'dragon_ball_room_v2';
|
||||
export const GAME_SESSION_TTL_MS = 90 * 24 * 60 * 60 * 1000;
|
||||
export const RESULT_RETRY_DELAYS_MS = [2000, 5000, 10000, 30000] as const;
|
||||
export const GAME_API_MESSAGES: Record<string, string> = {
|
||||
INVALID_SESSION: '접속 정보가 만료되었습니다. 새로 접속하세요.',
|
||||
MATCH_PENDING: '이전 대전 기록을 저장한 뒤 다시 시도하세요.',
|
||||
RESULT_CONFLICT: '이미 저장된 결과와 다릅니다.',
|
||||
NO_ACTIVE_MATCH: '현재 대전을 확인하세요.',
|
||||
ROOM_NOT_FOUND: '방 코드를 확인하세요.',
|
||||
ROOM_FULL: '이미 참가자가 있는 방입니다.',
|
||||
SELF_JOIN: '자신의 방에는 참가할 수 없습니다.',
|
||||
ROOM_EXPIRED: '방이 만료되었습니다. 새 방을 만드세요.',
|
||||
SERVER_ERROR: '처리하지 못했습니다. 다시 시도하세요.',
|
||||
INVALID_PROFILE: '프로필 정보를 확인하세요.',
|
||||
PROFILE_NAME_READONLY: '이름은 자동으로 지정되며 변경할 수 없습니다.',
|
||||
INVALID_APPEARANCE: '캐릭터, 머리, 도복색과 장비를 확인하세요.',
|
||||
COLOR_LOCKED: '아직 획득하지 않은 도복입니다.',
|
||||
EQUIPMENT_LOCKED: '아직 획득하지 않은 장비입니다.',
|
||||
INVALID_ACTION: '현재 선택할 수 없는 행동입니다.',
|
||||
ACTION_LOCKED: '이미 선택한 행동은 바꿀 수 없습니다.',
|
||||
RANKED_CLOSED: '랭킹 대전을 이용할 수 없습니다. 잠시 후 다시 시도하세요.',
|
||||
};
|
||||
@@ -0,0 +1,7 @@
|
||||
export const GUEST_TOKEN_KEY = 'dragon_ball_guest_token';
|
||||
export const RECONNECT_GRACE_MS = 10000;
|
||||
export const WAITING_ROOM_TTL_MS = 600000;
|
||||
export const ROOM_CODE_LENGTH = 6;
|
||||
export const ROOM_CODE_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
|
||||
export const REQUEST_CACHE_LIMIT = 100;
|
||||
export const RECORD_RETRY_MS = 2000;
|
||||
@@ -0,0 +1,10 @@
|
||||
export const PROTOCOL_VERSION = 1;
|
||||
export const CONNECT_TIMEOUT_MS = 15000;
|
||||
export const PROTOCOL_TIMEOUT_MS = 3000;
|
||||
export const PEER_PING_MS = 2000;
|
||||
export const PEER_SILENCE_MS = 6000;
|
||||
export const MAX_PEER_MESSAGE_BYTES = 16384;
|
||||
export const ACTIVE_ROOM_TTL_MS = 24 * 60 * 60 * 1000;
|
||||
export const TURN_CREDENTIAL_TTL_SECONDS = 3600;
|
||||
export const RESUME_START_DELAY_MS = 100;
|
||||
export const ROOM_POLL_MS = 1000;
|
||||
Reference in New Issue
Block a user