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
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗เว็บแอป Next.js ที่ตอบคำถามเดียว: ซื้อวัตถุดิบจากตลาด → ผลิต → ขายผลผลิต คุ้มไหม และเลเวลไหนดีที่สุด ครอบคลุมโรงงานทั้ง 43 ตัวใน Craft World ตั้งแต่ Lv.1 ถึงเลเวลสูงสุดของแต่ละโรงงาน
กำไร/รอบ = (ผลผลิต × ราคาขาย) − (วัตถุดิบ × ราคาซื้อ)กำไร/วัน = กำไร/รอบ × (86400 ÷ วินาทีต่อรอบ)% = กำไร/รอบ ÷ ต้นทุนราคาซื้อ/ขายเป็นเรท swap ต่อ 1 หน่วย (marginal — ยิงที่ 1 หน่วย)
SCREWS) จะมีราคาซื้อสูงผิดปกติ
ทำให้โรงงานที่ใช้มันเป็นวัตถุดิบ (Acid, Bolts) แสดงกำไรติดลบมหาศาลnpm install
npm run dev # http://localhost:3000
คำสั่งอื่น: npm run lint · npm run typecheck · npm run build
app/ App Router — layout, หน้าเดียว, global CSS
components/ SummaryTiles (server) + ProfitMatrix (client, ลิสต์/ตาราง/ฟิลเตอร์)
lib/ types, ตัวช่วยฟอร์แมตตัวเลข, ตัวโหลดข้อมูล
data/prices.json ราคา snapshot + ตารางโรงงานทุกเลเวล
อัปเดตราคา = แทนที่ data/prices.json ด้วย snapshot ใหม่ (โครงสร้างตาม lib/types.ts)
หน้าเว็บดึงราคาใหม่ทุก 60 วินาที พร้อมนับถอยหลังและปุ่มรีเฟรชทันที แถบสถานะบอกเสมอว่า
ตัวเลขที่เห็นมาจากไหน — สด คือดึงจากต้นทางสำเร็จ snapshot คือใช้ไฟล์ที่ติดมากับ build
ต้นทางคือ GraphQL ของ craft-world.gg (exactInputQuote) เปลี่ยนปลายทางได้ด้วย PRICE_API_URL
API มีแต่ exactInput (ระบุจำนวนขาเข้า) จึงต้องยิงสองทิศต่อหนึ่ง symbol
| ต้องการ | ยิง | ได้ |
|---|---|---|
ราคาขาย S | S → COIN จำนวน 1 ชิ้น | COIN ที่ได้ = ราคาขายต่อชิ้น |
ราคาซื้อ S | COIN → S ด้วย COIN เท่ากับราคาขาย | ได้ของ ~1 ชิ้น · ราคาซื้อ = COIN ที่จ่าย ÷ จำนวนที่ได้ |
ขาซื้อยิงด้วยมูลค่าราวหนึ่งชิ้นเพื่อให้ price impact เทียบเท่าขาขาย ถ้ายิงด้วย 1 COIN เฉย ๆ ของแพงจะกลายเป็นรายการจิ๋วและได้ราคาดีเกินจริง สองทิศเป็นคนละ pool กันจริง — ใน snapshot อัตราส่วน buy/sell กระจายตั้งแต่ 0.93 (DYNOKEY) ถึง 1.12 (PLASTICS) คำนวณย้อนจากค่าธรรมเนียมคงที่ไม่ได้
46 symbol × 2 ทิศ = 92 quote ต่อการรีเฟรชหนึ่งครั้ง รวมเป็น query ด้วย GraphQL alias แบ่งเป็นก้อนละ 8 ยิงขนานกันในแต่ละรอบ และ route แคชผลไว้ 30 วินาที หลายแท็บจึงไม่ถล่มต้นทาง
ต้นทางปกติตอบก้อนหนึ่งใน 1–3 วินาที แต่บางคำขอค้างแบบสุ่มนานเป็นสิบวินาที และค้างซ้ำได้ ก้อนไหนยังไม่ตอบใน 3 วินาทีจะยิงสำเนาขนานไปอีกชุดโดยไม่ยกเลิกตัวเดิม เอาตัวที่ตอบก่อน (สูงสุด 3 ชุดต่อก้อน) งบเวลารวม 30 วินาที
ราคาที่ได้ต้องครบทุกไอเทมที่สูตรใช้ ไม่งั้นถูกปฏิเสธแล้วตกกลับไปใช้ snapshot — payload ที่ขาดบางตัวจะทำให้ต้นทุนกลายเป็น Infinity ทั้งกระดาน ซึ่งแย่กว่าราคาเก่า
ปุ่มด้านบนหน้าเว็บสลับได้ 3 แบบ ตัวเลขทั้งหน้าเปลี่ยนตาม
| โหมด | วัตถุดิบมาจากไหน |
|---|---|
market ซื้อวัตถุดิบ | ซื้อวัตถุดิบชั้นถัดไปจากตลาด คราฟต์ 1 รอบ ขายผลผลิตกลับ |
chain คราฟต์สุดสาย | ซื้อเฉพาะ Dust · Fire · Water กับ Earth นอกนั้นคราฟต์เองทุกชั้น |
mixed เลือกที่ถูกกว่า | แต่ละชั้นเลือกทางที่ถูกกว่าระหว่างซื้อกับทำเอง (make-or-buy) |
Earth เป็นเหมืองที่ขุดเองได้ แต่คิดราคาซื้อจากตลาดทุกโหมด เพื่อให้เห็นต้นทุนแบบซื้อจริง — ถ้าคิดเป็น 0 ทั้งสาย Mud→Clay→Sand→Copper จะกลายเป็นฟรีและทำให้กำไรดูเกินจริงไปมาก
ด้วยเหตุผลเดียวกัน เหมืองไม่ถูกนับเป็นโรงงานในตาราง (isPurchasedOnly ใน lib/cost.ts
คัดออก) เพราะไม่มีวัตถุดิบให้ซื้อ ต้นทุนเลยเป็น 0 กำไร % ไม่มีความหมาย และจะขึ้นอันดับหนึ่ง
กำไร/วันเสมอทั้งที่เทียบกับโรงงานอื่นไม่ได้ ตารางจึงเหลือ 42 โรงงานที่เอามาเทียบกันได้จริง
แต่ละเลเวลกางเป็น รายการที่ต้องซื้อ ได้ (shoppingList ใน lib/cost.ts) บอกว่าต้องซื้ออะไร
จำนวนเท่าไหร่ ราคาต่อหน่วยเท่าไหร่ ผลรวมเท่ากับต้นทุนของแถวนั้นพอดี กดที่เลเวลในตารางเพื่อเปลี่ยนแถวที่กางดู
โหมดที่คราฟต์เองสมมติว่าโรงงานที่ป้อนให้อยู่ที่เลเวลซึ่งกินวัตถุดิบต่อชิ้นน้อยที่สุด
กำไร/วันนับเวลาของโรงงานป้อนแบบคอขวด — มีโรงงานแต่ละชนิดอย่างละโรงเดินพร้อมกัน
แต่ละโรงต้องผลิตวัตถุดิบให้พอหนึ่งรอบของโรงงานเป้าหมาย เวลาจริงต่อรอบคือค่าที่มากที่สุด
ระหว่างรอบของโรงงานเป้าหมายกับเวลาของโรงงานป้อนแต่ละตัว (cycle และ bottleneck ใน CostedRow)
โรงงานป้อนที่ใช้วัตถุดิบเท่ากันทุกเลเวลคิดที่เลเวลที่ผลิตได้เร็วที่สุด และ ads2x เร่งทุกโรงงานในสาย
เลย์เอาต์ปรับตามความกว้างจอด้วย CSS ล้วน ไม่มีการเช็ค user-agent (SSR จึงตรงกับ client เสมอ)
| ความกว้าง | เลย์เอาต์ |
|---|---|
< 760px | ลิสต์บน/ตารางล่าง · ตารางเหลือ 4 คอลัมน์หลัก รายละเอียดที่เหลือย้ายลงแถว .subrow เต็มความกว้าง · แตะโรงงานแล้วเลื่อนไปตารางให้ พร้อมแถบ "← รายการโรงงาน" แบบ sticky |
760–899px | คอลัมน์เดียว แต่ตารางแสดงครบ 9 คอลัมน์ |
≥ 900px | สองพาเนล ลิสต์ sticky ค้างไว้ซ้าย · หัวตาราง sticky ขณะเลื่อนดูเลเวลยาว ๆ |
รายละเอียดอื่น: ปุ่มบนจอแคบสูงอย่างน้อย 40px, ช่องค้นหาใช้ font-size 16px กัน iOS ซูมเอง,
:focus-visible มองเห็นชัดสำหรับคีย์บอร์ด, hover เปิดเฉพาะอุปกรณ์ที่มีเมาส์จริง
และเคารพ prefers-reduced-motion ตอนเลื่อนหน้า
.github/workflows/ci.yml รันบน push เข้า main, ทุก pull request และตามกำหนดทุกสัปดาห์
npm run lint, npm run typecheck, npm run buildnpm audit --omit=dev --audit-level=high) ส่วนทุก dependency รวม dev tooling ล้มงานที่ระดับ critical
(npm audit --audit-level=critical) เพราะ dev tooling ไม่ถูก deploy และบางตัวต้นทางยังไม่มีเวอร์ชันแก้
ผลเต็มทุกระดับแนบไว้ใน job summary เสมอDeploy บน Vercel — ค่า default ของ Next.js ใช้ได้เลย ไม่ต้องตั้ง env var ใดๆ
ข้อมูลโรงงานจาก rawrtools.com · ราคาจาก craft-world.gg