BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗เกม Tower Defense แบบ maze เล่นบน browser ได้แรงบันดาลใจจากแมพ [BK's] Gem TD (Warcraft III, by Bryvx) ตัวเลขของ gem, สูตร special และ wave ทั้ง 50 เลเวลดึงมาจากไฟล์แมพ [BK's] Gem TD v7.9.w3x โดยตรง
สถานะ: prototype มีระบบหลักครบ แต่ยังไม่ได้ปรับ balance และยังไม่มี slate, damage test, race mode, extra chance และมินิเกมพนัน
R) ฟรีและใช้ได้ตลอดเวลา?room=CODE) ให้เพื่อนเบื้องหลังใช้ PeerJS (WebRTC data channel) และใช้ signalling server สาธารณะของ PeerJS ไม่ต้องมี backend ของเราเอง จึงยัง deploy บน Vercel แบบ static ได้ ข้อจำกัดคือไม่มี TURN server ถ้าทั้งสองฝั่งอยู่หลัง NAT แบบเข้มงวด (เช่นเครือข่ายบริษัทบางแห่ง) อาจเชื่อมต่อไม่ได้
ปุ่มลัด: Space หยุด/เล่นต่อ · 1 2 4 เปลี่ยนความเร็ว · K Keep gem ที่เลือกอยู่ · Esc ยกเลิกการเลือก
npm install
npm run dev # http://localhost:5173
npm run build # type-check + build ไปที่ dist/
npm run simulate -- 5 --smart --difficulty=easy # ให้ bot เล่นแบบ headless เพื่อทดสอบ logic และ balance
npm run versus-test # ทดสอบ logic ของ versus โดยต่อ 2 ฝั่งผ่าน channel ในหน่วยความจำ
npm run features-test # ทดสอบ Remove rock, Downgrade, Swap และ Slate
npm run render-smoke # รัน renderer กับ canvas จำลอง เพื่อหา runtime error และค่า NaN
npm run determinism-test # seed เดียวกัน + action เดียวกัน = เกมเดียวกัน, replay, canPlace
npm run ai-test # recorder, analyzer, tuner, การตรวจคำตอบของ LLM
npm run bot-golden -- --write=a.json / --check=a.json # ยืนยันว่าการแก้โค้ดไม่เปลี่ยน action ของบอท
ต้องใช้ Node 18 ขึ้นไป
ผลทั้งหมดอยู่ใน sim-runs/ (ไม่อยู่ใน git) รันขนานทุก core
npm run batch -- --weights=w0 --seeds=200 # โหมด A: เล่น 200 เกม → รายงาน balance ใน sim-runs/batch/
npm run tune -- --rounds=20 # จูนค่าน้ำหนัก (hill-climbing) → รายงานรายรอบใน sim-runs/tune/reports/
npm run tune -- --export-llm # สร้างคำขอให้ LLM ที่ sim-runs/tune/llm/request-rNNN.md
npm run tune -- --rounds=5 --import=answer.json # เล่นข้อเสนอของ LLM (JSON) บน seed เดิม แล้วจูนต่อ
npm run tune -- --rounds=5 --try=my.json # ลองค่าน้ำหนักที่ตั้งเอง
ดู AI เล่นในเบราว์เซอร์: npm run dev → Settings → AI auto-play (ใส่ id ของค่าน้ำหนักและ seed หรือโหลดไฟล์ JSON) หรือเปิดลิงก์ http://localhost:5173/?ai=w3&seed=37 ที่อยู่ในรายงาน batch ค่าน้ำหนักชุดเดียวกัน + seed เดียวกัน จะได้เกมเดียวกับใน batch ทุก action ระหว่าง AI เล่น คลิกได้แค่เลือกดู tower ปุ่มความเร็วมี 1/4/8/16x
--weights= รับ w0, smart, id ที่บันทึกไว้ใน sim-runs/weights/ หรือ path ของไฟล์ JSON (ใส่แค่ค่าที่ต้องการเปลี่ยนก็พอ) ค่าน้ำหนักทั้งหมดพร้อมขอบเขตและคำอธิบายอยู่ใน src/ai/weights.ts
repo นี้มี vercel.json ตั้งค่าไว้แล้ว (framework Vite, output dist):
artnonnan/gemtdmain ระบบจะ deploy ให้อัตโนมัติหรือ deploy ผ่าน CLI ด้วย npx vercel --prod
src/
data/towers.json ค่าสถานะ tower 114 ตัว (generated จาก war3map.w3u)
data/waves.json ครีป 50 เลเวล (generated จาก war3map.w3u + war3map.j)
data/gems.ts ประเภท gem, คุณภาพ, สูตร special, ability ของแต่ละ tower
data/slates.ts สูตร slate, slate พิเศษ และ ability ของ slate (hold, permanent slow, flames, spells)
game/config.ts ขนาดบอร์ด, checkpoint, ค่าคงที่ต่าง ๆ
game/path.ts A* pathfinding และการตรวจว่า maze ถูกปิดหรือไม่
game/game.ts state ของเกม, กติกา, การจำลองการต่อสู้ (fixed timestep)
game/rng.ts seeded PRNG สำหรับสุ่ม gem (versus ใช้ seed เดียวกัน)
net/session.ts PeerJS wrapper (host/join) และ message protocol
net/match.ts ควบคุม versus: sync การเริ่ม wave, ส่ง snapshot, ตัดสินผล
render/renderer.ts วาดภาพด้วย Canvas 2D (กล้อง, LOD, ลำดับความลึก, cache หินและพื้นหลัง)
render/art.ts วาด tower ด้วยโค้ด รูปแบบแยกตาม quality 6 ระดับ (ต้นแบบอยู่ที่ demo/example1)
render/vfx.ts particle, คลื่นวงแหวน, ป้ายข้อความ
render/mini.ts มุมมองบอร์ดของคู่แข่ง (จาก snapshot)
ui/panel.ts แผง HUD
main.ts game loop และ input
ai/weights.ts ค่าน้ำหนักของบอท ขอบเขต และคำอธิบาย
ai/bot.ts บอท heuristic: nextAction (ตัดสินใจ) / applyAction (ลงมือ)
ai/runner.ts เล่นเกมแบบ headless และ replay จาก seed + log
ai/recorder.ts GameRecord ของแต่ละเกม (lives ที่เสียรายเวฟ, damage ต่อ tower, การเลือก)
ai/analyze.ts สรุปสถิติ และเทียบสองชุดแบบจับคู่ seed พร้อม standard error
ai/tuner.ts hill-climbing: เสนอ candidate, ตัดสิน, จำทิศทางที่ได้ผล
ai/advisor.ts คำขอสำหรับ LLM และการตรวจคำตอบ (LLM เป็นแค่ผู้เสนอ ไม่ใช่ผู้ตัดสิน)
ai/report.ts รายงานภาษาไทย (batch และรายรอบการจูน)
scripts/simulate.ts bot สำหรับเล่นแบบ headless
scripts/ai/ CLI ของ batch / tune (worker threads)
summary/ สรุปแต่ละ commit ของงาน AI (ภาษาไทย)
กติกาที่ยึดตามแมพต้นฉบับ: สูตรคำนวณเกราะของ WC3, aura ชนิดเดียวกันไม่ stack, ได้โบนัสดาเมจ +10% ทุก 10 kill (สูงสุด +120%), bounty = ubba + 1, ครีปเข้า Mine แล้วลด lives ตาม point value (upoi), lives สูงสุด 50, ความยาก Easy/Normal/Hard ปรับเกราะครีป −3/−1/+2
ค่าที่ประมาณเอง: 1 ช่องบนบอร์ด = 128 WC3 units, ตำแหน่ง checkpoint, สถานะของ gem ระดับ mod ที่อ่านจาก tooltip และ Chipped Ruby ที่ปรับ cooldown เป็น 0.8s (ในข้อมูลแมพเป็น 0.1s)
ใช้สคริปต์ในโฟลเดอร์ w3x (EXTRACT_W3X.md):
python -I extract_w3x.py "[BK's] Gem TD v7.9.w3x" extracted
python -I parse_objects.py extracted/war3map.w3u extracted/war3map.w3u.json
python -I export_towers.py extracted/war3map.w3u.json ../gemtd/src/data/towers.json extracted/war3map.j ../gemtd/src/data/waves.json
Fan prototype ที่ไม่ได้ใช้ asset ใด ๆ จาก Warcraft III ชื่อและตัวเลขของ gem อ้างอิงจากแมพ [BK's] Gem TD ของ Bryvx