Underground 2 Revived
Chrome과 Firefox에서 Need for Speed Underground 2를 WebGPU로 두고 팬 프로젝트입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
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에 있음. 비영리 개인 프로젝트.