BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 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