SimCity chạy bằng WebAssembly và OpenGL trong trình duyệt web
(micropolisweb.com)- Micropolis Web, dựa trên SimCity Classic gốc của Maxis, đã được công bố dưới dạng chạy trong trình duyệt, cho phép trải nghiệm trò mô phỏng xây dựng thành phố kinh điển mà không cần cài đặt riêng
- Dự án là phiên bản trò chơi do Will Wright thiết kế được Don Hopkins port lại, hiện vẫn chưa phải bản hoàn chỉnh mà ở trạng thái thử nghiệm và liên tục thay đổi
- Kho GitHub, video demo, sách và sơ đồ của Chaim Gingold được cung cấp kèm theo, giúp tìm hiểu sâu hơn về cách triển khai và lịch sử của SimCity
- Cách điều khiển sử dụng kéo chuột, bánh xe chuột, phím mũi tên, phím chữ, phím số, v.v., cho phép di chuyển, phóng to/thu nhỏ, tải thành phố, điều chỉnh tốc độ, thay đổi thuế suất và chuyển bộ tile
- Tên “Micropolis” được sử dụng theo các điều khoản của Micropolis Public Name License; các tính năng bổ sung và easter egg vẫn đang được chuẩn bị
Micropolis Web chạy trong trình duyệt
- Micropolis Web là phiên bản Micropolis chạy bằng WebAssembly
- Nền tảng là SimCity Classic gốc của Maxis, trò chơi do Will Wright thiết kế và được Don Hopkins port lại
- Trạng thái hiện tại không phải là một sản phẩm hoàn chỉnh, mà gần với một thử nghiệm còn dang dở và liên tục thay đổi
- Kênh hỗ trợ phát triển bổ sung được liên kết qua Patreon
- Có thể xem kho mã nguồn tại MicropolisCore
- Video liên quan:
- Tài liệu tham khảo:
- Tên “Micropolis” được sử dụng theo các điều khoản của Micropolis Public Name License
Cách điều khiển và các lưu ý còn lại
-
Điều khiển bằng chuột
- Kéo bằng nút trái để di chuyển màn hình
- Có thể phóng to/thu nhỏ bằng bánh xe chuột
-
Điều khiển bằng bàn phím
- Di chuyển màn hình bằng các phím mũi tên
- Phóng to/thu nhỏ bằng phím dấu phẩy và dấu chấm
- Tải nhiều thành phố khác nhau bằng các phím chữ
- Tạo bằng phím
\ - Thiết lập tốc độ bằng các phím số
- Bật/tắt tạm dừng bằng phím
0 - Giảm hoặc tăng thuế suất bằng các phím ngoặc vuông
- Chuyển bộ tile bằng phím
-và= - Nhấn nút “X” ở phía trên để ẩn cửa sổ hướng dẫn
- Các tính năng bổ sung và easter egg đang được chuẩn bị
- Dòng cảnh báo bắt đầu bằng nội dung không được nhấn phím cách, nhưng trong phần văn bản được cung cấp, phần giải thích tiếp theo chưa hoàn chỉnh
1 bình luận
Ý kiến trên Hacker News
Việc port các trò chơi cũ lên web khá thú vị. Ngày nay có nhiều game còn nhỏ hơn cả các trang web thông thường, nên tải nhanh và chạy tốt
Tôi vừa port Quake 3 và đang nghịch khá vui: https://thelongestyard.link/
Demo Micropolis Web 1: https://www.youtube.com/watch?v=wlHGfNlE8Os
Micropolis Web là phiên bản trên trình duyệt của Micropolis, SimCity mã nguồn mở, sử dụng WebAssembly, WebGL và SvelteKit. Nó dựa trên mã nguồn SimCity Classic gốc do Will Wright thiết kế và Don Hopkins port; bản demo đầu tiên đã chạy được trình mô phỏng WebAssembly và hoạt ảnh tile bằng WebGL, nhưng phần lớn giao diện người dùng vẫn đang được phát triển
Trang live: https://MicropolisWeb.com
Mã nguồn và tài liệu: https://github.com/SimHacker/MicropolisCore
Sách "Building SimCity" của Chaim Gingold: https://mitpress.mit.edu/9780262547482/building-simcity/
"SimCity Reverse Diagrams" của Chaim Gingold: https://smalltalkzoo.thechm.org/users/Dan/uploads/SimCityRev...
Micropolis Web Space Inventory Cellular Automata Music 1: https://www.youtube.com/watch?v=BBVyCpmVQew
Nhạc do Juho Hietala, Blamstrain thực hiện, còn Space Inventory Cellular Automata do Don Hopkins triển khai: https://blamstrain.com/
Gingold, Chaim. “Play Design.” Ph.D. thesis, University of California Santa Cruz, 2016. https://www.proquest.com/docview/1806122688
Bản port Wasm của Micropolis có vẻ có thể trở thành một giai đoạn phát triển mới. SimCity Classic trên Macintosh đã ảnh hưởng lớn đến cách tôi suy nghĩ về máy tính và phần mềm khi còn nhỏ, và tôi rất vui khi thấy nó được thổi sức sống mới
Tôi không phải game thủ, nhưng vẫn nhớ hồi nhỏ từng chơi SimCity. Không biết lối chơi đã thay đổi trong khoảng 25 năm qua hay trình duyệt bị lỗi, nhưng trông như chẳng làm được gì cả
Có thể tải một thành phố lên và xem nó hoạt động, nhưng tôi nhớ trong SimCity ngày xưa hình như mình có thể tự xây thành phố. Chẳng phải người chơi nên có cách để thực sự chơi sao?
"Space Inventory" thực ra là một vài quy tắc automata tế bào. Một quy tắc là khuếch tán nhiệt hỗn loạn dạng dithering 8-bit có wrap, tương tự "Heat"; quy tắc còn lại là một biến thể "EcoLibra" được Rudy Rucker công bố trong Autodesk Cellab do ông tạo cùng John Walker. Nó kết hợp "Life" và "Brian's Brain" với "Anneal" ("Vote 4/5")
https://www.fourmilab.ch/cellab/
https://www.fourmilab.ch/cellab/manual/rules.html#EcoLiBra
https://www.fourmilab.ch/cellab/manual/rules.html#Life
https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
https://www.fourmilab.ch/cellab/manual/rules.html#Brain
https://en.wikipedia.org/wiki/Brian%27s_Brain
https://www.fourmilab.ch/cellab/manual/rules.html#Vote
https://conwaylife.com/wiki/List_of_Life-like_rules
https://www.fourmilab.ch/cellab/manual/rules.html#Heat
Năm 1991, tôi đã thêm các quy tắc automata tế bào này vào SimCity, để hiển thị giá trị ô dưới dạng tile của SimCity. Tôi phân phối một bản demo miễn phí đầy đủ chức năng qua FTP ẩn danh, nhưng dùng automata tế bào như DRM, khiến thành phố tan chảy sau vài phút chơi nếu không có giấy phép
https://www.donhopkins.com/home/catalog/simcity/simcity-anno...
https://www.donhopkins.com/home/catalog/simcity/simcity-revi...
https://www.donhopkins.com/home/HyperLook-SimCity-Manual.pdf
https://www.donhopkins.com/home/catalog/hyperlook/HyperLook-...
https://www.donhopkins.com/home/catalog/hyperlook/SimCity.IN...
Trong hướng dẫn cài đặt có đoạn nói rằng bạn có thể nhận khóa giấy phép hoặc chạy ở chế độ demo; ở chế độ demo, sau 5 phút hoặc khi cố lưu, thành phố sẽ tan chảy, nên hãy mua giấy phép.
Tôi không kỳ vọng nhiều trên di động, nhưng trên Firefox của Android, trang này đã làm trình duyệt bị treo hẳn. Tôi phải kill tiến trình, và chuyện như vậy rất hiếm khi xảy ra
Nhân tiện, tôi có một game nhỏ tự port sang chạy trên trình duyệt. Nhờ tổ hợp Emscripten+SDL2 nên làm cho nó chạy được thì rất dễ, nhưng nói thật là phần tốn công nhất là làm sao để có thể chơi ổn trên điện thoại: https://play.neverball.org/
https://github.com/SimHacker/MicropolisCore/issues/1
Thay vì chờ đến khi hoàn thiện và hoàn hảo, tôi muốn công khai sớm nhất có thể để người khác có thể chạy thử. Vì vậy vẫn còn rất nhiều việc phải làm như giao diện người dùng, độ ổn định, hỗ trợ đa nền tảng, di động, v.v.
Ngay khi simulator và tile renderer hoạt động, tôi đã gắn vào các thao tác phóng to/di chuyển tối thiểu, giao diện điều khiển bằng bàn phím và một cửa sổ gợi ý có thể đóng bằng nút "+" ở góc trên bên phải
Điều tôi thật sự mong đợi là tích hợp với các ngôn ngữ lập trình trực quan như Snap! để có thể tạo live coding, khu vực plugin, robot, hệ thống giám sát/điều khiển, trực quan hóa và xuất dữ liệu, cũng như các giao diện thay thế kiểu dashboard Grafana
Điện thoại Android có thể kết nối với Mac hoặc PC bằng cáp USB, còn iPhone thì kết nối với Mac, rồi dùng Chrome hoặc trình gỡ lỗi Safari trên Mac để xem remote console, debug, thậm chí live coding. Nếu điều kiện phù hợp thì cũng có thể làm qua Wi-Fi, nhưng có thể Google đã gỡ tính năng đó hoặc Apple đã chặn ngay từ đầu
Trước đây tôi đã port client RuneScape lên web
https://play.rsps.app/
Dùng Wasm, TypeScript và WebGL
Kho mã nguồn: https://github.com/SimHacker/MicropolisCore
Điều xảy ra khi nhấn phím cách thật sự đáng kinh ngạc. Fractal rất đẹp
https://www.youtube.com/watch?v=0Gy9hJauXns
Không rõ các mô hình ngôn ngữ lớn liệu có thể port ngay lập tức những trò chơi như thế này không
Tôi đang dùng ChatGPT trong phát triển và nó giúp ích rất nhiều, nhưng cần rất nhiều vòng lặp và chỉ dẫn, nên còn xa mới gọi là làm được ngay. LLM sẽ không thay thế lập trình viên, nhưng lập trình viên dùng LLM sẽ thay thế lập trình viên không dùng LLM
Nó hữu ích trong việc giải thích tài liệu và best practice của các công cụ như Emscripten và Embind, làm cho makefile chạy được, phân tích mã, phân loại method và instance variable thành private/public, viết boilerplate khai báo Embind và tài liệu. Cũng có thể dùng nó như một kiểu grep nâng cao hiểu cú pháp mã và nhận truy vấn bằng tiếng Anh
https://github.com/SimHacker/MicropolisCore/blob/main/Microp...
Quá trình này không tự động cũng không tức thì; tính tổng thể thì đã mất 33 năm và vẫn chưa kết thúc. Dựa trên kinh nghiệm port bản SimCity cho Mac sang HyperLook của hệ thống cửa sổ NeWS vào năm 1991 rồi sau đó đưa nó sang nhiều nền tảng khác, tôi đã phải dẫn dắt ChatGPT rất nhiều
Với một trò chơi như SimCity, việc bỏ UI Mac, tách simulator khỏi UI rồi viết lại một UI chất lượng cao cho HyperLook của NeWS là đáng làm. Sau đó tôi cũng tạo UI cho TCL/Tk trên X11, và nhờ cấu trúc này mà SimCity multiplayer qua mạng cũng trở nên khả thi
X11 SimCity Demo: https://www.youtube.com/watch?v=Jvi98wVUmQA
Multi Player SimCityNet for X11 on Linux: https://www.youtube.com/watch?v=_fVl4dGwUrA
TCL Doc: https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
Callbacks: https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
Nhiều thập kỷ sau, sau khi phát hành SimCity dưới dạng mã nguồn mở và đưa ra phiên bản TCL/Tk/X11 cho OLPC và Linux, tôi đã chỉnh lý mã simulator thành C++ rồi dùng SWIG để định nghĩa API và callback, kết nối với Python. Việc refactor sang C++ giúp ích rất nhiều cho mô-đun hóa, tài liệu hóa và port sang nhiều nền tảng
Micropolis Core: https://github.com/SimHacker/micropolis/tree/master/Micropol...
Doxygen documentation (current): https://micropolisweb.com/doc/
Development Plan (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
OLPC Plan (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
To Do (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
User Interface Plan (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
OLPC Notes (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
Tôi cũng tạo giao diện desktop PyGTK/Cairo/X11 và giao diện client/server web dựa trên TurboGears/AMF/OpenLaszlo/Flash
Micropolis Online (SimCity) Web Demo (old): https://www.youtube.com/watch?v=8snnqQSI0GE
Bil Simser đã tích hợp simulator engine vào C# bằng SWIG: https://github.com/SimHacker/micropolis/tree/master/Micropol...
Vì đã có các tài liệu thiết kế và kinh nghiệm triển khai như vậy, tôi có thể prompt ChatGPT khá tốt về thiết kế API Emscripten/Embind; nó hữu ích cho việc viết boilerplate và kiểm chứng thiết kế, nhưng không giúp được nhiều trong việc nghĩ ra bản thân thiết kế. Nó cũng rất hữu ích để học các chi tiết và best practice của TypeScript, SvelteKit, node, WebGL, canvas, CSS, HTML
Tại sao gần như mỗi block phố đều có trạm cứu hỏa vậy?
Không điều khiển được, và ngay khi trình duyệt bắt đầu tải gì đó thì quạt CPU bắt đầu quay. Có chắc đây không chỉ là một trình đào tiền mã hóa sơ sài không? Nếu không phải thì tôi không hiểu lý do công bố một thứ không hoạt động là gì
Tôi cũng không có tiền mua đủ mọi loại máy tính và điện thoại, mà ngay cả nếu có thì cũng không có thời gian tự kiểm thử tất cả. Đây cũng không phải việc ai trả tiền cho tôi làm, nhưng nếu muốn thì bạn có thể ủng hộ qua Patreon: https://www.patreon.com/DonHopkins
Dù vậy, dự án này là việc làm vì đam mê, không phải nguồn thu nhập. Hiện tôi còn có một gói đặc biệt: mỗi tháng tôi sẽ im lặng 5 phút về chủ đề bạn muốn
Toàn bộ mã nguồn có thể xem trên GitHub, và bạn có thể báo lỗi hoặc tự build. Trình duyệt cũng có các công cụ gỡ lỗi và reverse engineering để xem xét binary WebAssembly và JavaScript đã biên dịch. Shader WebGL là văn bản thuần nên cũng có thể kiểm tra xem có khớp với mã nguồn trong kho hay không
https://github.com/SimHacker/MicropolisCore
Nếu tìm thấy bằng chứng về phần mềm đào coin sơ sài, bạn có thể báo cho FBI, Interpol và GitHub. Tôi công khai mã nguồn và binary bằng tên tôi, tài khoản GitHub của tôi và domain của tôi, nên cũng dễ truy ra nguồn gốc
Một ví dụ về báo cáo lỗi hữu ích là báo cáo đã xác định được vấn đề kèm thông tin hệ thống và stack trace, nhờ đó tôi có thể sửa chỉ trong vài phút: https://github.com/SimHacker/MicropolisCore/issues/1
Tôi cũng muốn biết bạn đã thử nhấn các phím số để điều chỉnh tốc độ chưa. Tính theo các phím số ở hàng trên bàn phím, "1" làm chậm xuống 1 khung hình/giây và 1 tick mô phỏng mỗi khung hình, còn "9" chạy ở 120 khung hình/giây và 50 tick mỗi khung hình. Trên Chrome ở máy Mac M1 của tôi, nó chạy mượt và giao diện cũng phản hồi khá tốt
Sẽ rất hữu ích nếu bạn cho biết thao tác nào không hoạt động, phần cứng·hệ điều hành·trình duyệt·GPU của bạn là gì, và trong console dành cho nhà phát triển của trình duyệt có lỗi nào không. Báo cáo lỗi sẽ hữu ích hơn nếu kèm stack trace trong console