Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
MapleStory calculators for boss profit, starforce, cube odds, and other game stats
AI summary · website content
GamesJavaScript · CSSGitHub @seo941024OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗메이플스토리 GMS 플레이어를 위한 계산기·시뮬레이터·기록 도구 모음 웹앱.
byeolnim.vercel.app · 설치 없이 브라우저에서 사용, 홈 화면에 앱으로 설치 가능
| 코디 시뮬레이터 | 보스 정보 |
|---|---|
| 스타포스 시뮬레이터 | 오늘의 채널 추천 |
|---|---|
| 메뉴 | 내용 |
|---|---|
| 캐릭터 목록 | 넥슨 랭킹 조회로 캐릭터 등록, 일별 경험치 기록과 기간별 평균 그래프 |
| 메이플 캘린더 | 캐릭터별 획득 아이템 달력 기록, 보스 일정 푸시 알림 |
| 숙제 트래커 | 캐릭터별 일일 숙제 체크리스트 |
| 오늘의 채널 추천 | 원하는 아이템 선택 시 점검 중이 아닌 채널 무작위 추천 |
| 메뉴 | 내용 |
|---|---|
| 보스 수익 계산기 | 주간·월간 결정석 수익과 결정석 개수 집계 |
| 헥사 계산기 | HEXA 스킬·마스터리·강화·공용 노드 강화 계산 |
| 해방 계산기 | 제네시스 해방 진행과 예상 해방 날짜 계산 |
| 미스틱 프론티어 계산기 | 패밀리어 3마리의 프론티어 잠재 옵션 입력으로 주사위 점수 계산 |
| 메뉴 | 내용 |
|---|---|
| 코디 시뮬레이터 | 헤어 믹스 염색·성형 믹스 렌즈 비율 미리보기, 피부 선택, 코디 아이템 착용 |
| 추가 옵션 시뮬레이터 | 환생의 불꽃 종류별 추가 옵션 재설정 |
| 스타포스 시뮬레이터 | 단계별 성공·실패·파괴 확률과 비용 기반 강화 시뮬레이션 |
| 큐브 시뮬레이터 | 목표 옵션 기댓값 계산, 직접 큐브 사용 시뮬레이션 |
| 패밀리어 시뮬레이터 | 유니크 패밀리어 옵션 재설정 |
| 소울 증폭 시뮬레이터 | 무기 증폭 단계 강화와 잠재능력 재설정 |
| 연마석 시뮬레이터 | 생명·신념의 연마석 등록 개수별 성공률 시뮬레이션 |
| 메뉴 | 내용 |
|---|---|
| 보스 정보 | 보스별 난이도·HP 카드 |
| 서버 상태 | 월드·채널 상태와 점검 정보 |
| 커뮤니티 | 게시판, 댓글, 사진 첨부 |
| 메이플 운빨 디펜스 | Night Troupe 치트시트 한국어판 |
| 영역 | 사용 기술 |
|---|---|
| 프론트엔드 | 바닐라 JavaScript, HTML, CSS · 번들러·프레임워크 미사용 |
| 호스팅·서버 | Vercel 정적 호스팅, api/*.js 서버리스 함수 |
| 데이터베이스 | Upstash Redis · 계정, 게시판, 경험치 스냅샷, 푸시 구독 |
| 파일 저장소 | Vercel Blob · 커뮤니티 사진. 코디 시뮬레이터 층 데이터는 저장소 정적 파일 |
| 예약 작업 | Vercel Cron 일 1회 수집, 외부 크론 서비스의 분 단위 푸시 발송 호출 |
| 알림 | Web Push API, VAPID |
| 앱 설치 | PWA manifest, 서비스 워커 |
GMS용 넥슨 공식 API 부재. 넥슨 홈페이지 랭킹·서버 상태 화면이 쓰는 인증 없는 엔드포인트 www.nexon.com/api/maplestory/no-auth/...를 주기적으로 조회·적재하고, 조회 시점에 가공하는 ELT 구조.
[Extract] api/_lib.js가 넥슨 홈페이지 no-auth 엔드포인트 조회
↓
[Load] 가공 없이 Redis에 시간순 스냅샷 적재 · 레코드당 최근 N개만 유지하는 롤링 버퍼
↓
[Schedule] Vercel Cron이 매일 1회 추적 대상 전체 재조회 · api/collect.js, 시크릿 인증
↓
[Transform] api/history.js가 응답 시점에 구간별 변화량 계산
롤링 버퍼 적재 · api/_lib.js
async function pushSnapshot(redis, key, snap) {
let arr = [];
const raw = await redis.get('hist:' + key);
if (raw) arr = typeof raw === 'string' ? JSON.parse(raw) : raw;
if (!Array.isArray(arr)) arr = [];
const last = arr[arr.length - 1];
if (last && last.date === snap.date) arr[arr.length - 1] = snap;
else if (!last || last.exp !== snap.exp || last.level !== snap.level || last.img !== snap.img) arr.push(snap);
arr = arr.slice(-180);
await redis.set('hist:' + key, JSON.stringify(arr));
return arr;
}
api/img.js는 넥슨 도메인만 허용.외부 렌더 서버에 의존하던 캐릭터 그림을, 수집한 게임 그림 층으로 브라우저에서 직접 조립하는 구조.
가림 처리 · mixdye_layer.js
// 슬롯마다 마지막으로 차지한 아이템이 주인. 렌더 서버도 요청 순서를 따름
const owner = {};
items.forEach((it, rank) => it.v.forEach(s => { owner[s] = rank; }));
// 층이 쓰는 슬롯 중 자기 슬롯을 다른 아이템에 빼앗기면 그 층을 숨김
const shown = layers.filter(L => {
const slots = (rules.smap[L.l[0]] || '').match(/../g) || [];
return !slots.some(s => L.v.includes(s) && owner[s] !== L.rank);
});
위치 계산 · 몸 층을 원점에 두고 이미 정해진 연결점을 가진 층부터 차례로 연결
const place = (L, x, y) => {
L.x = x; L.y = y;
for (const [k, [mx, my]] of Object.entries(L.l[3])) if (!(k in anchor)) anchor[k] = [x + mx, y + my];
placed.push(L);
};
mixdye_layer.js, tools/coordi_*.js, 설계 문서 COORDI_DESIGN.mdaction 값으로 분기.// api/auth.js · 회원가입, 로그인, 비밀번호 변경, 저장, 불러오기를 함수 하나로 처리
const action = String(body.action || '');
if (action === 'signup') { /* ... */ }
if (action === 'login') { /* ... */ }
if (action === 'save') { /* ... */ }
if (action === 'load') { /* ... */ }
api/push-tick.js를 호출하는 구조.// cube.js · 받는 중이면 같은 Promise를 재사용해 중복 요청 방지
if (!_cubeTableLoading) {
_cubeTableLoading = new Promise((resolve, reject) => {
const s = document.createElement('script');
s.src = 'cube_table.js?v=20260819b';
s.onload = resolve;
s.onerror = () => reject(new Error('cube_table.js 로드 실패'));
document.body.appendChild(s);
});
}
GMS_Calc/
├─ GMS_WEEK_BOSS/ 웹앱 본체 · Vercel 배포 루트
│ ├─ index.html 단일 페이지
│ ├─ common.js 공통 도우미 · 이스케이프, 지연 로딩, 단축키, 자동 실행
│ ├─ app.js 상태 저장, 메뉴 이동, 보스 수익 계산
│ ├─ character.js 캐릭터 추가·조회, 캐릭터 목록 화면, 카드 그림 저장
│ ├─ settings.js 설정, 백업, 테마·글꼴, 관리자 알림
│ ├─ home.js 첫 화면 · 머리 영역, 주요 기능 슬라이드, 전체 메뉴
│ ├─ *.js 메뉴별 기능 · cube.js, mixdye.js, starforce.js 등
│ ├─ data_*.js 메뉴별 데이터
│ ├─ api/ 서버리스 함수
│ ├─ tools/ 데이터 생성·수집 스크립트
│ ├─ serve.js 로컬 개발 서버
│ └─ sw.js, pwa.js 서비스 워커, 앱 설치
├─ .github/workflows/ 코디 데이터 수동 수집 작업
└─ COORDI_DESIGN.md 코디 시뮬레이터 설계 문서
node GMS_WEEK_BOSS/serve.js
http://localhost:3001 접속. 정적 파일과 api/ 함수 전체를 Vercel과 같은 방식으로 로컬 제공.
master 브랜치 푸시 시 Vercel 자동 배포. 자세한 절차는 GMS_WEEK_BOSS/README_DEPLOY.mdindex.html의 ?v= 캐시 버전 갱신| 변수 | 용도 |
|---|---|
UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN | Redis 연결 |
BLOB_READ_WRITE_TOKEN | 커뮤니티 사진 Vercel Blob 업로드 |
VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY | 푸시 알림 |
CRON_SECRET | 예약 작업 호출 인증 |
ADMIN_SECRET, ADMIN_IDS | 관리자 기능 |
게임 그림과 데이터의 권리는 NEXON에 있음. 비영리 개인 프로젝트.